todo/js/mutations/RemoveCompletedTodosMutation.js (72 lines of code) (raw):

// @flow import type {RemoveCompletedTodosMutation_user$key} from 'relay/RemoveCompletedTodosMutation_user.graphql'; import type {RemoveCompletedTodosMutation_todoConnection$key} from 'relay/RemoveCompletedTodosMutation_todoConnection.graphql'; import {useCallback} from 'react'; import {graphql, useFragment, useMutation} from 'react-relay'; const mutation = graphql` mutation RemoveCompletedTodosMutation( $connections: [ID!]! $input: RemoveCompletedTodosInput! ) { removeCompletedTodos(input: $input) { deletedTodoIds @deleteEdge(connections: $connections) user { id completedCount totalCount } } } `; export function useRemoveCompletedTodosMutation( userRef: RemoveCompletedTodosMutation_user$key, todoConnectionRef: RemoveCompletedTodosMutation_todoConnection$key, ): () => void { const user = useFragment( graphql` fragment RemoveCompletedTodosMutation_user on User { id userId totalCount } `, userRef, ); const todoConnection = useFragment( graphql` fragment RemoveCompletedTodosMutation_todoConnection on TodoConnection { __id edges { node { id complete } } } `, todoConnectionRef, ); const [commit] = useMutation(mutation); return useCallback(() => { const completedTodoIds = todoConnection.edges .filter((edge) => edge.node.complete) .map((edge) => edge.node.id); commit({ variables: { input: { userId: user.userId, }, connections: [todoConnection.__id], }, optimisticResponse: { removeCompletedTodos: { deletedTodoIds: completedTodoIds, user: { id: user.id, completedCount: 0, totalCount: user.totalCount - completedTodoIds.length, }, }, }, }); }, [commit, user, todoConnection]); }