"use client"; import { useEffect, useRef, useState } from "react"; import { User, Bell, Shield, Blocks, Brain, CreditCard, Save, Key, AlertTriangle } from "lucide-react"; import { updatePassword, updateProfile } from "./actions"; import { createClient } from "@/lib/supabase/client"; type AiProvider = "groq" | "ollama" | "openai" | "gemini"; export default function SettingsPage() { const [activeTab, setActiveTab] = useState("AI Preferences"); // Profile States const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [avatarUrl, setAvatarUrl] = useState(""); const [profileSaveStatus, setProfileSaveStatus] = useState(""); // Security States const [passwordSaveStatus, setPasswordSaveStatus] = useState(""); const formRef = useRef(null); // AI States const [aiProvider, setAiProvider] = useState("gemini"); const [apiKey, setApiKey] = useState(""); const [aiSaveStatus, setAiSaveStatus] = useState(""); // Supabase const [supabase] = useState(() => createClient()); const tabs = [ { name: "Profile & Account", icon: User }, { name: "AI Preferences", icon: Brain }, { name: "Security", icon: Shield }, { name: "Integrations", icon: Blocks }, { name: "Notifications", icon: Bell }, { name: "Billing & Plans", icon: CreditCard }, ]; useEffect(() => { let isActive = true; const fetchData = async () => { const { data: { user } } = await supabase.auth.getUser(); if (!user || !isActive) return; // 1. Fetch Profile const { data: profile } = await supabase .from("profiles") .select("*") .eq("id", user.id) .single(); if (profile && isActive) { setFirstName(profile.first_name || ""); setLastName(profile.last_name || ""); setAvatarUrl(profile.avatar_url || ""); } // 2. Fetch User Settings from Supabase const { data: settings } = await supabase .from("user_settings") .select("*") .eq("user_id", user.id) .single(); if (settings && isActive) { setAiProvider((settings.ai_model as AiProvider) || "gemini"); setApiKey(settings.api_key || ""); // Also sync to local storage for existing API route calls if they use it localStorage.setItem("mindspace_ai_provider", settings.ai_model); localStorage.setItem("mindspace_api_key", settings.api_key || ""); } }; void fetchData(); return () => { isActive = false; }; }, [supabase]); const handleProfileAction = async (formData: FormData) => { const response = await updateProfile(formData); if (response?.error) { setProfileSaveStatus(`Hata: ${response.error}`); } else { setProfileSaveStatus("Profil güncellendi!"); const avatar = formData.get("avatar"); if (avatar instanceof File && avatar.size > 0) window.location.reload(); } setTimeout(() => setProfileSaveStatus(""), 3000); }; const handlePasswordAction = async (formData: FormData) => { const response = await updatePassword(formData); if (response?.error) { setPasswordSaveStatus(`Hata: ${response.error}`); } else { setPasswordSaveStatus("Şifre güncellendi!"); formRef.current?.reset(); } setTimeout(() => setPasswordSaveStatus(""), 3000); }; const handleSaveAI = async () => { try { const { data: { user } } = await supabase.auth.getUser(); if (!user) throw new Error("Giriş yapılmamış"); // Save to Supabase user_settings table const { error } = await supabase .from("user_settings") .upsert({ user_id: user.id, ai_model: aiProvider, api_key: apiKey, updated_at: new Date().toISOString() }, { onConflict: 'user_id' }); if (error) throw error; // Sync to localStorage as a redundant fallback localStorage.setItem("mindspace_ai_provider", aiProvider); localStorage.setItem("mindspace_api_key", apiKey); setAiSaveStatus("Yapay Zeka ayarları kaydedildi!"); } catch (e: any) { console.error(e); setAiSaveStatus("Hata oluştu, veritabanına kaydedilemedi."); } setTimeout(() => setAiSaveStatus(""), 3000); }; return (

Settings / {activeTab}

{/* Settings Sidebar */}
{tabs.map((tab) => { const Icon = tab.icon; return ( ) })}
{/* Settings Content Area */}
{activeTab === "Profile & Account" && (

User Profile

{avatarUrl ? ( Avatar ) : (
)}
setFirstName(e.target.value)} className="w-full bg-[#150F1D] border border-white/10 rounded-sm px-3 py-2 text-sm outline-none focus:border-primary/50 transition-colors" />
setLastName(e.target.value)} className="w-full bg-[#150F1D] border border-white/10 rounded-sm px-3 py-2 text-sm outline-none focus:border-primary/50 transition-colors" />
{profileSaveStatus && {profileSaveStatus}}
)} {activeTab === "Security" && (

Şifre İşlemleri

{passwordSaveStatus && {passwordSaveStatus}}
)} {activeTab === "AI Preferences" && (

AI Assistant Configuration

Model ve Sağlayıcı Seçimi

{aiProvider !== "ollama" && (

API Keys

{aiProvider.toUpperCase()} API Key
setApiKey(e.target.value)} placeholder="sk-..." className="bg-[#0A0710] border border-white/10 rounded-sm px-3 py-2 text-sm text-foreground w-full outline-none focus:border-primary/50" />
)}
{aiSaveStatus && {aiSaveStatus}}
)} {["Integrations", "Notifications", "Billing & Plans"].includes(activeTab) && (

{activeTab}

Bu bölüm şu an geliştirme aşamasındadır.

)}
); }