admin/src/pages/users-admin/core/_hooks.ts

228 lines
6.5 KiB
TypeScript

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