Vercel/src/app/ViewSwitcher.tsx
2025-03-16 15:44:55 -05:00

78 lines
2.0 KiB
TypeScript

import Switcher from '@/components/Switcher';
import SwitcherItem from '@/components/SwitcherItem';
import IconFeed from '@/components/icons/IconFeed';
import IconGrid from '@/components/icons/IconGrid';
import {
PATH_FEED_INFERRED,
PATH_GRID_INFERRED,
} from '@/app/paths';
import IconSearch from '../components/icons/IconSearch';
import { useAppState } from '@/state/AppState';
import { GRID_HOMEPAGE_ENABLED } from './config';
import AdminAppMenu from '@/admin/AdminAppMenu';
import Spinner from '@/components/Spinner';
import clsx from 'clsx/lite';
export type SwitcherSelection = 'feed' | 'grid' | 'admin';
export default function ViewSwitcher({
currentSelection,
className,
}: {
currentSelection?: SwitcherSelection
className?: string
}) {
const {
isUserSignedIn,
isUserSignedInEager,
setIsCommandKOpen,
} = useAppState();
const renderItemFeed =
<SwitcherItem
icon={<IconFeed />}
href={PATH_FEED_INFERRED}
active={currentSelection === 'feed'}
noPadding
/>;
const renderItemGrid =
<SwitcherItem
icon={<IconGrid />}
href={PATH_GRID_INFERRED}
active={currentSelection === 'grid'}
noPadding
/>;
return (
<div className={clsx(
'flex gap-1 sm:gap-2',
className,
)}>
<Switcher>
{GRID_HOMEPAGE_ENABLED ? renderItemGrid : renderItemFeed}
{GRID_HOMEPAGE_ENABLED ? renderItemFeed : renderItemGrid}
{/* Show spinner if admin is suspected to be logged in */}
{(isUserSignedInEager && !isUserSignedIn) &&
<SwitcherItem
icon={<Spinner />}
isInteractive={false}
noPadding
/>}
{isUserSignedIn &&
<SwitcherItem
className="p-0!"
icon={<AdminAppMenu />}
noPadding
/>}
</Switcher>
<Switcher type="borderless">
<SwitcherItem
icon={<IconSearch />}
onClick={() => setIsCommandKOpen?.(true)}
/>
</Switcher>
</div>
);
}