From 43cb9feecbaf4d83517696154073cc75b7c9c5c4 Mon Sep 17 00:00:00 2001 From: MaheshtheDev <38828053+MaheshtheDev@users.noreply.github.com> Date: Mon, 19 Jan 2026 22:37:03 +0000 Subject: [PATCH] chore: ux improvements and space selector (#684) --- apps/web/app/new/page.tsx | 30 ++-- .../web/components/new/add-document/index.tsx | 115 +----------- apps/web/components/new/chat/index.tsx | 24 ++- apps/web/components/new/header.tsx | 68 +------ apps/web/components/new/mcp-modal/index.tsx | 17 +- apps/web/components/new/memories-grid.tsx | 8 +- apps/web/components/new/space-selector.tsx | 169 ++++++++++++++++++ 7 files changed, 238 insertions(+), 193 deletions(-) create mode 100644 apps/web/components/new/space-selector.tsx diff --git a/apps/web/app/new/page.tsx b/apps/web/app/new/page.tsx index 3d85a427..aad09a28 100644 --- a/apps/web/app/new/page.tsx +++ b/apps/web/app/new/page.tsx @@ -19,7 +19,7 @@ export default function NewPage() { return ( -
+
setIsAddDocumentOpen(true)} onOpenMCP={() => setIsMCPModalOpen(true)} /> -
-
-
-
- -
- - - -
+
+
+ +
+
+ + +
+ setIsAddDocumentOpen(false)} diff --git a/apps/web/components/new/add-document/index.tsx b/apps/web/components/new/add-document/index.tsx index a99505bd..282150e4 100644 --- a/apps/web/components/new/add-document/index.tsx +++ b/apps/web/components/new/add-document/index.tsx @@ -1,38 +1,21 @@ "use client" -import { useState, useEffect, useMemo, useCallback } from "react" +import { useState, useEffect, useCallback } from "react" import { Dialog, DialogContent, DialogTitle } from "@repo/ui/components/dialog" import { cn } from "@lib/utils" import { dmSansClassName } from "@/lib/fonts" -import { - FileTextIcon, - GlobeIcon, - ZapIcon, - ChevronsUpDownIcon, - FolderIcon, - Loader2, -} from "lucide-react" +import { FileTextIcon, GlobeIcon, ZapIcon, Loader2 } from "lucide-react" import { Button } from "@ui/components/button" import { ConnectContent } from "./connections" import { NoteContent } from "./note" import { LinkContent, type LinkData } from "./link" import { FileContent, type FileData } from "./file" import { useProject } from "@/stores" -import { $fetch } from "@lib/api" -import { DEFAULT_PROJECT_ID } from "@repo/lib/constants" -import type { Project } from "@repo/lib/types" -import { useQuery } from "@tanstack/react-query" -import { motion } from "motion/react" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from "@repo/ui/components/dropdown-menu" import { toast } from "sonner" import { useDocumentMutations } from "../../../hooks/use-document-mutations" import { useCustomer } from "autumn-js/react" import { useMemoriesUsage } from "@/hooks/use-memories-usage" +import { SpaceSelector } from "../space-selector" type TabType = "note" | "link" | "file" | "connect" @@ -115,7 +98,6 @@ export function AddDocument({ const [localSelectedProject, setLocalSelectedProject] = useState( globalSelectedProject, ) - const [isProjectSelectorOpen, setIsProjectSelectorOpen] = useState(false) // Form data state for button click handling const [noteContent, setNoteContent] = useState("") @@ -147,33 +129,6 @@ export function AddDocument({ setLocalSelectedProject(globalSelectedProject) }, [globalSelectedProject]) - const { data: projects = [], isLoading: isLoadingProjects } = useQuery({ - queryKey: ["projects"], - queryFn: async () => { - const response = await $fetch("@get/projects") - - if (response.error) { - throw new Error(response.error?.message || "Failed to load projects") - } - - return response.data?.projects || [] - }, - staleTime: 30 * 1000, - }) - - const projectName = useMemo(() => { - if (localSelectedProject === DEFAULT_PROJECT_ID) return "Default Project" - const found = projects.find( - (p: Project) => p.containerTag === localSelectedProject, - ) - return found?.name ?? localSelectedProject - }, [projects, localSelectedProject]) - - const handleProjectSelect = (containerTag: string) => { - setLocalSelectedProject(containerTag) - setIsProjectSelectorOpen(false) - } - useEffect(() => { if (defaultTab) { setActiveTab(defaultTab) @@ -334,65 +289,11 @@ export function AddDocument({ )}
- - - - - - handleProjectSelect(DEFAULT_PROJECT_ID)} - className={cn( - "flex items-center gap-2 px-3 py-2 rounded-[8px] cursor-pointer", - localSelectedProject === DEFAULT_PROJECT_ID - ? "bg-[#4BA0FA]/20 text-white" - : "text-[#737373] hover:bg-[#14161A] hover:text-white", - )} - > - - Default Project - - {projects - .filter((p: Project) => p.containerTag !== DEFAULT_PROJECT_ID) - .map((project: Project) => ( - handleProjectSelect(project.containerTag)} - className={cn( - "flex items-center gap-2 px-3 py-2 rounded-[8px] cursor-pointer", - localSelectedProject === project.containerTag - ? "bg-[#4BA0FA]/20 text-white" - : "text-[#737373] hover:bg-[#14161A] hover:text-white", - )} - > - - - {project.name} - - - ))} - - +
- - - switchProject(DEFAULT_PROJECT_ID)} - className={cn( - "cursor-pointer", - selectedProject === DEFAULT_PROJECT_ID && "bg-accent", - )} - > - - Default Project - - {projects - .filter((p: Project) => p.containerTag !== DEFAULT_PROJECT_ID) - .map((project: Project) => ( - switchProject(project.containerTag)} - className={cn( - "cursor-pointer", - selectedProject === project.containerTag && "bg-accent", - )} - > - - {project.name} - - ))} - - -
+
diff --git a/apps/web/components/new/mcp-modal/index.tsx b/apps/web/components/new/mcp-modal/index.tsx index 6816c21e..4a5cc0b1 100644 --- a/apps/web/components/new/mcp-modal/index.tsx +++ b/apps/web/components/new/mcp-modal/index.tsx @@ -2,9 +2,12 @@ import { dmSans125ClassName, dmSansClassName } from "@/lib/fonts" import { Dialog, DialogContent, DialogFooter } from "@repo/ui/components/dialog" import { cn } from "@lib/utils" import * as DialogPrimitive from "@radix-ui/react-dialog" -import { ChevronsUpDownIcon, XIcon } from "lucide-react" +import { XIcon } from "lucide-react" import { Button } from "@ui/components/button" import { MCPSteps } from "./mcp-detail-view" +import { SpaceSelector } from "../space-selector" +import { useProject } from "@/stores" +import { useProjectMutations } from "@/hooks/use-project-mutations" export function MCPModal({ isOpen, @@ -13,6 +16,8 @@ export function MCPModal({ isOpen: boolean onClose: () => void }) { + const { selectedProject } = useProject() + const { switchProject } = useProjectMutations() return ( !open && onClose()}>
- +
-
diff --git a/apps/web/components/new/memories-grid.tsx b/apps/web/components/new/memories-grid.tsx index e6095645..dd4a4e9b 100644 --- a/apps/web/components/new/memories-grid.tsx +++ b/apps/web/components/new/memories-grid.tsx @@ -54,7 +54,7 @@ export function MemoriesGrid({ isChatOpen }: { isChatOpen: boolean }) { const response = await $fetch("@post/documents/documents", { body: { page: pageParam as number, - limit: (pageParam as number) === 1 ? (IS_DEV ? 500 : 500) : PAGE_SIZE, + limit: PAGE_SIZE, sort: "createdAt", order: "desc", containerTags: selectedProject ? [selectedProject] : undefined, @@ -91,6 +91,8 @@ export function MemoriesGrid({ isChatOpen }: { isChatOpen: boolean }) { ) }, [data]) + const isLoadingMore = isFetchingNextPage + const loadMoreDocuments = useCallback(async (): Promise => { if (hasNextPage && !isFetchingNextPage) { await fetchNextPage() @@ -148,7 +150,7 @@ export function MemoriesGrid({ isChatOpen }: { isChatOpen: boolean }) { } return ( -
+
+ + +
+
+ {/* Default Project */} + handleSelect(DEFAULT_PROJECT_ID)} + className={cn( + "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-white text-sm font-medium", + value === DEFAULT_PROJECT_ID + ? "bg-[#161E2B] border border-[rgba(115,115,115,0.1)]" + : "opacity-50 hover:opacity-100 hover:bg-[#161E2B]/50", + )} + > + 📁 + My Space + + + {/* User Projects */} + {projects + .filter((p: Project) => p.containerTag !== DEFAULT_PROJECT_ID) + .map((project: Project) => ( + handleSelect(project.containerTag)} + className={cn( + "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-white text-sm font-medium", + value === project.containerTag + ? "bg-[#161E2B] border border-[rgba(115,115,115,0.1)]" + : "opacity-50 hover:opacity-100 hover:bg-[#161E2B]/50", + )} + > + 📁 + {project.name} + + ))} +
+ + {showNewSpace && ( + + )} +
+
+ + + + + ) +}