import { Children, cloneElement, createContext, forwardRef, useCallback, useContext, } from 'react'; import classNames from 'classnames'; import type { List, Record } from 'immutable'; import { useAppSelector } from '@/mastodon/store'; import { CollapsibleNavigationPanel } from 'mastodon/features/navigation_panel'; import { useBreakpoint } from '../hooks/useBreakpoint'; import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, BookmarkedStatuses, ListTimeline, Directory, } from '../util/async-components'; import { useColumnsContext } from '../util/columns_context'; import Bundle from './bundle'; import BundleColumnError from './bundle_column_error'; import { ColumnLoading } from './column_loading'; import { ComposePanel, RedirectToMobileComposeIfNeeded } from './compose_panel'; import DrawerLoading from './drawer_loading'; const componentMap = { COMPOSE: Compose, HOME: HomeTimeline, NOTIFICATIONS: Notifications, PUBLIC: PublicTimeline, REMOTE: PublicTimeline, COMMUNITY: CommunityTimeline, HASHTAG: HashtagTimeline, DIRECT: DirectTimeline, FAVOURITES: FavouritedStatuses, BOOKMARKS: BookmarkedStatuses, LIST: ListTimeline, DIRECTORY: Directory, } as const; const TabsBarPortal = () => { const { setTabsBarElement } = useColumnsContext(); const setRef = useCallback( (element: HTMLDivElement | null) => { if (element) { setTabsBarElement(element); } }, [setTabsBarElement], ); return
; }; export const ColumnIndexContext = createContext(1); export const useColumnIndexContext = () => useContext(ColumnIndexContext); interface Column { uuid: string; id: keyof typeof componentMap; params?: null | Record<{ other?: unknown }>; } type FetchedComponent = React.FC<{ columnId?: string; multiColumn?: boolean; params: unknown; }>; export const ColumnsArea = forwardRef< HTMLDivElement, { singleColumn?: boolean; children: React.ReactElement | React.ReactElement[]; } >(({ children, singleColumn }, ref) => { const renderComposePanel = !useBreakpoint('full'); const columns = useAppSelector((state) => (state.settings as Record<{ columns: List