91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import * as api from '../lib/api';
|
|
|
|
export function useArticles(params: api.FindArticlesParams = {}) {
|
|
return useQuery({
|
|
queryKey: ['articles', params],
|
|
queryFn: () => api.fetchArticles(params),
|
|
});
|
|
}
|
|
|
|
export function useArticle(slug: string) {
|
|
return useQuery({
|
|
queryKey: ['article', slug],
|
|
queryFn: () => api.fetchArticleBySlug(slug),
|
|
enabled: !!slug,
|
|
});
|
|
}
|
|
|
|
export function useArticleById(id: string) {
|
|
return useQuery({
|
|
queryKey: ['article', id],
|
|
queryFn: () => api.fetchArticleById(id),
|
|
enabled: !!id,
|
|
});
|
|
}
|
|
|
|
export function useCreateArticle() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: api.createArticle,
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateArticle() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ id, dto }: { id: string; dto: api.UpdateArticleDto }) =>
|
|
api.updateArticle(id, dto),
|
|
onSuccess: (data, variables) => {
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
queryClient.invalidateQueries({ queryKey: ['article', variables.id] });
|
|
queryClient.invalidateQueries({ queryKey: ['article', data.slug] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteArticle() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: api.deleteArticle,
|
|
onSuccess: (_, variables) => {
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
// Also invalidate any specific article queries
|
|
queryClient.removeQueries({ queryKey: ['article', variables] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useArchiveArticle() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: api.archiveArticle,
|
|
onSuccess: (data, variables) => {
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
queryClient.invalidateQueries({ queryKey: ['article', variables] });
|
|
queryClient.invalidateQueries({ queryKey: ['article', data.slug] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function usePublishArticle() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ id, status = 'published' }: { id: string; status?: 'draft' | 'published' }) =>
|
|
api.publishArticle(id, status),
|
|
onSuccess: (data, variables) => {
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
queryClient.invalidateQueries({ queryKey: ['article', variables.id] });
|
|
queryClient.invalidateQueries({ queryKey: ['article', data.slug] });
|
|
},
|
|
});
|
|
}
|