todo/js/mutations/ChangeTodoStatusMutation.js (68 lines of code) (raw):

// @flow import type {ChangeTodoStatusMutation_todo$key} from 'relay/ChangeTodoStatusMutation_todo.graphql'; import type {ChangeTodoStatusMutation_user$key} from 'relay/ChangeTodoStatusMutation_user.graphql'; import {useCallback} from 'react'; import {graphql, useFragment, useMutation} from 'react-relay'; const mutation = graphql` mutation ChangeTodoStatusMutation($input: ChangeTodoStatusInput!) { changeTodoStatus(input: $input) { todo { id complete } user { id completedCount } } } `; export function useChangeTodoStatusMutation( userRef: ChangeTodoStatusMutation_user$key, todoRef: ChangeTodoStatusMutation_todo$key, ): (boolean) => void { const user = useFragment( graphql` fragment ChangeTodoStatusMutation_user on User { id userId completedCount } `, userRef, ); const todo = useFragment( graphql` fragment ChangeTodoStatusMutation_todo on Todo { id } `, todoRef, ); const [commit] = useMutation(mutation); return useCallback( (complete: boolean) => { const payload = { id: todo.id, complete, }; commit({ variables: { input: { userId: user.userId, ...payload, }, }, optimisticResponse: { changeTodoStatus: { todo: payload, user: { id: user.id, completedCount: user.completedCount + (complete ? 1 : -1), }, }, }, }); }, [user, todo, commit], ); }