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> }>).get( 'columns', ), ); const isModalOpen = useAppSelector( (state) => !state.modal.get('stack').isEmpty(), ); if (singleColumn) { return (
{renderComposePanel && }
{children}
); } return (
{columns.map((column, index) => { const params = column.get('params') ? column.get('params')?.toJS() : null; const other = params?.other ?? {}; const uuid = column.get('uuid'); const id = column.get('id'); return ( {(SpecificComponent: FetchedComponent) => ( )} ); })} {Children.map(children, (child) => cloneElement(child, { multiColumn: true }), )}
); }); ColumnsArea.displayName = 'ColumnsArea'; const ErrorComponent = (props: { onRetry: () => void }) => { return ; }; const renderLoading = (columnId: string) => { const LoadingComponent = columnId === 'COMPOSE' ? : ; return () => LoadingComponent; };