/** * Converts a datetime-local input value (local time, no timezone info) * to a UTC ISO string for server submission. * * `datetime-local` inputs use the format "YYYY-MM-DDTHH:MM" and do NOT accept * ISO strings with a timezone designator (e.g. "2026-03-11T17:00:00.000Z"). * Setting an ISO UTC string directly on a datetime-local input causes the browser * to silently clear the field value. Use this function with a separate hidden input * to hold the converted UTC value before form submission. * * Returns null when value is empty, nullish, or not a valid date. * * NOTE: The returned ISO string (e.g. "2026-03-11T17:00:00.000Z") is intentionally * incompatible with datetime-local inputs, which only accept "YYYY-MM-DDTHH:MM". * Setting a Z-suffixed string on a datetime-local input causes browsers to silently * clear the field. Always write the result to a separate hidden input, not back to * the datetime-local input itself. */ import { format, parseISO } from "date-fns"; /** * Format a YYYY-MM-DD date string for display (e.g. "Apr 9"). * Returns null when the value is missing or unparseable — callers decide how to handle that case. */ export function formatEventDate(dateStr: string | null | undefined): string | null { if (!dateStr) return null; try { return format(parseISO(dateStr), "MMM d"); } catch { return null; } } export function localDateTimeToUtcIso(value: string | null | undefined): string | null { if (!value) return null; const date = new Date(value); if (isNaN(date.getTime())) return null; return date.toISOString(); }