'use client' import { useState } from 'react' import Header from '@/components/Header' import { Eye, EyeOff, Loader2, CheckCircle, XCircle, Save, Trash2 } from 'lucide-react' import { useSettings } from '@/lib/context/SettingsContext' import { testOpenCodeConnection } from '@/lib/api/opencode' import { testConnection } from '@/lib/api/api34ai' export default function SettingsPage() { const { settings, updateSettings, isMounted } = useSettings() const [showOpenCodeKey, setShowOpenCodeKey] = useState(false) const [show34aiKey, setShow34aiKey] = useState(false) const [testingOpenCode, setTestingOpenCode] = useState(false) const [testing34ai, setTesting34ai] = useState(false) const [openCodeStatus, setOpenCodeStatus] = useState<'untested' | 'success' | 'failed'>('untested') const [status34ai, setStatus34ai] = useState<'untested' | 'success' | 'failed'>('untested') const [saved, setSaved] = useState(false) const [openCodeError, setOpenCodeError] = useState(null) const [api34aiError, setApi34aiError] = useState(null) const [testingTikTok, setTestingTikTok] = useState(false) const [tiktokStatus, setTiktokStatus] = useState<'untested' | 'success' | 'failed'>('untested') const [tiktokError, setTiktokError] = useState(null) if (!isMounted) { return (
Loading...
) } const handleTestOpenCode = async () => { if (!settings.opencodeApiKey) { setOpenCodeError('Please enter an API key first') return } setTestingOpenCode(true) setOpenCodeError(null) try { const success = await testOpenCodeConnection(settings.opencodeApiKey, settings.opencodeModel) setOpenCodeStatus(success ? 'success' : 'failed') if (!success) { setOpenCodeError('Connection failed. Please check your API key.') } } catch (e: any) { setOpenCodeStatus('failed') setOpenCodeError(e.message || 'Failed to connect to OpenCode API') } finally { setTestingOpenCode(false) } } const handleTest34ai = async () => { if (!settings.api34aiKey) { setApi34aiError('Please enter an API key first') return } setTesting34ai(true) setApi34aiError(null) try { const success = await testConnection(settings.api34aiKey) setStatus34ai(success ? 'success' : 'failed') if (!success) { setApi34aiError('Connection failed. Please check your API key.') } } catch (e: any) { setStatus34ai('failed') setApi34aiError(e.message || 'Failed to connect to 34ai API') } finally { setTesting34ai(false) } } const handleTestTikTokCookies = async () => { if (!settings.tiktokCookies) { setTiktokError('Please enter TikTok cookies first') return } setTestingTikTok(true) setTiktokError(null) try { const cookies = JSON.parse(settings.tiktokCookies) if (!Array.isArray(cookies) || cookies.length === 0) { throw new Error('Invalid cookie format') } const response = await fetch('/api/tiktok', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cookies }), }) if (response.ok || response.status === 401) { setTiktokStatus('success') } else { setTiktokStatus('failed') setTiktokError('Cookies may be invalid. Try refreshing.') } } catch (e: any) { setTiktokStatus('failed') setTiktokError(e.message || 'Invalid JSON format in cookies') } finally { setTestingTikTok(false) } } const handleSave = () => { setSaved(true) setTimeout(() => setSaved(false), 2000) } const handleClear = () => { if (confirm('Are you sure you want to clear all settings?')) { localStorage.removeItem('ai-video-flow-settings') window.location.reload() } } const getStatusIcon = (status: 'untested' | 'success' | 'failed') => { switch (status) { case 'success': return case 'failed': return default: return
} } return (

Settings

Configure your API keys and TikTok cookies

{saved && (
Settings saved successfully!
)}

OpenCode Configuration

updateSettings({ opencodeApiKey: e.target.value })} placeholder="sk-..." className="w-full bg-slate-800 border border-slate-600 rounded-lg px-4 py-2.5 pr-10 text-white placeholder-slate-500 focus:outline-none focus:border-primary" />
{getStatusIcon(openCodeStatus)} {openCodeStatus === 'success' && ( Connected! )}
{openCodeError && (

{openCodeError}

)}

34ai Configuration

updateSettings({ api34aiKey: e.target.value })} placeholder="public_..." className="w-full bg-slate-800 border border-slate-600 rounded-lg px-4 py-2.5 pr-10 text-white placeholder-slate-500 focus:outline-none focus:border-primary" />
updateSettings({ api34aiBaseUrl: e.target.value })} placeholder="https://34ai.net" className="w-full bg-slate-800 border border-slate-600 rounded-lg px-4 py-2.5 text-white placeholder-slate-500 focus:outline-none focus:border-primary" />
{getStatusIcon(status34ai)} {status34ai === 'success' && ( Connected! )}
{api34aiError && (

{api34aiError}

)}

TikTok Cookies (Required for Trending)

How to get TikTok cookies:

  1. Install "Cookie-Editor" extension on Chrome
  2. Go to tiktok.com and login
  3. Click Cookie-Editor → Export → Copy
  4. Paste the cookies below