From 73c5480fac134b74d080456d325ffb2e06555d3a Mon Sep 17 00:00:00 2001 From: codetorso Date: Fri, 16 Aug 2024 09:16:46 +0530 Subject: editor --- apps/web/.npmrc | 2 + apps/web/app/(dash)/(memories)/content.tsx | 63 +++--- apps/web/app/(dash)/menu.tsx | 186 ++++++++++-------- apps/web/app/editor/page.tsx | 8 + apps/web/components/editor/advanced-editor.tsx | 161 ++++++++++++++++ apps/web/components/editor/content.ts | 4 + apps/web/components/editor/emoji/emojiList.tsx | 76 ++++++++ apps/web/components/editor/emoji/suggestion.ts | 67 +++++++ apps/web/components/editor/extensions.ts | 182 ++++++++++++++++++ .../editor/generative/ai-completion-command.tsx | 66 +++++++ .../editor/generative/ai-selector-commands.tsx | 76 ++++++++ .../components/editor/generative/ai-selector.tsx | 121 ++++++++++++ .../editor/generative/generative-menu-switch.tsx | 75 ++++++++ apps/web/components/editor/image-upload.ts | 60 ++++++ apps/web/components/editor/prosemirror.css | 212 +++++++++++++++++++++ .../components/editor/selectors/align-selector.tsx | 87 +++++++++ .../components/editor/selectors/link-selector.tsx | 120 ++++++++++++ .../components/editor/selectors/node-selector.tsx | 148 ++++++++++++++ .../components/editor/selectors/text-buttons.tsx | 75 ++++++++ apps/web/components/editor/slash-command.tsx | 209 ++++++++++++++++++++ apps/web/components/editor/toc.tsx | 109 +++++++++++ apps/web/components/editor/ui/button.tsx | 56 ++++++ apps/web/components/editor/ui/command.tsx | 155 +++++++++++++++ apps/web/components/editor/ui/dialog.tsx | 122 ++++++++++++ .../components/editor/ui/icons/crazy-spinner.tsx | 11 ++ .../components/editor/ui/icons/loading-circle.tsx | 20 ++ apps/web/components/editor/ui/icons/magic.tsx | 32 ++++ apps/web/components/editor/ui/menu.tsx | 89 +++++++++ apps/web/components/editor/ui/popover.tsx | 31 +++ apps/web/components/editor/ui/scroll-area.tsx | 48 +++++ apps/web/components/editor/ui/separator.tsx | 31 +++ apps/web/package.json | 60 +++--- 32 files changed, 2630 insertions(+), 132 deletions(-) create mode 100644 apps/web/.npmrc create mode 100644 apps/web/app/editor/page.tsx create mode 100644 apps/web/components/editor/advanced-editor.tsx create mode 100644 apps/web/components/editor/content.ts create mode 100644 apps/web/components/editor/emoji/emojiList.tsx create mode 100644 apps/web/components/editor/emoji/suggestion.ts create mode 100644 apps/web/components/editor/extensions.ts create mode 100644 apps/web/components/editor/generative/ai-completion-command.tsx create mode 100644 apps/web/components/editor/generative/ai-selector-commands.tsx create mode 100644 apps/web/components/editor/generative/ai-selector.tsx create mode 100644 apps/web/components/editor/generative/generative-menu-switch.tsx create mode 100644 apps/web/components/editor/image-upload.ts create mode 100644 apps/web/components/editor/prosemirror.css create mode 100644 apps/web/components/editor/selectors/align-selector.tsx create mode 100644 apps/web/components/editor/selectors/link-selector.tsx create mode 100644 apps/web/components/editor/selectors/node-selector.tsx create mode 100644 apps/web/components/editor/selectors/text-buttons.tsx create mode 100644 apps/web/components/editor/slash-command.tsx create mode 100644 apps/web/components/editor/toc.tsx create mode 100644 apps/web/components/editor/ui/button.tsx create mode 100644 apps/web/components/editor/ui/command.tsx create mode 100644 apps/web/components/editor/ui/dialog.tsx create mode 100644 apps/web/components/editor/ui/icons/crazy-spinner.tsx create mode 100644 apps/web/components/editor/ui/icons/loading-circle.tsx create mode 100644 apps/web/components/editor/ui/icons/magic.tsx create mode 100644 apps/web/components/editor/ui/menu.tsx create mode 100644 apps/web/components/editor/ui/popover.tsx create mode 100644 apps/web/components/editor/ui/scroll-area.tsx create mode 100644 apps/web/components/editor/ui/separator.tsx (limited to 'apps') diff --git a/apps/web/.npmrc b/apps/web/.npmrc new file mode 100644 index 00000000..d7cd57c2 --- /dev/null +++ b/apps/web/.npmrc @@ -0,0 +1,2 @@ +@tiptap-pro:registry=https://registry.tiptap.dev/ +//registry.tiptap.dev/:_authToken={add auth token from tiptap website} \ No newline at end of file diff --git a/apps/web/app/(dash)/(memories)/content.tsx b/apps/web/app/(dash)/(memories)/content.tsx index 5d81e823..74f95849 100644 --- a/apps/web/app/(dash)/(memories)/content.tsx +++ b/apps/web/app/(dash)/(memories)/content.tsx @@ -37,7 +37,17 @@ import { toast } from "sonner"; import { Input } from "@repo/ui/shadcn/input"; import { motion } from "framer-motion"; import { useSearchParams } from "next/navigation"; -import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@repo/ui/shadcn/alert-dialog"; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from "@repo/ui/shadcn/alert-dialog"; type TMemoriesPage = { memoriesAndSpaces: { memories: Content[]; spaces: StoredSpace[] }; @@ -156,7 +166,6 @@ export function MemoriesPage({ {currentSpace && (
- {usersWithAccess && usersWithAccess.length > 0 && (
Users with access @@ -292,7 +301,8 @@ function SpaceComponent({ >
- {title.slice(0, 2).toUpperCase()}{id} + {title.slice(0, 2).toUpperCase()} + {id}
@@ -304,8 +314,11 @@ function SpaceComponent({
- - {handleDeleteSpace(id)}} /> + { + handleDeleteSpace(id); + }} + />
@@ -454,26 +467,28 @@ function Filters({ ); } -function SpaceDeleteAlert({onClick}: {onClick: ()=> void}){ +function SpaceDeleteAlert({ onClick }: { onClick: () => void }) { return ( - - - - Are you absolutely sure? - - This is irreversible. This will delete the space and all memories inside it. - - - - Cancel - Delete - - - - ) + + {" "} + + + + + Are you absolutely sure? + + This is irreversible. This will delete the space and all memories + inside it. + + + + Cancel + Delete + + + + ); } -export default MemoriesPage; \ No newline at end of file +export default MemoriesPage; diff --git a/apps/web/app/(dash)/menu.tsx b/apps/web/app/(dash)/menu.tsx index abac5411..68466cb1 100644 --- a/apps/web/app/(dash)/menu.tsx +++ b/apps/web/app/(dash)/menu.tsx @@ -11,6 +11,7 @@ import { } from "@repo/ui/icons"; import { Button } from "@repo/ui/shadcn/button"; import { MinusIcon, PlusCircleIcon } from "lucide-react"; +import Editor from "@/components/editor/advanced-editor"; import { Dialog, DialogContent, @@ -58,20 +59,16 @@ function Menu() { }, ]; - - const [dialogOpen, setDialogOpen] = useState(false); return ( - <> +
{/* Desktop Menu */}
- + Logo
- setDialogOpen(false)} /> + setDialogOpen(false)} /> {/* Mobile Menu */}
@@ -154,12 +151,11 @@ function Menu() {
- +
); } -function DialogContentMenu({setDialogClose}: {setDialogClose: ()=> void}){ - +function DialogContentMenu({ setDialogClose }: { setDialogClose: () => void }) { const [spaces, setSpaces] = useState([]); useEffect(() => { @@ -221,7 +217,7 @@ function DialogContentMenu({setDialogClose}: {setDialogClose: ()=> void}){ setContent(""); setSelectedSpaces([]); return cont; - } + }; const formSubmit = () => { toast.promise(handleSubmit(content, selectedSpaces), { @@ -236,89 +232,115 @@ function DialogContentMenu({setDialogClose}: {setDialogClose: ()=> void}){ richColors: true, }); }; + + const [editorOpen, setEditorOpen] = useState(false); return ( -
- + + Add memory -
- - ({ - label: x.name, - value: x.id.toString(), - }))} - onSelect={(v) => - setSelectedSpaces((prev) => { - if (v === "") { - return []; - } - return [...prev, parseInt(v)]; - }) +
+ + ({ + label: x.name, + value: x.id.toString(), + }))} + onSelect={(v) => + setSelectedSpaces((prev) => { + if (v === "") { + return []; } - onSubmit={async (spaceName) => { - const space = options.find((x) => x.label === spaceName); - toast.info("Creating space..."); + return [...prev, parseInt(v)]; + }) + } + onSubmit={async (spaceName) => { + const space = options.find((x) => x.label === spaceName); + toast.info("Creating space..."); - if (space) { - toast.error("A space with that name already exists."); - } + if (space) { + toast.error("A space with that name already exists."); + } - const creationTask = await createSpace(spaceName); - if (creationTask.success && creationTask.data) { - toast.success("Space created " + creationTask.data); - setSpaces((prev) => [ - ...prev, - { - name: spaceName, - id: creationTask.data!, - createdAt: new Date(), - user: null, - numItems: 0, - }, - ]); - setSelectedSpaces((prev) => [...prev, creationTask.data!]); - } else { - toast.error("Space creation failed: " + creationTask.error); - } - }} - /> -
+ const creationTask = await createSpace(spaceName); + if (creationTask.success && creationTask.data) { + toast.success("Space created " + creationTask.data); + setSpaces((prev) => [ + ...prev, + { + name: spaceName, + id: creationTask.data!, + createdAt: new Date(), + user: null, + numItems: 0, + }, + ]); + setSelectedSpaces((prev) => [...prev, creationTask.data!]); + } else { + toast.error("Space creation failed: " + creationTask.error); + } + }} + /> +
-
- -