51 lines
1.8 KiB
JavaScript
51 lines
1.8 KiB
JavaScript
import { toFaDigits } from '@/utils/persian'
|
|
import { toJalaali } from '@/utils/date-utils'
|
|
|
|
const WEEKDAY_NAMES = ['شنبه', 'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه']
|
|
const MONTH_NAMES = [
|
|
'فروردین',
|
|
'اردیبهشت',
|
|
'خرداد',
|
|
'تیر',
|
|
'مرداد',
|
|
'شهریور',
|
|
'مهر',
|
|
'آبان',
|
|
'آذر',
|
|
'دی',
|
|
'بهمن',
|
|
'اسفند',
|
|
]
|
|
const GREGORIAN_WEEKDAYS = ['Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri']
|
|
const DAY_MS = 24 * 60 * 60 * 1000
|
|
|
|
/**
|
|
* Builds the current Jalaali week (Saturday → Friday) anchored to the Asia/Tehran
|
|
* timezone, independent of the viewer's local clock. The day matching Tehran's
|
|
* "today" is flagged `selected`. Returns `{ month, days }` for DashboardCalendar.
|
|
*/
|
|
export const useTehranCalendar = () => {
|
|
const parts = new Intl.DateTimeFormat('en-US', {
|
|
timeZone: 'Asia/Tehran',
|
|
year: 'numeric',
|
|
month: 'numeric',
|
|
day: 'numeric',
|
|
weekday: 'short',
|
|
}).formatToParts(new Date())
|
|
const part = (type) => parts.find((p) => p.type === type)?.value
|
|
const todayIndex = GREGORIAN_WEEKDAYS.indexOf(part('weekday'))
|
|
const todayUtc = Date.UTC(Number(part('year')), Number(part('month')) - 1, Number(part('day')))
|
|
const weekStartUtc = todayUtc - todayIndex * DAY_MS
|
|
|
|
const today = new Date(todayUtc)
|
|
const { jm } = toJalaali(today.getUTCFullYear(), today.getUTCMonth() + 1, today.getUTCDate())
|
|
|
|
const days = WEEKDAY_NAMES.map((weekday, i) => {
|
|
const date = new Date(weekStartUtc + i * DAY_MS)
|
|
const { jd } = toJalaali(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate())
|
|
return { weekday, day: toFaDigits(jd), selected: i === todayIndex }
|
|
})
|
|
|
|
return { month: `${MONTH_NAMES[jm - 1]} ماه`, days }
|
|
}
|