This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

semble / src / webapp / features / cards / lib / mutations / useAddCard.tsx
1.7 kB 43 lines
1import { useMutation, useQueryClient } from '@tanstack/react-query'; 2import { addUrlToLibrary } from '../dal'; 3import { cardKeys } from '../cardKeys'; 4import { collectionKeys } from '@/features/collections/lib/collectionKeys'; 5 6export default function useAddCard() { 7 const queryClient = useQueryClient(); 8 9 const mutation = useMutation({ 10 mutationFn: (newCard: { 11 url: string; 12 note?: string; 13 collectionIds?: string[]; 14 }) => { 15 return addUrlToLibrary(newCard.url, { 16 note: newCard.note, 17 collectionIds: newCard.collectionIds, 18 }); 19 }, 20 21 // Do things that are absolutely necessary and logic related (like query invalidation) in the useMutation callbacks 22 // Do UI related things like redirects or showing toast notifications in mutate callbacks. If the user navigated away from the current screen before the mutation finished, those will purposefully not fire 23 // https://tkdodo.eu/blog/mastering-mutations-in-react-query#some-callbacks-might-not-fire 24 onSuccess: (_data, variables) => { 25 queryClient.invalidateQueries({ queryKey: cardKeys.mine() }); 26 queryClient.invalidateQueries({ queryKey: cardKeys.all() }); 27 queryClient.invalidateQueries({ queryKey: collectionKeys.mine() }); 28 queryClient.invalidateQueries({ queryKey: collectionKeys.infinite() }); 29 queryClient.invalidateQueries({ 30 queryKey: collectionKeys.bySembleUrl(variables.url), 31 }); 32 33 // invalidate each collection query individually 34 variables.collectionIds?.forEach((id) => { 35 queryClient.invalidateQueries({ 36 queryKey: collectionKeys.collection(id), 37 }); 38 }); 39 }, 40 }); 41 42 return mutation; 43}