'use client'; import React, {useEffect, useState} from 'react'; import {useLanguage} from '@/contexts/LanguageContext'; import UserSelector from './UserSelector'; import WikiTypeSelector from './WikiTypeSelector'; import TokenInput from './TokenInput'; interface ModelSelectionModalProps { isOpen: boolean; onClose: () => void; provider: string; setProvider: (value: string) => void; model: string; setModel: (value: string) => void; isCustomModel: boolean; setIsCustomModel: (value: boolean) => void; customModel: string; setCustomModel: (value: string) => void; onApply: (token?: string) => void; // Wiki type options isComprehensiveView: boolean; setIsComprehensiveView: (value: boolean) => void; // File filter options - optional excludedDirs?: string; setExcludedDirs?: (value: string) => void; excludedFiles?: string; setExcludedFiles?: (value: string) => void; includedDirs?: string; setIncludedDirs?: (value: string) => void; includedFiles?: string; setIncludedFiles?: (value: string) => void; showFileFilters?: boolean; showWikiType: boolean; // Token input for refresh showTokenInput?: boolean; repositoryType?: 'github' | 'gitlab' | 'bitbucket'; // Authentication authRequired?: boolean; authCode?: string; setAuthCode?: (code: string) => void; isAuthLoading?: boolean; } export default function ModelSelectionModal({ isOpen, onClose, provider, setProvider, model, setModel, isCustomModel, setIsCustomModel, customModel, setCustomModel, onApply, isComprehensiveView, setIsComprehensiveView, excludedDirs = '', setExcludedDirs, excludedFiles = '', setExcludedFiles, includedDirs = '', setIncludedDirs, includedFiles = '', setIncludedFiles, showFileFilters = false, authRequired = false, authCode = '', setAuthCode, isAuthLoading, showWikiType = true, showTokenInput = false, repositoryType = 'github', }: ModelSelectionModalProps) { const { messages: t } = useLanguage(); // Local state for form values (to only apply changes when the user clicks "Submit") const [localProvider, setLocalProvider] = useState(provider); const [localModel, setLocalModel] = useState(model); const [localIsCustomModel, setLocalIsCustomModel] = useState(isCustomModel); const [localCustomModel, setLocalCustomModel] = useState(customModel); const [localIsComprehensiveView, setLocalIsComprehensiveView] = useState(isComprehensiveView); const [localExcludedDirs, setLocalExcludedDirs] = useState(excludedDirs); const [localExcludedFiles, setLocalExcludedFiles] = useState(excludedFiles); const [localIncludedDirs, setLocalIncludedDirs] = useState(includedDirs); const [localIncludedFiles, setLocalIncludedFiles] = useState(includedFiles); // Token input state const [localAccessToken, setLocalAccessToken] = useState(''); const [localSelectedPlatform, setLocalSelectedPlatform] = useState<'github' | 'gitlab' | 'bitbucket'>(repositoryType); const [showTokenSection, setShowTokenSection] = useState(showTokenInput); // Reset local state when modal is opened useEffect(() => { if (isOpen) { setLocalProvider(provider); setLocalModel(model); setLocalIsCustomModel(isCustomModel); setLocalCustomModel(customModel); setLocalIsComprehensiveView(isComprehensiveView); setLocalExcludedDirs(excludedDirs); setLocalExcludedFiles(excludedFiles); setLocalIncludedDirs(includedDirs); setLocalIncludedFiles(includedFiles); setLocalSelectedPlatform(repositoryType); setLocalAccessToken(''); setShowTokenSection(showTokenInput); } }, [isOpen, provider, model, isCustomModel, customModel, isComprehensiveView, excludedDirs, excludedFiles, includedDirs, includedFiles, repositoryType, showTokenInput]); // Handler for applying changes const handleApply = () => { setProvider(localProvider); setModel(localModel); setIsCustomModel(localIsCustomModel); setCustomModel(localCustomModel); setIsComprehensiveView(localIsComprehensiveView); if (setExcludedDirs) setExcludedDirs(localExcludedDirs); if (setExcludedFiles) setExcludedFiles(localExcludedFiles); if (setIncludedDirs) setIncludedDirs(localIncludedDirs); if (setIncludedFiles) setIncludedFiles(localIncludedFiles); // Pass token to onApply if needed if (showTokenInput) { onApply(localAccessToken); } else { onApply(); } onClose(); }; if (!isOpen) return null; return (
{/* Modal header with close button */}

{t.form?.modelSelection || 'Model Selection'}

{/* Modal body */}
{/* Wiki Type Selector */} { showWikiType && } {/* Divider */}
{/* Model Selector */} setLocalExcludedDirs(value) : undefined} excludedFiles={localExcludedFiles} setExcludedFiles={showFileFilters ? (value: string) => setLocalExcludedFiles(value) : undefined} includedDirs={localIncludedDirs} setIncludedDirs={showFileFilters ? (value: string) => setLocalIncludedDirs(value) : undefined} includedFiles={localIncludedFiles} setIncludedFiles={showFileFilters ? (value: string) => setLocalIncludedFiles(value) : undefined} /> {/* Token Input Section for refresh */} {showTokenInput && ( <>
setShowTokenSection(!showTokenSection)} allowPlatformChange={false} // Don't allow platform change during refresh /> )} {/* Authorization Code Input */} {isAuthLoading && (
Loading authentication status...
)} {!isAuthLoading && authRequired && (
setAuthCode?.(e.target.value)} className="input-japanese block w-full px-3 py-2 text-sm rounded-md bg-transparent text-[var(--foreground)] focus:outline-none focus:border-[var(--accent-primary)]" placeholder="Enter your authorization code" />
{t.form?.authorizationRequired || 'Authentication is required to generate the wiki.'}
)}
{/* Modal footer */}
); }