"use client"; import React, { useEffect, useMemo, useState } from "react"; import Image from "next/image"; import Link from "next/link"; import { MemoriesIcon, ExploreIcon, CanvasIcon, AddIcon } from "@repo/ui/icons"; import { Button } from "@repo/ui/shadcn/button"; import { MinusIcon, PlusCircleIcon } from "lucide-react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@repo/ui/shadcn/dialog"; import { Label } from "@repo/ui/shadcn/label"; import { Textarea } from "@repo/ui/shadcn/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@repo/ui/shadcn/select"; import { toast } from "sonner"; import { getSpaces } from "../actions/fetchers"; import { Space } from "../actions/types"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@repo/ui/shadcn/tooltip"; import { InformationCircleIcon } from "@heroicons/react/24/outline"; import { createMemory, createSpace } from "../actions/doers"; import { Input } from "@repo/ui/shadcn/input"; import ComboboxWithCreate from "@repo/ui/shadcn/combobox"; import { StoredSpace } from "@/server/db/schema"; import { revalidatePath } from "next/cache"; function Menu() { const [spaces, setSpaces] = useState([]); useEffect(() => { (async () => { let spaces = await getSpaces(); if (!spaces.success || !spaces.data) { toast.warning("Unable to get spaces", { richColors: true, }); setSpaces([]); return; } setSpaces(spaces.data); })(); }, []); const menuItems = [ { icon: MemoriesIcon, text: "Memories", url: "/memories", disabled: false, }, { icon: CanvasIcon, text: "Canvas", url: "/canvas", disabled: true, }, ]; const [content, setContent] = useState(""); const [selectedSpaces, setSelectedSpaces] = useState([]); const autoDetectedType = useMemo(() => { if (content.length === 0) { return "none"; } if ( content.match(/https?:\/\/(x\.com|twitter\.com)\/[\w]+\/[\w]+\/[\d]+/) ) { return "tweet"; } else if (content.match(/https?:\/\/[\w\.]+/)) { return "page"; } else if (content.match(/https?:\/\/www\.[\w\.]+/)) { return "page"; } else { return "note"; } }, [content]); const [dialogOpen, setDialogOpen] = useState(false); const options = useMemo( () => spaces.map((x) => ({ label: x.name, value: x.id.toString(), })), [spaces], ); const handleSubmit = async (content?: string, space?: string) => { setDialogOpen(false); toast.info("Creating memory..."); if (!content || content.length === 0) { toast.error("Content is required"); return; } const cont = await createMemory({ content: content, spaces: space ? [space] : undefined, }); setContent(""); if (cont.success) { toast.success("Memory created"); } else { toast.error(`Memory creation failed: ${cont.error}`); } }; return ( <> {/* Desktop Menu */}
Logo

Add

{menuItems.map((item) => ( {`${item.text}

{item.text}

))}
{ const content = e.get("content")?.toString(); const space = e.get("space")?.toString(); await handleSubmit(content, space); }} className="flex flex-col gap-4" > Add memory A "Memory" is a bookmark, something you want to remember.