114 lines
No EOL
3.5 KiB
JavaScript
114 lines
No EOL
3.5 KiB
JavaScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import productReviewService, { productReviewAdminService } from '@services/productReviewService';
|
|
import { useNotification } from './reduxHooks';
|
|
|
|
// User-facing review hooks
|
|
export const useProductReviews = (productId) => {
|
|
return useQuery({
|
|
queryKey: ['product-reviews', productId],
|
|
queryFn: () => productReviewService.getProductReviews(productId),
|
|
enabled: !!productId
|
|
});
|
|
};
|
|
|
|
export const useCanReviewProduct = (productId) => {
|
|
return useQuery({
|
|
queryKey: ['can-review-product', productId],
|
|
queryFn: () => productReviewService.canReviewProduct(productId),
|
|
enabled: !!productId
|
|
});
|
|
};
|
|
|
|
export const useAddProductReview = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: ({ productId, reviewData }) =>
|
|
productReviewService.addProductReview(productId, reviewData),
|
|
onSuccess: (data, variables) => {
|
|
// Invalidate reviews for this product
|
|
queryClient.invalidateQueries({ queryKey: ['product-reviews', variables.productId] });
|
|
queryClient.invalidateQueries({ queryKey: ['can-review-product', variables.productId] });
|
|
|
|
notification.showNotification(
|
|
data.message || 'Review submitted successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to submit review',
|
|
'error'
|
|
);
|
|
}
|
|
});
|
|
};
|
|
|
|
// Admin review hooks
|
|
export const usePendingReviews = () => {
|
|
return useQuery({
|
|
queryKey: ['pending-reviews'],
|
|
queryFn: productReviewAdminService.getPendingReviews
|
|
});
|
|
};
|
|
|
|
export const useAdminProductReviews = (productId) => {
|
|
return useQuery({
|
|
queryKey: ['admin-product-reviews', productId],
|
|
queryFn: () => productReviewAdminService.getProductReviews(productId),
|
|
enabled: !!productId
|
|
});
|
|
};
|
|
|
|
export const useApproveReview = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: (reviewId) => productReviewAdminService.approveReview(reviewId),
|
|
onSuccess: () => {
|
|
// Invalidate both pending reviews and product reviews
|
|
queryClient.invalidateQueries({ queryKey: ['pending-reviews'] });
|
|
queryClient.invalidateQueries({ queryKey: ['admin-product-reviews'] });
|
|
queryClient.invalidateQueries({ queryKey: ['product-reviews'] });
|
|
|
|
notification.showNotification(
|
|
'Review approved successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to approve review',
|
|
'error'
|
|
);
|
|
}
|
|
});
|
|
};
|
|
|
|
export const useDeleteReview = () => {
|
|
const queryClient = useQueryClient();
|
|
const notification = useNotification();
|
|
|
|
return useMutation({
|
|
mutationFn: (reviewId) => productReviewAdminService.deleteReview(reviewId),
|
|
onSuccess: () => {
|
|
// Invalidate both pending reviews and product reviews
|
|
queryClient.invalidateQueries({ queryKey: ['pending-reviews'] });
|
|
queryClient.invalidateQueries({ queryKey: ['admin-product-reviews'] });
|
|
queryClient.invalidateQueries({ queryKey: ['product-reviews'] });
|
|
|
|
notification.showNotification(
|
|
'Review deleted successfully',
|
|
'success'
|
|
);
|
|
},
|
|
onError: (error) => {
|
|
notification.showNotification(
|
|
error.message || 'Failed to delete review',
|
|
'error'
|
|
);
|
|
}
|
|
});
|
|
}; |