"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Separator } from "@/components/ui/separator" import { settingsApi, credentialsApi, ConfiguredService } from "@/lib/api" import { toast } from "sonner" import { Loader2, Check, Key, Trash2, Eye, EyeOff } from "lucide-react" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Badge } from "@/components/ui/badge" import { Textarea } from "@/components/ui/textarea" interface ThemeConfig { logoUrl: string primaryColor: string companyName: string } const DEFAULT_THEME: ThemeConfig = { logoUrl: "/logo.png", primaryColor: "#000000", companyName: "GoHorseJobs" } export default function SettingsPage() { const [config, setConfig] = useState(DEFAULT_THEME) const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) // Credentials State const [credentials, setCredentials] = useState([]) const [loadingCredentials, setLoadingCredentials] = useState(false) const [selectedService, setSelectedService] = useState(null) const [credentialPayload, setCredentialPayload] = useState("") const [isDialogOpen, setIsDialogOpen] = useState(false) const [showPassword, setShowPassword] = useState(false) const fetchSettings = async () => { try { const data = await settingsApi.get("theme") if (data && Object.keys(data).length > 0) { setConfig({ ...DEFAULT_THEME, ...data }) } } catch (error) { console.error("Failed to fetch theme settings", error) } } const fetchCredentials = async () => { setLoadingCredentials(true) try { const res = await credentialsApi.list() // Ensure we handle the response correctly (api.ts wraps it in { services: ... }) if (res && res.services) { setCredentials(res.services) } } catch (error) { console.error("Failed to fetch credentials", error) toast.error("Failed to load credentials status") } finally { setLoadingCredentials(false) } } useEffect(() => { Promise.all([fetchSettings(), fetchCredentials()]).finally(() => setLoading(false)) }, []) const handleSaveTheme = async () => { setSaving(true) try { await settingsApi.save("theme", config) toast.success("Theme settings saved") window.location.reload() } catch (error) { console.error("Failed to save settings", error) toast.error("Failed to save settings") } finally { setSaving(false) } } const handleOpenCredentialDialog = (serviceName: string) => { setSelectedService(serviceName) setCredentialPayload("") setShowPassword(false) setIsDialogOpen(true) } const handleSaveCredential = async () => { if (!selectedService || !credentialPayload) return setSaving(true) try { await credentialsApi.save(selectedService, credentialPayload) toast.success(`Credentials for ${selectedService} saved`) setIsDialogOpen(false) fetchCredentials() // Refresh list } catch (error) { console.error("Failed to save credential", error) toast.error("Failed to save credential") } finally { setSaving(false) } } const handleDeleteCredential = async (serviceName: string) => { if (!confirm(`Are you sure you want to remove credentials for ${serviceName}?`)) return try { await credentialsApi.delete(serviceName) toast.success(`Credentials for ${serviceName} removed`) fetchCredentials() } catch (error) { console.error("Failed to delete credential", error) toast.error("Failed to delete credential") } } if (loading) { return
} return (

System Settings

Manage application appearance and integrations.

Branding & Theme Integrations & Credentials Branding & Theme Customize the look and feel of your dashboard.
setConfig({ ...config, companyName: e.target.value })} />
setConfig({ ...config, logoUrl: e.target.value })} /> {config.logoUrl && (
Preview e.currentTarget.style.display = 'none'} />
)}

Enter a public URL for your logo.

setConfig({ ...config, primaryColor: e.target.value })} />
Sample Button
External Services Manage credentials for third-party integrations securely.
{credentials.map((service) => (

{service.service_name}

{service.is_configured ? ( Configured ) : ( Not Configured )}

{service.is_configured ? `Updated on ${new Date(service.updated_at).toLocaleDateString()} by ${service.updated_by || 'Unknown'}` : 'No credentials saved for this service.'}

{service.is_configured && ( )}
))}
Configure {selectedService} Enter the secret credentials for {selectedService}. These will be encrypted and stored securely.