From 4f9b154fb83513d2236a31ea6b7ba2d3bbadb758 Mon Sep 17 00:00:00 2001 From: Varun Raj Date: Sat, 17 Aug 2024 23:34:15 +0530 Subject: [PATCH] feat: added birthday selector Signed-off-by: Varun Raj --- bun.lockb | Bin 159961 -> 174542 bytes package.json | 4 ++ src/components/people/PersonBirthdayCell.tsx | 33 +++++++++--- src/components/ui/calendar.tsx | 28 ++++++++++ src/components/ui/datepicker.tsx | 52 +++++++++++++++++++ src/components/ui/popover.tsx | 31 +++++++++++ src/handlers/api/people.handler.ts | 6 ++- src/helpers/date.helper.ts | 9 ++++ src/helpers/person.helper.ts | 10 +++- 9 files changed, 164 insertions(+), 9 deletions(-) create mode 100644 src/components/ui/calendar.tsx create mode 100644 src/components/ui/datepicker.tsx create mode 100644 src/components/ui/popover.tsx create mode 100644 src/helpers/date.helper.ts diff --git a/bun.lockb b/bun.lockb index 2b9886687dafa224ba586b41359b556b32d47adb..cf736c2a15a1e1a63283ec2a64e2ba24385d0980 100755 GIT binary patch delta 38077 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 delta 29860 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 + + const handleEdit = (date?: Date | null) => { + if (!date) return; + const formatedDate = formatDate(date.toString(), 'yyyy-MM-dd'); + setLoading(true); + return updatePerson(person.id, { + birthDate: formatedDate, + }) + .then(() => { + + }) + .catch(() => {}) + .finally(() => { + setLoading(false); + }); + } + + + return (
- {person.birthDate ? ( - {person.birthDate.toDateString()} - ) : ( - Unknown - )} +
) } diff --git a/src/components/ui/calendar.tsx b/src/components/ui/calendar.tsx new file mode 100644 index 0000000..6c36f3f --- /dev/null +++ b/src/components/ui/calendar.tsx @@ -0,0 +1,28 @@ +import * as React from "react" +import { ChevronLeftIcon, ChevronRightIcon } from "@radix-ui/react-icons" +import { DayPicker } from "react-day-picker" +import "react-day-picker/dist/style.css"; + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/ui/button" + +export type CalendarProps = React.ComponentProps + +function Calendar({ + className, + classNames, + showOutsideDays = true, + ...props +}: CalendarProps) { + return ( + + ) +} +Calendar.displayName = "Calendar" + +export { Calendar } diff --git a/src/components/ui/datepicker.tsx b/src/components/ui/datepicker.tsx new file mode 100644 index 0000000..6ccd136 --- /dev/null +++ b/src/components/ui/datepicker.tsx @@ -0,0 +1,52 @@ +"use client" + +import * as React from "react" +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" + +interface IProps { + date?: Date | null + onSelect?: (date?: Date | null) => any +} +export function DatePicker( + { date: _date, onSelect }: IProps +) { + const [date, setDate] = React.useState(_date || null) + + const handleSelect = (date?: Date) => { + setDate(date || null) + onSelect?.(date) + } + return ( + + + + + + + + + ) +} diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx new file mode 100644 index 0000000..d82e714 --- /dev/null +++ b/src/components/ui/popover.tsx @@ -0,0 +1,31 @@ +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverAnchor = PopoverPrimitive.Anchor + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor } diff --git a/src/handlers/api/people.handler.ts b/src/handlers/api/people.handler.ts index b33b6cd..77744d6 100644 --- a/src/handlers/api/people.handler.ts +++ b/src/handlers/api/people.handler.ts @@ -12,6 +12,10 @@ export const listPeople = (): Promise => { }); } -export const updatePerson = (id: string, data: Partial) => { +export const updatePerson = (id: string, data: Partial<{ + name: string; + birthDate: string; + isHidden: boolean; +}>) => { return API.put(UPDATE_PERSON_PATH(id), data) } \ No newline at end of file diff --git a/src/helpers/date.helper.ts b/src/helpers/date.helper.ts new file mode 100644 index 0000000..0b2a138 --- /dev/null +++ b/src/helpers/date.helper.ts @@ -0,0 +1,9 @@ +import { format, parse } from "date-fns" + +export const formatDate = (date: string, outputFormat?: string): string => { + return format(date, outputFormat || "PPP") +} + +export const parseDate = (date: string, inputFormat: string): Date => { + return parse(date, inputFormat, new Date()); +} \ No newline at end of file diff --git a/src/helpers/person.helper.ts b/src/helpers/person.helper.ts index 9a89d7d..0bb4daf 100644 --- a/src/helpers/person.helper.ts +++ b/src/helpers/person.helper.ts @@ -1,11 +1,17 @@ import { PERSON_THUBNAIL_PATH } from "@/config/routes" import { IPerson } from "@/types/person" +import { parseDate } from "./date.helper" -export const cleanUpPerson = (person: IPerson): IPerson => { +interface IAPIPerson extends Omit { + updatedAt: string; + birthDate: string | null; +} + +export const cleanUpPerson = (person: IAPIPerson): IPerson => { return { ...person, thumbnailPath: PERSON_THUBNAIL_PATH(person.id), - birthDate: person.birthDate ? new Date(person.birthDate) : null, + birthDate: person.birthDate ? new Date(parseDate(person.birthDate, 'yyyy-MM-dd')) : null, updatedAt: new Date(person.updatedAt), } } \ No newline at end of file