'use client'
import { useState } from 'react'
import { CalendarIcon } from 'lucide-react'
import { Button } from '@/registry/new-york/ui/button'
import { Calendar } from '@/registry/new-york/ui/calendar'
import { Input } from '@/registry/new-york/ui/input'
import { Label } from '@/registry/new-york/ui/label'
import { Popover, PopoverContent, PopoverTrigger } from '@/registry/new-york/ui/popover'
function formatDate(date: Date | undefined) {
if (!date) {
return ''
}
return date.toLocaleDateString('en-US', {
day: '2-digit',
month: 'long',
year: 'numeric'
})
}
function isValidDate(date: Date | undefined) {
if (!date) {
return false
}
return !isNaN(date.getTime())
}
const DatePickerWithinInputDemo = () => {
const [open, setOpen] = useState(false)
const [date, setDate] = useState<Date | undefined>(new Date())
const [month, setMonth] = useState<Date | undefined>(date)
const [value, setValue] = useState(formatDate(date))
return (
<div className='w-full max-w-xs space-y-2'>
<Label htmlFor='date' className='px-1'>
Date picker within input
</Label>
<div className='relative flex gap-2'>
<Input
id='date'
value={value}
placeholder='January 01, 2025'
className='bg-background pr-10'
onChange={e => {
const date = new Date(e.target.value)
setValue(e.target.value)
if (isValidDate(date)) {
setDate(date)
setMonth(date)
}
}}
onKeyDown={e => {
if (e.key === 'ArrowDown') {
e.preventDefault()
setOpen(true)
}
}}
/>
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button id='date-picker' variant='ghost' className='absolute top-1/2 right-2 size-6 -translate-y-1/2'>
<CalendarIcon className='size-3.5' />
<span className='sr-only'>Pick a date</span>
</Button>
</PopoverTrigger>
<PopoverContent className='w-auto overflow-hidden p-0' align='end' alignOffset={-8} sideOffset={10}>
<Calendar
mode='single'
selected={date}
month={month}
onMonthChange={setMonth}
onSelect={date => {
setDate(date)
setValue(formatDate(date))
setOpen(false)
}}
/>
</PopoverContent>
</Popover>
</div>
</div>
)
}
export default DatePickerWithinInputDemo