This commit is contained in:
2026-03-28 01:06:30 -05:00
parent 796c374d38
commit ecb708790d
35 changed files with 2347 additions and 37 deletions

View File

@@ -0,0 +1,78 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { api, type ListParams } from '../api/client';
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] });
},
});
}