'use client' import { useState } from 'react' import { Card } from '@/components/ui/card' import { Switch } from '@/components/ui/switch' import { Label } from '@/components/ui/label' import { Button } from '@/components/ui/button' import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group' import { updateAISettings } from '@/app/actions/ai-settings' import { DemoModeToggle } from '@/components/demo-mode-toggle' import { toast } from 'sonner' import { Loader2 } from 'lucide-react' import { useLanguage } from '@/lib/i18n' interface AISettingsPanelProps { initialSettings: { titleSuggestions: boolean semanticSearch: boolean paragraphRefactor: boolean memoryEcho: boolean memoryEchoFrequency: 'daily' | 'weekly' | 'custom' aiProvider: 'auto' | 'openai' | 'ollama' preferredLanguage: 'auto' | 'en' | 'fr' | 'es' | 'de' | 'fa' | 'it' | 'pt' | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'hi' | 'nl' | 'pl' demoMode: boolean } } export function AISettingsPanel({ initialSettings }: AISettingsPanelProps) { const [settings, setSettings] = useState(initialSettings) const [isPending, setIsPending] = useState(false) const { t } = useLanguage() const handleToggle = async (feature: string, value: boolean) => { // Optimistic update setSettings(prev => ({ ...prev, [feature]: value })) try { setIsPending(true) await updateAISettings({ [feature]: value }) toast.success(t('aiSettings.saved')) } catch (error) { console.error('Error updating setting:', error) toast.error(t('aiSettings.error')) // Revert on error setSettings(initialSettings) } finally { setIsPending(false) } } const handleFrequencyChange = async (value: 'daily' | 'weekly' | 'custom') => { setSettings(prev => ({ ...prev, memoryEchoFrequency: value })) try { setIsPending(true) await updateAISettings({ memoryEchoFrequency: value }) toast.success(t('aiSettings.saved')) } catch (error) { console.error('Error updating frequency:', error) toast.error(t('aiSettings.error')) setSettings(initialSettings) } finally { setIsPending(false) } } const handleProviderChange = async (value: 'auto' | 'openai' | 'ollama') => { setSettings(prev => ({ ...prev, aiProvider: value })) try { setIsPending(true) await updateAISettings({ aiProvider: value }) toast.success(t('aiSettings.saved')) } catch (error) { console.error('Error updating provider:', error) toast.error(t('aiSettings.error')) setSettings(initialSettings) } finally { setIsPending(false) } } const handleLanguageChange = async (value: 'auto' | 'en' | 'fr' | 'es' | 'de' | 'fa' | 'it' | 'pt' | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'hi' | 'nl' | 'pl') => { setSettings(prev => ({ ...prev, preferredLanguage: value })) try { setIsPending(true) await updateAISettings({ preferredLanguage: value }) toast.success(t('aiSettings.saved')) } catch (error) { console.error('Error updating language:', error) toast.error(t('aiSettings.error')) setSettings(initialSettings) } finally { setIsPending(false) } } const handleDemoModeToggle = async (enabled: boolean) => { setSettings(prev => ({ ...prev, demoMode: enabled })) try { setIsPending(true) await updateAISettings({ demoMode: enabled }) } catch (error) { console.error('Error toggling demo mode:', error) toast.error(t('aiSettings.error')) setSettings(initialSettings) throw error } finally { setIsPending(false) } } return (
{isPending && (
{t('aiSettings.saving')}
)} {/* Feature Toggles */}

{t('aiSettings.features')}

handleToggle('titleSuggestions', checked)} /> handleToggle('semanticSearch', checked)} /> handleToggle('paragraphRefactor', checked)} /> handleToggle('memoryEcho', checked)} /> {settings.memoryEcho && (

How often to analyze note connections

)} {/* Demo Mode Toggle */}
{/* AI Provider Selection */}

Choose your preferred AI provider

Ollama when available, OpenAI fallback

100% private, runs locally on your machine

Most accurate, requires API key

) } interface FeatureToggleProps { name: string description: string checked: boolean onChange: (checked: boolean) => void } function FeatureToggle({ name, description, checked, onChange }: FeatureToggleProps) { return (

{description}

) }