94 lines
2.4 KiB
TypeScript
94 lines
2.4 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
import toast from "react-hot-toast";
|
|
import { useTranslation } from "next-i18next";
|
|
import { useSession } from "next-auth/react";
|
|
|
|
const useUsers = () => {
|
|
const { status } = useSession();
|
|
|
|
return useQuery({
|
|
queryKey: ["users"],
|
|
queryFn: async () => {
|
|
const response = await fetch("/api/v1/users");
|
|
if (!response.ok) {
|
|
if (response.status === 401) {
|
|
window.location.href = "/dashboard";
|
|
}
|
|
throw new Error("Failed to fetch users.");
|
|
}
|
|
|
|
const data = await response.json();
|
|
return data.response;
|
|
},
|
|
enabled: status === "authenticated",
|
|
});
|
|
};
|
|
|
|
const useAddUser = () => {
|
|
const queryClient = useQueryClient();
|
|
const { t } = useTranslation();
|
|
|
|
return useMutation({
|
|
mutationFn: async (body: any) => {
|
|
if (body.password.length < 8) throw new Error(t("password_length_error"));
|
|
|
|
const load = toast.loading(t("creating_account"));
|
|
|
|
const response = await fetch("/api/v1/users", {
|
|
method: "POST",
|
|
body: JSON.stringify(body),
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
|
|
const data = await response.json();
|
|
if (!response.ok) throw new Error(data.response);
|
|
|
|
toast.dismiss(load);
|
|
|
|
return data.response;
|
|
},
|
|
onSuccess: (data) => {
|
|
queryClient.setQueryData(["users"], (oldData: any) => [...oldData, data]);
|
|
toast.success(t("user_created"));
|
|
},
|
|
onError: (error) => {
|
|
toast.error(error.message);
|
|
},
|
|
});
|
|
};
|
|
|
|
const useDeleteUser = () => {
|
|
const queryClient = useQueryClient();
|
|
const { t } = useTranslation();
|
|
|
|
return useMutation({
|
|
mutationFn: async (userId: number) => {
|
|
const load = toast.loading(t("deleting_user"));
|
|
|
|
const response = await fetch(`/api/v1/users/${userId}`, {
|
|
method: "DELETE",
|
|
});
|
|
|
|
const data = await response.json();
|
|
if (!response.ok) throw new Error(data.response);
|
|
|
|
toast.dismiss(load);
|
|
|
|
return data.response;
|
|
},
|
|
onSuccess: (data, variables) => {
|
|
queryClient.setQueryData(["users"], (oldData: any) =>
|
|
oldData.filter((user: any) => user.id !== variables)
|
|
);
|
|
toast.success(t("user_deleted"));
|
|
},
|
|
onError: (error) => {
|
|
toast.error(error.message);
|
|
},
|
|
});
|
|
};
|
|
|
|
export { useUsers, useAddUser, useDeleteUser };
|