({ open, onClose, onCreated, onOpenGlobalSettings }: CreateProjectModalProps)
| 116 | } |
| 117 | |
| 118 | export default function CreateProjectModal({ open, onClose, onCreated, onOpenGlobalSettings }: CreateProjectModalProps) { |
| 119 | const [projectName, setProjectName] = useState(''); |
| 120 | const [prompt, setPrompt] = useState(''); |
| 121 | const [selectedCLI, setSelectedCLI] = useState<string>('claude'); |
| 122 | const [selectedModel, setSelectedModel] = useState<string>(DEFAULT_MODEL_ID); |
| 123 | // Fallback is removed but kept for backward compatibility |
| 124 | const [fallbackEnabled, setFallbackEnabled] = useState(false); |
| 125 | const [useDefaultSettings, setUseDefaultSettings] = useState(true); |
| 126 | const [loading, setLoading] = useState(false); |
| 127 | const [initializationStep, setInitializationStep] = useState(''); |
| 128 | const [showInitialization, setShowInitialization] = useState(false); |
| 129 | const [initializingProjectId, setInitializingProjectId] = useState<string | null>(null); |
| 130 | const [globalSettings, setGlobalSettings] = useState<GlobalSettings | null>(null); |
| 131 | const [enabledCLIs, setEnabledCLIs] = useState<CLIOption[]>([]); |
| 132 | const [cliStatus, setCLIStatus] = useState<CLIStatus>(() => createCliStatusFallback()); |
| 133 | const [imageUrl, setImageUrl] = useState(''); |
| 134 | const [websiteUrl, setWebsiteUrl] = useState(''); |
| 135 | const [imageError, setImageError] = useState(''); |
| 136 | const [showImageInput, setShowImageInput] = useState(false); |
| 137 | const [showWebsiteInput, setShowWebsiteInput] = useState(false); |
| 138 | const [showCLIDropdown, setShowCLIDropdown] = useState(false); |
| 139 | const [showModelDropdown, setShowModelDropdown] = useState(false); |
| 140 | const router = useRouter(); |
| 141 | |
| 142 | const loadGlobalSettings = useCallback(async () => { |
| 143 | try { |
| 144 | const [settingsResponse, cliStatuses] = await Promise.all([ |
| 145 | fetch(`${API_BASE}/api/settings/global`), |
| 146 | fetchCliStatusSnapshot(), |
| 147 | ]); |
| 148 | |
| 149 | setCLIStatus(cliStatuses); |
| 150 | |
| 151 | let settings: GlobalSettings | null = null; |
| 152 | if (settingsResponse.ok) { |
| 153 | settings = await settingsResponse.json(); |
| 154 | if (settings?.cli_settings) { |
| 155 | for (const [cli, config] of Object.entries(settings.cli_settings)) { |
| 156 | if (config && typeof config === 'object' && 'model' in config && config.model) { |
| 157 | config.model = sanitizeModel(cli, config.model as string); |
| 158 | } |
| 159 | } |
| 160 | } |
| 161 | setGlobalSettings(settings); |
| 162 | } |
| 163 | |
| 164 | if (settings) { |
| 165 | const enabled = CLI_OPTIONS.filter((cli) => { |
| 166 | const isEnabled = settings.cli_settings?.[cli.id]?.enabled !== false; |
| 167 | const isInstalled = cliStatuses[cli.id]?.installed !== false; |
| 168 | const isAvailable = cli.enabled !== false; |
| 169 | return isEnabled && isInstalled && isAvailable; |
| 170 | }); |
| 171 | |
| 172 | const effectiveCLIs = enabled.length > 0 ? enabled : CLI_OPTIONS.filter((cli) => cli.enabled !== false); |
| 173 | setEnabledCLIs(effectiveCLIs); |
| 174 | |
| 175 | const defaultCLI = settings.default_cli || 'claude'; |
nothing calls this directly
no test coverage detected