fischerX/apps/web/src/hooks/use-content.ts

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'] });
},
});
};