"use client" import { useEffect, useRef } from "react" import { Group, Panel, Separator, useDefaultLayout, useGroupRef } from "react-resizable-panels" import { useUserInterfaceStore } from "@/lib/stores/user-interface-store" import { useMarkAllAsRead } from "@/lib/queries/use-mark-all-as-read" import { useSubscriptions } from "@/lib/queries/use-subscriptions" import { useUnreadCounts } from "@/lib/queries/use-unread-counts" import { useIsMobile } from "@/lib/hooks/use-is-mobile" import { classNames } from "@/lib/utilities" import { EntryList } from "./entry-list" import { EntryDetailPanel } from "./entry-detail-panel" import { ErrorBoundary } from "./error-boundary" import { useRealtimeEntries } from "@/lib/hooks/use-realtime-entries" import { useCustomFeeds } from "@/lib/queries/use-custom-feeds" interface ReaderShellProperties { userEmailAddress: string | null feedFilter: "all" | "saved" folderIdentifier?: string | null feedIdentifier?: string | null customFeedIdentifier?: string | null } export function ReaderShell({ userEmailAddress, feedFilter, folderIdentifier, feedIdentifier, customFeedIdentifier, }: ReaderShellProperties) { const selectedEntryIdentifier = useUserInterfaceStore( (state) => state.selectedEntryIdentifier ) const setSelectedEntryIdentifier = useUserInterfaceStore( (state) => state.setSelectedEntryIdentifier ) const entryListViewMode = useUserInterfaceStore( (state) => state.entryListViewMode ) const setEntryListViewMode = useUserInterfaceStore( (state) => state.setEntryListViewMode ) const setSearchOpen = useUserInterfaceStore((state) => state.setSearchOpen) const markAllAsRead = useMarkAllAsRead() const { data: subscriptionsData } = useSubscriptions() const { data: unreadCounts } = useUnreadCounts() const { data: customFeedsData } = useCustomFeeds() const isMobile = useIsMobile() const focusedPanel = useUserInterfaceStore((state) => state.focusedPanel) const fontSize = useUserInterfaceStore((state) => state.fontSize) const toggleShortcutsDialog = useUserInterfaceStore( (state) => state.toggleShortcutsDialog ) const detailLayout = useDefaultLayout({ id: "asa-detail-layout", panelIds: ["entry-list", "detail-panel"], storage: typeof window !== "undefined" ? localStorage : { getItem: () => null, setItem: () => {} }, }) const detailGroupRef = useGroupRef() const detailOnLayoutChangedRef = useRef(detailLayout.onLayoutChanged) detailOnLayoutChangedRef.current = detailLayout.onLayoutChanged useEffect(() => { useUserInterfaceStore.getState().setResetDetailLayout(() => { const group = detailGroupRef.current if (!group) return const currentLayout = group.getLayout() const panelIdentifiers = Object.keys(currentLayout) if (panelIdentifiers.length === 0) return const equalSharePercentage = 100 / panelIdentifiers.length const equalLayout: Record = {} for (const panelIdentifier of panelIdentifiers) { equalLayout[panelIdentifier] = equalSharePercentage } const appliedLayout = group.setLayout(equalLayout) detailOnLayoutChangedRef.current?.(appliedLayout) }) return () => useUserInterfaceStore.getState().setResetDetailLayout(null) }, [detailGroupRef]) useRealtimeEntries() let pageTitle = feedFilter === "saved" ? "saved" : "all entries" if (feedFilter === "all" && customFeedIdentifier && customFeedsData) { const matchingCustomFeed = customFeedsData.find( (customFeed) => customFeed.identifier === customFeedIdentifier ) if (matchingCustomFeed) { pageTitle = matchingCustomFeed.name } } if (feedFilter === "all" && feedIdentifier && subscriptionsData) { const matchingSubscription = subscriptionsData.subscriptions.find( (subscription) => subscription.feedIdentifier === feedIdentifier ) if (matchingSubscription) { pageTitle = matchingSubscription.customTitle || matchingSubscription.feedTitle || "feed" } } if (feedFilter === "all" && folderIdentifier && subscriptionsData) { const matchingFolder = subscriptionsData.folders.find( (folder) => folder.folderIdentifier === folderIdentifier ) if (matchingFolder) { pageTitle = matchingFolder.name } } const totalUnreadCount = Object.values(unreadCounts ?? {}).reduce( (sum, count) => sum + count, 0 ) const allAreRead = totalUnreadCount === 0 return (
{isMobile && selectedEntryIdentifier ? ( ) : (

{pageTitle}

)}
{!(isMobile && selectedEntryIdentifier) && ( <> {feedFilter === "all" && ( )} )}
{isMobile ? ( selectedEntryIdentifier ? (
) : (
) ) : (
{selectedEntryIdentifier && ( <>
)}
)}
) }