293 lines
8.0 KiB
TypeScript
293 lines
8.0 KiB
TypeScript
'use client';
|
|
|
|
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import {
|
|
contentApi,
|
|
CreateArticleRequest,
|
|
UpdateArticleRequest,
|
|
QueryArticleRequest,
|
|
CreateCategoryRequest,
|
|
UpdateCategoryRequest,
|
|
CreateTagRequest,
|
|
UpdateTagRequest,
|
|
CreateCommentRequest,
|
|
QueryCommentRequest,
|
|
} from '@/lib/content-api';
|
|
|
|
export const useArticles = (params?: QueryArticleRequest) => {
|
|
return useQuery({
|
|
queryKey: ['articles', params],
|
|
queryFn: () => contentApi.getArticles(params),
|
|
});
|
|
};
|
|
|
|
export const useArticle = (id?: string) => {
|
|
return useQuery({
|
|
queryKey: ['article', id],
|
|
queryFn: () => id ? contentApi.getArticle(id) : null,
|
|
enabled: !!id,
|
|
});
|
|
};
|
|
|
|
export const useArticleBySlug = (slug?: string) => {
|
|
return useQuery({
|
|
queryKey: ['articleBySlug', slug],
|
|
queryFn: () => slug ? contentApi.getArticleBySlug(slug) : null,
|
|
enabled: !!slug,
|
|
});
|
|
};
|
|
|
|
export const useCreateArticle = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (data: CreateArticleRequest) => contentApi.createArticle(data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useUpdateArticle = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ id, data }: { id: string; data: UpdateArticleRequest }) =>
|
|
contentApi.updateArticle(id, data),
|
|
onSuccess: (_, { id }) => {
|
|
queryClient.invalidateQueries({ queryKey: ['article', id] });
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useDeleteArticle = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => contentApi.deleteArticle(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const usePublishArticle = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => contentApi.publishArticle(id),
|
|
onSuccess: (_, id) => {
|
|
queryClient.invalidateQueries({ queryKey: ['article', id] });
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useSubmitForReview = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => contentApi.submitForReview(id),
|
|
onSuccess: (_, id) => {
|
|
queryClient.invalidateQueries({ queryKey: ['article', id] });
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useReviewArticle = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ id, data }: { id: string; data: { action: 'approve' | 'reject'; comment?: string } }) =>
|
|
contentApi.reviewArticle(id, data),
|
|
onSuccess: (_, { id }) => {
|
|
queryClient.invalidateQueries({ queryKey: ['article', id] });
|
|
queryClient.invalidateQueries({ queryKey: ['articles'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useArticleVersions = (articleId?: string) => {
|
|
return useQuery({
|
|
queryKey: ['articleVersions', articleId],
|
|
queryFn: () => articleId ? contentApi.getArticleVersions(articleId) : null,
|
|
enabled: !!articleId,
|
|
});
|
|
};
|
|
|
|
export const useCategories = () => {
|
|
return useQuery({
|
|
queryKey: ['categories'],
|
|
queryFn: () => contentApi.getCategories(),
|
|
});
|
|
};
|
|
|
|
export const useCategoryTree = () => {
|
|
return useQuery({
|
|
queryKey: ['categoryTree'],
|
|
queryFn: () => contentApi.getCategoryTree(),
|
|
});
|
|
};
|
|
|
|
export const useCategory = (id?: string) => {
|
|
return useQuery({
|
|
queryKey: ['category', id],
|
|
queryFn: () => id ? contentApi.getCategory(id) : null,
|
|
enabled: !!id,
|
|
});
|
|
};
|
|
|
|
export const useCreateCategory = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (data: CreateCategoryRequest) => contentApi.createCategory(data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['categories'] });
|
|
queryClient.invalidateQueries({ queryKey: ['categoryTree'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useUpdateCategory = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ id, data }: { id: string; data: UpdateCategoryRequest }) =>
|
|
contentApi.updateCategory(id, data),
|
|
onSuccess: (_, { id }) => {
|
|
queryClient.invalidateQueries({ queryKey: ['category', id] });
|
|
queryClient.invalidateQueries({ queryKey: ['categories'] });
|
|
queryClient.invalidateQueries({ queryKey: ['categoryTree'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useDeleteCategory = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => contentApi.deleteCategory(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['categories'] });
|
|
queryClient.invalidateQueries({ queryKey: ['categoryTree'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useTags = (params?: QueryArticleRequest) => {
|
|
return useQuery({
|
|
queryKey: ['tags', params],
|
|
queryFn: () => contentApi.getTags(params),
|
|
});
|
|
};
|
|
|
|
export const usePopularTags = () => {
|
|
return useQuery({
|
|
queryKey: ['popularTags'],
|
|
queryFn: () => contentApi.getPopularTags(),
|
|
});
|
|
};
|
|
|
|
export const useCreateTag = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (data: CreateTagRequest) => contentApi.createTag(data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['tags'] });
|
|
queryClient.invalidateQueries({ queryKey: ['popularTags'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useUpdateTag = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ id, data }: { id: string; data: UpdateTagRequest }) =>
|
|
contentApi.updateTag(id, data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['tags'] });
|
|
queryClient.invalidateQueries({ queryKey: ['popularTags'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useDeleteTag = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => contentApi.deleteTag(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['tags'] });
|
|
queryClient.invalidateQueries({ queryKey: ['popularTags'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useArticleComments = (articleId?: string, params?: QueryCommentRequest) => {
|
|
return useQuery({
|
|
queryKey: ['articleComments', articleId, params],
|
|
queryFn: () => articleId ? contentApi.getArticleComments(articleId, params) : null,
|
|
enabled: !!articleId,
|
|
});
|
|
};
|
|
|
|
export const useComments = (params?: QueryCommentRequest) => {
|
|
return useQuery({
|
|
queryKey: ['comments', params],
|
|
queryFn: () => contentApi.getComments(params),
|
|
});
|
|
};
|
|
|
|
export const useCreateComment = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (data: CreateCommentRequest) => contentApi.createComment(data),
|
|
onSuccess: (_, { articleId }) => {
|
|
queryClient.invalidateQueries({ queryKey: ['articleComments', articleId] });
|
|
queryClient.invalidateQueries({ queryKey: ['comments'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useApproveComment = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => contentApi.approveComment(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['comments'] });
|
|
queryClient.invalidateQueries({ queryKey: ['articleComments'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useRejectComment = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => contentApi.rejectComment(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['comments'] });
|
|
queryClient.invalidateQueries({ queryKey: ['articleComments'] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useDeleteComment = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => contentApi.deleteComment(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['comments'] });
|
|
queryClient.invalidateQueries({ queryKey: ['articleComments'] });
|
|
},
|
|
});
|
|
};
|