12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import { useState, useEffect } from 'react';
- import '@src/Options.css';
- import { Button } from '@extension/ui';
- import { withErrorBoundary, withSuspense } from '@extension/shared';
- import { GeneralSettings } from './components/GeneralSettings';
- import { ModelSettings } from './components/ModelSettings';
- type TabTypes = 'general' | 'models';
- const TABS: { id: TabTypes; icon: string; label: string }[] = [
- { id: 'general', icon: '⚙️', label: 'General' },
- { id: 'models', icon: '📊', label: 'Models' },
- ];
- const Options = () => {
- const [activeTab, setActiveTab] = useState<TabTypes>('models');
- const [isDarkMode, setIsDarkMode] = useState(false);
- // Check for dark mode preference
- useEffect(() => {
- const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
- setIsDarkMode(darkModeMediaQuery.matches);
- const handleChange = (e: MediaQueryListEvent) => {
- setIsDarkMode(e.matches);
- };
- darkModeMediaQuery.addEventListener('change', handleChange);
- return () => darkModeMediaQuery.removeEventListener('change', handleChange);
- }, []);
- const renderTabContent = () => {
- switch (activeTab) {
- case 'general':
- return <GeneralSettings isDarkMode={isDarkMode} />;
- case 'models':
- return <ModelSettings isDarkMode={isDarkMode} />;
- default:
- return null;
- }
- };
- return (
- <div
- className={`flex min-h-screen min-w-[768px] ${isDarkMode ? 'bg-slate-900' : "bg-[url('/bg.jpg')] bg-cover bg-center"} ${isDarkMode ? 'text-gray-200' : 'text-gray-900'}`}>
- {/* Vertical Navigation Bar */}
- <nav
- className={`w-48 border-r ${isDarkMode ? 'border-slate-700 bg-slate-800/80' : 'border-white/20 bg-[#0EA5E9]/10'} backdrop-blur-sm`}>
- <div className="p-4">
- <h1 className={`mb-6 text-xl font-bold ${isDarkMode ? 'text-gray-200' : 'text-gray-800'}`}>Settings</h1>
- <ul className="space-y-2">
- {TABS.map(item => (
- <li key={item.id}>
- <Button
- onClick={() => setActiveTab(item.id)}
- className={`flex w-full items-center space-x-2 rounded-lg px-4 py-2 text-left text-base
- ${
- activeTab !== item.id
- ? `${isDarkMode ? 'bg-slate-700/70 text-gray-300 hover:text-white' : 'bg-[#0EA5E9]/15 font-medium text-gray-700 hover:text-white'} backdrop-blur-sm`
- : `${isDarkMode ? 'bg-sky-800/50' : ''} text-white backdrop-blur-sm`
- }`}>
- <span>{item.icon}</span>
- <span>{item.label}</span>
- </Button>
- </li>
- ))}
- </ul>
- </div>
- </nav>
- {/* Main Content Area */}
- <main className={`flex-1 ${isDarkMode ? 'bg-slate-800/50' : 'bg-white/10'} p-8 backdrop-blur-sm`}>
- <div className="mx-auto min-w-[512px] max-w-screen-lg">{renderTabContent()}</div>
- </main>
- </div>
- );
- };
- export default withErrorBoundary(withSuspense(Options, <div>Loading...</div>), <div>Error Occurred</div>);
|