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 { 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 />
+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 { 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
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 { 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 =