mirror of
https://github.com/ahmadk953/tasko.git
synced 2025-01-31 00:53:37 +00:00
119 lines
2.6 KiB
TypeScript
119 lines
2.6 KiB
TypeScript
'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 {
|
|
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({
|
|
type,
|
|
variant,
|
|
className,
|
|
size,
|
|
placeholder,
|
|
afterSelectText,
|
|
boardId,
|
|
card,
|
|
}: DatePickerProps) {
|
|
const [date, setDate] = React.useState<Date>();
|
|
|
|
const { execute, isLoading } = useAction(updateCard, {
|
|
onSuccess: () => {
|
|
toast.success('Date updated');
|
|
},
|
|
onError: (error) => {
|
|
toast.error(error);
|
|
},
|
|
});
|
|
|
|
React.useEffect(() => {
|
|
if (card?.dueDate && type === 'dueDate') {
|
|
setDate(card.dueDate);
|
|
}
|
|
|
|
if (card?.startedAt && type === 'startedAtDate') {
|
|
setDate(card.startedAt);
|
|
}
|
|
}, [card?.startedAt, card?.dueDate, type]);
|
|
|
|
const onBlur = () => {
|
|
if (!date || !boardId || !card) return;
|
|
|
|
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}>
|
|
<Calendar mode='single' selected={date} onSelect={setDate} />
|
|
</PopoverContent>
|
|
</Popover>
|
|
);
|
|
}
|