ln/app/client/hooks/useToastMutation.tsx

43 lines
1.2 KiB
TypeScript

import {
ApolloCache,
DefaultContext,
DocumentNode,
FetchResult,
InternalRefetchQueriesInclude,
MaybeMasked,
MutationFunctionOptions,
OperationVariables,
Unmasked,
useMutation
} from '@apollo/client';
import { toaster } from '../components/ui/toaster';
interface UseToastMutationProps<T> {
mutation: DocumentNode;
refetchQueries?:
| InternalRefetchQueriesInclude
| ((result: FetchResult<Unmasked<NoInfer<T>>>) => InternalRefetchQueriesInclude)
| undefined;
successMsg?: string;
}
interface UseToastMutationReturn<T> {
update: (
options?:
| MutationFunctionOptions<T, OperationVariables, DefaultContext, ApolloCache<any>>
| undefined
) => Promise<FetchResult<MaybeMasked<T>>>;
}
export function useToastMutation<T>(props: UseToastMutationProps<T>): UseToastMutationReturn<T> {
const [update] = useMutation<T>(props.mutation, {
onCompleted: () => toaster.create({ description: props.successMsg, type: 'success' }),
onError: error => {
toaster.create({ description: `${error.message}`, type: 'error' });
console.error(error);
},
refetchQueries: props.refetchQueries
});
return { update };
}