admin/helpers/dates.ts
alisaza e1eaf5eff5 feat: initial ghabilee-admin backoffice app
Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js
app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
2026-09-05 13:12:59 +03:30

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 'ثبت نشده'
}