// User Admin React Query hooks import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { toast } from "react-hot-toast"; import { QUERY_KEYS as QUERY_KEY } from "../../../utils/query-key"; import { getUsers, getUser, searchUsers, createUser, updateUser, updateUserProfile, updateUserAvatar, deleteUser, verifyUser, unverifyUser, getUserStats, } from "./_requests"; import { User, UserFilters, CreateUserRequest, UpdateUserRequest, UpdateUserProfileRequest, UpdateUserAvatarRequest, PaginatedUsersResponse, } from "./_models"; // Get all users export const useUsers = (filters?: UserFilters) => { return useQuery({ queryKey: [QUERY_KEY.GET_USERS, filters], queryFn: () => getUsers(filters), staleTime: 5 * 60 * 1000, // 5 minutes }); }; // Get user by ID export const useUser = (id: string) => { return useQuery({ queryKey: [QUERY_KEY.GET_USER, id], queryFn: () => getUser(id), enabled: !!id, staleTime: 5 * 60 * 1000, }); }; // Search users with filters export const useSearchUsers = (filters: UserFilters) => { return useQuery({ queryKey: [QUERY_KEY.SEARCH_USERS, filters], queryFn: () => searchUsers(filters), enabled: Object.keys(filters).length > 0, staleTime: 2 * 60 * 1000, // 2 minutes for search results }); }; // Get user statistics export const useUserStats = () => { return useQuery({ queryKey: [QUERY_KEY.USER_STATS], queryFn: getUserStats, staleTime: 10 * 60 * 1000, // 10 minutes }); }; // Create user mutation export const useCreateUser = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (userData: CreateUserRequest) => createUser(userData), onSuccess: (data) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] }); toast.success("کاربر با موفقیت ایجاد شد"); }, onError: (error: any) => { const message = error?.response?.data?.message || "خطا در ایجاد کاربر"; toast.error(message); }, }); }; // Update user mutation export const useUpdateUser = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ id, userData, }: { id: string; userData: UpdateUserRequest; }) => updateUser(id, userData), onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USER, variables.id], }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] }); toast.success("کاربر با موفقیت به‌روزرسانی شد"); }, onError: (error: any) => { const message = error?.response?.data?.message || "خطا در به‌روزرسانی کاربر"; toast.error(message); }, }); }; // Update user profile mutation export const useUpdateUserProfile = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ id, userData, }: { id: string; userData: UpdateUserProfileRequest; }) => updateUserProfile(id, userData), onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USER, variables.id], }); toast.success("پروفایل کاربر با موفقیت به‌روزرسانی شد"); }, onError: (error: any) => { const message = error?.response?.data?.message || "خطا در به‌روزرسانی پروفایل"; toast.error(message); }, }); }; // Update user avatar mutation export const useUpdateUserAvatar = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ id, avatarData, }: { id: string; avatarData: UpdateUserAvatarRequest; }) => updateUserAvatar(id, avatarData), onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USER, variables.id], }); toast.success("تصویر کاربر با موفقیت به‌روزرسانی شد"); }, onError: (error: any) => { const message = error?.response?.data?.message || "خطا در به‌روزرسانی تصویر"; toast.error(message); }, }); }; // Delete user mutation export const useDeleteUser = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (id: string) => deleteUser(id), onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); queryClient.removeQueries({ queryKey: [QUERY_KEY.GET_USER, variables] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] }); toast.success("کاربر با موفقیت حذف شد"); }, onError: (error: any) => { const message = error?.response?.data?.message || "خطا در حذف کاربر"; toast.error(message); }, }); }; // Verify user mutation export const useVerifyUser = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (id: string) => verifyUser(id), onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USER, variables], }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] }); toast.success("کاربر با موفقیت تأیید شد"); }, onError: (error: any) => { const message = error?.response?.data?.message || "خطا در تأیید کاربر"; toast.error(message); }, }); }; // Unverify user mutation export const useUnverifyUser = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (id: string) => unverifyUser(id), onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USER, variables], }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] }); toast.success("تأیید کاربر لغو شد"); }, onError: (error: any) => { const message = error?.response?.data?.message || "خطا در لغو تأیید کاربر"; toast.error(message); }, }); };