Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
138 lines
4.6 KiB
TypeScript
138 lines
4.6 KiB
TypeScript
import jalaali from 'jalaali-js'
|
|
import dayjs from 'dayjs'
|
|
import utc from 'dayjs/plugin/utc'
|
|
import timezone from 'dayjs/plugin/timezone'
|
|
|
|
dayjs.extend(utc)
|
|
dayjs.extend(timezone)
|
|
|
|
export const convertToDateString = (dateString: string): string => {
|
|
const date = dayjs(dateString)
|
|
|
|
if (date.year() === 1 || Number.isNaN(date.year())) return 'نا مشخص'
|
|
const jalaaliDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date())
|
|
|
|
return `${jalaaliDate.jy}/${String(jalaaliDate.jm).padStart(2, '0')}/${String(jalaaliDate.jd).padStart(2, '0')}`
|
|
}
|
|
|
|
interface PersianDateValue {
|
|
year: number
|
|
month: number | { number: number }
|
|
day: number
|
|
hour?: number
|
|
minute?: number
|
|
second?: number
|
|
}
|
|
|
|
export const convertToISOFormat = (dateObject: PersianDateValue) => {
|
|
const { year, month, day, hour, minute, second } = dateObject
|
|
const monthNumber = typeof month === 'number' ? month : month.number
|
|
const { gy, gm, gd } = jalaali.toGregorian(year, monthNumber, day)
|
|
const date = dayjs(new Date(gy, gm - 1, gd, hour || 0, minute || 0, second || 0))
|
|
|
|
return date.format('YYYY-MM-DDTHH:mm:ss.SSSZ')
|
|
}
|
|
|
|
const calculateDuration = (durSeconds: number) => {
|
|
let hour, minute, seconds
|
|
|
|
seconds = Math.floor(durSeconds)
|
|
minute = Math.floor(seconds / 60)
|
|
seconds = seconds % 60
|
|
hour = Math.floor(minute / 60)
|
|
minute = minute % 60
|
|
const day = Math.floor(hour / 24)
|
|
|
|
hour = hour % 24
|
|
let duration = ''
|
|
|
|
if (day) return 'بیش از یک روز'
|
|
if (hour) {
|
|
duration += `${hour} ساعت`
|
|
if (minute) {
|
|
duration += ' و '
|
|
duration += `${minute} دقیقه`
|
|
}
|
|
if (seconds) {
|
|
duration += ' و '
|
|
duration += `${seconds} ثانیه`
|
|
}
|
|
|
|
return duration
|
|
}
|
|
if (minute) {
|
|
duration += `${minute} دقیقه`
|
|
if (seconds) {
|
|
duration += ' و '
|
|
duration += `${seconds} ثانیه`
|
|
}
|
|
|
|
return duration
|
|
}
|
|
if (seconds) duration += `${seconds} ثانیه`
|
|
|
|
return duration.length ? duration : '0 ثانیه'
|
|
}
|
|
|
|
type DateInput = string | number | Date | null | undefined
|
|
|
|
export const getDate = (input: DateInput, outFormat: string | null = 'jYYYY/jMM/jDD', inFormat: string | null = 'YYYY-MM-DDTHH:mm:ssZ') => {
|
|
const storageTimeZone = '+0330'
|
|
const resolvedOutFormat = outFormat ?? 'jYYYY/jMM/jDD'
|
|
const resolvedInFormat = inFormat ?? 'YYYY-MM-DDTHH:mm:ssZ'
|
|
|
|
if ((input === null || input === undefined || input === '') && resolvedInFormat !== 'calculateDuration') return null
|
|
|
|
const inputText = String(input)
|
|
|
|
if (inputText.startsWith('-')) return 'Invalid Date'
|
|
|
|
if (resolvedOutFormat === 'duration') {
|
|
return dayjs.unix(Number(input)).diff(dayjs(), 'days')
|
|
}
|
|
|
|
if (resolvedInFormat === 'calculateDuration') {
|
|
return calculateDuration(Number(input))
|
|
}
|
|
|
|
if (resolvedOutFormat === 'HH:MM - jYYYY/jMM/jDD') {
|
|
const date = dayjs(input).utcOffset(storageTimeZone)
|
|
const jDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date())
|
|
|
|
return `${date.format('HH:mm')} - ${jDate.jy}/${String(jDate.jm).padStart(2, '0')}/${String(jDate.jd).padStart(2, '0')}`
|
|
}
|
|
|
|
if (resolvedInFormat === 'timestamp' && resolvedOutFormat !== 'jalaliDay' && resolvedOutFormat !== 'jalaliMonth') {
|
|
const date = dayjs.unix(Number(input)).utcOffset(storageTimeZone)
|
|
const jDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date())
|
|
|
|
return `${jDate.jy}/${String(jDate.jm).padStart(2, '0')}/${String(jDate.jd).padStart(2, '0')}`
|
|
}
|
|
|
|
if (resolvedInFormat === 'timestamp' && resolvedOutFormat === 'jalaliDay') {
|
|
const weekDays = ['یکشنبه', 'دوشنبه', 'سهشنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه']
|
|
|
|
return weekDays[dayjs.unix(Number(input)).utcOffset(storageTimeZone).day()]
|
|
}
|
|
|
|
if (resolvedInFormat === 'timestamp' && resolvedOutFormat === 'jalaliMonth') {
|
|
const jalaliMonths = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند']
|
|
const date = dayjs.unix(Number(input)).utcOffset(storageTimeZone)
|
|
const jDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date())
|
|
|
|
return jalaliMonths[jDate.jm - 1] || 'نا معلوم'
|
|
}
|
|
|
|
if (dayjs(input, resolvedInFormat).isValid()) {
|
|
const date = dayjs(input, resolvedInFormat)
|
|
const jDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date())
|
|
|
|
return resolvedOutFormat
|
|
.replace('jYYYY', jDate.jy.toString())
|
|
.replace('jMM', String(jDate.jm).padStart(2, '0'))
|
|
.replace('jDD', String(jDate.jd).padStart(2, '0'))
|
|
}
|
|
|
|
return 'ثبت نشده'
|
|
}
|