Skip to content

Commit

Permalink
react: MutationResult.client is always set
Browse files Browse the repository at this point in the history
As far as I can tell, whenever a MutationResult is provided to the user of
useMutation (or the component or HOC), it always contains a `client`; eg,
OperationData.refreshClient checks this invariant.

MutationResult is also used to type an internal state variable used by
MutationData and useMutation; this one doesn't contain a `client`. This PR
changes that variable to different type without `client`, and the actual exposed
MutationResult now has a non-optional `client`. This makes it match
`QueryResult`.

Now TypeScript consumers of `useMutation` don't need to check to see if `client`
exists before using it.
  • Loading branch information
glasser committed Jul 16, 2020
1 parent ab1a8e8 commit c6695f2
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 10 deletions.
18 changes: 10 additions & 8 deletions src/react/data/MutationData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,22 @@ import {
MutationDataOptions,
MutationTuple,
MutationFunctionOptions,
MutationResult
MutationResult,
} from '../types/types';
import { OperationData } from './OperationData';
import { OperationVariables } from '../../core/types';
import { FetchResult } from '../../link/core/types';

type MutationResultWithoutClient<TData = any> = Omit<MutationResult<TData>, 'client'>;

export class MutationData<
TData = any,
TVariables = OperationVariables
> extends OperationData {
private mostRecentMutationId: number;
private result: MutationResult<TData>;
private previousResult?: MutationResult<TData>;
private setResult: (result: MutationResult<TData>) => any;
private result: MutationResultWithoutClient<TData>;
private previousResult?: MutationResultWithoutClient<TData>;
private setResult: (result: MutationResultWithoutClient<TData>) => any;

constructor({
options,
Expand All @@ -29,8 +31,8 @@ export class MutationData<
}: {
options: MutationDataOptions<TData, TVariables>;
context: any;
result: MutationResult<TData>;
setResult: (result: MutationResult<TData>) => any;
result: MutationResultWithoutClient<TData>;
setResult: (result: MutationResultWithoutClient<TData>) => any;
}) {
super(options, context);
this.verifyDocumentType(options.mutation, DocumentType.Mutation);
Expand All @@ -39,7 +41,7 @@ export class MutationData<
this.mostRecentMutationId = 0;
}

public execute(result: MutationResult<TData>) {
public execute(result: MutationResultWithoutClient<TData>): MutationTuple<TData, TVariables> {
this.isMounted = true;
this.verifyDocumentType(this.getOptions().mutation, DocumentType.Mutation);
return [
Expand Down Expand Up @@ -148,7 +150,7 @@ export class MutationData<
return this.mostRecentMutationId === mutationId;
}

private updateResult(result: MutationResult<TData>) {
private updateResult(result: MutationResultWithoutClient<TData>) {
if (
this.isMounted &&
(!this.previousResult || !equal(this.previousResult, result))
Expand Down
4 changes: 2 additions & 2 deletions src/react/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,8 +189,8 @@ export interface MutationResult<TData = any> {
error?: ApolloError;
loading: boolean;
called: boolean;
client?: ApolloClient<object>;
}
client: ApolloClient<object>;
};

export declare type MutationFunction<
TData = any,
Expand Down

0 comments on commit c6695f2

Please sign in to comment.