98 lines
2.6 KiB
TypeScript
98 lines
2.6 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import * as api from '../lib/api';
|
|
|
|
export function useComments(params: api.FindCommentsParams = {}) {
|
|
return useQuery({
|
|
queryKey: ['comments', params],
|
|
queryFn: () => api.fetchComments(params),
|
|
});
|
|
}
|
|
|
|
export function useCreateComment() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: api.createComment,
|
|
onSuccess: (data, variables) => {
|
|
queryClient.invalidateQueries({
|
|
queryKey: ['comments', { articleId: variables.articleId }]
|
|
});
|
|
queryClient.invalidateQueries({
|
|
queryKey: ['comments', { liveBlogId: variables.liveBlogId }]
|
|
});
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateComment() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ id, dto }: { id: string; dto: api.UpdateCommentDto }) =>
|
|
api.updateComment(id, dto),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['comments'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteComment() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: api.deleteComment,
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['comments'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useReactionCounts(
|
|
articleId?: string,
|
|
liveBlogId?: string,
|
|
commentId?: string
|
|
) {
|
|
return useQuery({
|
|
queryKey: ['reactions', 'counts', { articleId, liveBlogId, commentId }],
|
|
queryFn: () => api.getReactionCounts(articleId, liveBlogId, commentId),
|
|
enabled: !!articleId || !!liveBlogId || !!commentId,
|
|
});
|
|
}
|
|
|
|
export function useUserReaction(
|
|
articleId?: string,
|
|
liveBlogId?: string,
|
|
commentId?: string
|
|
) {
|
|
return useQuery({
|
|
queryKey: ['reactions', 'user', { articleId, liveBlogId, commentId }],
|
|
queryFn: () => api.getUserReaction(articleId, liveBlogId, commentId),
|
|
enabled: !!articleId || !!liveBlogId || !!commentId,
|
|
retry: false,
|
|
});
|
|
}
|
|
|
|
export function useAddReaction() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: api.addReaction,
|
|
onSuccess: (_, variables) => {
|
|
// Invalidate both counts and user reaction queries
|
|
queryClient.invalidateQueries({
|
|
queryKey: ['reactions', 'counts', {
|
|
articleId: variables.articleId,
|
|
liveBlogId: variables.liveBlogId,
|
|
commentId: variables.commentId
|
|
}]
|
|
});
|
|
queryClient.invalidateQueries({
|
|
queryKey: ['reactions', 'user', {
|
|
articleId: variables.articleId,
|
|
liveBlogId: variables.liveBlogId,
|
|
commentId: variables.commentId
|
|
}]
|
|
});
|
|
},
|
|
});
|
|
} |