Files
portabase/src/features/settings/settings-tabs.tsx
T

102 lines
3.1 KiB
TypeScript
Raw Normal View History

"use client";
import {Tabs, TabsContent, TabsList, TabsTrigger} from "@/components/ui/tabs";
import {useEffect, useState} from "react";
import {useRouter, useSearchParams} from "next/navigation";
import {Setting} from "@/db/schema/01_setting";
2026-05-24 17:09:12 +02:00
import {SettingsEmailSection} from "@/features/settings/email-section";
import {SettingsStorageSection} from "@/features/settings/storage-section";
import {StorageChannelWith} from "@/db/schema/12_storage-channel";
2026-06-22 16:56:17 +02:00
import {AlarmClock, MailboxIcon, Save, UserCircle} from "lucide-react";
2026-03-28 16:35:02 +01:00
import {
SettingsNotificationSection
2026-05-24 17:09:12 +02:00
} from "@/features/settings/notification-section";
2026-03-28 16:35:02 +01:00
import {NotificationChannelWith} from "@/db/schema/09_notification-channel";
2026-06-22 16:56:17 +02:00
import {SettingsAvatarSection} from "@/features/settings/avatar-section";
export type SettingsTabsProps = {
settings: Setting
2026-03-28 16:35:02 +01:00
storageChannels: StorageChannelWith[],
notificationChannels: NotificationChannelWith[];
};
2026-03-28 16:35:02 +01:00
export const SettingsTabs = ({settings, storageChannels, notificationChannels}: SettingsTabsProps) => {
const router = useRouter();
const searchParams = useSearchParams();
const [tab, setTab] = useState<string>(() => searchParams.get("tab") ?? "email");
useEffect(() => {
const newTab = searchParams.get("tab") ?? "email";
setTab(newTab);
}, [searchParams]);
const handleChangeTab = (value: string) => {
router.push(`?tab=${value}`);
};
2026-01-29 23:46:04 +01:00
const tabs = [
{
name: 'System Email',
value: 'email',
icon: MailboxIcon,
content: (
<SettingsEmailSection settings={settings}/>
)
},
{
2026-02-12 20:18:26 +01:00
name: 'Storage',
2026-01-29 23:46:04 +01:00
value: 'storage',
icon: Save,
content: (
<SettingsStorageSection storageChannels={storageChannels} settings={settings}/>
2026-03-28 16:35:02 +01:00
)
},
{
name: 'Notification',
value: 'notification',
icon: AlarmClock,
content: (
<SettingsNotificationSection notificationChannels={notificationChannels} settings={settings}/>
2026-01-29 23:46:04 +01:00
)
2026-06-22 16:56:17 +02:00
},
{
name: 'Avatar',
value: 'avatar',
icon: UserCircle,
content: (
<SettingsAvatarSection settings={settings}/>
)
2026-01-29 23:46:04 +01:00
}
]
return (
<div className="h-full mt-3">
2026-01-29 23:46:04 +01:00
<Tabs className="h-full gap-4" value={tab} onValueChange={handleChangeTab}>
<TabsList>
{tabs.map(({icon: Icon, name, value}) => (
<TabsTrigger key={value} value={value} className='flex items-center gap-1 px-2.5 sm:px-3'>
<Icon/>
{name}
</TabsTrigger>
))}
</TabsList>
2026-01-29 23:46:04 +01:00
{tabs.map(tab => (
<TabsContent key={tab.value} value={tab.value} className="h-full">
{tab.content}
</TabsContent>
))}
</Tabs>
</div>
);
};