import { ReactElement, useState } from 'react'; import { Stack, Typography } from '@mui/joy'; import CollapsibleSection from './CollapsibleSection'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import PageRow from './pagerow/PageRow'; import { Page, PageFilter, PageSortOrder } from '../../../db/pages'; import { StashTag } from '../../../db/constants'; import { filterPages, groupPagesByWindow, sortPages } from '../../sort'; import { InView } from 'react-intersection-observer'; import React from 'react'; import { useAppDispatch, useAppSelector } from '../../../store/hooks'; import { selectSelectedUrls, addMultiToSelection, removeMultiFromSelection, selectSimilarUrls } from '../../../store/uiSlice'; import WindowGroupHeader from '../../components/WindowGroupHeader'; import { selectWindows, selectTabs } from '../../../store/windowsSlice'; interface WindowGroupProps { windowId: number; pages: Page[]; } const WindowGroup = React.memo(({ windowId, pages }: WindowGroupProps): ReactElement => { const windows = useAppSelector(selectWindows); const allTabs = useAppSelector(selectTabs); const currentWindow = windows[windowId]; const windowTabs = currentWindow?.tabIds?.map(id => allTabs[id]).filter(Boolean) || undefined; const windowUrls = pages.map((p) => p.nurl.normalized); // If windowId is not found or invalid, we show "Archived" or similar. // WindowGroupHeader logic handles title default. // But we might want to be explicit. const title = Number.isNaN(windowId) || !currentWindow ? "Archived / Closed Window" : undefined; // Actually, if windowId is defined but not in `windows` (closed), we still might want to show "Window "? // Previous logic: `const windowTitle = Number.isNaN(windowId) ? "Archived" : Window ${windowId};` // WindowGroupHeader handles `Window (N pages)` if title missing. // Let's pass explicit title if it's archived. // Determine if all pages in this group are stashed const allStashed = pages.every(p => p.humanTags && p.humanTags.includes(StashTag)); return ( {({ inView, ref, entry }) => inView ? (
{pages.map((page) => ( ))}
) : (
) } ); }); interface RawPageListProps { pages: Page[]; sortOrder: PageSortOrder; filter: PageFilter; groupByWindow: boolean; } const RawPageList = React.memo(({ pages, sortOrder, filter, groupByWindow, }: RawPageListProps): ReactElement => { var windowsOrPages: JSX.Element[]; const similarUrls = useAppSelector(selectSimilarUrls); // console.log('RawPageList render', { pagesLength: pages?.length, groupByWindow }); if (groupByWindow) { const windowGroupsSorted = groupPagesByWindow(filterPages(pages, filter)); windowsOrPages = windowGroupsSorted.map(([windowId, windowPages]) => ( )); } else { const filteredPages = filterPages(pages, filter); const pagesSorted = sortPages(filteredPages, sortOrder, similarUrls); windowsOrPages = pagesSorted.map((page) => ( )); } return <>{windowsOrPages}; }); export default RawPageList;