import { useState } from 'preact/hooks'; import { MindforgeApiService } from '../services/MindforgeApiService'; import { FileTreeComponent } from './FileTreeComponent'; import { Button } from './Button'; import * as diff from 'diff'; import { marked } from 'marked'; import './VerificadorComponent.css'; function utf8ToBase64(str: string): string { const bytes = new TextEncoder().encode(str); const binary = Array.from(bytes, byte => String.fromCharCode(byte)).join(''); return window.btoa(binary); } type CheckTypeEnum = 'language' | 'content' | 'both'; interface FileResult { path: string; fileName: string; originalContent: string; languageResult: string | null; contentResult: string | null; error: string | null; } export function VerificadorComponent() { const [selectedPaths, setSelectedPaths] = useState([]); const [checkType, setCheckType] = useState('language'); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [results, setResults] = useState([]); const handleSubmit = async () => { if (selectedPaths.length === 0) { setError('Selecione pelo menos um arquivo do repositório.'); return; } setLoading(true); setError(null); setResults([]); try { const fileResults = await Promise.all( selectedPaths.map(async (path): Promise => { const fileName = path.split('/').pop() ?? path; try { const { content } = await MindforgeApiService.getFileContent(path); const base64Content = utf8ToBase64(content); let languageResult: string | null = null; let contentResult: string | null = null; if (checkType === 'both') { const [langRes, contRes] = await Promise.all([ MindforgeApiService.checkFile({ fileContent: base64Content, fileName, checkType: 'language' }), MindforgeApiService.checkFile({ fileContent: base64Content, fileName, checkType: 'content' }), ]); languageResult = langRes.result; contentResult = contRes.result; } else { const res = await MindforgeApiService.checkFile({ fileContent: base64Content, fileName, checkType }); if (checkType === 'language') languageResult = res.result; else contentResult = res.result; } return { path, fileName, originalContent: content, languageResult, contentResult, error: null }; } catch (err: any) { return { path, fileName, originalContent: '', languageResult: null, contentResult: null, error: err.message }; } }) ); setResults(fileResults); } catch (err: any) { setError(err.message || 'Ocorreu um erro ao processar os arquivos.'); } finally { setLoading(false); } }; const renderDiff = (original: string, updated: string) => { const diffResult = diff.diffWordsWithSpace(original, updated); return (
{diffResult.map((part, index) => { const className = part.added ? 'diff-added' : part.removed ? 'diff-removed' : ''; return ( {part.value} ); })}
); }; return (

Verificador de Arquivos

Selecione os arquivos do repositório para validação de linguagem ou conteúdo.

{selectedPaths.length > 0 && (
{selectedPaths.length} arquivo{selectedPaths.length !== 1 ? 's' : ''} selecionado{selectedPaths.length !== 1 ? 's' : ''}
)}
{error &&
{error}
}
{loading && (

Analisando sua forja mental...

)} {!loading && results.length > 0 && (
{results.map((fileResult) => (
{fileResult.fileName}
{fileResult.error && (
{fileResult.error}
)} {!fileResult.error && checkType === 'language' && fileResult.languageResult && (
Linguagem (Diff)
{renderDiff(fileResult.originalContent, fileResult.languageResult)}
)} {!fileResult.error && checkType === 'content' && fileResult.contentResult && (
Conteúdo
)} {!fileResult.error && checkType === 'both' && fileResult.languageResult && fileResult.contentResult && (
Linguagem (Diff)
{renderDiff(fileResult.originalContent, fileResult.languageResult)}
Conteúdo
)}
))}
)}
); }