import { isDefined } from '@typebot.io/lib' import { ParsedReply } from '../../../types' import { DateInputBlock } from '@typebot.io/schemas' import { parse as chronoParse } from 'chrono-node' import { format } from 'date-fns' import { defaultDateInputOptions } from '@typebot.io/schemas/features/blocks/inputs/date/constants' export const parseDateReply = ( reply: string, block: DateInputBlock ): ParsedReply => { const parsedDate = chronoParse(reply) if (parsedDate.length === 0) return { status: 'fail' } const formatString = block.options?.format ?? (block.options?.hasTime ? defaultDateInputOptions.formatWithTime : defaultDateInputOptions.format) const detectedStartDate = parseDateWithNeutralTimezone( parsedDate[0].start.date() ) const startDate = format(detectedStartDate, formatString) const detectedEndDate = parsedDate[0].end?.date() ? parseDateWithNeutralTimezone(parsedDate[0].end?.date()) : undefined const endDate = detectedEndDate ? format(detectedEndDate, formatString) : undefined if (block.options?.isRange && !endDate) return { status: 'fail' } const max = block.options?.max if ( isDefined(max) && (detectedStartDate > new Date(max) || (detectedEndDate && detectedEndDate > new Date(max))) ) return { status: 'fail' } const min = block.options?.min if ( isDefined(min) && (detectedStartDate < new Date(min) || (detectedEndDate && detectedEndDate < new Date(min))) ) return { status: 'fail' } return { status: 'success', reply: block.options?.isRange ? `${startDate} to ${endDate}` : startDate, } } const parseDateWithNeutralTimezone = (date: Date) => new Date(date.valueOf() + date.getTimezoneOffset() * 60 * 1000)