style: clean up code formatting and remove trailing whitespace
refactor: reorganize imports and fix type imports
This commit is contained in:
1 parent
d3704602fd
commit
47c04de6fe
232 files changed
+7140
-4798
No files matched your search
@@ -1,13 +1,19 @@
|
||||
"use client";
|
||||
|
||||
import { Loader2, Sparkles } from "lucide-react";
|
||||
import { useCallback, useMemo, useState } from "react";
|
||||
import { Sparkles, Loader2 } from "lucide-react";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Textarea } from "@/components/ui/textarea";
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
||||
import { ItemImageCapture, ProcessedImage } from "./ItemImageCapture";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from "@/components/ui/select";
|
||||
import { Textarea } from "@/components/ui/textarea";
|
||||
import { ItemImageCapture, type ProcessedImage } from "./ItemImageCapture";
|
||||
|
||||
interface ItemAiAssistantProps {
|
||||
locale: string;
|
||||
@@ -86,7 +92,10 @@ export function ItemAiAssistant({
|
||||
const data = await response.json();
|
||||
const structure = data?.structure ?? data;
|
||||
const columns = structure?.columns;
|
||||
setLogs((prev) => [...prev, `Resposta recebida. Tamanho ~${JSON.stringify(structure).length} bytes.`]);
|
||||
setLogs((prev) => [
|
||||
...prev,
|
||||
`Resposta recebida. Tamanho ~${JSON.stringify(structure).length} bytes.`,
|
||||
]);
|
||||
|
||||
// Heurística: sugerir nomes com base em imagens quando não houver texto detectado
|
||||
const suggestNamesFromImages = (imgs: ProcessedImage[]): string[] => {
|
||||
@@ -96,7 +105,15 @@ export function ItemAiAssistant({
|
||||
.replace(/\.[a-zA-Z0-9]+$/, "")
|
||||
.toLowerCase()
|
||||
.replace(/[_\s]+/g, "-");
|
||||
const common = new Set(["image", "img", "screenshot", "captura", "photo", "foto", "unknown"]);
|
||||
const common = new Set([
|
||||
"image",
|
||||
"img",
|
||||
"screenshot",
|
||||
"captura",
|
||||
"photo",
|
||||
"foto",
|
||||
"unknown",
|
||||
]);
|
||||
const orientation = first.height > first.width ? "retrato" : "paisagem";
|
||||
const suggestions: string[] = [];
|
||||
if (base && !common.has(base)) suggestions.push(base);
|
||||
@@ -105,12 +122,19 @@ export function ItemAiAssistant({
|
||||
return Array.from(new Set(suggestions)).slice(0, 3);
|
||||
};
|
||||
|
||||
const autoNameDetected = typeof columns?.name === "string" && Boolean(String(columns.name).trim());
|
||||
const autoDescDetected = typeof columns?.description === "string" && Boolean(String(columns.description).trim());
|
||||
const autoNameDetected =
|
||||
typeof columns?.name === "string" &&
|
||||
Boolean(String(columns.name).trim());
|
||||
const autoDescDetected =
|
||||
typeof columns?.description === "string" &&
|
||||
Boolean(String(columns.description).trim());
|
||||
|
||||
const origemDados: string = autoNameDetected || autoDescDetected ? "automatico" : "nao_detectado";
|
||||
const origemDados: string =
|
||||
autoNameDetected || autoDescDetected ? "automatico" : "nao_detectado";
|
||||
|
||||
const sugestoesNome = !autoNameDetected ? suggestNamesFromImages(images) : [];
|
||||
const sugestoesNome = !autoNameDetected
|
||||
? suggestNamesFromImages(images)
|
||||
: [];
|
||||
|
||||
// Estrutura final com campos obrigatórios, origem e sugestões
|
||||
const finalStructure = {
|
||||
@@ -125,18 +149,35 @@ export function ItemAiAssistant({
|
||||
? "Confirme o nome sugerido ou ajuste se necessário."
|
||||
: "Informe um nome para o item. Descrição é opcional, mas ajuda.",
|
||||
},
|
||||
sugestoes: sugestoesNome.length > 0 ? { nome: sugestoesNome } : undefined,
|
||||
sugestoes:
|
||||
sugestoesNome.length > 0 ? { nome: sugestoesNome } : undefined,
|
||||
},
|
||||
};
|
||||
|
||||
setRawJson(JSON.stringify(finalStructure, null, 2));
|
||||
|
||||
const prefill: ItemAiPrefill = {
|
||||
name: autoNameDetected ? (columns!.name as string) : undefined,
|
||||
description: autoDescDetected ? (columns!.description as string) : undefined,
|
||||
metadata: typeof columns === "object" && columns !== null
|
||||
? { ...columns, origem_dados: origemDados, confirmar_nome: autoNameDetected ? false : undefined, sugestoes: sugestoesNome.length ? { nome: sugestoesNome } : undefined }
|
||||
: { origem_dados: origemDados, confirmar_nome: autoNameDetected ? false : undefined, sugestoes: sugestoesNome.length ? { nome: sugestoesNome } : undefined },
|
||||
name: autoNameDetected ? (columns?.name as string) : undefined,
|
||||
description: autoDescDetected
|
||||
? (columns?.description as string)
|
||||
: undefined,
|
||||
metadata:
|
||||
typeof columns === "object" && columns !== null
|
||||
? {
|
||||
...columns,
|
||||
origem_dados: origemDados,
|
||||
confirmar_nome: autoNameDetected ? false : undefined,
|
||||
sugestoes: sugestoesNome.length
|
||||
? { nome: sugestoesNome }
|
||||
: undefined,
|
||||
}
|
||||
: {
|
||||
origem_dados: origemDados,
|
||||
confirmar_nome: autoNameDetected ? false : undefined,
|
||||
sugestoes: sugestoesNome.length
|
||||
? { nome: sugestoesNome }
|
||||
: undefined,
|
||||
},
|
||||
};
|
||||
|
||||
if (columns) {
|
||||
@@ -160,12 +201,20 @@ export function ItemAiAssistant({
|
||||
}
|
||||
}
|
||||
|
||||
setLogs((prev) => [...prev, "Sugestões de preenchimento geradas. Aguardando confirmação do usuário."]);
|
||||
setLogs((prev) => [
|
||||
...prev,
|
||||
"Sugestões de preenchimento geradas. Aguardando confirmação do usuário.",
|
||||
]);
|
||||
onGenerated({ json: finalStructure, prefill });
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
setError(err instanceof Error ? err.message : "Erro ao processar análise de IA.");
|
||||
setLogs((prev) => [...prev, `Erro: ${err instanceof Error ? err.message : String(err)}`]);
|
||||
setError(
|
||||
err instanceof Error ? err.message : "Erro ao processar análise de IA.",
|
||||
);
|
||||
setLogs((prev) => [
|
||||
...prev,
|
||||
`Erro: ${err instanceof Error ? err.message : String(err)}`,
|
||||
]);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
setLogs((prev) => [...prev, "Processo de geração concluído."]);
|
||||
@@ -193,8 +242,8 @@ export function ItemAiAssistant({
|
||||
Assistente IA para registro de item
|
||||
</h2>
|
||||
<p className="max-w-3xl text-sm text-muted-foreground">
|
||||
Cole prints e descreva o item. A IA vai sugerir a tabela, campos e metadados. Você pode ajustar os dados
|
||||
antes de salvar.
|
||||
Cole prints e descreva o item. A IA vai sugerir a tabela, campos e
|
||||
metadados. Você pode ajustar os dados antes de salvar.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-2 text-xs text-muted-foreground">
|
||||
@@ -216,7 +265,10 @@ export function ItemAiAssistant({
|
||||
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium">Escopo</label>
|
||||
<Select value={scope} onValueChange={(value: "global" | "server") => setScope(value)}>
|
||||
<Select
|
||||
value={scope}
|
||||
onValueChange={(value: "global" | "server") => setScope(value)}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
@@ -247,7 +299,9 @@ export function ItemAiAssistant({
|
||||
)}
|
||||
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium">Descrição detalhada para a IA</label>
|
||||
<label className="text-sm font-medium">
|
||||
Descrição detalhada para a IA
|
||||
</label>
|
||||
<Textarea
|
||||
value={description}
|
||||
onChange={(event) => setDescription(event.target.value)}
|
||||
@@ -257,10 +311,14 @@ export function ItemAiAssistant({
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium">Prints / evidências visuais</label>
|
||||
<label className="text-sm font-medium">
|
||||
Prints / evidências visuais
|
||||
</label>
|
||||
<ItemImageCapture onImagesChange={setImages} />
|
||||
{images.length > 0 && (
|
||||
<p className="text-xs text-emerald-600">Imagem recebida — pronta para processamento.</p>
|
||||
<p className="text-xs text-emerald-600">
|
||||
Imagem recebida — pronta para processamento.
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -271,12 +329,17 @@ export function ItemAiAssistant({
|
||||
)}
|
||||
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Button type="button" onClick={handleGenerate} disabled={disabled || loading}>
|
||||
<Button
|
||||
type="button"
|
||||
onClick={handleGenerate}
|
||||
disabled={disabled || loading}
|
||||
>
|
||||
{loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
|
||||
Gerar com IA
|
||||
</Button>
|
||||
<p className="text-xs text-muted-foreground">
|
||||
A IA retornará um JSON com sugestões de campos. As alterações só serão aplicadas após sua confirmação.
|
||||
A IA retornará um JSON com sugestões de campos. As alterações só
|
||||
serão aplicadas após sua confirmação.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -292,16 +355,20 @@ export function ItemAiAssistant({
|
||||
</pre>
|
||||
) : (
|
||||
<p>
|
||||
Execute a análise para visualizar o JSON sugerido. Ele será usado para preencher automaticamente os
|
||||
campos do formulário.
|
||||
Execute a análise para visualizar o JSON sugerido. Ele será
|
||||
usado para preencher automaticamente os campos do formulário.
|
||||
</p>
|
||||
)}
|
||||
{logs.length > 0 && (
|
||||
<div className="space-y-1">
|
||||
<p className="text-[11px] text-muted-foreground">Logs do processo</p>
|
||||
<p className="text-[11px] text-muted-foreground">
|
||||
Logs do processo
|
||||
</p>
|
||||
<div className="rounded-md border bg-muted/30 p-2">
|
||||
{logs.map((line, idx) => (
|
||||
<p key={idx} className="text-[11px] leading-relaxed">• {line}</p>
|
||||
<p key={idx} className="text-[11px] leading-relaxed">
|
||||
• {line}
|
||||
</p>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
@@ -312,4 +379,3 @@ export function ItemAiAssistant({
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user