todo/js/mutations/MarkAllTodosMutation.js (69 lines of code) (raw):

// @flow import type {MarkAllTodosMutation_user$key} from 'relay/MarkAllTodosMutation_user.graphql'; import type {MarkAllTodosMutation_todoEdge$key} from 'relay/MarkAllTodosMutation_todoEdge.graphql'; import {useCallback} from 'react'; import {graphql, useFragment, useMutation} from 'react-relay'; const mutation = graphql` mutation MarkAllTodosMutation($input: MarkAllTodosInput!) { markAllTodos(input: $input) { changedTodos { id complete } user { id completedCount } } } `; export function useMarkAllTodosMutation( userRef: MarkAllTodosMutation_user$key, todoEdgeRef: MarkAllTodosMutation_todoEdge$key, ): (boolean) => void { const user = useFragment( graphql` fragment MarkAllTodosMutation_user on User { id userId totalCount } `, userRef, ); const todos = useFragment( graphql` fragment MarkAllTodosMutation_todoEdge on TodoEdge @relay(plural: true) { node { id } } `, todoEdgeRef, ); const [commit] = useMutation(mutation); return useCallback( (complete: boolean) => { commit({ variables: { input: { userId: user.userId, complete, }, }, optimisticResponse: { markAllTodos: { changedTodos: todos.map(({node: {id}}) => ({ id, complete, })), user: { id: user.id, completedCount: complete ? user.totalCount : 0, }, }, }, }); }, [commit, user, todos], ); }