Problem
App.tsx and TaskList.tsx have 4-7 scattered queryClient.invalidateQueries calls per action. Cache invalidation logic is duplicated and inconsistent, causing UI flicker (all queries invalidate → blank → refetch).
Solution
Extract into dedicated mutation hooks using React Query's useMutation:
// hooks/mutations/useCompleteTask.ts
export function useCompleteTask() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (taskId: string) => window.electronAPI.tasks.toggleComplete(taskId),
onMutate: async (taskId) => { /* optimistic update */ },
onSettled: () => queryClient.invalidateQueries({ queryKey: ['tasks'] }),
});
}
Create: useCompleteTask(), useDeleteTask(), useUpdateTask(), useCreateTask(), useMoveTask()
Files
apps/electron/src/renderer/hooks/mutations/ — new directory for mutation hooks
apps/electron/src/renderer/App.tsx — replace inline mutation logic
apps/electron/src/renderer/components/TaskList.tsx — replace inline mutation logic
Problem
App.tsxandTaskList.tsxhave 4-7 scatteredqueryClient.invalidateQueriescalls per action. Cache invalidation logic is duplicated and inconsistent, causing UI flicker (all queries invalidate → blank → refetch).Solution
Extract into dedicated mutation hooks using React Query's
useMutation:Create:
useCompleteTask(),useDeleteTask(),useUpdateTask(),useCreateTask(),useMoveTask()Files
apps/electron/src/renderer/hooks/mutations/— new directory for mutation hooksapps/electron/src/renderer/App.tsx— replace inline mutation logicapps/electron/src/renderer/components/TaskList.tsx— replace inline mutation logic