228 lines
6.5 KiB
TypeScript
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);
|
|
},
|
|
});
|
|
};
|