From 893fe194b935b4014717f205a5ca9e97f516f1af Mon Sep 17 00:00:00 2001 From: MaheshtheDev Date: Sat, 10 Aug 2024 17:48:53 -0700 Subject: [PATCH 01/11] chore: Update Telegram bot with Markdown Support --- apps/web/app/api/telegram/route.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/web/app/api/telegram/route.ts b/apps/web/app/api/telegram/route.ts index c629e409..20241611 100644 --- a/apps/web/app/api/telegram/route.ts +++ b/apps/web/app/api/telegram/route.ts @@ -21,7 +21,10 @@ bot.command("start", async (ctx) => { const cipherd = cipher(user.id.toString()); await ctx.reply( - `Welcome to Supermemory bot. I am here to help you remember things better. Click here to create and link your account: https://supermemory.ai/signin?telegramUser=${cipherd}`, + `Welcome to Supermemory bot. I am here to help you remember things better. [Click here to create and link your account](https://supermemory.ai/signin?telegramUser=${cipherd})`, + { + parse_mode: "MarkdownV2", + }, ); }); @@ -38,7 +41,10 @@ bot.on("message", async (ctx) => { if (!dbUser) { await ctx.reply( - `Welcome to Supermemory bot. I am here to help you remember things better. Click here to create and link your account: https://supermemory.ai/signin?telegramUser=${cipherd}`, + `Welcome to Supermemory bot. I am here to help you remember things better. [Click here to create and link your account](https://supermemory.ai/signin?telegramUser=${cipherd})`, + { + parse_mode: "MarkdownV2", + }, ); return; @@ -103,7 +109,14 @@ bot.on("message", async (ctx) => { .returning({ id: storedContent.id }); } - await ctx.api.editMessageText(ctx.chat.id, message.message_id, data.response); + await ctx.api.editMessageText( + ctx.chat.id, + message.message_id, + data.response, + { + parse_mode: "MarkdownV2", + }, + ); }); export const POST = webhookCallback(bot, "std/http"); From 73c5480fac134b74d080456d325ffb2e06555d3a Mon Sep 17 00:00:00 2001 From: codetorso Date: Fri, 16 Aug 2024 09:16:46 +0530 Subject: [PATCH 02/11] 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 + .../web/components/editor/advanced-editor.tsx | 161 + apps/web/components/editor/content.ts | 4 + .../web/components/editor/emoji/emojiList.tsx | 76 + .../web/components/editor/emoji/suggestion.ts | 67 + apps/web/components/editor/extensions.ts | 182 + .../generative/ai-completion-command.tsx | 66 + .../generative/ai-selector-commands.tsx | 76 + .../editor/generative/ai-selector.tsx | 121 + .../generative/generative-menu-switch.tsx | 75 + apps/web/components/editor/image-upload.ts | 60 + apps/web/components/editor/prosemirror.css | 212 ++ .../editor/selectors/align-selector.tsx | 87 + .../editor/selectors/link-selector.tsx | 120 + .../editor/selectors/node-selector.tsx | 148 + .../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 + .../editor/ui/icons/crazy-spinner.tsx | 11 + .../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 +- pnpm-lock.yaml | 3212 +++++++++++------ 33 files changed, 4787 insertions(+), 1187 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 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); + } + }} + /> +
-
- -