This commit is contained in:
+14
-12
@@ -7,10 +7,12 @@ import { BrowserRouter } from 'react-router-dom'
|
||||
import { QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
||||
import { ToastContainer } from 'react-toastify'
|
||||
import Toast from '@/components/Toast'
|
||||
import { getRefreshToken, getToken, removeRefreshToken, removeToken, setRefreshToken, setToken } from './config/func'
|
||||
import { getRefreshToken, setRefreshToken, setToken } from './config/func'
|
||||
import MainRouter from './router/MainRouter'
|
||||
import AuthRouter from './router/AuthRouter'
|
||||
import { Paths } from './config/Paths';
|
||||
import { useSessionAuth } from './config/sessionAuth';
|
||||
import { appNavigate, AppNavigation } from './config/navigation';
|
||||
import type { IApiErrorRepsonse } from './shared/types/Types';
|
||||
import { refreshToken } from './pages/auth/service/AuthService';
|
||||
|
||||
@@ -36,9 +38,9 @@ const queryClient = new QueryClient({
|
||||
// اگر خطا از refresh endpoint است، refresh token منقضی شده
|
||||
if (isRefreshEndpoint) {
|
||||
window.isRefreshTokenExpired = true;
|
||||
await removeToken();
|
||||
await removeRefreshToken();
|
||||
window.location.href = Paths.auth.login;
|
||||
useSessionAuth.getState().clearSession();
|
||||
queryClient.clear();
|
||||
appNavigate(Paths.auth.login, { replace: true });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -65,9 +67,9 @@ const queryClient = new QueryClient({
|
||||
|
||||
if (!refreshTokenValue) {
|
||||
window.isRefreshTokenExpired = true;
|
||||
await removeToken();
|
||||
await removeRefreshToken();
|
||||
window.location.href = Paths.auth.login;
|
||||
useSessionAuth.getState().clearSession();
|
||||
queryClient.clear();
|
||||
appNavigate(Paths.auth.login, { replace: true });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -106,10 +108,9 @@ const queryClient = new QueryClient({
|
||||
window.isRefreshTokenExpired = true;
|
||||
}
|
||||
|
||||
// Clear tokens and redirect to login
|
||||
await removeToken();
|
||||
await removeRefreshToken();
|
||||
window.location.href = Paths.auth.login;
|
||||
useSessionAuth.getState().clearSession();
|
||||
queryClient.clear();
|
||||
appNavigate(Paths.auth.login, { replace: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,11 +126,12 @@ const queryClient = new QueryClient({
|
||||
|
||||
const App: FC = () => {
|
||||
|
||||
const isLoggedIn = getToken()
|
||||
const isLoggedIn = useSessionAuth((state) => state.isAuthenticated)
|
||||
|
||||
return (
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<BrowserRouter>
|
||||
<AppNavigation />
|
||||
{isLoggedIn ? <MainRouter /> : <AuthRouter />}
|
||||
</BrowserRouter>
|
||||
<Toast />
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
import { useEffect, type FC } from "react";
|
||||
import { useNavigate, type NavigateOptions } from "react-router-dom";
|
||||
|
||||
let navigateRef: ReturnType<typeof useNavigate> | null = null;
|
||||
|
||||
export const setAppNavigate = (navigate: ReturnType<typeof useNavigate>) => {
|
||||
navigateRef = navigate;
|
||||
};
|
||||
|
||||
export const appNavigate = (to: string, options?: NavigateOptions) => {
|
||||
if (navigateRef) {
|
||||
navigateRef(to, options);
|
||||
return;
|
||||
}
|
||||
|
||||
window.location.assign(to);
|
||||
};
|
||||
|
||||
export const AppNavigation: FC = () => {
|
||||
const navigate = useNavigate();
|
||||
|
||||
useEffect(() => {
|
||||
setAppNavigate(navigate);
|
||||
return () => {
|
||||
navigateRef = null;
|
||||
};
|
||||
}, [navigate]);
|
||||
|
||||
return null;
|
||||
};
|
||||
@@ -0,0 +1,19 @@
|
||||
import { create } from "zustand";
|
||||
import { getToken, removeRefreshToken, removeToken } from "./func";
|
||||
|
||||
type SessionAuthStore = {
|
||||
isAuthenticated: boolean;
|
||||
setAuthenticated: (value: boolean) => void;
|
||||
clearSession: () => void;
|
||||
};
|
||||
|
||||
export const useSessionAuth = create<SessionAuthStore>((set) => ({
|
||||
isAuthenticated: !!getToken(),
|
||||
setAuthenticated: (value) => set({ isAuthenticated: value }),
|
||||
clearSession: () => {
|
||||
removeToken();
|
||||
removeRefreshToken();
|
||||
window.isRefreshTokenExpired = false;
|
||||
set({ isAuthenticated: false });
|
||||
},
|
||||
}));
|
||||
@@ -12,6 +12,8 @@ import { extractErrorMessage, setRefreshToken } from '../../../config/func'
|
||||
import { setToken } from '../../../config/func'
|
||||
import { toast } from '@/shared/toast'
|
||||
import { Paths } from '@/config/Paths'
|
||||
import { useSessionAuth } from '@/config/sessionAuth'
|
||||
import { appNavigate } from '@/config/navigation'
|
||||
|
||||
const LoginStep2: FC = () => {
|
||||
|
||||
@@ -40,8 +42,8 @@ const LoginStep2: FC = () => {
|
||||
onSuccess(data) {
|
||||
setToken(data?.data?.tokens?.accessToken?.token)
|
||||
setRefreshToken(data?.data?.tokens?.refreshToken?.token)
|
||||
// Check if there's a redirect parameter in the URL
|
||||
window.location.href = Paths.home
|
||||
useSessionAuth.getState().setAuthenticated(true)
|
||||
appNavigate(Paths.home, { replace: true })
|
||||
},
|
||||
onError(error) {
|
||||
toast(extractErrorMessage(error), 'error')
|
||||
|
||||
+10
-11
@@ -1,10 +1,10 @@
|
||||
import type { FC, ReactNode } from 'react'
|
||||
import type { FC, MouseEvent, ReactNode } from 'react'
|
||||
import { Link } from 'react-router-dom'
|
||||
import { useQueryClient } from '@tanstack/react-query'
|
||||
import { clx } from '../helpers/utils'
|
||||
import { Paths } from '../config/Paths'
|
||||
// import { useLogout } from '../pages/auth/hooks/useAuthData'
|
||||
import { removeToken } from '../config/func'
|
||||
import { removeRefreshToken } from '../config/func'
|
||||
import { useSessionAuth } from '../config/sessionAuth'
|
||||
import { appNavigate } from '../config/navigation'
|
||||
import { useGetAdminMe } from '@/pages/admin/hooks/useAdminData'
|
||||
import type { PermissionItemType } from '@/pages/admin/types/Types'
|
||||
|
||||
@@ -22,14 +22,13 @@ type Props = {
|
||||
const SideBarItem: FC<Props> = (props: Props) => {
|
||||
|
||||
const { data:adminPermissions } = useGetAdminMe();
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
// const logout = useLogout()
|
||||
|
||||
const handleLogout = async () => {
|
||||
// await logout.mutateAsync()
|
||||
removeToken()
|
||||
removeRefreshToken()
|
||||
window.location.href = Paths.auth.login
|
||||
const handleLogout = (event: MouseEvent<HTMLAnchorElement>) => {
|
||||
event.preventDefault()
|
||||
useSessionAuth.getState().clearSession()
|
||||
queryClient.clear()
|
||||
appNavigate(Paths.auth.login, { replace: true })
|
||||
}
|
||||
const permissions: PermissionItemType[] = adminPermissions?.data?.role?.permissions ?? []
|
||||
const hasPermission =
|
||||
|
||||
Reference in New Issue
Block a user