From 7972e543c47cb97b1716bbfe305d3244eb4d00bf Mon Sep 17 00:00:00 2001 From: MaheshtheDev <38828053+MaheshtheDev@users.noreply.github.com> Date: Thu, 22 Jan 2026 02:35:35 +0000 Subject: chore: cmdk, google docs viewer, image preview, document icons (#691) --- apps/web/app/new/page.tsx | 42 ++- apps/web/components/new/chat/index.tsx | 18 +- .../components/new/document-cards/file-preview.tsx | 102 +------ .../new/document-cards/google-docs-preview.tsx | 51 ++-- .../components/new/document-cards/note-preview.tsx | 130 +-------- .../new/document-cards/website-preview.tsx | 33 +-- apps/web/components/new/document-icon.tsx | 322 +++++++++++++++++++++ .../new/document-modal/content/google-doc.tsx | 66 +++++ .../new/document-modal/content/image-preview.tsx | 56 ++++ .../new/document-modal/content/index.tsx | 143 +++++++++ .../document-modal/content/text-editor-content.tsx | 91 ++++++ .../new/document-modal/document-icon.tsx | 273 +---------------- .../new/document-modal/graph-list-memories.tsx | 36 ++- apps/web/components/new/document-modal/index.tsx | 129 ++------- apps/web/components/new/document-modal/title.tsx | 19 +- .../components/new/documents-command-palette.tsx | 233 +++++++++++++++ apps/web/components/new/header.tsx | 11 +- apps/web/components/new/mcp-modal/index.tsx | 6 +- .../components/new/mcp-modal/mcp-detail-view.tsx | 2 +- apps/web/components/new/memories-grid.tsx | 116 ++++++-- apps/web/lib/url-helpers.ts | 46 +++ 21 files changed, 1228 insertions(+), 697 deletions(-) create mode 100644 apps/web/components/new/document-icon.tsx create mode 100644 apps/web/components/new/document-modal/content/google-doc.tsx create mode 100644 apps/web/components/new/document-modal/content/image-preview.tsx create mode 100644 apps/web/components/new/document-modal/content/index.tsx create mode 100644 apps/web/components/new/document-modal/content/text-editor-content.tsx create mode 100644 apps/web/components/new/documents-command-palette.tsx (limited to 'apps') diff --git a/apps/web/app/new/page.tsx b/apps/web/app/new/page.tsx index 2417ccb7..afb077b3 100644 --- a/apps/web/app/new/page.tsx +++ b/apps/web/app/new/page.tsx @@ -1,28 +1,51 @@ "use client" -import { useState } from "react" +import { useState, useCallback } from "react" import { Header } from "@/components/new/header" import { ChatSidebar } from "@/components/new/chat" import { MemoriesGrid } from "@/components/new/memories-grid" import { AnimatedGradientBackground } from "@/components/new/animated-gradient-background" import { AddDocumentModal } from "@/components/new/add-document" import { MCPModal } from "@/components/new/mcp-modal" +import { DocumentModal } from "@/components/new/document-modal" +import { DocumentsCommandPalette } from "@/components/new/documents-command-palette" import { HotkeysProvider } from "react-hotkeys-hook" import { useHotkeys } from "react-hotkeys-hook" import { AnimatePresence } from "motion/react" import { useIsMobile } from "@hooks/use-mobile" +import { useProject } from "@/stores" import { analytics } from "@/lib/analytics" +import type { DocumentsWithMemoriesResponseSchema } from "@repo/validation/api" +import type { z } from "zod" + +type DocumentsResponse = z.infer +type DocumentWithMemories = DocumentsResponse["documents"][0] export default function NewPage() { const isMobile = useIsMobile() + const { selectedProject } = useProject() const [isAddDocumentOpen, setIsAddDocumentOpen] = useState(false) const [isMCPModalOpen, setIsMCPModalOpen] = useState(false) + const [isSearchOpen, setIsSearchOpen] = useState(false) + const [selectedDocument, setSelectedDocument] = + useState(null) + const [isDocumentModalOpen, setIsDocumentModalOpen] = useState(false) + useHotkeys("c", () => { analytics.addDocumentModalOpened() setIsAddDocumentOpen(true) }) + useHotkeys("mod+k", (e) => { + e.preventDefault() + setIsSearchOpen(true) + }) const [isChatOpen, setIsChatOpen] = useState(!isMobile) + const handleOpenDocument = useCallback((document: DocumentWithMemories) => { + setSelectedDocument(document) + setIsDocumentModalOpen(true) + }, []) + return (
@@ -40,13 +63,17 @@ export default function NewPage() { setIsMCPModalOpen(true) }} onOpenChat={() => setIsChatOpen(true)} + onOpenSearch={() => setIsSearchOpen(true)} />
- +
@@ -70,6 +97,17 @@ export default function NewPage() { isOpen={isMCPModalOpen} onClose={() => setIsMCPModalOpen(false)} /> + + setIsDocumentModalOpen(false)} + />
) diff --git a/apps/web/components/new/chat/index.tsx b/apps/web/components/new/chat/index.tsx index 8c57aeae..32fe116e 100644 --- a/apps/web/components/new/chat/index.tsx +++ b/apps/web/components/new/chat/index.tsx @@ -383,7 +383,7 @@ export function ChatSidebar({ className={cn( "flex items-start justify-start", isMobile - ? "fixed bottom-4 right-4 z-50" + ? "fixed bottom-5 right-0 left-0 z-50 justify-center items-center" : "absolute top-0 right-0 m-4", dmSansClassName(), )} @@ -392,15 +392,21 @@ export function ChatSidebar({ - - {!isMobile && "Chat with Nova"} + + Chat with Nova ) : ( diff --git a/apps/web/components/new/document-cards/file-preview.tsx b/apps/web/components/new/document-cards/file-preview.tsx index 93e53463..f30645dc 100644 --- a/apps/web/components/new/document-cards/file-preview.tsx +++ b/apps/web/components/new/document-cards/file-preview.tsx @@ -5,71 +5,12 @@ import type { DocumentsWithMemoriesResponseSchema } from "@repo/validation/api" import type { z } from "zod" import { dmSansClassName } from "@/lib/fonts" import { cn } from "@lib/utils" -import { PDF } from "@ui/assets/icons" -import { FileText, Image, Video } from "lucide-react" +import { DocumentIcon } from "@/components/new/document-icon" type DocumentsResponse = z.infer type DocumentWithMemories = DocumentsResponse["documents"][0] -function PDFIcon() { - return ( - - PDF Icon - - - - - - - - - - - - - - - - - ) -} - function getFileTypeInfo(document: DocumentWithMemories): { - icon: React.ReactNode extension: string color?: string } { @@ -78,56 +19,33 @@ function getFileTypeInfo(document: DocumentWithMemories): { if (mimeType) { if (mimeType === "application/pdf") { - return { - icon: , - extension: ".pdf", - color: "#FF7673", - } + return { extension: ".pdf", color: "#FF7673" } } if (mimeType.startsWith("image/")) { const ext = mimeType.split("/")[1] || "jpg" - return { - icon: , - extension: `.${ext}`, - } + return { extension: `.${ext}` } } if (mimeType.startsWith("video/")) { const ext = mimeType.split("/")[1] || "mp4" - return { - icon: