remove hard reload
deploy to danak / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-07-03 17:16:22 +03:30
parent afc2701580
commit 70e71d7bdb
5 changed files with 77 additions and 25 deletions
+14 -12
View File
@@ -7,10 +7,12 @@ import { BrowserRouter } from 'react-router-dom'
import { QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query' import { QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ToastContainer } from 'react-toastify' import { ToastContainer } from 'react-toastify'
import Toast from '@/components/Toast' 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 MainRouter from './router/MainRouter'
import AuthRouter from './router/AuthRouter' import AuthRouter from './router/AuthRouter'
import { Paths } from './config/Paths'; import { Paths } from './config/Paths';
import { useSessionAuth } from './config/sessionAuth';
import { appNavigate, AppNavigation } from './config/navigation';
import type { IApiErrorRepsonse } from './shared/types/Types'; import type { IApiErrorRepsonse } from './shared/types/Types';
import { refreshToken } from './pages/auth/service/AuthService'; import { refreshToken } from './pages/auth/service/AuthService';
@@ -36,9 +38,9 @@ const queryClient = new QueryClient({
// اگر خطا از refresh endpoint است، refresh token منقضی شده // اگر خطا از refresh endpoint است، refresh token منقضی شده
if (isRefreshEndpoint) { if (isRefreshEndpoint) {
window.isRefreshTokenExpired = true; window.isRefreshTokenExpired = true;
await removeToken(); useSessionAuth.getState().clearSession();
await removeRefreshToken(); queryClient.clear();
window.location.href = Paths.auth.login; appNavigate(Paths.auth.login, { replace: true });
return; return;
} }
@@ -65,9 +67,9 @@ const queryClient = new QueryClient({
if (!refreshTokenValue) { if (!refreshTokenValue) {
window.isRefreshTokenExpired = true; window.isRefreshTokenExpired = true;
await removeToken(); useSessionAuth.getState().clearSession();
await removeRefreshToken(); queryClient.clear();
window.location.href = Paths.auth.login; appNavigate(Paths.auth.login, { replace: true });
return; return;
} }
@@ -106,10 +108,9 @@ const queryClient = new QueryClient({
window.isRefreshTokenExpired = true; window.isRefreshTokenExpired = true;
} }
// Clear tokens and redirect to login useSessionAuth.getState().clearSession();
await removeToken(); queryClient.clear();
await removeRefreshToken(); appNavigate(Paths.auth.login, { replace: true });
window.location.href = Paths.auth.login;
} }
} }
} }
@@ -125,11 +126,12 @@ const queryClient = new QueryClient({
const App: FC = () => { const App: FC = () => {
const isLoggedIn = getToken() const isLoggedIn = useSessionAuth((state) => state.isAuthenticated)
return ( return (
<QueryClientProvider client={queryClient}> <QueryClientProvider client={queryClient}>
<BrowserRouter> <BrowserRouter>
<AppNavigation />
{isLoggedIn ? <MainRouter /> : <AuthRouter />} {isLoggedIn ? <MainRouter /> : <AuthRouter />}
</BrowserRouter> </BrowserRouter>
<Toast /> <Toast />
+30
View File
@@ -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;
};
+19
View File
@@ -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 });
},
}));
+4 -2
View File
@@ -12,6 +12,8 @@ import { extractErrorMessage, setRefreshToken } from '../../../config/func'
import { setToken } from '../../../config/func' import { setToken } from '../../../config/func'
import { toast } from '@/shared/toast' import { toast } from '@/shared/toast'
import { Paths } from '@/config/Paths' import { Paths } from '@/config/Paths'
import { useSessionAuth } from '@/config/sessionAuth'
import { appNavigate } from '@/config/navigation'
const LoginStep2: FC = () => { const LoginStep2: FC = () => {
@@ -40,8 +42,8 @@ const LoginStep2: FC = () => {
onSuccess(data) { onSuccess(data) {
setToken(data?.data?.tokens?.accessToken?.token) setToken(data?.data?.tokens?.accessToken?.token)
setRefreshToken(data?.data?.tokens?.refreshToken?.token) setRefreshToken(data?.data?.tokens?.refreshToken?.token)
// Check if there's a redirect parameter in the URL useSessionAuth.getState().setAuthenticated(true)
window.location.href = Paths.home appNavigate(Paths.home, { replace: true })
}, },
onError(error) { onError(error) {
toast(extractErrorMessage(error), 'error') toast(extractErrorMessage(error), 'error')
+10 -11
View File
@@ -1,10 +1,10 @@
import type { FC, ReactNode } from 'react' import type { FC, MouseEvent, ReactNode } from 'react'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import { useQueryClient } from '@tanstack/react-query'
import { clx } from '../helpers/utils' import { clx } from '../helpers/utils'
import { Paths } from '../config/Paths' import { Paths } from '../config/Paths'
// import { useLogout } from '../pages/auth/hooks/useAuthData' import { useSessionAuth } from '../config/sessionAuth'
import { removeToken } from '../config/func' import { appNavigate } from '../config/navigation'
import { removeRefreshToken } from '../config/func'
import { useGetAdminMe } from '@/pages/admin/hooks/useAdminData' import { useGetAdminMe } from '@/pages/admin/hooks/useAdminData'
import type { PermissionItemType } from '@/pages/admin/types/Types' import type { PermissionItemType } from '@/pages/admin/types/Types'
@@ -22,14 +22,13 @@ type Props = {
const SideBarItem: FC<Props> = (props: Props) => { const SideBarItem: FC<Props> = (props: Props) => {
const { data:adminPermissions } = useGetAdminMe(); const { data:adminPermissions } = useGetAdminMe();
const queryClient = useQueryClient()
// const logout = useLogout() const handleLogout = (event: MouseEvent<HTMLAnchorElement>) => {
event.preventDefault()
const handleLogout = async () => { useSessionAuth.getState().clearSession()
// await logout.mutateAsync() queryClient.clear()
removeToken() appNavigate(Paths.auth.login, { replace: true })
removeRefreshToken()
window.location.href = Paths.auth.login
} }
const permissions: PermissionItemType[] = adminPermissions?.data?.role?.permissions ?? [] const permissions: PermissionItemType[] = adminPermissions?.data?.role?.permissions ?? []
const hasPermission = const hasPermission =