import React, { useMemo, useState } from 'react'; import { Modal, Pressable, Text, View } from 'react-native'; import { styles } from '../styles'; import { todayYMD } from '../utils/date'; const WEEKDAYS = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; function toYMD(date) { const y = date.getFullYear(); const m = `${date.getMonth() + 1}`.padStart(2, '0'); const d = `${date.getDate()}`.padStart(2, '0'); return `${y}-${m}-${d}`; } function parseFromYMD(value) { if (!value || !/^\d{4}-\d{2}-\d{2}$/.test(value)) return new Date(); const date = new Date(`${value}T00:00:00`); return Number.isNaN(date.getTime()) ? new Date() : date; } function monthLabel(date) { return date.toLocaleDateString(undefined, { month: 'long', year: 'numeric' }); } function buildMonthGrid(viewDate) { const first = new Date(viewDate.getFullYear(), viewDate.getMonth(), 1); const startWeekday = (first.getDay() + 6) % 7; const daysInMonth = new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 0).getDate(); const cells = []; for (let i = 0; i < startWeekday; i += 1) cells.push(null); for (let day = 1; day <= daysInMonth; day += 1) { cells.push(new Date(viewDate.getFullYear(), viewDate.getMonth(), day)); } while (cells.length % 7 !== 0) cells.push(null); return cells; } export default function DatePickerModal({ visible, value, onClose, onSelect, title = 'Pick date' }) { const [viewDate, setViewDate] = useState(parseFromYMD(value || todayYMD())); const grid = useMemo(() => buildMonthGrid(viewDate), [viewDate]); const selected = value || todayYMD(); const goMonth = (diff) => { setViewDate((prev) => new Date(prev.getFullYear(), prev.getMonth() + diff, 1)); }; return ( {title} Close goMonth(-1)}> {monthLabel(viewDate)} goMonth(1)}> {WEEKDAYS.map((w) => ( {w} ))} {grid.map((cell, idx) => { if (!cell) return ; const ymd = toYMD(cell); const isSelected = ymd === selected; return ( onSelect(ymd)}> {cell.getDate()} ); })} ); }