235 lines
No EOL
6.3 KiB
JavaScript
235 lines
No EOL
6.3 KiB
JavaScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import blogService from '@services/blogService';
|
|
import blogAdminService from '@services/blogAdminService';
|
|
import { useNotification } from './reduxHooks';
|
|
|
|
// Public blog hooks
|
|
export const useBlogPosts = (params) => {
|
|
return useQuery({
|
|
queryKey: ['blog-posts', params],
|
|
queryFn: () => blogService.getAllPosts(params),
|
|
});
|
|
};
|
|
|
|
export const useBlogPost = (slug) => {
|
|
return useQuery({
|
|
queryKey: ['blog-post', slug],
|
|
queryFn: () => blogService.getPostBySlug(slug),
|
|
enabled: !!slug,
|
|
});
|
|
};
|
|
|
|
export const useBlogCategories = () => {
|
|
return useQuery({
|
|
queryKey: ['blog-categories'],
|
|
queryFn: () => blogService.getAllCategories(),
|
|
});
|
|
};
|
|
|
|
export const useAddComment = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ postId, commentData }) => blogService.addComment(postId, commentData),
|
|
onSuccess: (data, variables) => {
|
|
queryClient.invalidateQueries({ queryKey: ['blog-post', variables.postId] });
|
|
notification.showNotification(
|
|
data.message || 'Comment added successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to add comment',
|
|
'error'
|
|
);
|
|
},
|
|
});
|
|
};
|
|
|
|
// Admin blog hooks
|
|
export const useAdminBlogPosts = () => {
|
|
return useQuery({
|
|
queryKey: ['admin-blog-posts'],
|
|
queryFn: () => blogAdminService.getAllPosts(),
|
|
});
|
|
};
|
|
|
|
export const useAdminBlogPost = (id) => {
|
|
return useQuery({
|
|
queryKey: ['admin-blog-post', id],
|
|
queryFn: () => blogAdminService.getPostById(id),
|
|
enabled: !!id,
|
|
});
|
|
};
|
|
|
|
export const useCreateBlogPost = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: (postData) => blogAdminService.createPost(postData),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['admin-blog-posts'] });
|
|
notification.showNotification(
|
|
'Blog post created successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to create blog post',
|
|
'error'
|
|
);
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useUpdateBlogPost = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ id, postData }) => blogAdminService.updatePost(id, postData),
|
|
onSuccess: (_, variables) => {
|
|
queryClient.invalidateQueries({ queryKey: ['admin-blog-posts'] });
|
|
queryClient.invalidateQueries({ queryKey: ['admin-blog-post', variables.id] });
|
|
notification.showNotification(
|
|
'Blog post updated successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to update blog post',
|
|
'error'
|
|
);
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useDeleteBlogPost = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: (id) => blogAdminService.deletePost(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['admin-blog-posts'] });
|
|
notification.showNotification(
|
|
'Blog post deleted successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to delete blog post',
|
|
'error'
|
|
);
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useUploadBlogImage = () => {
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ postId, imageData }) => blogAdminService.uploadImage(postId, imageData),
|
|
onSuccess: (_, variables) => {
|
|
notification.showNotification(
|
|
'Image uploaded successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to upload image',
|
|
'error'
|
|
);
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useDeleteBlogImage = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ postId, imageId }) => blogAdminService.deleteImage(postId, imageId),
|
|
onSuccess: (_, variables) => {
|
|
queryClient.invalidateQueries({ queryKey: ['admin-blog-post', variables.postId] });
|
|
notification.showNotification(
|
|
'Image deleted successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to delete image',
|
|
'error'
|
|
);
|
|
},
|
|
});
|
|
};
|
|
|
|
export const usePendingComments = () => {
|
|
return useQuery({
|
|
queryKey: ['pending-comments'],
|
|
queryFn: () => blogAdminService.getPendingComments(),
|
|
});
|
|
};
|
|
|
|
export const usePostComments = (postId) => {
|
|
return useQuery({
|
|
queryKey: ['post-comments', postId],
|
|
queryFn: () => blogAdminService.getPostComments(postId),
|
|
enabled: !!postId,
|
|
});
|
|
};
|
|
|
|
export const useApproveComment = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: (commentId) => blogAdminService.approveComment(commentId),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['pending-comments'] });
|
|
queryClient.invalidateQueries({ queryKey: ['post-comments'] });
|
|
notification.showNotification(
|
|
'Comment approved successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to approve comment',
|
|
'error'
|
|
);
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useDeleteComment = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: (commentId) => blogAdminService.deleteComment(commentId),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['pending-comments'] });
|
|
queryClient.invalidateQueries({ queryKey: ['post-comments'] });
|
|
notification.showNotification(
|
|
'Comment deleted successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to delete comment',
|
|
'error'
|
|
);
|
|
},
|
|
});
|
|
}; |