From 0e49cc33f8d9b8cb55184e4c78e75decd070c40c Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Tue, 24 Mar 2026 16:07:28 +0200 Subject: [PATCH] format: auto-fix via pnpm format:fix --- .../components/DocumentsTableShell.tsx | 20 +++---- .../new-chat/[[...chat_id]]/page.tsx | 2 +- .../[search_space_id]/team/team-content.tsx | 2 +- surfsense_web/app/global-error.tsx | 2 +- surfsense_web/app/layout.tsx | 12 ++-- .../assistant-ui/connector-popup.tsx | 3 +- .../components/assistant-ui/thread.tsx | 8 ++- .../layout/providers/LayoutDataProvider.tsx | 11 ++-- .../ui/sidebar/AllPrivateChatsSidebar.tsx | 2 +- .../ui/sidebar/AllSharedChatsSidebar.tsx | 2 +- .../public-chat/public-chat-view.tsx | 2 +- .../settings/image-model-manager.tsx | 4 +- .../settings/model-config-manager.tsx | 2 +- .../components/settings/team-dialog.tsx | 2 +- .../settings/user-settings-dialog.tsx | 2 +- surfsense_web/components/tool-ui/index.ts | 2 +- .../video-presentation/combined-player.tsx | 13 ++-- .../generate-video-presentation.tsx | 59 ++++++------------- surfsense_web/components/ui/hero-carousel.tsx | 7 +-- surfsense_web/docker-entrypoint.js | 5 +- surfsense_web/hooks/use-chat-session-state.ts | 2 +- surfsense_web/hooks/use-comments-sync.ts | 2 +- surfsense_web/hooks/use-connectors-sync.ts | 2 +- .../hooks/use-documents-processing.ts | 6 +- surfsense_web/hooks/use-documents.ts | 6 +- surfsense_web/hooks/use-inbox.ts | 42 ++++++------- surfsense_web/hooks/use-messages-sync.ts | 2 +- surfsense_web/lib/remotion/compile-check.ts | 30 ++++------ surfsense_web/lib/remotion/dom-to-pptx.d.ts | 2 +- surfsense_web/next.config.ts | 2 +- surfsense_web/zero/queries/chat.ts | 17 ++---- surfsense_web/zero/queries/documents.ts | 14 ++--- surfsense_web/zero/queries/inbox.ts | 6 +- surfsense_web/zero/schema/chat.ts | 2 +- surfsense_web/zero/schema/documents.ts | 2 +- surfsense_web/zero/schema/inbox.ts | 2 +- surfsense_web/zero/schema/index.ts | 2 +- 37 files changed, 128 insertions(+), 175 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx index cc9881d3b..e2309299d 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx @@ -1,5 +1,6 @@ "use client"; +import { useAtomValue, useSetAtom } from "jotai"; import { AlertCircle, CheckCircle2, @@ -16,12 +17,11 @@ import { Trash2, User, } from "lucide-react"; -import { useAtomValue, useSetAtom } from "jotai"; import { useTranslations } from "next-intl"; import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { membersAtom } from "@/atoms/members/members-query.atoms"; -import { openEditorPanelAtom } from "@/atoms/editor/editor-panel.atom"; import { toast } from "sonner"; +import { openEditorPanelAtom } from "@/atoms/editor/editor-panel.atom"; +import { membersAtom } from "@/atoms/members/members-query.atoms"; import { useDocumentUploadDialog } from "@/components/assistant-ui/document-upload-popup"; import { JsonMetadataViewer } from "@/components/json-metadata-viewer"; import { MarkdownViewer } from "@/components/markdown-viewer"; @@ -35,14 +35,9 @@ import { AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Drawer, @@ -51,7 +46,12 @@ import { DrawerHeader, DrawerTitle, } from "@/components/ui/drawer"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { diff --git a/surfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsx index a9a6c5ec2..7c9f303e7 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsx @@ -40,7 +40,6 @@ import type { ThinkingStep } from "@/components/tool-ui/deepagent-thinking"; import { DisplayImageToolUI } from "@/components/tool-ui/display-image"; import { GeneratePodcastToolUI } from "@/components/tool-ui/generate-podcast"; import { GenerateReportToolUI } from "@/components/tool-ui/generate-report"; -import { GenerateVideoPresentationToolUI } from "@/components/tool-ui/video-presentation"; import { CreateGoogleDriveFileToolUI, DeleteGoogleDriveFileToolUI, @@ -59,6 +58,7 @@ import { import { SandboxExecuteToolUI } from "@/components/tool-ui/sandbox-execute"; import { ScrapeWebpageToolUI } from "@/components/tool-ui/scrape-webpage"; import { RecallMemoryToolUI, SaveMemoryToolUI } from "@/components/tool-ui/user-memory"; +import { GenerateVideoPresentationToolUI } from "@/components/tool-ui/video-presentation"; import { Skeleton } from "@/components/ui/skeleton"; import { useChatSessionStateSync } from "@/hooks/use-chat-session-state"; import { useMessagesSync } from "@/hooks/use-messages-sync"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/team/team-content.tsx b/surfsense_web/app/dashboard/[search_space_id]/team/team-content.tsx index 3e1ab0af1..43b4d0b7a 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/team/team-content.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/team/team-content.tsx @@ -20,7 +20,6 @@ import { UserPlus, Users, } from "lucide-react"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { useCallback, useEffect, useMemo, useState } from "react"; import { toast } from "sonner"; import { @@ -44,6 +43,7 @@ import { AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; import { Calendar as CalendarComponent } from "@/components/ui/calendar"; import { diff --git a/surfsense_web/app/global-error.tsx b/surfsense_web/app/global-error.tsx index ec558052d..8e6f1e445 100644 --- a/surfsense_web/app/global-error.tsx +++ b/surfsense_web/app/global-error.tsx @@ -1,7 +1,7 @@ "use client"; -import posthog from "posthog-js"; import NextError from "next/error"; +import posthog from "posthog-js"; import { useEffect } from "react"; export default function GlobalError({ diff --git a/surfsense_web/app/layout.tsx b/surfsense_web/app/layout.tsx index 9ba06c04d..784fd3bcf 100644 --- a/surfsense_web/app/layout.tsx +++ b/surfsense_web/app/layout.tsx @@ -4,9 +4,9 @@ import { RootProvider } from "fumadocs-ui/provider/next"; import { Roboto } from "next/font/google"; import { AnnouncementToastProvider } from "@/components/announcements/AnnouncementToastProvider"; import { GlobalLoadingProvider } from "@/components/providers/GlobalLoadingProvider"; -import { ZeroProvider } from "@/components/providers/ZeroProvider"; import { I18nProvider } from "@/components/providers/I18nProvider"; import { PostHogProvider } from "@/components/providers/PostHogProvider"; +import { ZeroProvider } from "@/components/providers/ZeroProvider"; import { ThemeProvider } from "@/components/theme/theme-provider"; import { Toaster } from "@/components/ui/sonner"; import { LocaleProvider } from "@/contexts/LocaleContext"; @@ -140,11 +140,11 @@ export default function RootLayout({ defaultTheme="system" > - - - {children} - - + + + {children} + + diff --git a/surfsense_web/components/assistant-ui/connector-popup.tsx b/surfsense_web/components/assistant-ui/connector-popup.tsx index 4e207eee3..dc74e6b57 100644 --- a/surfsense_web/components/assistant-ui/connector-popup.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup.tsx @@ -164,8 +164,7 @@ export const ConnectorIndicator = forwardRef 0 || (connectorsLoading && !connectorsError); + const useSyncData = connectorsFromSync.length > 0 || (connectorsLoading && !connectorsError); const connectors = useSyncData ? connectorsFromSync : allConnectors || []; const refreshConnectors = async () => { diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx index ac83b86e5..e0b39f6e4 100644 --- a/surfsense_web/components/assistant-ui/thread.tsx +++ b/surfsense_web/components/assistant-ui/thread.tsx @@ -938,7 +938,13 @@ const TOOL_GROUPS: { label: string; tools: string[] }[] = [ }, { label: "Generate", - tools: ["generate_podcast", "generate_video_presentation", "generate_report", "generate_image", "display_image"], + tools: [ + "generate_podcast", + "generate_video_presentation", + "generate_report", + "generate_image", + "display_image", + ], }, { label: "Memory", diff --git a/surfsense_web/components/layout/providers/LayoutDataProvider.tsx b/surfsense_web/components/layout/providers/LayoutDataProvider.tsx index 47a2b2362..ec58ef68c 100644 --- a/surfsense_web/components/layout/providers/LayoutDataProvider.tsx +++ b/surfsense_web/components/layout/providers/LayoutDataProvider.tsx @@ -3,7 +3,6 @@ import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { AlertTriangle, Inbox, Megaphone, SquareLibrary } from "lucide-react"; -import { Spinner } from "@/components/ui/spinner"; import { useParams, usePathname, useRouter } from "next/navigation"; import { useTranslations } from "next-intl"; import { useTheme } from "next-themes"; @@ -22,6 +21,10 @@ import { userSettingsDialogAtom, } from "@/atoms/settings/settings-dialog.atoms"; import { currentUserAtom } from "@/atoms/user/user-query.atoms"; +import { MorePagesDialog } from "@/components/settings/more-pages-dialog"; +import { SearchSpaceSettingsDialog } from "@/components/settings/search-space-settings-dialog"; +import { TeamDialog } from "@/components/settings/team-dialog"; +import { UserSettingsDialog } from "@/components/settings/user-settings-dialog"; import { AlertDialog, AlertDialogAction, @@ -42,7 +45,7 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; - +import { Spinner } from "@/components/ui/spinner"; import { useAnnouncements } from "@/hooks/use-announcements"; import { useDocumentsProcessing } from "@/hooks/use-documents-processing"; import { useInbox } from "@/hooks/use-inbox"; @@ -53,10 +56,6 @@ import { logout } from "@/lib/auth-utils"; import { deleteThread, fetchThreads, updateThread } from "@/lib/chat/thread-persistence"; import { resetUser, trackLogout } from "@/lib/posthog/events"; import { cacheKeys } from "@/lib/query-client/cache-keys"; -import { MorePagesDialog } from "@/components/settings/more-pages-dialog"; -import { SearchSpaceSettingsDialog } from "@/components/settings/search-space-settings-dialog"; -import { TeamDialog } from "@/components/settings/team-dialog"; -import { UserSettingsDialog } from "@/components/settings/user-settings-dialog"; import type { ChatItem, NavItem, SearchSpace } from "../types/layout.types"; import { CreateSearchSpaceDialog } from "../ui/dialogs"; import { LayoutShell } from "../ui/shell"; diff --git a/surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx index eb75842ba..1e857ec97 100644 --- a/surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx +++ b/surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx @@ -18,6 +18,7 @@ import { useParams, useRouter } from "next/navigation"; import { useTranslations } from "next-intl"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { toast } from "sonner"; +import { Tabs, TabsList, TabsTrigger } from "@/components/ui/animated-tabs"; import { Button } from "@/components/ui/button"; import { Dialog, @@ -36,7 +37,6 @@ import { import { Input } from "@/components/ui/input"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; -import { Tabs, TabsList, TabsTrigger } from "@/components/ui/animated-tabs"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useDebouncedValue } from "@/hooks/use-debounced-value"; import { useLongPress } from "@/hooks/use-long-press"; diff --git a/surfsense_web/components/layout/ui/sidebar/AllSharedChatsSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/AllSharedChatsSidebar.tsx index 81c75f9d7..01fa1714f 100644 --- a/surfsense_web/components/layout/ui/sidebar/AllSharedChatsSidebar.tsx +++ b/surfsense_web/components/layout/ui/sidebar/AllSharedChatsSidebar.tsx @@ -18,6 +18,7 @@ import { useParams, useRouter } from "next/navigation"; import { useTranslations } from "next-intl"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { toast } from "sonner"; +import { Tabs, TabsList, TabsTrigger } from "@/components/ui/animated-tabs"; import { Button } from "@/components/ui/button"; import { Dialog, @@ -36,7 +37,6 @@ import { import { Input } from "@/components/ui/input"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; -import { Tabs, TabsList, TabsTrigger } from "@/components/ui/animated-tabs"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useDebouncedValue } from "@/hooks/use-debounced-value"; import { useLongPress } from "@/hooks/use-long-press"; diff --git a/surfsense_web/components/public-chat/public-chat-view.tsx b/surfsense_web/components/public-chat/public-chat-view.tsx index 1407087e2..4adaa83e5 100644 --- a/surfsense_web/components/public-chat/public-chat-view.tsx +++ b/surfsense_web/components/public-chat/public-chat-view.tsx @@ -6,9 +6,9 @@ import { ReportPanel } from "@/components/report-panel/report-panel"; import { DisplayImageToolUI } from "@/components/tool-ui/display-image"; import { GeneratePodcastToolUI } from "@/components/tool-ui/generate-podcast"; import { GenerateReportToolUI } from "@/components/tool-ui/generate-report"; -import { GenerateVideoPresentationToolUI } from "@/components/tool-ui/video-presentation"; import { LinkPreviewToolUI } from "@/components/tool-ui/link-preview"; import { ScrapeWebpageToolUI } from "@/components/tool-ui/scrape-webpage"; +import { GenerateVideoPresentationToolUI } from "@/components/tool-ui/video-presentation"; import { Spinner } from "@/components/ui/spinner"; import { usePublicChat } from "@/hooks/use-public-chat"; import { usePublicChatRuntime } from "@/hooks/use-public-chat-runtime"; diff --git a/surfsense_web/components/settings/image-model-manager.tsx b/surfsense_web/components/settings/image-model-manager.tsx index 0b28c9a7f..09c8bb669 100644 --- a/surfsense_web/components/settings/image-model-manager.tsx +++ b/surfsense_web/components/settings/image-model-manager.tsx @@ -15,7 +15,6 @@ import { } from "lucide-react"; import { useCallback, useMemo, useState } from "react"; import { toast } from "sonner"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { createImageGenConfigMutationAtom, deleteImageGenConfigMutationAtom, @@ -38,6 +37,7 @@ import { AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { @@ -69,12 +69,12 @@ import { Separator } from "@/components/ui/separator"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; -import { useMediaQuery } from "@/hooks/use-media-query"; import { getImageGenModelsByProvider, IMAGE_GEN_PROVIDERS, } from "@/contracts/enums/image-gen-providers"; import type { ImageGenerationConfig } from "@/contracts/types/new-llm-config.types"; +import { useMediaQuery } from "@/hooks/use-media-query"; import { getProviderIcon } from "@/lib/provider-icons"; import { cn } from "@/lib/utils"; diff --git a/surfsense_web/components/settings/model-config-manager.tsx b/surfsense_web/components/settings/model-config-manager.tsx index f4a584942..80bfd8e31 100644 --- a/surfsense_web/components/settings/model-config-manager.tsx +++ b/surfsense_web/components/settings/model-config-manager.tsx @@ -13,7 +13,6 @@ import { Wand2, } from "lucide-react"; import { useCallback, useMemo, useState } from "react"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { membersAtom, myAccessAtom } from "@/atoms/members/members-query.atoms"; import { createNewLLMConfigMutationAtom, @@ -36,6 +35,7 @@ import { AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; diff --git a/surfsense_web/components/settings/team-dialog.tsx b/surfsense_web/components/settings/team-dialog.tsx index 681964afc..a3a962378 100644 --- a/surfsense_web/components/settings/team-dialog.tsx +++ b/surfsense_web/components/settings/team-dialog.tsx @@ -2,9 +2,9 @@ import { useAtom } from "jotai"; import { useTranslations } from "next-intl"; +import { TeamContent } from "@/app/dashboard/[search_space_id]/team/team-content"; import { teamDialogAtom } from "@/atoms/settings/settings-dialog.atoms"; import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog"; -import { TeamContent } from "@/app/dashboard/[search_space_id]/team/team-content"; interface TeamDialogProps { searchSpaceId: number; diff --git a/surfsense_web/components/settings/user-settings-dialog.tsx b/surfsense_web/components/settings/user-settings-dialog.tsx index 426903a23..855f12b61 100644 --- a/surfsense_web/components/settings/user-settings-dialog.tsx +++ b/surfsense_web/components/settings/user-settings-dialog.tsx @@ -3,9 +3,9 @@ import { useAtom } from "jotai"; import { KeyRound, User } from "lucide-react"; import { useTranslations } from "next-intl"; -import { userSettingsDialogAtom } from "@/atoms/settings/settings-dialog.atoms"; import { ApiKeyContent } from "@/app/dashboard/[search_space_id]/user-settings/components/ApiKeyContent"; import { ProfileContent } from "@/app/dashboard/[search_space_id]/user-settings/components/ProfileContent"; +import { userSettingsDialogAtom } from "@/atoms/settings/settings-dialog.atoms"; import { SettingsDialog } from "@/components/settings/settings-dialog"; export function UserSettingsDialog() { diff --git a/surfsense_web/components/tool-ui/index.ts b/surfsense_web/components/tool-ui/index.ts index 65c0ca497..def531417 100644 --- a/surfsense_web/components/tool-ui/index.ts +++ b/surfsense_web/components/tool-ui/index.ts @@ -32,7 +32,6 @@ export { } from "./display-image"; export { GeneratePodcastToolUI } from "./generate-podcast"; export { GenerateReportToolUI } from "./generate-report"; -export { GenerateVideoPresentationToolUI } from "./video-presentation"; export { CreateGoogleDriveFileToolUI, DeleteGoogleDriveFileToolUI } from "./google-drive"; export { Image, @@ -106,4 +105,5 @@ export { SaveMemoryResultSchema, SaveMemoryToolUI, } from "./user-memory"; +export { GenerateVideoPresentationToolUI } from "./video-presentation"; export { type WriteTodosData, WriteTodosSchema, WriteTodosToolUI } from "./write-todos"; diff --git a/surfsense_web/components/tool-ui/video-presentation/combined-player.tsx b/surfsense_web/components/tool-ui/video-presentation/combined-player.tsx index f8e79f677..9a87c48d2 100644 --- a/surfsense_web/components/tool-ui/video-presentation/combined-player.tsx +++ b/surfsense_web/components/tool-ui/video-presentation/combined-player.tsx @@ -1,9 +1,10 @@ "use client"; -import React, { useMemo } from "react"; -import { Player } from "@remotion/player"; -import { Sequence, AbsoluteFill, useCurrentFrame, useVideoConfig, interpolate } from "remotion"; import { Audio } from "@remotion/media"; +import { Player } from "@remotion/player"; +import type React from "react"; +import { useMemo } from "react"; +import { AbsoluteFill, interpolate, Sequence, useCurrentFrame, useVideoConfig } from "remotion"; import { FPS } from "@/lib/remotion/constants"; export interface CompiledSlide { @@ -64,9 +65,7 @@ function Watermark() { ); } -export function buildSlideWithWatermark( - SlideComponent: React.ComponentType, -): React.FC { +export function buildSlideWithWatermark(SlideComponent: React.ComponentType): React.FC { const Wrapped: React.FC = () => ( @@ -115,7 +114,7 @@ export function CombinedPlayer({ slides }: CombinedPlayerProps) { const totalFrames = useMemo( () => slides.reduce((sum, s) => sum + s.durationInFrames, 0), - [slides], + [slides] ); return ( diff --git a/surfsense_web/components/tool-ui/video-presentation/generate-video-presentation.tsx b/surfsense_web/components/tool-ui/video-presentation/generate-video-presentation.tsx index 34e443f5d..0ec87264a 100644 --- a/surfsense_web/components/tool-ui/video-presentation/generate-video-presentation.tsx +++ b/surfsense_web/components/tool-ui/video-presentation/generate-video-presentation.tsx @@ -1,16 +1,9 @@ "use client"; -import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { makeAssistantToolUI } from "@assistant-ui/react"; -import { - AlertCircleIcon, - Download, - Film, - Loader2, - Presentation, - X, -} from "lucide-react"; +import { AlertCircleIcon, Download, Film, Loader2, Presentation, X } from "lucide-react"; import { useParams, usePathname } from "next/navigation"; +import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { z } from "zod"; import { Spinner } from "@/components/ui/spinner"; import { baseApiService } from "@/lib/apis/base-api.service"; @@ -18,9 +11,9 @@ import { authenticatedFetch } from "@/lib/auth-utils"; import { compileCheck, compileToComponent } from "@/lib/remotion/compile-check"; import { FPS } from "@/lib/remotion/constants"; import { - CombinedPlayer, buildCompositionComponent, buildSlideWithWatermark, + CombinedPlayer, type CompiledSlide, } from "./combined-player"; @@ -54,7 +47,7 @@ const VideoPresentationStatusResponseSchema = z.object({ audio_url: z.string().nullish(), duration_seconds: z.number().nullish(), duration_in_frames: z.number().nullish(), - }), + }) ) .nullish(), scene_codes: z @@ -63,7 +56,7 @@ const VideoPresentationStatusResponseSchema = z.object({ slide_number: z.number(), code: z.string(), title: z.string().nullish(), - }), + }) ) .nullish(), slide_count: z.number().nullish(), @@ -206,9 +199,7 @@ function VideoPresentationPlayer({ const durationInFrames = slide.duration_in_frames ?? 300; const check = compileCheck(scene.code); if (!check.success) { - console.warn( - `Slide ${slide.slide_number} failed to compile: ${check.error}`, - ); + console.warn(`Slide ${slide.slide_number} failed to compile: ${check.error}`); continue; } @@ -219,9 +210,7 @@ function VideoPresentationPlayer({ title: scene.title ?? slide.title, code: scene.code, durationInFrames, - audioUrl: slide.audio_url - ? `${backendUrl}${slide.audio_url}` - : undefined, + audioUrl: slide.audio_url ? `${backendUrl}${slide.audio_url}` : undefined, }); } @@ -238,17 +227,13 @@ function VideoPresentationPlayer({ try { let blob: Blob; if (shareToken) { - blob = await baseApiService.getBlob( - new URL(slide.audioUrl).pathname, - ); + blob = await baseApiService.getBlob(new URL(slide.audioUrl).pathname); } else { const resp = await authenticatedFetch(slide.audioUrl, { method: "GET", }); if (!resp.ok) { - console.warn( - `Audio fetch ${resp.status} for slide "${slide.title}"`, - ); + console.warn(`Audio fetch ${resp.status} for slide "${slide.title}"`); return { ...slide, audioUrl: undefined }; } blob = await resp.blob(); @@ -260,7 +245,7 @@ function VideoPresentationPlayer({ console.warn(`Failed to fetch audio for "${slide.title}":`, err); return { ...slide, audioUrl: undefined }; } - }), + }) ); setCompiledSlides(withBlobs); @@ -284,7 +269,7 @@ function VideoPresentationPlayer({ const totalDuration = useMemo( () => compiledSlides.reduce((sum, s) => sum + s.durationInFrames / FPS, 0), - [compiledSlides], + [compiledSlides] ); const handleDownload = async () => { @@ -299,9 +284,7 @@ function VideoPresentationPlayer({ abortControllerRef.current = controller; try { - const { canRenderMediaOnWeb, renderMediaOnWeb } = await import( - "@remotion/web-renderer" - ); + const { canRenderMediaOnWeb, renderMediaOnWeb } = await import("@remotion/web-renderer"); const formats = [ { container: "mp4" as const, videoCodec: "h264" as const, ext: "mp4" }, @@ -326,7 +309,7 @@ function VideoPresentationPlayer({ if (!chosen) { throw new Error( - "Your browser does not support video rendering (WebCodecs). Please use Chrome, Edge, or Firefox 130+.", + "Your browser does not support video rendering (WebCodecs). Please use Chrome, Edge, or Firefox 130+." ); } @@ -422,7 +405,7 @@ function VideoPresentationPlayer({ durationInFrames: slide.durationInFrames, fps: FPS, style: { width: 1920, height: 1080 }, - }), + }) ); }); @@ -466,8 +449,7 @@ function VideoPresentationPlayer({

{title}

- {compiledSlides.length} slides · {totalDuration.toFixed(1)}s ·{" "} - {FPS}fps + {compiledSlides.length} slides · {totalDuration.toFixed(1)}s · {FPS}fps

@@ -479,9 +461,7 @@ function VideoPresentationPlayer({ Rendering {renderFormat ?? ""}{" "} - {renderProgress !== null - ? `${Math.round(renderProgress * 100)}%` - : "..."} + {renderProgress !== null ? `${Math.round(renderProgress * 100)}%` : "..."}

Download Failed

-

- {renderError} -

+

{renderError}

)} @@ -626,8 +604,7 @@ export const GenerateVideoPresentationToolUI = makeAssistantToolUI< const params = useParams(); const pathname = usePathname(); const isPublicRoute = pathname?.startsWith("/public/"); - const shareToken = - isPublicRoute && typeof params?.token === "string" ? params.token : null; + const shareToken = isPublicRoute && typeof params?.token === "string" ? params.token : null; const title = args.video_title || "SurfSense Presentation"; diff --git a/surfsense_web/components/ui/hero-carousel.tsx b/surfsense_web/components/ui/hero-carousel.tsx index adf7126b8..da704a42a 100644 --- a/surfsense_web/components/ui/hero-carousel.tsx +++ b/surfsense_web/components/ui/hero-carousel.tsx @@ -19,8 +19,7 @@ const carouselItems = [ }, { title: "Video Generation", - description: - "Create short videos with AI-generated visuals and narration from your sources.", + description: "Create short videos with AI-generated visuals and narration from your sources.", src: "/homepage/hero_tutorial/video_gen_surf.mp4", }, { @@ -176,9 +175,7 @@ function HeroCarousel() { const id = setTimeout(() => { directionRef.current = "forward"; - setActiveIndex((prev) => - prev >= carouselItems.length - 1 ? 0 : prev + 1 - ); + setActiveIndex((prev) => (prev >= carouselItems.length - 1 ? 0 : prev + 1)); }, AUTOPLAY_MS); return () => clearTimeout(id); diff --git a/surfsense_web/docker-entrypoint.js b/surfsense_web/docker-entrypoint.js index dad52b73e..8323f5652 100644 --- a/surfsense_web/docker-entrypoint.js +++ b/surfsense_web/docker-entrypoint.js @@ -22,7 +22,10 @@ const replacements = [ process.env.NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE || "LOCAL", ], ["__NEXT_PUBLIC_ETL_SERVICE__", process.env.NEXT_PUBLIC_ETL_SERVICE || "DOCLING"], - ["__NEXT_PUBLIC_ZERO_CACHE_URL__", process.env.NEXT_PUBLIC_ZERO_CACHE_URL || "http://localhost:4848"], + [ + "__NEXT_PUBLIC_ZERO_CACHE_URL__", + process.env.NEXT_PUBLIC_ZERO_CACHE_URL || "http://localhost:4848", + ], ["__NEXT_PUBLIC_DEPLOYMENT_MODE__", process.env.NEXT_PUBLIC_DEPLOYMENT_MODE || "self-hosted"], ]; diff --git a/surfsense_web/hooks/use-chat-session-state.ts b/surfsense_web/hooks/use-chat-session-state.ts index 3c32c3d2a..467e360aa 100644 --- a/surfsense_web/hooks/use-chat-session-state.ts +++ b/surfsense_web/hooks/use-chat-session-state.ts @@ -1,10 +1,10 @@ "use client"; +import { useQuery } from "@rocicorp/zero/react"; import { useSetAtom } from "jotai"; import { useEffect } from "react"; import { chatSessionStateAtom } from "@/atoms/chat/chat-session-state.atom"; import { queries } from "@/zero/queries"; -import { useQuery } from "@rocicorp/zero/react"; /** * Syncs chat session state for a thread via Zero. diff --git a/surfsense_web/hooks/use-comments-sync.ts b/surfsense_web/hooks/use-comments-sync.ts index 48d97d0e6..b6a68364d 100644 --- a/surfsense_web/hooks/use-comments-sync.ts +++ b/surfsense_web/hooks/use-comments-sync.ts @@ -1,5 +1,6 @@ "use client"; +import { useQuery } from "@rocicorp/zero/react"; import { useQueryClient } from "@tanstack/react-query"; import { useAtomValue } from "jotai"; import { useCallback, useEffect, useMemo, useRef } from "react"; @@ -9,7 +10,6 @@ import type { Author, Comment, CommentReply } from "@/contracts/types/chat-comme import type { Membership } from "@/contracts/types/members.types"; import { cacheKeys } from "@/lib/query-client/cache-keys"; import { queries } from "@/zero/queries"; -import { useQuery } from "@rocicorp/zero/react"; interface RawCommentRow { id: number; diff --git a/surfsense_web/hooks/use-connectors-sync.ts b/surfsense_web/hooks/use-connectors-sync.ts index 602c06dfc..d36728118 100644 --- a/surfsense_web/hooks/use-connectors-sync.ts +++ b/surfsense_web/hooks/use-connectors-sync.ts @@ -1,9 +1,9 @@ "use client"; +import { useQuery } from "@rocicorp/zero/react"; import { useMemo } from "react"; import type { SearchSourceConnector } from "@/contracts/types/connector.types"; import { queries } from "@/zero/queries"; -import { useQuery } from "@rocicorp/zero/react"; /** * Syncs connectors for a search space via Zero. diff --git a/surfsense_web/hooks/use-documents-processing.ts b/surfsense_web/hooks/use-documents-processing.ts index 7075e9dae..e39c03de0 100644 --- a/surfsense_web/hooks/use-documents-processing.ts +++ b/surfsense_web/hooks/use-documents-processing.ts @@ -1,8 +1,8 @@ "use client"; +import { useQuery } from "@rocicorp/zero/react"; import { useEffect, useRef, useState } from "react"; import { queries } from "@/zero/queries"; -import { useQuery } from "@rocicorp/zero/react"; export type DocumentsProcessingStatus = "idle" | "processing" | "success" | "error"; @@ -20,9 +20,7 @@ export function useDocumentsProcessing(searchSpaceId: number | null): DocumentsP const wasProcessingRef = useRef(false); const successTimerRef = useRef | null>(null); - const [documents] = useQuery( - queries.documents.bySpace({ searchSpaceId: searchSpaceId ?? -1 }) - ); + const [documents] = useQuery(queries.documents.bySpace({ searchSpaceId: searchSpaceId ?? -1 })); useEffect(() => { if (!searchSpaceId || !documents) return; diff --git a/surfsense_web/hooks/use-documents.ts b/surfsense_web/hooks/use-documents.ts index dbf99b349..df782ca83 100644 --- a/surfsense_web/hooks/use-documents.ts +++ b/surfsense_web/hooks/use-documents.ts @@ -1,10 +1,10 @@ "use client"; +import { useQuery } from "@rocicorp/zero/react"; import { useCallback, useEffect, useRef, useState } from "react"; import type { DocumentSortBy, DocumentTypeEnum, SortOrder } from "@/contracts/types/document.types"; import { documentsApiService } from "@/lib/apis/documents-api.service"; import { queries } from "@/zero/queries"; -import { useQuery } from "@rocicorp/zero/react"; export interface DocumentStatusType { state: "ready" | "pending" | "processing" | "failed"; @@ -254,7 +254,9 @@ export function useDocuments( ...existing, title: liveItem.title, document_type: liveItem.documentType, - status: (liveItem.status as unknown as DocumentStatusType) ?? { state: "ready" as const }, + status: (liveItem.status as unknown as DocumentStatusType) ?? { + state: "ready" as const, + }, }; } } diff --git a/surfsense_web/hooks/use-inbox.ts b/surfsense_web/hooks/use-inbox.ts index 196a97b4e..4203c3506 100644 --- a/surfsense_web/hooks/use-inbox.ts +++ b/surfsense_web/hooks/use-inbox.ts @@ -1,10 +1,10 @@ "use client"; +import { useQuery } from "@rocicorp/zero/react"; import { useCallback, useEffect, useRef, useState } from "react"; import type { InboxItem, NotificationCategory } from "@/contracts/types/inbox.types"; import { notificationsApiService } from "@/lib/apis/notifications-api.service"; import { queries } from "@/zero/queries"; -import { useQuery } from "@rocicorp/zero/react"; export type { InboxItem, @@ -118,9 +118,7 @@ export function useInbox( }, [userId, searchSpaceId, category, prefetchedUnread, prefetchedUnreadReady]); // EFFECT 2: Zero real-time sync for notification updates - const [zeroNotifications] = useQuery( - queries.notifications.byUser({ userId: userId ?? "" }) - ); + const [zeroNotifications] = useQuery(queries.notifications.byUser({ userId: userId ?? "" })); useEffect(() => { if (!userId || !searchSpaceId || !zeroNotifications || !initialLoadDoneRef.current) return; @@ -134,9 +132,7 @@ export function useInbox( return true; }); - const recentItems = validItems.filter( - (item) => new Date(item.createdAt) > cutoff - ); + const recentItems = validItems.filter((item) => new Date(item.createdAt) > cutoff); const liveIds = new Set(recentItems.map((d) => d.id)); @@ -145,18 +141,21 @@ export function useInbox( const newItems: InboxItem[] = recentItems .filter((d) => !prevIds.has(d.id)) - .map((item) => ({ - id: item.id, - user_id: item.userId, - search_space_id: item.searchSpaceId ?? undefined, - type: item.type, - title: item.title, - message: item.message, - read: item.read, - metadata: item.metadata as unknown as Record, - created_at: new Date(item.createdAt).toISOString(), - updated_at: item.updatedAt ? new Date(item.updatedAt).toISOString() : null, - } as InboxItem)); + .map( + (item) => + ({ + id: item.id, + user_id: item.userId, + search_space_id: item.searchSpaceId ?? undefined, + type: item.type, + title: item.title, + message: item.message, + read: item.read, + metadata: item.metadata as unknown as Record, + created_at: new Date(item.createdAt).toISOString(), + updated_at: item.updatedAt ? new Date(item.updatedAt).toISOString() : null, + }) as InboxItem + ); let updated = prev.map((existing) => { const liveItem = recentItems.find((v) => v.id === existing.id); @@ -187,10 +186,7 @@ export function useInbox( // Calibrate older-unread offset on first Zero data if (olderUnreadOffsetRef.current === null) { const recentUnreadCount = recentItems.filter((item) => !item.read).length; - olderUnreadOffsetRef.current = Math.max( - 0, - apiUnreadTotalRef.current - recentUnreadCount - ); + olderUnreadOffsetRef.current = Math.max(0, apiUnreadTotalRef.current - recentUnreadCount); } if (olderUnreadOffsetRef.current !== null) { diff --git a/surfsense_web/hooks/use-messages-sync.ts b/surfsense_web/hooks/use-messages-sync.ts index da2869bc6..ddbe8a757 100644 --- a/surfsense_web/hooks/use-messages-sync.ts +++ b/surfsense_web/hooks/use-messages-sync.ts @@ -1,9 +1,9 @@ "use client"; +import { useQuery } from "@rocicorp/zero/react"; import { useEffect, useRef } from "react"; import type { RawMessage } from "@/contracts/types/chat-messages.types"; import { queries } from "@/zero/queries"; -import { useQuery } from "@rocicorp/zero/react"; /** * Syncs chat messages for a thread via Zero. diff --git a/surfsense_web/lib/remotion/compile-check.ts b/surfsense_web/lib/remotion/compile-check.ts index 192d6f48e..de04c153d 100644 --- a/surfsense_web/lib/remotion/compile-check.ts +++ b/surfsense_web/lib/remotion/compile-check.ts @@ -2,12 +2,12 @@ import * as Babel from "@babel/standalone"; import React from "react"; import { AbsoluteFill, - useCurrentFrame, - useVideoConfig, - spring, + Easing, interpolate, Sequence, - Easing, + spring, + useCurrentFrame, + useVideoConfig, } from "remotion"; import { DURATION_IN_FRAMES } from "./constants"; @@ -21,7 +21,7 @@ function createStagger(totalFrames: number) { frame: number, fps: number, index: number, - total: number, + total: number ): { opacity: number; transform: string } { const enterPhase = Math.floor(totalFrames * 0.2); const exitStart = Math.floor(totalFrames * 0.8); @@ -43,9 +43,7 @@ function createStagger(totalFrames: number) { const opacity = s * (1 - exit); const translateY = - interpolate(s, [0, 1], [40, 0]) + - interpolate(exit, [0, 1], [0, -30]) + - ambient; + interpolate(s, [0, 1], [40, 0]) + interpolate(exit, [0, 1], [0, -30]) + ambient; const scale = interpolate(s, [0, 1], [0.97, 1]); return { @@ -97,7 +95,7 @@ export function prepareSource(code: string): string { const codeWithoutImports = code.replace(/^import\s+.*$/gm, "").trim(); const match = codeWithoutImports.match( - /export\s+(?:const|function)\s+(\w+)\s*(?::\s*React\.FC\s*)?=?\s*\(\s*\)\s*=>\s*\{([\s\S]*)\};?\s*$/, + /export\s+(?:const|function)\s+(\w+)\s*(?::\s*React\.FC\s*)?=?\s*\(\s*\)\s*=>\s*\{([\s\S]*)\};?\s*$/ ); if (match) { @@ -137,18 +135,10 @@ export function compileCheck(code: string): CompileResult { } } -export function compileToComponent( - code: string, - durationInFrames?: number, -): React.ComponentType { - const staggerFn = durationInFrames - ? createStagger(durationInFrames) - : defaultStagger; +export function compileToComponent(code: string, durationInFrames?: number): React.ComponentType { + const staggerFn = durationInFrames ? createStagger(durationInFrames) : defaultStagger; const jsCode = transpile(code); - const factory = new Function( - ...INJECTED_NAMES, - `${jsCode}\nreturn DynamicComponent;`, - ); + const factory = new Function(...INJECTED_NAMES, `${jsCode}\nreturn DynamicComponent;`); return factory(...buildInjectedValues(staggerFn)) as React.ComponentType; } diff --git a/surfsense_web/lib/remotion/dom-to-pptx.d.ts b/surfsense_web/lib/remotion/dom-to-pptx.d.ts index e832eb495..b451c7a33 100644 --- a/surfsense_web/lib/remotion/dom-to-pptx.d.ts +++ b/surfsense_web/lib/remotion/dom-to-pptx.d.ts @@ -13,6 +13,6 @@ declare module "dom-to-pptx" { export function exportToPptx( elementOrSelector: string | HTMLElement | Array, - options?: ExportOptions, + options?: ExportOptions ): Promise; } diff --git a/surfsense_web/next.config.ts b/surfsense_web/next.config.ts index 0f71a9eaf..f02cf4d03 100644 --- a/surfsense_web/next.config.ts +++ b/surfsense_web/next.config.ts @@ -1,7 +1,7 @@ -import path from "path"; import { createMDX } from "fumadocs-mdx/next"; import type { NextConfig } from "next"; import createNextIntlPlugin from "next-intl/plugin"; +import path from "path"; // Create the next-intl plugin const withNextIntl = createNextIntlPlugin("./i18n/request.ts"); diff --git a/surfsense_web/zero/queries/chat.ts b/surfsense_web/zero/queries/chat.ts index 45ffa7ea2..de8b13f8a 100644 --- a/surfsense_web/zero/queries/chat.ts +++ b/surfsense_web/zero/queries/chat.ts @@ -3,24 +3,19 @@ import { z } from "zod"; import { zql } from "../schema/index"; export const messageQueries = { - byThread: defineQuery( - z.object({ threadId: z.number() }), - ({ args: { threadId } }) => - zql.new_chat_messages.where("threadId", threadId).orderBy("createdAt", "asc"), + byThread: defineQuery(z.object({ threadId: z.number() }), ({ args: { threadId } }) => + zql.new_chat_messages.where("threadId", threadId).orderBy("createdAt", "asc") ), }; export const commentQueries = { - byThread: defineQuery( - z.object({ threadId: z.number() }), - ({ args: { threadId } }) => - zql.chat_comments.where("threadId", threadId).orderBy("createdAt", "asc"), + byThread: defineQuery(z.object({ threadId: z.number() }), ({ args: { threadId } }) => + zql.chat_comments.where("threadId", threadId).orderBy("createdAt", "asc") ), }; export const chatSessionQueries = { - byThread: defineQuery( - z.object({ threadId: z.number() }), - ({ args: { threadId } }) => zql.chat_session_state.where("threadId", threadId).one(), + byThread: defineQuery(z.object({ threadId: z.number() }), ({ args: { threadId } }) => + zql.chat_session_state.where("threadId", threadId).one() ), }; diff --git a/surfsense_web/zero/queries/documents.ts b/surfsense_web/zero/queries/documents.ts index aa34bf718..97088945f 100644 --- a/surfsense_web/zero/queries/documents.ts +++ b/surfsense_web/zero/queries/documents.ts @@ -3,19 +3,13 @@ import { z } from "zod"; import { zql } from "../schema/index"; export const documentQueries = { - bySpace: defineQuery( - z.object({ searchSpaceId: z.number() }), - ({ args: { searchSpaceId } }) => - zql.documents.where("searchSpaceId", searchSpaceId).orderBy("createdAt", "desc"), + bySpace: defineQuery(z.object({ searchSpaceId: z.number() }), ({ args: { searchSpaceId } }) => + zql.documents.where("searchSpaceId", searchSpaceId).orderBy("createdAt", "desc") ), }; export const connectorQueries = { - bySpace: defineQuery( - z.object({ searchSpaceId: z.number() }), - ({ args: { searchSpaceId } }) => - zql.search_source_connectors - .where("searchSpaceId", searchSpaceId) - .orderBy("createdAt", "desc"), + bySpace: defineQuery(z.object({ searchSpaceId: z.number() }), ({ args: { searchSpaceId } }) => + zql.search_source_connectors.where("searchSpaceId", searchSpaceId).orderBy("createdAt", "desc") ), }; diff --git a/surfsense_web/zero/queries/inbox.ts b/surfsense_web/zero/queries/inbox.ts index 6221ef345..d85b7212f 100644 --- a/surfsense_web/zero/queries/inbox.ts +++ b/surfsense_web/zero/queries/inbox.ts @@ -3,9 +3,7 @@ import { z } from "zod"; import { zql } from "../schema/index"; export const notificationQueries = { - byUser: defineQuery( - z.object({ userId: z.string() }), - ({ args: { userId } }) => - zql.notifications.where("userId", userId).orderBy("createdAt", "desc"), + byUser: defineQuery(z.object({ userId: z.string() }), ({ args: { userId } }) => + zql.notifications.where("userId", userId).orderBy("createdAt", "desc") ), }; diff --git a/surfsense_web/zero/schema/chat.ts b/surfsense_web/zero/schema/chat.ts index b8b7fbb93..0293059fd 100644 --- a/surfsense_web/zero/schema/chat.ts +++ b/surfsense_web/zero/schema/chat.ts @@ -1,4 +1,4 @@ -import { table, string, number, json } from "@rocicorp/zero"; +import { json, number, string, table } from "@rocicorp/zero"; export const newChatMessageTable = table("new_chat_messages") .columns({ diff --git a/surfsense_web/zero/schema/documents.ts b/surfsense_web/zero/schema/documents.ts index c50fc959b..ceeefd877 100644 --- a/surfsense_web/zero/schema/documents.ts +++ b/surfsense_web/zero/schema/documents.ts @@ -1,4 +1,4 @@ -import { table, string, number, boolean, json } from "@rocicorp/zero"; +import { boolean, json, number, string, table } from "@rocicorp/zero"; export const documentTable = table("documents") .columns({ diff --git a/surfsense_web/zero/schema/inbox.ts b/surfsense_web/zero/schema/inbox.ts index 3eca9522f..946180ba4 100644 --- a/surfsense_web/zero/schema/inbox.ts +++ b/surfsense_web/zero/schema/inbox.ts @@ -1,4 +1,4 @@ -import { table, string, number, boolean, json } from "@rocicorp/zero"; +import { boolean, json, number, string, table } from "@rocicorp/zero"; export const notificationTable = table("notifications") .columns({ diff --git a/surfsense_web/zero/schema/index.ts b/surfsense_web/zero/schema/index.ts index 1c3e89151..0a6587e92 100644 --- a/surfsense_web/zero/schema/index.ts +++ b/surfsense_web/zero/schema/index.ts @@ -1,4 +1,4 @@ -import { createSchema, createBuilder, relationships } from "@rocicorp/zero"; +import { createBuilder, createSchema, relationships } from "@rocicorp/zero"; import { chatCommentTable, chatSessionStateTable, newChatMessageTable } from "./chat"; import { documentTable, searchSourceConnectorTable } from "./documents"; import { notificationTable } from "./inbox";