From 99d8922bb454642e25e6584b70b4a860db375f80 Mon Sep 17 00:00:00 2001 From: Pouria Delfanazari Date: Tue, 2 Sep 2025 17:06:17 -0700 Subject: [PATCH] feat: basic add card drawer --- .../addCardDrawer/AddCardDrawer.tsx | 140 ++++++++++++++++++ .../cards/lib/mutations/useAddCard.tsx | 35 +++++ .../collectionSelector/CollectionSelector.tsx | 107 +++++++++++++ .../Error.CollectionSelector.tsx | 5 + .../Skeleton.CollectionSelector.tsx | 13 ++ .../CollectionSelectorItem.module.css | 15 ++ .../CollectionSelectorItem.tsx | 52 +++++++ .../composerDrawer/ComposerDrawer.tsx | 3 +- src/webapp/providers/drawers.tsx | 9 +- src/webapp/styles/theme.tsx | 8 + 10 files changed, 384 insertions(+), 3 deletions(-) create mode 100644 src/webapp/features/cards/components/addCardDrawer/AddCardDrawer.tsx create mode 100644 src/webapp/features/cards/lib/mutations/useAddCard.tsx create mode 100644 src/webapp/features/collections/components/collectionSelector/CollectionSelector.tsx create mode 100644 src/webapp/features/collections/components/collectionSelector/Error.CollectionSelector.tsx create mode 100644 src/webapp/features/collections/components/collectionSelector/Skeleton.CollectionSelector.tsx create mode 100644 src/webapp/features/collections/components/collectionSelectorItem/CollectionSelectorItem.module.css create mode 100644 src/webapp/features/collections/components/collectionSelectorItem/CollectionSelectorItem.tsx diff --git a/src/webapp/features/cards/components/addCardDrawer/AddCardDrawer.tsx b/src/webapp/features/cards/components/addCardDrawer/AddCardDrawer.tsx new file mode 100644 index 00000000..8e6b4e44 --- /dev/null +++ b/src/webapp/features/cards/components/addCardDrawer/AddCardDrawer.tsx @@ -0,0 +1,140 @@ +import { + Button, + Container, + Drawer, + Grid, + Group, + Stack, + Textarea, + TextInput, +} from '@mantine/core'; +import { useForm } from '@mantine/form'; + +import { notifications } from '@mantine/notifications'; +import useAddCard from '../../lib/mutations/useAddCard'; +import CollectionSelector from '@/features/collections/components/collectionSelector/CollectionSelector'; +import { Suspense, useState } from 'react'; +import CollectionSelectorSkeleton from '@/features/collections/components/collectionSelector/Skeleton.CollectionSelector'; + +interface Props { + isOpen: boolean; + onClose: () => void; + selectedCollection?: { id: string; name: string; description?: string }; +} + +export default function AddCardDrawer(props: Props) { + const initialCollections = props.selectedCollection + ? [props.selectedCollection] + : []; + const [selectedCollections, setSelectedCollections] = + useState<{ id: string; name: string; description?: string }[]>( + initialCollections, + ); + const addCard = useAddCard(); + + const form = useForm({ + initialValues: { + url: '', + note: '', + collections: initialCollections, + }, + }); + + const handleCreateCollection = (e: React.FormEvent) => { + e.preventDefault(); + + addCard.mutate( + { + url: form.getValues().url, + note: form.getValues().note, + collectionIds: selectedCollections.map((c) => c.id), + }, + { + onSuccess: () => { + notifications.show({ + message: 'Added card.', + }); + props.onClose(); + }, + onError: () => { + notifications.show({ + message: 'Could not add card.', + }); + }, + onSettled: () => { + form.reset(); + }, + }, + ); + }; + + return ( + + + + New Card + + + +
+ + + + + + +