import { useState, useEffect } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription, } from '../ui/dialog'; import { Button } from '../ui/button'; import { Input } from '../ui/input'; import { Label } from '../ui/label'; import { Loader2, Info } from 'lucide-react'; import type { App } from '../../services/api'; interface AppConfigDialogProps { open: boolean; onOpenChange: (open: boolean) => void; app: App | null; existingConfig?: Record; onSave: (config: Record) => void; isSaving?: boolean; } export function AppConfigDialog({ open, onOpenChange, app, existingConfig, onSave, isSaving = false, }: AppConfigDialogProps) { const [config, setConfig] = useState>({}); // Initialize config when dialog opens or app changes useEffect(() => { if (app && open) { const initialConfig: Record = {}; // Debug logging to diagnose the issue console.log('[AppConfigDialog] App data:', { name: app.name, hasDefaultConfig: !!app.defaultConfig, defaultConfigKeys: app.defaultConfig ? Object.keys(app.defaultConfig) : [], hasExistingConfig: !!existingConfig, existingConfigKeys: existingConfig ? Object.keys(existingConfig) : [], }); // Start with default config if (app.defaultConfig) { Object.entries(app.defaultConfig).forEach(([key, value]) => { initialConfig[key] = String(value); }); } // Override with existing config if provided if (existingConfig) { Object.entries(existingConfig).forEach(([key, value]) => { initialConfig[key] = value; }); } setConfig(initialConfig); } }, [app, existingConfig, open]); const handleSave = () => { onSave(config); }; const handleChange = (key: string, value: string) => { setConfig(prev => ({ ...prev, [key]: value })); }; // Convert snake_case to Title Case for labels const formatLabel = (key: string): string => { return key .split('_') .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); }; if (!app) return null; const configKeys = Object.keys(app.defaultConfig || {}); const hasConfig = configKeys.length > 0; return ( Configure {app.name} {app.description} {hasConfig ? (
{configKeys.map((key) => { const isRequired = app.requiredSecrets?.some(secret => secret.toLowerCase().includes(key.toLowerCase()) ); return (
{isRequired && ( )}
handleChange(key, e.target.value)} placeholder={String(app.defaultConfig?.[key] || '')} required={isRequired} /> {isRequired && (

This value is used to generate application secrets

)}
); })} {app.dependencies && app.dependencies.length > 0 && (

Dependencies

This app requires the following apps to be deployed first:

    {app.dependencies.map(dep => (
  • {dep}
  • ))}
)}
) : (

This app doesn't require any configuration.

Click Add to proceed with default settings.

)}
); }