chore: refactor website information retrieval and simplify layout components

- Remove the `getWebsiteInfo` function to streamline website information handling.
- Update components to directly use translation functions for site name and tagline.
- Clean up `DashboardLayout`, `Footer`, `Navbar`, and `NavbarMobile` by removing unnecessary imports and improving readability.
- Maintain consistent use of translations across the application for better localization support.
This commit is contained in:
javayhu 2025-03-15 14:08:31 +08:00
parent e76745e52e
commit 2b41ef578a
6 changed files with 37 additions and 93 deletions

View File

@ -1,17 +1,7 @@
import { AppSidebar } from '@/components/dashboard/app-sidebar';
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from '@/components/ui/breadcrumb';
import { Separator } from '@/components/ui/separator';
import {
SidebarInset,
SidebarProvider,
SidebarTrigger,
SidebarProvider
} from '@/components/ui/sidebar';
import { PropsWithChildren } from 'react';
@ -19,34 +9,9 @@ export default function DashboardLayout({children}: PropsWithChildren) {
return (
<SidebarProvider>
<AppSidebar />
<SidebarInset>
<header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12">
<div className="flex items-center gap-2 px-4">
<SidebarTrigger className="-ml-1" />
<Separator orientation="vertical" className="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden md:block">
<BreadcrumbLink href="#">
Building Your Application
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator className="hidden md:block" />
<BreadcrumbItem>
<BreadcrumbPage>Data Fetching</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</div>
</header>
<div className="flex flex-1 flex-col gap-4 p-4 pt-0">
<div className="grid auto-rows-min gap-4 md:grid-cols-3">
<div className="aspect-video rounded-xl bg-muted/50" />
<div className="aspect-video rounded-xl bg-muted/50" />
<div className="aspect-video rounded-xl bg-muted/50" />
</div>
<div className="min-h-[100vh] flex-1 rounded-xl bg-muted/50 md:min-h-min" />
</div>
{children}
</SidebarInset>
</SidebarProvider>
);

View File

@ -1,21 +1,6 @@
'use client';
import * as React from 'react';
import {
BookOpen,
Bot,
Command,
Frame,
LifeBuoy,
Map,
PieChart,
Send,
Settings2,
SquareTerminal,
} from 'lucide-react';
import { NavMain } from '@/components/dashboard/nav-main';
import { NavProjects } from '@/components/dashboard/nav-projects';
import { NavSecondary } from '@/components/dashboard/nav-secondary';
import { NavUser } from '@/components/dashboard/nav-user';
import {
Sidebar,
@ -26,12 +11,20 @@ import {
SidebarMenuButton,
SidebarMenuItem,
} from '@/components/ui/sidebar';
import { getWebsiteInfo } from '@/config';
import { createTranslator } from '@/i18n/translator';
import { useTranslations } from 'next-intl';
import { Logo } from '../logo';
import { LocaleLink } from '@/i18n/navigation';
import { Routes } from '@/routes';
import {
Bot,
Frame,
LifeBuoy,
Map,
PieChart,
Send,
Settings2
} from 'lucide-react';
import { useTranslations } from 'next-intl';
import * as React from 'react';
import { Logo } from '../logo';
const data = {
navMain: [
@ -112,7 +105,6 @@ const data = {
export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
const t = useTranslations();
const websiteInfo = getWebsiteInfo(createTranslator(t));
return (
<Sidebar collapsible="icon" {...props}>
@ -124,7 +116,7 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
<Logo className="size-8" />
<div className="grid flex-1 text-left leading-tight">
<span className="truncate font-semibold text-lg">
{websiteInfo.name}
{t('Site.name')}
</span>
</div>
</LocaleLink>
@ -134,8 +126,8 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
</SidebarHeader>
<SidebarContent>
<NavMain items={data.navMain} />
<NavProjects projects={data.projects} />
<NavSecondary items={data.navSecondary} className="mt-auto" />
{/* <NavProjects projects={data.projects} /> */}
{/* <NavSecondary items={data.navSecondary} className="mt-auto" /> */}
</SidebarContent>
<SidebarFooter>
<NavUser />

View File

@ -4,9 +4,9 @@ import Container from '@/components/container';
import { ThemeSwitcherHorizontal } from '@/components/layout/theme-switcher-horizontal';
import { Logo } from '@/components/logo';
import BuiltWithButton from '@/components/shared/built-with-button';
import { getFooterLinks, getWebsiteInfo, getSocialLinks } from '@/config';
import { createTranslator } from '@/i18n/translator';
import { getFooterLinks, getSocialLinks } from '@/config';
import { LocaleLink } from '@/i18n/navigation';
import { createTranslator } from '@/i18n/translator';
import { cn } from '@/lib/utils';
import { useTranslations } from 'next-intl';
import React from 'react';
@ -15,7 +15,6 @@ export function Footer({ className }: React.HTMLAttributes<HTMLElement>) {
const t = useTranslations();
const translator = createTranslator(t);
const footerLinks = getFooterLinks(translator);
const websiteInfo = getWebsiteInfo(translator);
const socialLinks = getSocialLinks();
return (
@ -27,12 +26,14 @@ export function Footer({ className }: React.HTMLAttributes<HTMLElement>) {
{/* logo and name */}
<div className="items-center space-x-2 flex">
<Logo />
<span className="text-xl font-semibold">{websiteInfo.name}</span>
<span className="text-xl font-semibold">
{t('Site.name')}
</span>
</div>
{/* tagline */}
<p className="text-muted-foreground text-base py-2 md:pr-12">
{websiteInfo.tagline}
{t('Site.tagline')}
</p>
{/* social links */}
@ -95,7 +96,7 @@ export function Footer({ className }: React.HTMLAttributes<HTMLElement>) {
<div className="border-t py-8">
<Container className="px-4 flex items-center justify-between">
<span className="text-muted-foreground text-sm">
&copy; {new Date().getFullYear()} {websiteInfo.name} All Rights
&copy; {new Date().getFullYear()} {t('Site.name')} All Rights
Reserved.
</span>

View File

@ -9,9 +9,9 @@ import {
CollapsibleContent,
CollapsibleTrigger,
} from '@/components/ui/collapsible';
import { getMenuLinks, getWebsiteInfo } from '@/config';
import { createTranslator } from '@/i18n/translator';
import { getMenuLinks } from '@/config';
import { LocaleLink, useLocalePathname } from '@/i18n/navigation';
import { createTranslator } from '@/i18n/translator';
import { authClient } from '@/lib/auth-client';
import { cn } from '@/lib/utils';
import { Routes } from '@/routes';
@ -37,8 +37,6 @@ export function NavbarMobile({
const { data: session, error } = authClient.useSession();
const user = session?.user;
const t = useTranslations();
const translator = createTranslator(t);
const websiteInfo = getWebsiteInfo(translator);
React.useEffect(() => {
const handleRouteChangeStart = () => {
@ -77,7 +75,9 @@ export function NavbarMobile({
{/* navbar left shows logo */}
<LocaleLink href={Routes.Root} className="flex items-center gap-2">
<Logo />
<span className="text-xl font-semibold">{websiteInfo.name}</span>
<span className="text-xl font-semibold">
{t('Site.name')}
</span>
</LocaleLink>
{/* navbar right shows menu icon */}

View File

@ -2,7 +2,6 @@
import { LoginWrapper } from '@/components/auth/login-button';
import Container from '@/components/container';
import LocaleSelector from '@/components/layout/locale-selector';
import { NavbarMobile } from '@/components/layout/navbar-mobile';
import { ThemeSwitcher } from '@/components/layout/theme-switcher';
import { UserButton } from '@/components/layout/user-button';
@ -17,10 +16,10 @@ import {
NavigationMenuTrigger,
navigationMenuTriggerStyle,
} from '@/components/ui/navigation-menu';
import { getMenuLinks, getWebsiteInfo } from '@/config';
import { createTranslator } from '@/i18n/translator';
import { getMenuLinks } from '@/config';
import { useScroll } from '@/hooks/use-scroll';
import { LocaleLink, useLocalePathname } from '@/i18n/navigation';
import { createTranslator } from '@/i18n/translator';
import { authClient } from '@/lib/auth-client';
import { cn } from '@/lib/utils';
import { Routes } from '@/routes';
@ -47,8 +46,6 @@ export function Navbar({ scroll }: NavBarProps) {
const t = useTranslations();
const translator = createTranslator(t);
const menuLinks = getMenuLinks(translator);
const websiteInfo = getWebsiteInfo(translator);
const commonTranslations = useTranslations('Common');
const localePathname = useLocalePathname();
// console.log(`Navbar, user:`, user);
@ -71,7 +68,9 @@ export function Navbar({ scroll }: NavBarProps) {
<div className="flex items-center">
<LocaleLink href="/" className="flex items-center space-x-2">
<Logo />
<span className="text-xl font-semibold">{websiteInfo.name}</span>
<span className="text-xl font-semibold">
{t('Site.name')}
</span>
</LocaleLink>
</div>
@ -215,13 +214,13 @@ export function Navbar({ scroll }: NavBarProps) {
<div className="flex items-center gap-x-4">
<LoginWrapper mode="modal" asChild>
<Button variant="outline" size="sm">
{commonTranslations('login')}
{t('Common.login')}
</Button>
</LoginWrapper>
<Button asChild size="sm" variant="default">
<LocaleLink href={Routes.Register}>
{commonTranslations('signUp')}
{t('Common.signUp')}
</LocaleLink>
</Button>
</div>

View File

@ -56,19 +56,6 @@ export const websiteConfig: WebsiteConfig = {
}
};
/**
* Get website information with translations
*
* @param t - The translation function
* @returns The website information with translated content
*/
export function getWebsiteInfo(t: TranslationFunction): WebsiteInfo {
return {
name: t('Site.name'),
tagline: t('Site.tagline'),
};
}
/**
* Get menu links with translations
*