11'use client'
22
33import { useMemo , useState } from 'react'
4+ import { z } from 'zod'
45import { ChevronLeft , ChevronRight } from '../../icons'
56import { cn } from '../../lib/cn'
67import { Chip , chipVariants } from '../chip/chip'
@@ -27,6 +28,7 @@ const WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] as const
2728
2829const DEFAULT_RANGE_START_TIME = '00:00'
2930const DEFAULT_RANGE_END_TIME = '23:59'
31+ const localDateTimePartsSchema = z . tuple ( [ z . iso . date ( ) , z . iso . time ( ) ] )
3032
3133function getDaysInMonth ( year : number , month : number ) : number {
3234 return new Date ( year , month + 1 , 0 ) . getDate ( )
@@ -155,10 +157,9 @@ export function parseDateTimeValue(value: string | Date | undefined): {
155157 const parsed = value instanceof Date ? value : new Date ( value )
156158 if ( Number . isNaN ( parsed . getTime ( ) ) ) return { date : null , time : null }
157159 if ( typeof value === 'string' ) {
158- const wallTime =
159- / ^ \d { 4 } - \d { 2 } - \d { 2 } T ( (?: [ 0 1 ] \d | 2 [ 0 - 3 ] ) : [ 0 - 5 ] \d (?: : [ 0 - 5 ] \d (?: \. \d { 1 , 9 } ) ? ) ? ) $ / . exec ( value )
160- if ( wallTime ) {
161- const time = wallTime [ 1 ]
160+ const wallTime = localDateTimePartsSchema . safeParse ( value . split ( 'T' ) )
161+ if ( wallTime . success ) {
162+ const [ , time ] = wallTime . data
162163 return {
163164 date : parsed ,
164165 time : time . length === 8 && time . endsWith ( ':00' ) ? time . slice ( 0 , 5 ) : time ,
0 commit comments