/** * Port Configuration Component * Configure service ports (changes require restart) */ import { useState, useEffect } from 'react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { Save, AlertTriangle, Loader2 } from 'lucide-react'; import { useI18n } from '@/contexts'; import { fetchPortConfig, updatePortConfig } from '@/api'; import type { PortConfig } from '@/api'; import styles from './SettingsPanel.module.css'; export function PortConfiguration() { const { t } = useI18n(); const queryClient = useQueryClient(); const [localConfig, setLocalConfig] = useState({ fastapi_port: 2048, camoufox_debug_port: 9222, stream_proxy_port: 3120, stream_proxy_enabled: true, }); const [hasChanges, setHasChanges] = useState(false); // Fetch current config const { data: config, isLoading } = useQuery({ queryKey: ['portConfig'], queryFn: fetchPortConfig, }); // Update local state when config loads useEffect(() => { if (config) { setLocalConfig(config); setHasChanges(false); } }, [config]); // Update config mutation const updateMutation = useMutation({ mutationFn: updatePortConfig, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['portConfig'] }); setHasChanges(false); }, }); const handleChange = (field: keyof PortConfig, value: number | boolean) => { setLocalConfig((prev) => ({ ...prev, [field]: value })); setHasChanges(true); }; const handleSave = () => { updateMutation.mutate(localConfig); }; const validatePort = (port: number): boolean => { return port >= 1024 && port <= 65535; }; if (isLoading) { return (
{t.common.loading}
); } return (
{/* Restart Warning */} {hasChanges && (
{t.settingsPage.restartWarning}
)} {/* FastAPI Port */}
handleChange('fastapi_port', parseInt(e.target.value) || 2048)} /> {!validatePort(localConfig.fastapi_port) && ( {t.settingsPage.portRangeError} )}
{/* Camoufox Debug Port */}
handleChange('camoufox_debug_port', parseInt(e.target.value) || 9222)} />
{/* Stream Proxy Toggle + Port */}
{t.settingsPage.streamProxy}
{localConfig.stream_proxy_enabled && (
handleChange('stream_proxy_port', parseInt(e.target.value) || 3120)} />
)} {/* Save Button */}
); }