import { DEFAULT_SCHEDULE_START_TIME, DEFAULT_SCHEDULE_END_TIME, SCHEDULE_MINUTE_STEP, } from '@mp-pilates/shared' function buildHourOptions(): string[] { const startHour = parseInt(DEFAULT_SCHEDULE_START_TIME.slice(0, 2), 10) const endHour = parseInt(DEFAULT_SCHEDULE_END_TIME.slice(0, 2), 10) const list: string[] = [] for (let h = startHour; h <= endHour; h++) { list.push(String(h).padStart(2, '0')) } return list } function buildMinuteOptions(): string[] { const list: string[] = [] for (let m = 0; m < 60; m += SCHEDULE_MINUTE_STEP) { list.push(String(m).padStart(2, '0')) } return list } export const SCHEDULE_HOUR_OPTIONS = buildHourOptions() export const SCHEDULE_MINUTE_OPTIONS = buildMinuteOptions() export const SCHEDULE_TIME_PICKER_RANGE = [SCHEDULE_HOUR_OPTIONS, SCHEDULE_MINUTE_OPTIONS] export function timeToMinutes(time: string): number { const [h, m] = time.split(':').map(Number) return h * 60 + (m || 0) } export function minutesToTime(total: number): string { const h = Math.floor(total / 60) const m = total % 60 return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}` } export function timeToPickerIndex(time: string): number[] { let total = timeToMinutes(time || DEFAULT_SCHEDULE_START_TIME) const minTotal = timeToMinutes(DEFAULT_SCHEDULE_START_TIME) const maxTotal = timeToMinutes(DEFAULT_SCHEDULE_END_TIME) total = Math.max(minTotal, Math.min(maxTotal, total)) total = Math.round(total / SCHEDULE_MINUTE_STEP) * SCHEDULE_MINUTE_STEP total = Math.max(minTotal, Math.min(maxTotal, total)) const hour = String(Math.floor(total / 60)).padStart(2, '0') const minute = String(total % 60).padStart(2, '0') return [ Math.max(0, SCHEDULE_HOUR_OPTIONS.indexOf(hour)), Math.max(0, SCHEDULE_MINUTE_OPTIONS.indexOf(minute)), ] } export function pickerIndexToTime(value: number[]): string { const hour = SCHEDULE_HOUR_OPTIONS[value[0]] ?? SCHEDULE_HOUR_OPTIONS[0] const minute = SCHEDULE_MINUTE_OPTIONS[value[1]] ?? SCHEDULE_MINUTE_OPTIONS[0] return `${hour}:${minute}` } /** 将 "HH:mm" 加一小时,不超过当日最晚结束时间 21:30 */ export function addOneHourCapped(time: string): string { const next = timeToMinutes(time) + 60 const cap = timeToMinutes(DEFAULT_SCHEDULE_END_TIME) return minutesToTime(Math.min(next, cap)) }