172 lines
4.9 KiB
TypeScript
172 lines
4.9 KiB
TypeScript
import { OrdersStatus } from "@/app/profile/orders/types/Types";
|
|
import { TOKEN_NAME, REFRESH_TOKEN_NAME } from "./const";
|
|
|
|
export function isEmail(input: string): boolean {
|
|
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
return emailRegex.test(input);
|
|
}
|
|
|
|
export function NumberFormat(number: number): string {
|
|
return Intl.NumberFormat("fa-IR").format(number);
|
|
// return Intl.NumberFormat("fa-IR").format(number);
|
|
}
|
|
|
|
export const timeAgo = (date: string | Date): string => {
|
|
const now = new Date();
|
|
const past = new Date(date);
|
|
const diff = Math.floor((now.getTime() - past.getTime()) / 1000); // اختلاف بر حسب ثانیه
|
|
|
|
const units = [
|
|
{ name: "سال", value: 60 * 60 * 24 * 365 },
|
|
{ name: "ماه", value: 60 * 60 * 24 * 30 },
|
|
{ name: "روز", value: 60 * 60 * 24 },
|
|
{ name: "ساعت", value: 60 * 60 },
|
|
{ name: "دقیقه", value: 60 },
|
|
{ name: "ثانیه", value: 1 },
|
|
];
|
|
|
|
for (const unit of units) {
|
|
const amount = Math.floor(diff / unit.value);
|
|
if (amount >= 1) return `${amount} ${unit.name} پیش`;
|
|
}
|
|
|
|
return "همین الان";
|
|
};
|
|
export const getToken = async () => {
|
|
if (typeof window === "undefined") {
|
|
return null; // در سرور token موجود نیست
|
|
}
|
|
return localStorage.getItem(TOKEN_NAME);
|
|
};
|
|
|
|
export const isAuthenticated = async (): Promise<boolean> => {
|
|
if (typeof window === "undefined") {
|
|
return false; // در سرور همیشه false
|
|
}
|
|
|
|
const token = localStorage.getItem(TOKEN_NAME);
|
|
const refreshToken = localStorage.getItem(REFRESH_TOKEN_NAME);
|
|
|
|
// اگر هیچ توکنی وجود ندارد
|
|
if (!token && !refreshToken) {
|
|
return false;
|
|
}
|
|
|
|
// اگر توکن وجود دارد، فرض میکنیم معتبر است (axios interceptor refresh را هندل میکند)
|
|
if (token) {
|
|
return true;
|
|
}
|
|
|
|
// اگر فقط refresh token وجود دارد، سعی میکنیم refresh کنیم
|
|
if (refreshToken) {
|
|
try {
|
|
const { refreshToken: refreshTokenAPI } = await import(
|
|
"../app/auth/service/Service"
|
|
);
|
|
const data = await refreshTokenAPI({ token: refreshToken });
|
|
|
|
if (data?.results?.data?.accessToken?.token) {
|
|
await setToken(data.results.data.accessToken.token);
|
|
if (data.results.data.refreshToken?.token) {
|
|
await setRefreshToken(data.results.data.refreshToken.token);
|
|
}
|
|
return true;
|
|
}
|
|
} catch (error) {
|
|
console.error("خطا در refresh token:", error);
|
|
// پاک کردن توکنهای نامعتبر
|
|
await removeToken();
|
|
await removeRefreshToken();
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
export const getRefreshToken = async () => {
|
|
if (typeof window === "undefined") {
|
|
return null;
|
|
}
|
|
return localStorage.getItem(REFRESH_TOKEN_NAME);
|
|
};
|
|
|
|
export const setToken = (token: string) => {
|
|
if (typeof window === "undefined") {
|
|
return;
|
|
}
|
|
localStorage.setItem(TOKEN_NAME, token);
|
|
};
|
|
|
|
export const setRefreshToken = (refreshToken: string) => {
|
|
if (typeof window === "undefined") {
|
|
return;
|
|
}
|
|
localStorage.setItem(REFRESH_TOKEN_NAME, refreshToken);
|
|
};
|
|
|
|
export const removeToken = async () => {
|
|
if (typeof window === "undefined") {
|
|
return;
|
|
}
|
|
localStorage.removeItem(TOKEN_NAME);
|
|
};
|
|
|
|
export const removeRefreshToken = async () => {
|
|
if (typeof window === "undefined") {
|
|
return;
|
|
}
|
|
localStorage.removeItem(REFRESH_TOKEN_NAME);
|
|
};
|
|
|
|
export function toJalaliDate(
|
|
date: Date | string | number,
|
|
options?: Intl.DateTimeFormatOptions,
|
|
locale: string = "fa-IR-u-ca-persian"
|
|
): string {
|
|
const parsedDate = new Date(date);
|
|
|
|
if (isNaN(parsedDate.getTime())) {
|
|
return "";
|
|
throw new Error("Invalid date provided to toJalaliDate");
|
|
}
|
|
|
|
const defaultOptions: Intl.DateTimeFormatOptions = {
|
|
year: "numeric",
|
|
month: "numeric",
|
|
day: "numeric",
|
|
// weekday: "long",
|
|
// hour: "numeric",
|
|
// minute: "numeric",
|
|
};
|
|
|
|
const formatter = new Intl.DateTimeFormat(locale, {
|
|
...defaultOptions,
|
|
...options,
|
|
});
|
|
|
|
return formatter.format(parsedDate);
|
|
}
|
|
|
|
export function limitHtmlWords(htmlString: string, wordLimit: number): string {
|
|
// پاک کردن تگها
|
|
const plainText = htmlString.replace(/<[^>]*>/g, "");
|
|
|
|
// تقسیم و محدود کردن کلمات
|
|
const words = plainText.split(/\s+/).slice(0, wordLimit);
|
|
const result = words.join(" ") + "...";
|
|
|
|
return result;
|
|
}
|
|
|
|
export const getStatusText = (status: string) => {
|
|
const statusMap: { [key: string]: string } = {
|
|
[OrdersStatus.wait_payment]: "در انتظار پرداخت",
|
|
[OrdersStatus.process_by_seller]: "در حال پردازش",
|
|
[OrdersStatus.shipped]: "در حال ارسال",
|
|
[OrdersStatus.Delivered]: "تحویل شده",
|
|
[OrdersStatus.Cancelled]: "لغو شده",
|
|
[OrdersStatus.cancelled_system]: "لغو شده توسط سیستم",
|
|
};
|
|
return statusMap[status] || status;
|
|
};
|