marco.pms.web/src/hooks/useAuth.jsx

191 lines
5.1 KiB
JavaScript

import { useState, useEffect, useCallback } from "react";
import {
Mutation,
useMutation,
useQuery,
useQueryClient,
} from "@tanstack/react-query";
import { Link, useNavigate } from "react-router-dom";
import AuthRepository from "../repositories/AuthRepository.jsx";
import { useDispatch, useSelector } from "react-redux";
import {
closeAuthModal,
closeModal,
openAuthModal,
openModal,
setSelfTenant,
toggleModal,
} from "../slices/localVariablesSlice.jsx";
import { removeSession } from "../utils/authUtils.js";
import { cacheProfileData } from "../slices/apiDataManager.jsx";
import { blockUI } from "../utils/blockUI.js";
import showToast from "../services/toastService";
// ----------------------------Modal--------------------------
export const useModal = (modalType) => {
const dispatch = useDispatch();
const modalState = useSelector(
(state) => state.localVariables.modals[modalType] || {}
);
const { isOpen = false, data = null } = modalState;
const onOpen = (payload = {}) =>
dispatch(openModal({ modalType, data: payload }));
const onClose = () => dispatch(closeModal({ modalType }));
const onToggle = () => dispatch(toggleModal({ modalType }));
return { isOpen, data, onOpen, onClose, onToggle };
};
export const useSubscription = (frequency) => {
return useQuery({
queryKey: ["subscriptionPlans", frequency],
queryFn: async () => {
const resp = await AuthRepository.getSubscription(frequency);
return resp.data;
},
});
};
// -------------------APIHook-------------------------------------
export const useTenants = () => {
return useQuery({
queryKey: ["tenantlist"],
queryFn: async () => await AuthRepository.getTenantList(),
});
};
export const useSelectTenant = (onSuccessCallBack) => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async (tenantId) => {
const res = await AuthRepository.selectTenant(tenantId);
return res.data;
},
onSuccess: (data) => {
if (localStorage.getItem("jwtToken")) {
localStorage.setItem("jwtToken", data.token);
localStorage.setItem("refreshToken", data.refreshToken);
} else {
sessionStorage.setItem("jwtToken", data.token);
sessionStorage.setItem("refreshToken", data.refreshToken);
}
if (onSuccessCallBack) onSuccessCallBack();
},
onError: (error) => {
showToast(error.message || "Error while creating project", "error");
localStorage.removeItem("jwtToken");
localStorage.removeItem("refreshToken");
localStorage.removeItem("ctnt");
},
});
};
export const useCreateSelfTenant = (onSuccessCallBack, onFailureCallBack) => {
const dispatch = useDispatch();
return useMutation({
mutationFn: async (payload) => {
const resp = await AuthRepository.createSuscription(payload);
return resp.data;
},
onSuccess: (response, variables) => {
dispatch(
setSelfTenant({
tenantEnquireId: response?.id,
planId: null,
details: response,
})
);
if (onSuccessCallBack) onSuccessCallBack(response);
},
onError: (error) => {
showToast(
`${error?.response?.data?.errors || ""} ${
error?.response?.data?.message || ""
} ${error?.response?.data?.statusCode || ""}`.trim() ||
error?.message ||
"Something went wrong, please try again!",
"error"
);
if (onFailureCallBack) onFailureCallBack();
},
});
};
export const useSelfGetSubscription = (onSuccessCallBack,onFailureCallBack) => {
const dispatch = useDispatch();
return useMutation({
mutationFn: async (payload) => {
blockUI();
const resp = await AuthRepository.selfCreateSubscription(payload);
return resp.data;
},
onSuccess: (response, variables) => {
if (onSuccessCallBack) onSuccessCallBack(response);
},
onError: (error) => {
showToast("Somthing worng went happend", "error");
if (onFailureCallBack) onFailureCallBack();
},
});
};
export const useAuthModal = () => {
const dispatch = useDispatch();
const { isOpen } = useSelector((state) => state.localVariables.AuthModal);
return {
isOpen,
onOpen: () => dispatch(openAuthModal()),
onClose: () => dispatch(closeAuthModal()),
};
};
export const useLogout = () => {
const queryClient = useQueryClient();
const navigate = useNavigate();
const dispatch = useDispatch();
return useMutation({
mutationFn: async () => {
const refreshToken =
localStorage.getItem("refreshToken") ||
sessionStorage.getItem("refreshToken");
if (!refreshToken) return; // no call if already removed
return await AuthRepository.logout({ refreshToken });
},
onMutate: async () => {
// Cancel all ongoing queries
await queryClient.cancelQueries();
},
onSuccess: () => {
queryClient.clear();
removeSession();
dispatch(cacheProfileData(null));
navigate("/auth/login", { replace: true });
},
onError: () => {
removeSession();
queryClient.clear();
navigate("/auth/login", { replace: true });
},
});
};