Files
mtdb_movie/common/resources/client/admin/settings/settings-layout.tsx
maher 703f50a09d
Some checks failed
Build / run (push) Has been cancelled
first commit
2025-10-29 11:42:25 +01:00

78 lines
2.0 KiB
TypeScript
Executable File

import clsx from 'clsx';
import {NavLink, Outlet, useLocation, useNavigate} from 'react-router-dom';
import {SettingsNavConfig} from './settings-nav-config';
import {useIsMobileMediaQuery} from '../../utils/hooks/is-mobile-media-query';
import {Option, Select} from '../../ui/forms/select/select';
import {Trans} from '../../i18n/trans';
import {StaticPageTitle} from '../../seo/static-page-title';
interface Props {
className?: string;
}
export function SettingsLayout({className}: Props) {
const isMobile = useIsMobileMediaQuery();
return (
<div
className={clsx(
className,
'container mx-auto min-h-full items-start gap-30 p-24 md:flex',
)}
>
<StaticPageTitle>
<Trans message="Settings" />
</StaticPageTitle>
{isMobile ? <MobileNav /> : <DesktopNav />}
<div className="relative max-w-500 flex-auto md:px-30">
<Outlet />
</div>
</div>
);
}
function MobileNav() {
const {pathname} = useLocation();
const navigate = useNavigate();
const value = pathname.split('/').pop();
return (
<Select
minWidth="min-w-none"
className="mb-24 w-full bg"
selectionMode="single"
selectedValue={value}
onSelectionChange={newPage => {
navigate(newPage as string);
}}
>
{SettingsNavConfig.map(item => (
<Option key={item.to as string} value={item.to}>
<Trans {...item.label} />
</Option>
))}
</Select>
);
}
function DesktopNav() {
return (
<div className="sticky top-24 w-240 flex-shrink-0">
{SettingsNavConfig.map(item => (
<NavLink
key={item.to as string}
to={item.to}
className={({isActive}) =>
clsx(
'mb-8 block whitespace-nowrap rounded-button p-14 text-sm transition-bg-color',
isActive
? 'bg-primary/6 font-semibold text-primary'
: 'hover:bg-hover',
)
}
>
<Trans {...item.label} />
</NavLink>
))}
</div>
);
}