structure + layout header sidebar
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
export const Paths = {
|
||||
home: '/home',
|
||||
myOrders: '/my-orders',
|
||||
preFactors: '/pre-factors',
|
||||
tickets: {
|
||||
list: '/tickets',
|
||||
},
|
||||
announcement: {
|
||||
list: '/announcement',
|
||||
},
|
||||
criticisms: '/criticisms',
|
||||
learning: '/learning',
|
||||
auth: {
|
||||
login: '/auth/login',
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import axios from "axios";
|
||||
import { getToken } from "./func";
|
||||
|
||||
const instance = axios.create({
|
||||
baseURL: import.meta.env.VITE_API_URL || "http://localhost:3000/api",
|
||||
timeout: 10000,
|
||||
});
|
||||
|
||||
instance.interceptors.request.use(
|
||||
(config) => {
|
||||
const token = getToken();
|
||||
if (token) {
|
||||
config.headers.Authorization = `Bearer ${token}`;
|
||||
}
|
||||
return config;
|
||||
},
|
||||
(error) => {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
instance.interceptors.response.use(
|
||||
(response) => response,
|
||||
(error) => {
|
||||
if (error.response?.status === 401) {
|
||||
// Handle unauthorized
|
||||
console.log("Unauthorized");
|
||||
}
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
export default instance;
|
||||
@@ -0,0 +1,47 @@
|
||||
const TOKEN_NAME = import.meta.env.VITE_TOKEN_NAME;
|
||||
const REFRESH_TOKEN_NAME = import.meta.env.VITE_REFRESH_TOKEN_NAME;
|
||||
|
||||
export const getToken = () => {
|
||||
return localStorage.getItem(TOKEN_NAME);
|
||||
};
|
||||
|
||||
export const setToken = (token: string) => {
|
||||
localStorage.setItem(TOKEN_NAME, token);
|
||||
};
|
||||
|
||||
export const removeToken = () => {
|
||||
localStorage.removeItem(TOKEN_NAME);
|
||||
};
|
||||
|
||||
export const getRefreshToken = () => {
|
||||
return localStorage.getItem(REFRESH_TOKEN_NAME);
|
||||
};
|
||||
|
||||
export const setRefreshToken = (refreshToken: string) => {
|
||||
localStorage.setItem(REFRESH_TOKEN_NAME, refreshToken);
|
||||
};
|
||||
|
||||
export const removeRefreshToken = () => {
|
||||
localStorage.removeItem(REFRESH_TOKEN_NAME);
|
||||
};
|
||||
|
||||
export const timeAgo = (dateString: string): string => {
|
||||
const date = new Date(dateString);
|
||||
const now = new Date();
|
||||
const diffInMs = now.getTime() - date.getTime();
|
||||
const diffInMinutes = Math.floor(diffInMs / (1000 * 60));
|
||||
const diffInHours = Math.floor(diffInMinutes / 60);
|
||||
const diffInDays = Math.floor(diffInHours / 24);
|
||||
|
||||
if (diffInMinutes < 1) return "همین الان";
|
||||
if (diffInMinutes < 60) return `${diffInMinutes} دقیقه پیش`;
|
||||
if (diffInHours < 24) return `${diffInHours} ساعت پیش`;
|
||||
if (diffInDays < 7) return `${diffInDays} روز پیش`;
|
||||
|
||||
return date.toLocaleDateString("fa-IR");
|
||||
};
|
||||
|
||||
export const NumberFormat = (num?: number): string => {
|
||||
if (!num) return "0";
|
||||
return num.toLocaleString("fa-IR");
|
||||
};
|
||||
Reference in New Issue
Block a user