in packages/relay-runtime/mutations/commitMutation.js [72:157]
function commitMutation<TMutation: MutationParameters>(
environment: IEnvironment,
config: MutationConfig<TMutation>,
): Disposable {
invariant(
isRelayModernEnvironment(environment),
'commitMutation: expected `environment` to be an instance of ' +
'`RelayModernEnvironment`.',
);
const mutation = getRequest(config.mutation);
if (mutation.params.operationKind !== 'mutation') {
throw new Error('commitMutation: Expected mutation operation');
}
if (mutation.kind !== 'Request') {
throw new Error('commitMutation: Expected mutation to be of type request');
}
let {optimisticResponse, optimisticUpdater, updater} = config;
const {configs, cacheConfig, onError, onUnsubscribe, variables, uploadables} =
config;
const operation = createOperationDescriptor(
mutation,
variables,
cacheConfig,
generateUniqueClientID(),
);
// TODO: remove this check after we fix flow.
if (typeof optimisticResponse === 'function') {
optimisticResponse = optimisticResponse();
warning(
false,
'commitMutation: Expected `optimisticResponse` to be an object, ' +
'received a function.',
);
}
if (__DEV__) {
if (optimisticResponse instanceof Object) {
validateMutation(optimisticResponse, mutation, variables);
}
}
if (configs) {
({optimisticUpdater, updater} = RelayDeclarativeMutationConfig.convert(
configs,
mutation,
optimisticUpdater,
updater,
));
}
const errors = [];
const subscription = environment
.executeMutation({
operation,
optimisticResponse,
optimisticUpdater,
updater,
uploadables,
})
.subscribe({
next: payload => {
if (Array.isArray(payload)) {
payload.forEach(item => {
if (item.errors) {
errors.push(...item.errors);
}
});
} else {
if (payload.errors) {
errors.push(...payload.errors);
}
}
config.onNext?.();
},
complete: () => {
const {onCompleted} = config;
if (onCompleted) {
const snapshot = environment.lookup(operation.fragment);
onCompleted(
(snapshot.data: $FlowFixMe),
errors.length !== 0 ? errors : null,
);
}
},
error: onError,
unsubscribe: onUnsubscribe,
});
return {dispose: subscription.unsubscribe};
}