79 lines
1.9 KiB
TypeScript
79 lines
1.9 KiB
TypeScript
|
|
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] });
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|