import { useState } from 'react' import { useCliAuthStore } from '../../stores/cliAuthStore' export function OpenCodeLoginPanel() { const { openCodeApiKey, saveOpenCodeApiKey, isLoading } = useCliAuthStore() const [mode, setMode] = useState<'menu' | 'api_key'>('menu') const [apiKey, setApiKey] = useState('') const [status, setStatus] = useState(null) const handleFreeModels = async () => { setStatus(null) try { await saveOpenCodeApiKey('', '') setStatus('Free models configured!') } catch (err) { setStatus(err instanceof Error ? err.message : String(err)) } } const handleSave = async () => { if (!apiKey.trim()) { setStatus('Please enter an API key'); return } setStatus(null) try { await saveOpenCodeApiKey(apiKey.trim(), '') setStatus('Saved!') } catch (err) { setStatus(err instanceof Error ? err.message : String(err)) } } const handleClear = async () => { await useCliAuthStore.getState().clearAuth() setApiKey('') setStatus('Cleared') } if (mode === 'api_key') { return (
OpenCode Zen API keys use pay-as-you-go billing. Sign up at opencode.ai/zen to get your key.
setApiKey(e.target.value)} placeholder={openCodeApiKey ? '••••••••' : 'oc-...'} className="flex-1 rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] px-3 py-2 text-sm text-[var(--color-text-primary)] placeholder-[var(--color-text-tertiary)] focus:border-[var(--color-brand)] focus:outline-none" />
{status && (
{status}
)}
) } return (
OpenCode Zen offers free models (no API key needed) or paid models via API key.
{status && (
{status}
)}
{openCodeApiKey && ( )}
) }