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;