43 lines
1.2 KiB
TypeScript
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 };
|
|
}
|