This commit focuses on refining UI/UX across various components and pages of the application. Changes include adjusting padding and spacing to enhance the overall readability and user interaction, amending hyperlink styling, modifying dropdown menus for optimized mobile experience, and adjusting key UI elements. Other modifications include revising imports for better maintainability, and adding enhancements to several UI components to improve their visual presentation.
175 lines
3.9 KiB
TypeScript
175 lines
3.9 KiB
TypeScript
'use client';
|
|
|
|
import Link from 'next/link';
|
|
import { useRouter } from 'next/navigation';
|
|
|
|
import { Home, LogOut, Menu } from 'lucide-react';
|
|
|
|
import { AccountSelector } from '@kit/accounts/account-selector';
|
|
import { useSignOut } from '@kit/supabase/hooks/use-sign-out';
|
|
import {
|
|
Dialog,
|
|
DialogContent,
|
|
DialogHeader,
|
|
DialogTitle,
|
|
DialogTrigger,
|
|
} from '@kit/ui/dialog';
|
|
import {
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuItem,
|
|
DropdownMenuSeparator,
|
|
DropdownMenuTrigger,
|
|
} from '@kit/ui/dropdown-menu';
|
|
import { Trans } from '@kit/ui/trans';
|
|
|
|
import featureFlagsConfig from '~/config/feature-flags.config';
|
|
import pathsConfig from '~/config/paths.config';
|
|
import { getTeamAccountSidebarConfig } from '~/config/team-account-sidebar.config';
|
|
|
|
const features = {
|
|
enableTeamAccounts: featureFlagsConfig.enableTeamAccounts,
|
|
enableTeamCreation: featureFlagsConfig.enableTeamCreation,
|
|
};
|
|
|
|
export const AccountLayoutMobileNavigation = (
|
|
props: React.PropsWithChildren<{
|
|
account: string;
|
|
}>,
|
|
) => {
|
|
const signOut = useSignOut();
|
|
|
|
const Links = getTeamAccountSidebarConfig(props.account).routes.map(
|
|
(item, index) => {
|
|
if ('children' in item) {
|
|
return item.children.map((child) => {
|
|
return (
|
|
<DropdownLink
|
|
key={child.path}
|
|
Icon={child.Icon}
|
|
path={child.path}
|
|
label={child.label}
|
|
/>
|
|
);
|
|
});
|
|
}
|
|
|
|
if ('divider' in item) {
|
|
return <DropdownMenuSeparator key={index} />;
|
|
}
|
|
|
|
return (
|
|
<DropdownLink
|
|
key={item.path}
|
|
Icon={item.Icon}
|
|
path={item.path}
|
|
label={item.label}
|
|
/>
|
|
);
|
|
},
|
|
);
|
|
|
|
return (
|
|
<DropdownMenu>
|
|
<DropdownMenuTrigger>
|
|
<Menu className={'h-9'} />
|
|
</DropdownMenuTrigger>
|
|
|
|
<DropdownMenuContent sideOffset={10} className={'w-screen rounded-none'}>
|
|
<OrganizationsModal />
|
|
|
|
{Links}
|
|
|
|
<DropdownMenuSeparator />
|
|
|
|
<SignOutDropdownItem onSignOut={() => signOut.mutateAsync()} />
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>
|
|
);
|
|
};
|
|
|
|
function DropdownLink(
|
|
props: React.PropsWithChildren<{
|
|
path: string;
|
|
label: string;
|
|
Icon: React.ReactNode;
|
|
}>,
|
|
) {
|
|
return (
|
|
<DropdownMenuItem asChild>
|
|
<Link
|
|
href={props.path}
|
|
className={'flex h-12 w-full items-center space-x-2 px-3'}
|
|
>
|
|
{props.Icon}
|
|
|
|
<span>
|
|
<Trans i18nKey={props.label} defaults={props.label} />
|
|
</span>
|
|
</Link>
|
|
</DropdownMenuItem>
|
|
);
|
|
}
|
|
|
|
function SignOutDropdownItem(
|
|
props: React.PropsWithChildren<{
|
|
onSignOut: () => unknown;
|
|
}>,
|
|
) {
|
|
return (
|
|
<DropdownMenuItem
|
|
className={'flex h-12 w-full items-center space-x-2'}
|
|
onClick={props.onSignOut}
|
|
>
|
|
<LogOut className={'h-4'} />
|
|
|
|
<span>
|
|
<Trans i18nKey={'common:signOut'} />
|
|
</span>
|
|
</DropdownMenuItem>
|
|
);
|
|
}
|
|
|
|
function OrganizationsModal() {
|
|
const router = useRouter();
|
|
|
|
return (
|
|
<Dialog>
|
|
<DialogTrigger asChild>
|
|
<DropdownMenuItem
|
|
className={'flex h-12 w-full items-center space-x-2'}
|
|
onSelect={(e) => e.preventDefault()}
|
|
>
|
|
<Home className={'h-4'} />
|
|
|
|
<span>
|
|
<Trans i18nKey={'common:yourOrganizations'} />
|
|
</span>
|
|
</DropdownMenuItem>
|
|
</DialogTrigger>
|
|
|
|
<DialogContent>
|
|
<DialogHeader>
|
|
<DialogTitle>
|
|
<Trans i18nKey={'common:yourOrganizations'} />
|
|
</DialogTitle>
|
|
</DialogHeader>
|
|
|
|
<div className={'py-16'}>
|
|
<AccountSelector
|
|
onAccountChange={(value) => {
|
|
const path = value
|
|
? pathsConfig.app.accountHome.replace('[account]', value)
|
|
: pathsConfig.app.home;
|
|
|
|
router.replace(path);
|
|
}}
|
|
accounts={[]}
|
|
features={features}
|
|
/>
|
|
</div>
|
|
</DialogContent>
|
|
</Dialog>
|
|
);
|
|
}
|