import { createContext, type ReactNode, useCallback, useContext, useEffect, useMemo, useState } from "react"; import { useLocation } from "react-router-dom"; import type { MemoOriginScope } from "@/components/MemoView/navigation"; import type { MemoScope } from "@/lib/memo-views"; import type { Memo } from "@/types/proto/api/v1/memo_service_pb"; export type AttachmentSection = "all" | "media" | "audio" | "documents" | "unused"; export type InboxFilter = "all" | "unread" | "archived"; export interface MemoDetailSidebarDescriptor { memo: Memo; from?: string; fromScope?: MemoOriginScope; readonly?: boolean; onShareImageOpen?: () => void; } interface AppSidebarContextValue { attachmentSection: AttachmentSection; setAttachmentSection: (section: AttachmentSection) => void; inboxFilter: InboxFilter; setInboxFilter: (filter: InboxFilter) => void; memoDetail: MemoDetailSidebarDescriptor | undefined; setMemoDetail: (descriptor?: MemoDetailSidebarDescriptor) => void; mobileOpen: boolean; setMobileOpen: (open: boolean) => void; quickFindOpen: boolean; setQuickFindOpen: (open: boolean) => void; memoScope: MemoScope; setMemoScope: (scope: MemoScope) => void; } const AppSidebarContext = createContext(null); export const AppSidebarProvider = ({ children }: { children: ReactNode }) => { const location = useLocation(); const [attachmentSection, setAttachmentSection] = useState("all"); const [inboxFilter, setInboxFilter] = useState("all"); const [memoDetail, setMemoDetailState] = useState(); const [mobileOpen, setMobileOpen] = useState(false); const [quickFindOpen, setQuickFindOpen] = useState(false); const [memoScope, setMemoScope] = useState("home"); useEffect(() => { setMobileOpen(false); setAttachmentSection("all"); setInboxFilter("all"); }, [location.pathname]); const setMemoDetail = useCallback((descriptor?: MemoDetailSidebarDescriptor) => { setMemoDetailState(descriptor); }, []); const value = useMemo( () => ({ attachmentSection, setAttachmentSection, inboxFilter, setInboxFilter, memoDetail, setMemoDetail, mobileOpen, setMobileOpen, quickFindOpen, setQuickFindOpen, memoScope, setMemoScope, }), [attachmentSection, inboxFilter, memoDetail, setMemoDetail, mobileOpen, quickFindOpen, memoScope], ); return {children}; }; export const useAppSidebar = () => { const context = useContext(AppSidebarContext); if (!context) { throw new Error("useAppSidebar must be used within AppSidebarProvider"); } return context; };