tasko/components/ui/date-picker.tsx

120 lines
2.6 KiB
TypeScript
Raw Permalink Normal View History

'use client';
import * as React from 'react';
import { toast } from 'sonner';
import { format } from 'date-fns';
import { Calendar as CalendarIcon } from 'lucide-react';
import { cn } from '@/lib/utils';
import { Button } from '@/components/ui/button';
import { Calendar } from '@/components/ui/calendar';
import {
Popover,
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
import { updateCard } from '@/actions/update-card';
import { useAction } from '@/hooks/use-action';
import { CardWithList } from '@/types';
interface DatePickerProps {
2024-11-08 01:29:32 +00:00
type: 'dueDate' | 'startedAtDate';
variant?:
| 'outline'
| 'default'
| 'gray'
| 'destructive'
| 'secondary'
| 'ghost'
| 'link'
| 'primary'
| 'transparent';
className?: string;
size?: 'default' | 'sm' | 'lg' | 'icon' | 'inline';
placeholder?: string;
afterSelectText?: string;
boardId?: string;
card?: CardWithList;
}
export function DatePicker({
2024-11-08 01:29:32 +00:00
type,
variant,
className,
size,
placeholder,
afterSelectText,
boardId,
card,
}: DatePickerProps) {
const [date, setDate] = React.useState<Date>();
const { execute, isLoading } = useAction(updateCard, {
onSuccess: () => {
2024-11-08 01:29:32 +00:00
toast.success('Date updated');
},
onError: (error) => {
toast.error(error);
},
});
React.useEffect(() => {
2024-11-08 01:29:32 +00:00
if (card?.dueDate && type === 'dueDate') {
setDate(card.dueDate);
}
2024-11-08 01:29:32 +00:00
if (card?.startedAt && type === 'startedAtDate') {
setDate(card.startedAt);
}
}, [card?.startedAt, card?.dueDate, type]);
const onBlur = () => {
if (!date || !boardId || !card) return;
2024-11-08 01:29:32 +00:00
if (type === 'dueDate') {
execute({
id: card.id,
boardId,
dueDate: date,
});
}
if (type === 'startedAtDate') {
execute({
id: card.id,
boardId,
startedAt: date,
});
}
setDate(date);
};
return (
<Popover>
<PopoverTrigger asChild>
<Button
variant={variant ?? 'outline'}
className={cn(
'w-[280px] justify-start text-left font-normal',
!date && 'text-muted-foreground',
className
)}
size={size}
disabled={isLoading}
>
<CalendarIcon className='mr-2 h-4 w-4' />
{date ? (
afterSelectText + format(date, 'PP')
) : (
<span>{placeholder ? placeholder : 'Pick a date'}</span>
)}
</Button>
</PopoverTrigger>
<PopoverContent className='w-auto p-0' onBlur={onBlur}>
2024-07-25 18:48:44 +00:00
<Calendar mode='single' selected={date} onSelect={setDate} />
</PopoverContent>
</Popover>
);
}