1. Marketing Layout: speed up rendering by retrieving user session from cookies instead of using server side request 2. Use "redirecting" state when signing in to keep displaying a loading state while Next.js redirects to home page 3. Use "useCallback" to prevent double tracking when switching pages 4. Add links pre-fetching in marketing navigation 5. Add new pending state to MFA verification form 6. Pre-fetch sign-in/sign-up pages 7. Fix i18n when using regional languages 8. currency formatter should default to the region if it exists 9. Update packages
89 lines
2.1 KiB
TypeScript
89 lines
2.1 KiB
TypeScript
'use client';
|
|
|
|
import dynamic from 'next/dynamic';
|
|
import Link from 'next/link';
|
|
|
|
import { useQuery } from '@tanstack/react-query';
|
|
|
|
import { PersonalAccountDropdown } from '@kit/accounts/personal-account-dropdown';
|
|
import { useSignOut } from '@kit/supabase/hooks/use-sign-out';
|
|
import { useSupabase } from '@kit/supabase/hooks/use-supabase';
|
|
import { Button } from '@kit/ui/button';
|
|
import { If } from '@kit/ui/if';
|
|
import { Trans } from '@kit/ui/trans';
|
|
|
|
import featuresFlagConfig from '~/config/feature-flags.config';
|
|
import pathsConfig from '~/config/paths.config';
|
|
|
|
const ModeToggle = dynamic(() =>
|
|
import('@kit/ui/mode-toggle').then((mod) => ({
|
|
default: mod.ModeToggle,
|
|
})),
|
|
);
|
|
|
|
const paths = {
|
|
home: pathsConfig.app.home,
|
|
};
|
|
|
|
const features = {
|
|
enableThemeToggle: featuresFlagConfig.enableThemeToggle,
|
|
};
|
|
|
|
export function SiteHeaderAccountSection() {
|
|
const session = useSession();
|
|
const signOut = useSignOut();
|
|
|
|
if (session.data) {
|
|
return (
|
|
<PersonalAccountDropdown
|
|
showProfileName={false}
|
|
paths={paths}
|
|
features={features}
|
|
user={session.data.user}
|
|
signOutRequested={() => signOut.mutateAsync()}
|
|
/>
|
|
);
|
|
}
|
|
|
|
return <AuthButtons />;
|
|
}
|
|
|
|
function AuthButtons() {
|
|
return (
|
|
<div className={'flex gap-x-2.5 animate-in fade-in duration-500'}>
|
|
<div className={'hidden md:flex'}>
|
|
<If condition={features.enableThemeToggle}>
|
|
<ModeToggle />
|
|
</If>
|
|
</div>
|
|
|
|
<div className={'flex gap-x-2.5'}>
|
|
<Button className={'hidden md:block'} asChild variant={'ghost'}>
|
|
<Link href={pathsConfig.auth.signIn}>
|
|
<Trans i18nKey={'auth:signIn'} />
|
|
</Link>
|
|
</Button>
|
|
|
|
<Button asChild className="text-xs md:text-sm" variant={'default'}>
|
|
<Link href={pathsConfig.auth.signUp}>
|
|
<Trans i18nKey={'auth:signUp'} />
|
|
</Link>
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function useSession() {
|
|
const client = useSupabase();
|
|
|
|
return useQuery({
|
|
queryKey: ['session'],
|
|
queryFn: async () => {
|
|
const { data } = await client.auth.getSession();
|
|
|
|
return data.session;
|
|
},
|
|
});
|
|
}
|