import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { api, type ListParams } from '../api/client'; export function useCollections() { return useQuery({ queryKey: ['collections'], queryFn: () => api.collections.list(), staleTime: 30_000, }); } export function useCreateCollection() { const qc = useQueryClient(); return useMutation({ mutationFn: (name: string) => api.collections.create(name), onSuccess: () => qc.invalidateQueries({ queryKey: ['collections'] }), }); } export function useRenameCollection() { const qc = useQueryClient(); return useMutation({ mutationFn: ({ id, name }: { id: number; name: string }) => api.collections.rename(id, name), onSuccess: () => qc.invalidateQueries({ queryKey: ['collections'] }), }); } export function useDeleteCollection() { const qc = useQueryClient(); return useMutation({ mutationFn: (id: number) => api.collections.delete(id), onSuccess: () => { qc.invalidateQueries({ queryKey: ['collections'] }); qc.invalidateQueries({ queryKey: ['memes'] }); }, }); } export function useMoveMeme() { const qc = useQueryClient(); return useMutation({ mutationFn: ({ id, collection_id }: { id: string; collection_id: number }) => api.memes.move(id, collection_id), onSuccess: (_, vars) => { qc.invalidateQueries({ queryKey: ['memes'] }); qc.invalidateQueries({ queryKey: ['meme', vars.id] }); qc.invalidateQueries({ queryKey: ['collections'] }); }, }); } export function useMemes(params: ListParams = {}) { return useQuery({ queryKey: ['memes', params], queryFn: () => api.memes.list(params), }); } export function useMeme(id: string | null) { return useQuery({ queryKey: ['meme', id], queryFn: () => api.memes.get(id!), enabled: !!id, }); } export function useTags() { return useQuery({ queryKey: ['tags'], queryFn: () => api.tags.list(), }); } export function useUploadMeme() { const qc = useQueryClient(); return useMutation({ mutationFn: (formData: FormData) => api.memes.upload(formData), onSuccess: () => { qc.invalidateQueries({ queryKey: ['memes'] }); qc.invalidateQueries({ queryKey: ['tags'] }); }, }); } export function useUpdateMeme() { const qc = useQueryClient(); return useMutation({ mutationFn: ({ id, ...body }: { id: string; title?: string; description?: string; tags?: string[] }) => api.memes.update(id, body), onSuccess: (_, vars) => { qc.invalidateQueries({ queryKey: ['memes'] }); qc.invalidateQueries({ queryKey: ['meme', vars.id] }); qc.invalidateQueries({ queryKey: ['tags'] }); }, }); } export function useDeleteMeme() { const qc = useQueryClient(); return useMutation({ mutationFn: (id: string) => api.memes.delete(id), onSuccess: () => { qc.invalidateQueries({ queryKey: ['memes'] }); qc.invalidateQueries({ queryKey: ['tags'] }); }, }); } export function useRescaleMeme() { const qc = useQueryClient(); return useMutation({ mutationFn: ({ id, ...body }: { id: string; width?: number; height?: number; quality?: number; label?: string; }) => api.memes.rescale(id, body), onSuccess: (_, vars) => { qc.invalidateQueries({ queryKey: ['meme', vars.id] }); }, }); }