39 lines
1.5 KiB
TypeScript
39 lines
1.5 KiB
TypeScript
/** Утилиты форматирования для карточек канала (без React). */
|
|
|
|
export function formatTime(iso: string | null) {
|
|
if (!iso) return '—'
|
|
return new Date(iso).toLocaleString([], {
|
|
day: '2-digit',
|
|
month: '2-digit',
|
|
hour: '2-digit',
|
|
minute: '2-digit',
|
|
})
|
|
}
|
|
|
|
/** Минуты суток → «HH:MM:00» — формат `TimeOnly` на сервере. */
|
|
export function toTime(minutes: number): string {
|
|
const m = ((minutes % (24 * 60)) + 24 * 60) % (24 * 60)
|
|
return `${String(Math.floor(m / 60)).padStart(2, '0')}:${String(m % 60).padStart(2, '0')}:00`
|
|
}
|
|
|
|
/**
|
|
* Момент UTC во времени канала. Сетка задаётся в нём, поэтому предпросмотр показывается так же:
|
|
* локальное время админа тут только запутало бы.
|
|
*/
|
|
export function channelTime(iso: string, utcOffsetMinutes: number): Date {
|
|
return new Date(new Date(iso).getTime() + utcOffsetMinutes * 60_000)
|
|
}
|
|
|
|
/** «HH:MM» во времени канала. */
|
|
export function formatChannelTime(iso: string, utcOffsetMinutes: number): string {
|
|
const d = channelTime(iso, utcOffsetMinutes)
|
|
return `${String(d.getUTCHours()).padStart(2, '0')}:${String(d.getUTCMinutes()).padStart(2, '0')}`
|
|
}
|
|
|
|
/** ffmpeg-цвет (0xRRGGBB / имя) → CSS для превью-плашки. */
|
|
export function cssColor(value: string): string {
|
|
const v = value.trim()
|
|
if (v.startsWith('0x')) return `#${v.slice(2)}`
|
|
return v
|
|
}
|