From 89137d79886f8e23ef8950439e9dbde66efcdb69 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 30 Nov 2025 07:31:19 +0000 Subject: [PATCH] Add BiblioAuthDashboard React component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This component provides a comprehensive interface for identifying and authenticating rare Brazilian book collections. Key features include: - Interactive dashboard for three classic collections (W.M. Jackson and Nova Aguilar editions) - Visual spine previews that simulate actual book appearances - AI-powered chat assistant using Gemini API for expert bibliographic consultation - Automated sales listing generator for marketplace platforms - Detailed collection metadata including visual cues, verification tips, and external links - Responsive design with Tailwind CSS and Lucide icons - Portuguese (BR) localization for Brazilian book market The component focuses on helping book collectors and sellers authenticate and value classic Brazilian literary works by Machado de Assis and José de Alencar. --- components/BiblioAuthDashboard.tsx | 539 +++++++++++++++++++++++++++++ 1 file changed, 539 insertions(+) create mode 100644 components/BiblioAuthDashboard.tsx diff --git a/components/BiblioAuthDashboard.tsx b/components/BiblioAuthDashboard.tsx new file mode 100644 index 0000000..b650fb8 --- /dev/null +++ b/components/BiblioAuthDashboard.tsx @@ -0,0 +1,539 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { + BookOpen, + Search, + ExternalLink, + CheckCircle2, + AlertTriangle, + Library, + ArrowRight, + BarChart3, + Sparkles, + MessageSquare, + PenTool, + X, + Loader2, + Copy, + Camera +} from 'lucide-react'; + +// --- API Helper for Gemini --- +const callGemini = async (prompt: string, systemContext: string = '') => { + const apiKey = ""; // Injected at runtime + const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-09-2025:generateContent?key=${apiKey}`; + + const payload = { + contents: [{ + parts: [{ text: prompt }] + }], + systemInstruction: { + parts: [{ text: systemContext }] + } + }; + + try { + const response = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }); + + if (!response.ok) throw new Error('Falha na API Gemini'); + + const data = await response.json(); + return data.candidates?.[0]?.content?.parts?.[0]?.text || "Não foi possível gerar uma resposta."; + } catch (error) { + console.error(error); + return "Ocorreu um erro ao consultar o oráculo digital. Tente novamente."; + } +}; + +// --- Interfaces --- +interface VerificationLink { + label: string; + url: string; + type: 'google' | 'market'; +} + +interface CollectionData { + id: string; + author: string; + editionName: string; + publisher: string; + probability: number; + period: string; + visualCues: string[]; + verificationTip: string; + links: VerificationLink[]; + spineColor: string; + spineTextColor: string; + spineAccent: string; +} + +// --- Main Component --- +const BiblioAuthDashboard = () => { + const [selectedId, setSelectedId] = useState('jackson_machado'); + const [aiMode, setAiMode] = useState<'chat' | 'sales' | null>(null); + + // AI States + const [aiInput, setAiInput] = useState(''); + const [aiResponse, setAiResponse] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + // Sales Gen States + const [conditions, setConditions] = useState([]); + + // Dados Correlacionados (Atualizados sem a coleção branca) + const collections: Record = { + jackson_machado: { + id: 'jackson_machado', + author: 'Machado de Assis', + editionName: 'Obras Completas (31 Volumes)', + publisher: 'W.M. Jackson Inc.', + probability: 98, + period: 'Décadas de 1940-1960', + visualCues: [ + 'Lombada verde-escura (quase preta)', + 'Linhas horizontais douradas', + 'Muitos volumes (31 no total)', + 'Papel amarelado grosso' + ], + verificationTip: 'Clássico absoluto. Procure "W.M. Jackson" na folha de rosto. Se tiver todos os 31 volumes, o valor triplica.', + links: [ + { label: 'Ver capas originais no Google', url: 'https://www.google.com/search?tbm=isch&q=coleção+machado+de+assis+wm+jackson+lombada+verde', type: 'google' }, + { label: 'Consultar valor na Estante Virtual', url: 'https://www.estantevirtual.com.br/busca?q=colecao+machado+de+assis+jackson+31+volumes', type: 'market' } + ], + spineColor: 'bg-emerald-950', + spineTextColor: 'text-yellow-600', + spineAccent: 'border-yellow-700' + }, + jackson_alencar: { + id: 'jackson_alencar', + author: 'José de Alencar', + editionName: 'Obras Completas (Edição Jackson)', + publisher: 'W.M. Jackson Inc.', + probability: 80, + period: 'Décadas de 1950-1960', + visualCues: [ + 'Lombada Vermelha / Vinho escuro', + 'Estilo idêntico à do Machado (linhas douradas)', + 'Cerca de 14 a 16 volumes', + 'Geralmente vizinha de estante da coleção Machado' + ], + verificationTip: 'Frequentemente confundida com outras encadernações vermelhas. Verifique se o logo na base da lombada é igual ao da coleção verde.', + links: [ + { label: 'Comparar com fotos reais', url: 'https://www.google.com/search?tbm=isch&q=coleção+josé+de+alencar+wm+jackson+vermelha', type: 'google' }, + { label: 'Verificar preços de mercado', url: 'https://www.estantevirtual.com.br/busca?q=colecao+jose+de+alencar+jackson+completa', type: 'market' } + ], + spineColor: 'bg-red-900', + spineTextColor: 'text-yellow-500', + spineAccent: 'border-red-950' + }, + aguilar: { + id: 'aguilar', + author: 'Edição de Luxo (Vários)', + editionName: 'Biblioteca Luso-Brasileira', + publisher: 'Editora Nova Aguilar', + probability: 75, + period: '1960 - Presente', + visualCues: [ + 'Aspeto de "Bíblia" ou dicionário', + 'Capa flexível ou dura imitando couro', + 'Cores: Marrom (Machado), Verde (Alencar), Azul (Poesia)', + 'Papel bíblia (extremamente fino)' + ], + verificationTip: 'O papel é a chave. Se for fino como papel de bíblia e tiver fitilho marcador, é Aguilar. São os livros mais valiosos individualmente.', + links: [ + { label: 'Ver fotos da Edição Aguilar', url: 'https://www.google.com/search?tbm=isch&q=machado+de+assis+obra+completa+aguilar+couro', type: 'google' }, + { label: 'Preço de colecionador', url: 'https://www.estantevirtual.com.br/busca?q=machado+de+assis+obra+completa+aguilar', type: 'market' } + ], + spineColor: 'bg-amber-900', + spineTextColor: 'text-yellow-500', + spineAccent: 'border-amber-950' + } + }; + + const current = collections[selectedId]; + + // --- AI Handlers --- + + const handleChatSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!aiInput.trim()) return; + + setIsLoading(true); + const userQ = aiInput; + setAiInput(''); // Clear input immediately + + // Initial placeholder + setAiResponse("Consultando a biblioteca virtual..."); + + const systemPrompt = `Você é um especialista em livros raros brasileiros e bibliófilo experiente. O usuário está examinando a coleção "${current.editionName}" de ${current.author}, publicada pela ${current.publisher} (${current.period}). + Responda em Português do Brasil. Seja culto mas acessível. Dê detalhes históricos sobre essa edição específica se souber. + Se perguntarem sobre valor, dê uma estimativa genérica de mercado para livros usados, mas avise que varia conforme o estado (oxidação, traças, lombada).`; + + const result = await callGemini(userQ, systemPrompt); + setAiResponse(result); + setIsLoading(false); + }; + + const handleSalesGenerator = async () => { + setIsLoading(true); + setAiResponse("Redigindo anúncio vendedor..."); + + const conditionText = conditions.length > 0 ? conditions.join(', ') : "Estado geral bom, com sinais naturais do tempo"; + + const prompt = `Crie uma descrição de venda atraente e profissional para o site 'Estante Virtual' ou 'Mercado Livre'. + Livro/Coleção: ${current.editionName} de ${current.author}. + Editora: ${current.publisher}. + Período: ${current.period}. + Estado de Conservação: ${conditionText}. + + Estrutura da resposta: + 1. Título do Anúncio (Chamativo - use Caps Lock em palavras chaves) + 2. Descrição Bibliográfica (Destaque o valor histórico da edição ${current.publisher}) + 3. Checklist do Estado (Baseado em: ${conditionText}) + 4. "Call to Action" para colecionador + + Use emojis de livros/antiguidades moderadamente.`; + + const result = await callGemini(prompt, ""); + setAiResponse(result); + setIsLoading(false); + }; + + const toggleCondition = (cond: string) => { + setConditions(prev => + prev.includes(cond) ? prev.filter(c => c !== cond) : [...prev, cond] + ); + }; + + // --- Components --- + + const SpinePreview = ({ type }: { type: string }) => { + // MACHADO (JACKSON) - VERDE + if (type === 'jackson_machado') { + return ( +
+
+
+
+ Machado
de
Assis
+
+
+
+ JACKSON +
+ ); + } + // ALENCAR (JACKSON) - VERMELHA + if (type === 'jackson_alencar') { + return ( +
+
+
+
+ José
de
Alencar
+
+
+
+ JACKSON +
+ ); + } + // AGUILAR - COURO + return ( +
+
+
+
+ OBRA
COMPLETA
+
+ Machado
Alencar
Outros
+ AGUILAR +
+ ); + }; + + return ( +
+ + {/* Cabeçalho */} +
+
+ +

Identificador de Coleções Raras

+
+

Análise ajustada: Focando em encadernações clássicas (Jackson e Aguilar).

+
+ +
+ + {/* Painel Esquerdo: Seleção da Coleção */} +
+

Hipóteses Visuais

+ + {Object.values(collections).map((item) => ( + + ))} +
+ + {/* Painel Central: Dossier Detalhado */} +
+
+ + {/* Header do Dossier */} +
+
+ +
+
+ +
+ +
+
+ + Dossier #{current.id.toUpperCase()} +
+

{current.editionName}

+

{current.author}

+ +
+ {/* Botões de Ação IA */} + + + +
+
+
+
+ + {/* Conteúdo Variável: Dossier Normal ou IA */} +
+ + {/* Overlay da IA */} + {aiMode && ( +
+
+

+ {aiMode === 'chat' ? ( + <> Chat com Especialista (Gemini) + ) : ( + <> Assistente de Vendas (Gemini) + )} +

+ +
+ +
+ + {/* Modo Vendas: Seletores */} + {aiMode === 'sales' && !aiResponse && !isLoading && ( +
+
+

Selecione as condições dos livros:

+
+ {['Páginas Amareladas (Oxidação)', 'Lombada Solta', 'Sem Grifos', 'Capa com Desgaste', 'Coleção Completa', 'Volume Avulso', 'Assinatura de Posse', 'Papel Quebradiço', 'Livre de Traças'].map(cond => ( + + ))} +
+
+ +
+ )} + + {/* Modo Chat: Input Inicial */} + {aiMode === 'chat' && !aiResponse && !isLoading && ( +
+
+ +
+

Consultar Especialista

+

Tire dúvidas sobre a raridade, história ou conteúdo da coleção {current.author}.

+ +
+ setAiInput(e.target.value)} + placeholder={`Ex: Esta edição da ${current.publisher} é considerada rara?`} + className="w-full p-4 pr-12 rounded-xl border-2 border-slate-200 focus:border-indigo-500 focus:ring-4 focus:ring-indigo-100 outline-none transition-all" + autoFocus + /> + +
+
+ )} + + {/* Loading State */} + {isLoading && ( +
+ +

O Gemini está analisando os dados bibliográficos...

+
+ )} + + {/* Response State */} + {aiResponse && !isLoading && ( +
+
+ {aiResponse} +
+
+ + +
+
+ )} + +
+
+ )} + + {/* Dossier Normal (Sem IA) */} +
+
+

+ + Características Visuais +

+
    + {current.visualCues.map((cue, idx) => ( +
  • +
    + {cue} +
  • + ))} +
+
+

+ + Ponto de Atenção +

+

+ {current.verificationTip} +

+
+
+ +
+
+

+ + Índice de Confiança +

+
+
+
+ + Match Visual + +
+
+ + {current.probability}% + +
+
+
+
+
+
+
+ +
+

Verificação Externa

+ {current.links.map((link, idx) => ( + + + {link.type === 'google' ? : } + {link.label} + + + + ))} +
+
+
+ +
+
+
+
+
+ ); +}; + +export default BiblioAuthDashboard;