From 93e0fe6172e0d64584e7ee869bbe4fbdb34b1bde Mon Sep 17 00:00:00 2001 From: daniel31x13 Date: Wed, 29 Nov 2023 09:41:24 -0500 Subject: [PATCH] improved modals --- components/Modals/New.tsx | 112 --------- components/Modals/NewCollectionModal.tsx | 162 ++++++++++++ components/Modals/NewLink.tsx | 246 +++++++++++++++++++ components/Modals/Tabs.tsx/NewCollection.tsx | 119 --------- components/Modals/Tabs.tsx/NewLink.tsx | 208 ---------------- components/Navbar.tsx | 70 ++++-- pages/collections/index.tsx | 9 +- 7 files changed, 461 insertions(+), 465 deletions(-) delete mode 100644 components/Modals/New.tsx create mode 100644 components/Modals/NewCollectionModal.tsx create mode 100644 components/Modals/NewLink.tsx delete mode 100644 components/Modals/Tabs.tsx/NewCollection.tsx delete mode 100644 components/Modals/Tabs.tsx/NewLink.tsx diff --git a/components/Modals/New.tsx b/components/Modals/New.tsx deleted file mode 100644 index 36be204..0000000 --- a/components/Modals/New.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import { Tab } from "@headlessui/react"; -import React, { useEffect, useState } from "react"; -import { Toaster } from "react-hot-toast"; -import NewLink from "./Tabs.tsx/NewLink"; -import NewCollection from "./Tabs.tsx/NewCollection"; - -type Props = { - index?: number; - modalId: string; - isOpen: boolean; - onClose: Function; -}; - -export default function New({ index, modalId, isOpen, onClose }: Props) { - const newModal = document.getElementById(modalId); - const [tabIndex, setTabIndex] = useState(index); - - useEffect(() => { - setTabIndex(index); - - newModal?.addEventListener("close", () => { - onClose(); - }); - - return () => { - newModal?.addEventListener("close", () => { - onClose(); - }); - }; - }, [isOpen]); - - return ( - - -
-
- -
- - setTabIndex(i)} - selectedIndex={tabIndex} - > - - - `${ - selected ? "btn-primary" : "btn-ghost" - } outline-none rounded-md btn btn-sm w-24` - } - > - Link - - {/* - `${ - selected ? "btn-primary" : "btn-ghost" - } outline-none rounded-md btn btn-sm w-24` - } - > - File - */} - {/* - `${ - selected ? "btn-primary" : "btn-ghost" - } outline-none rounded-md btn btn-sm w-24` - } - > - Note - */} - - `${ - selected ? "btn-primary" : "btn-ghost" - } outline-none rounded-md btn btn-sm w-24` - } - > - Collection - - - - - - - {/* File */} - {/* Note */} - - - - - -
-
- -
-
- ); -} diff --git a/components/Modals/NewCollectionModal.tsx b/components/Modals/NewCollectionModal.tsx new file mode 100644 index 0000000..ad7a6f9 --- /dev/null +++ b/components/Modals/NewCollectionModal.tsx @@ -0,0 +1,162 @@ +import React, { useEffect, useState } from "react"; +import TextInput from "@/components/TextInput"; +import useCollectionStore from "@/store/collections"; +import toast, { Toaster } from "react-hot-toast"; +import { faFolder } from "@fortawesome/free-solid-svg-icons"; +import { HexColorPicker } from "react-colorful"; +import { Collection } from "@prisma/client"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +type Props = { + modalId: string; + isOpen: boolean; + onClose: Function; +}; + +export default function NewCollectionModal({ + modalId, + isOpen, + onClose, +}: Props) { + const newModal = document.getElementById(modalId); + + useEffect(() => { + newModal?.addEventListener("close", () => { + onClose(); + }); + + return () => { + newModal?.addEventListener("close", () => { + onClose(); + }); + }; + }, [isOpen]); + + const initial = { + name: "", + description: "", + color: "#0ea5e9", + }; + + const [collection, setCollection] = useState>(initial); + + useEffect(() => { + setCollection(initial); + }, [isOpen]); + + const [submitLoader, setSubmitLoader] = useState(false); + const { addCollection } = useCollectionStore(); + + const submit = async () => { + if (!submitLoader) { + setSubmitLoader(true); + if (!collection) return null; + + setSubmitLoader(true); + + const load = toast.loading("Creating..."); + + let response; + + response = await addCollection(collection as any); + + toast.dismiss(load); + + if (response.ok) { + toast.success(`Collection "Created!"`); + (document.getElementById(modalId) as any).close(); + } else toast.error(response.data as string); + + setSubmitLoader(false); + } + }; + + return ( + + +
+
+ +
+ +

Create a New Collection

+ +
+
+
+

Name

+
+ + setCollection({ ...collection, name: e.target.value }) + } + /> +
+
+

Color

+
+ +
+
+ setCollection({ ...collection, color: "#0ea5e9" }) + } + > + Reset +
+
+ setCollection({ ...collection, color: e })} + /> +
+
+
+ +
+

Description

+