import React, { useRef, useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Sun, Moon, Laptop, Save, Trash2, Upload, CheckCircle2, AlertCircle, FlaskConical } from 'lucide-react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { useTheme } from '@/lib/theme'; import { useProjects } from '@/lib/hooks/useProjects'; import { useWindStore } from '@/store/appStore'; import { useI18n } from '@/store/i18nStore'; import { Badge } from '@/components/ui/badge'; import { importProjectFromText, readProjectFile, type ImportResult, } from '@/lib/import-project'; import AuditPanel from '@/components/AuditPanel'; const SettingsModule: React.FC = () => { const { theme, setTheme, effectiveTheme } = useTheme(); const { projects, loading, error, remove } = useProjects(); const { t, locale } = useI18n(); const fileInputRef = useRef(null); const [importResult, setImportResult] = useState(null); const [importing, setImporting] = useState(false); const exportSnapshot = () => { const state = useWindStore.getState(); const blob = new Blob([JSON.stringify(state, null, 2)], { type: 'application/json' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.setAttribute('href', url); link.setAttribute('download', 'ventoapp-state.json'); document.body.appendChild(link); link.click(); document.body.removeChild(link); }; const handleImportClick = () => { fileInputRef.current?.click(); }; const handleFileSelected = async (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; setImporting(true); setImportResult(null); try { const text = await readProjectFile(file); const result = importProjectFromText(text); setImportResult(result); } catch (e) { setImportResult({ ok: false, error: e instanceof Error ? e.message : 'Falha ao ler arquivo', }); } finally { setImporting(false); if (fileInputRef.current) fileInputRef.current.value = ''; } }; return (

{t('nav_settings')}

Configurações Testes {t('settings_appearance')} {t('settings_appearance_desc')}

{t('settings_effective')}: {effectiveTheme}

{t('settings_projects')} {t('settings_projects_desc')}

{t('settings_projects_count', { count: projects.length })}

{importResult && (
{importResult.ok ? ( ) : ( )}
{importResult.ok ? t('settings_import_success') : t('settings_import_error')}
{importResult.module && (
{t('settings_import_module')}: {importResult.module} {importResult.projectName && ( {t('settings_import_project')}: {importResult.projectName} )}
)} {importResult.appliedFields && importResult.appliedFields.length > 0 && (
{t('settings_import_fields', { count: importResult.appliedFields.length })}: {importResult.appliedFields.join(', ')}
)} {importResult.warnings && importResult.warnings.length > 0 && (
{t('settings_import_warnings')}: {importResult.warnings.join('; ')}
)} {importResult.error && (
{importResult.error}
)}
)} {loading &&

{t('common_loading')}

} {error &&

{error}

} {projects.length === 0 && !loading && (

{t('settings_no_projects')}

)}
{projects.map((p) => (
{p.name}
{p.module} · {new Date(p.updatedAt).toLocaleString(locale === 'pt-BR' ? 'pt-BR' : 'en-US')}
))}
{t('settings_about')}

{t('app_title')} — {t('settings_about_desc')}

{t('settings_stack')}: React 19 + TypeScript + Vite + Tailwind v4 + shadcn/ui + Zustand + R3F + @react-pdf/renderer.

Cobertura: 11 seções normativas + 3 anexos. Todos os 8 marcos do plano de implementação concluídos.

Desenvolvido por BrainSteel do Brasil - resp. Eng. Marcos A. Reifonas

); }; export default SettingsModule;