"use client"; import { Inbox } from "lucide-react"; import { useRouter } from "next/navigation"; import type { ReactNode } from "react"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useAnonymousMode } from "@/contexts/anonymous-mode"; import { useLoginGate } from "@/contexts/login-gate"; import { useAnnouncements } from "@/hooks/use-announcements"; import { anonymousChatApiService } from "@/lib/apis/anonymous-chat-api.service"; import type { ChatItem, NavItem, PageUsage, Workspace } from "../types/layout.types"; import { LayoutShell } from "../ui/shell"; interface FreeLayoutDataProviderProps { children: ReactNode; } const GUEST_SPACE: Workspace = { id: 0, name: "SurfSense Free", description: "Free AI chat without login", isOwner: false, memberCount: 1, }; export function FreeLayoutDataProvider({ children }: FreeLayoutDataProviderProps) { const router = useRouter(); const { gate } = useLoginGate(); const anonMode = useAnonymousMode(); const { unreadCount: announcementUnreadCount } = useAnnouncements(); const [quota, setQuota] = useState<{ used: number; limit: number } | null>(null); useEffect(() => { anonymousChatApiService .getQuota() .then((q) => { setQuota({ used: q.used, limit: q.limit }); }) .catch(() => {}); }, []); const resetChat = useCallback(() => { if (anonMode.isAnonymous) { anonMode.resetChat(); } }, [anonMode]); const gatedAction = useCallback((feature: string) => () => gate(feature), [gate]); const navItems: NavItem[] = useMemo( () => ( [ { title: "Inbox", url: "#inbox", icon: Inbox, isActive: false, }, ] as (NavItem | null)[] ).filter((item): item is NavItem => item !== null), [] ); const pageUsage: PageUsage | undefined = quota ? { pagesUsed: quota.used, pagesLimit: quota.limit } : undefined; const handleChatSelect = useCallback((_chat: ChatItem) => gate("view chat history"), [gate]); const handleNavItemClick = useCallback( (item: NavItem) => { if (item.title === "Inbox") gate("use the inbox"); }, [gate] ); const handleAnnouncements = useCallback(() => gate("see what's new"), [gate]); const handleWorkspaceSelect = useCallback((_id: number) => gate("switch workspaces"), [gate]); return ( router.push("/register")} pageUsage={pageUsage} isChatPage isLoadingChats={false} > {children} ); }