xertica-ui 1.3.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -120,88 +120,40 @@ interface AssistenteXerticaProps {
120
120
  isFullPage?: boolean;
121
121
  }
122
122
 
123
- import type { Message, Conversa, SearchResult, SearchSource, SearchCommand, Sugestao } from '../contexts/AssistenteContext';
124
-
125
- const sugestoesPadrao: Sugestao[] = [
126
- { id: '1', texto: 'O que posso pedir para você fazer?' },
127
- { id: '2', texto: 'O que você faz?' },
128
- { id: '3', texto: 'Com quais projetos devo me preocupar agora?' },
129
- { id: '4', texto: 'Qual meu próximo projeto?' },
130
- { id: '5', texto: 'Qual projetos está tendo o melhor desempenho?' }
131
- ];
132
-
133
- const sugestoesRicas: Sugestao[] = [
134
- { id: 'rich-1', texto: 'Ver exemplo de Gráfico', icon: <BarChart3 className="w-4 h-4 mr-2" /> },
135
- { id: 'rich-2', texto: 'Ver exemplo de Imagem', icon: <ImageIcon className="w-4 h-4 mr-2" /> },
136
- { id: 'rich-3', texto: 'Ver exemplo de Tabela', icon: <TableIcon className="w-4 h-4 mr-2" /> },
137
- { id: 'rich-4', texto: 'Ver exemplo de Documento', icon: <FileText className="w-4 h-4 mr-2" /> }
138
- ];
123
+ import type { Message, Conversa, SearchResult, SearchSource, SearchCommand, Sugestao, MockResponse } from '../contexts/AssistenteContext';
124
+ import { sugestoesPadrao, sugestoesRicas, gerarResposta } from './assistant-utils';
125
+
126
+ // ... (existing code)
127
+
128
+ interface AssistenteXerticaProps {
129
+ isExpanded: boolean;
130
+ onToggle: () => void;
131
+ onToggleWithTab?: (tab: 'chat' | 'historico' | 'favoritos') => void;
132
+ isFullPage?: boolean;
133
+ demoMode?: boolean;
134
+ customResponses?: MockResponse[];
135
+ }
136
+
137
+ // ... (existing code)
138
+
139
+
140
+
139
141
 
140
142
  // Respostas simuladas da IA
141
- const gerarResposta = (mensagemUsuario: string): string => {
142
- const mensagemLower = mensagemUsuario.toLowerCase();
143
- const mensagemOriginal = mensagemUsuario;
144
-
145
- if (mensagemLower.includes('o que') && (mensagemLower.includes('fazer') || mensagemLower.includes('pedir'))) {
146
- return 'Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?';
147
- }
148
-
149
- if (mensagemLower.includes('o que você faz') || mensagemLower.includes('quem é você')) {
150
- return 'Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.';
151
- }
152
-
153
- if (mensagemLower.includes('projeto') && (mensagemLower.includes('preocupar') || mensagemLower.includes('atenção'))) {
154
- return 'Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?';
155
- }
156
-
157
- if (mensagemLower.includes('próximo projeto') || mensagemLower.includes('próxima tarefa')) {
158
- return 'Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?';
159
- }
160
-
161
- if (mensagemLower.includes('desempenho') || mensagemLower.includes('performance') || mensagemLower.includes('melhor')) {
162
- return 'Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parab��ns!\n\nQuer ver métricas detalhadas?';
163
- }
164
-
165
- if (mensagemLower.includes('olá') || mensagemLower.includes('oi') || mensagemLower.includes('bom dia') || mensagemLower.includes('boa tarde') || mensagemLower.includes('boa noite')) {
166
- return 'Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.';
167
- }
168
-
169
- if (mensagemLower.includes('obrigado') || mensagemLower.includes('obrigada')) {
170
- return 'Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!';
171
- }
172
-
173
- // Respostas para ações especiais
174
- if (mensagemLower.includes('criar documento')) {
175
- const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, '').trim();
176
- return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
177
- }
178
-
179
- if (mensagemLower.includes('gerar podcast')) {
180
- const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, '').trim();
181
- return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
182
- }
183
-
184
- if (mensagemLower.includes('pesquisar')) {
185
- const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, '').trim();
186
- return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
187
- }
188
-
189
- if (mensagemLower.includes('arquivo') || mensagemLower.includes('documento')) {
190
- return 'Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!';
191
- }
192
-
193
- // Resposta genérica inteligente
194
- const respostasGenericas = [
195
- 'Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?',
196
- 'Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?',
197
- 'Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?',
198
- 'Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?'
199
- ];
200
-
201
- return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
202
- };
203
-
204
- export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage = false }: AssistenteXerticaProps) {
143
+
144
+
145
+
146
+
147
+
148
+
149
+ export function AssistenteXertica({
150
+ isExpanded,
151
+ onToggle,
152
+ onToggleWithTab,
153
+ isFullPage = false,
154
+ demoMode = false,
155
+ customResponses = []
156
+ }: AssistenteXerticaProps) {
205
157
  const navigate = useNavigate();
206
158
  const { geminiApiKey, isApiKeyValid } = useApiKey();
207
159
  const {
@@ -398,10 +350,10 @@ export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFul
398
350
  setIsTyping(true);
399
351
 
400
352
  try {
401
- let resposta: string;
353
+ let novaMensagemParcial: Partial<Message> = {};
402
354
 
403
- // Se a chave da API for válida, usar Gemini
404
- if (isApiKeyValid && geminiApiKey) {
355
+ // Se a chave da API for válida e não estiver em modo demo, usar Gemini
356
+ if (isApiKeyValid && geminiApiKey && !demoMode) {
405
357
  // Construir histórico da conversa para o Gemini
406
358
  const conversaAtiva = conversas.find(c => c.id === conversaAtual);
407
359
  const historico: GeminiMessage[] = [];
@@ -444,7 +396,8 @@ export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFul
444
396
  }
445
397
 
446
398
  try {
447
- resposta = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
399
+ const respostaTexto = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
400
+ novaMensagemParcial = { content: respostaTexto };
448
401
  } catch (error) {
449
402
  console.error('Erro ao chamar API Gemini:', error);
450
403
  // Usar a mensagem de erro do utilitário se disponível
@@ -460,27 +413,41 @@ export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFul
460
413
  description: 'Sua chave foi reportada como vazada. Gere uma nova em Google AI Studio.',
461
414
  duration: 6000,
462
415
  });
463
- resposta = `🔐 **Chave de API Desativada por Segurança**\n\n${errorMessage}\n\n**Como resolver:**\n1. Acesse [Google AI Studio](https://aistudio.google.com/apikey)\n2. Gere uma nova chave de API\n3. Configure a nova chave em **Configurações > API**\n\n⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`;
416
+ novaMensagemParcial = {
417
+ content: `🔐 **Chave de API Desativada por Segurança**\n\n${errorMessage}\n\n**Como resolver:**\n1. Acesse [Google AI Studio](https://aistudio.google.com/apikey)\n2. Gere uma nova chave de API\n3. Configure a nova chave em **Configurações > API**\n\n⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`
418
+ };
464
419
  } else {
465
420
  toast.error('Erro ao processar mensagem', {
466
421
  description: 'Verifique sua chave de API nas Configurações.',
467
422
  duration: 4000,
468
423
  });
469
- resposta = `**Erro ao processar sua mensagem**\n\n${errorMessage}\n\n💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`;
424
+ novaMensagemParcial = {
425
+ content: `**Erro ao processar sua mensagem**\n\n${errorMessage}\n\n💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`
426
+ };
470
427
  }
471
428
  }
472
429
  } else {
473
- // Fallback para respostas simuladas se não houver API key
430
+ // Fallback para respostas simuladas se não houver API key ou em modo demo
474
431
  await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 1000));
475
- resposta = gerarResposta(mensagemUsuario);
432
+
433
+ // Passar customResponses para gerarResposta
434
+ const resultadoMock = gerarResposta(mensagemUsuario, customResponses);
435
+
436
+ if (typeof resultadoMock === 'string') {
437
+ novaMensagemParcial = { content: resultadoMock };
438
+ } else {
439
+ // Se for objeto (MockResponse), usar diretamente
440
+ novaMensagemParcial = resultadoMock;
441
+ }
476
442
  }
477
443
 
478
444
  const novaMensagem: Message = {
479
445
  id: Date.now().toString() + '-ia',
480
446
  type: 'assistant',
481
- content: resposta,
447
+ content: '', // Valor padrão se não vier no partial
482
448
  timestamp: new Date(),
483
- isFavorite: false
449
+ isFavorite: false,
450
+ ...novaMensagemParcial
484
451
  };
485
452
 
486
453
  setConversas(prev => prev.map(conv => {
@@ -489,7 +456,7 @@ export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFul
489
456
  return {
490
457
  ...conv,
491
458
  mensagens: novasMensagens,
492
- ultimaMensagem: resposta.substring(0, 50) + '...',
459
+ ultimaMensagem: (novaMensagem.content || '').substring(0, 50) + '...',
493
460
  timestamp: new Date().toLocaleString('pt-BR')
494
461
  };
495
462
  }
@@ -0,0 +1,101 @@
1
+ import type { Message, MockResponse, Sugestao } from '../contexts/AssistenteContext';
2
+ import { BarChart3, ImageIcon, Table as TableIcon, FileText } from 'lucide-react';
3
+ import React from 'react';
4
+
5
+ export const sugestoesPadrao: Sugestao[] = [
6
+ { id: '1', texto: 'O que posso pedir para você fazer?' },
7
+ { id: '2', texto: 'O que você faz?' },
8
+ { id: '3', texto: 'Com quais projetos devo me preocupar agora?' },
9
+ { id: '4', texto: 'Qual meu próximo projeto?' },
10
+ { id: '5', texto: 'Qual projetos está tendo o melhor desempenho?' }
11
+ ];
12
+
13
+ export const sugestoesRicas: Sugestao[] = [
14
+ { id: 'rich-1', texto: 'Ver exemplo de Gráfico', icon: React.createElement(BarChart3, { className: "w-4 h-4 mr-2" }) },
15
+ { id: 'rich-2', texto: 'Ver exemplo de Imagem', icon: React.createElement(ImageIcon, { className: "w-4 h-4 mr-2" }) },
16
+ { id: 'rich-3', texto: 'Ver exemplo de Tabela', icon: React.createElement(TableIcon, { className: "w-4 h-4 mr-2" }) },
17
+ { id: 'rich-4', texto: 'Ver exemplo de Documento', icon: React.createElement(FileText, { className: "w-4 h-4 mr-2" }) }
18
+ ];
19
+
20
+ // Respostas simuladas da IA
21
+ export const gerarResposta = (mensagemUsuario: string, customResponses?: MockResponse[]): string | Partial<Message> => {
22
+ const mensagemLower = mensagemUsuario.toLowerCase();
23
+
24
+ // 1. Verificar respostas customizadas primeiro
25
+ if (customResponses && customResponses.length > 0) {
26
+ for (const mock of customResponses) {
27
+ const trigger = mock.trigger;
28
+ let match = false;
29
+
30
+ if (trigger instanceof RegExp) {
31
+ match = trigger.test(mensagemUsuario);
32
+ } else {
33
+ match = mensagemLower.includes(trigger.toLowerCase());
34
+ }
35
+
36
+ if (match) {
37
+ return mock.response;
38
+ }
39
+ }
40
+ }
41
+
42
+ const mensagemOriginal = mensagemUsuario;
43
+
44
+ if (mensagemLower.includes('o que') && (mensagemLower.includes('fazer') || mensagemLower.includes('pedir'))) {
45
+ return 'Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?';
46
+ }
47
+
48
+ if (mensagemLower.includes('o que você faz') || mensagemLower.includes('quem é você')) {
49
+ return 'Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.';
50
+ }
51
+
52
+ if (mensagemLower.includes('projeto') && (mensagemLower.includes('preocupar') || mensagemLower.includes('atenção'))) {
53
+ return 'Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?';
54
+ }
55
+
56
+ if (mensagemLower.includes('próximo projeto') || mensagemLower.includes('próxima tarefa')) {
57
+ return 'Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?';
58
+ }
59
+
60
+ if (mensagemLower.includes('desempenho') || mensagemLower.includes('performance') || mensagemLower.includes('melhor')) {
61
+ return 'Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parabéns!\n\nQuer ver métricas detalhadas?';
62
+ }
63
+
64
+ if (mensagemLower.includes('olá') || mensagemLower.includes('oi') || mensagemLower.includes('bom dia') || mensagemLower.includes('boa tarde') || mensagemLower.includes('boa noite')) {
65
+ return 'Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.';
66
+ }
67
+
68
+ if (mensagemLower.includes('obrigado') || mensagemLower.includes('obrigada')) {
69
+ return 'Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!';
70
+ }
71
+
72
+ // Respostas para ações especiais
73
+ if (mensagemLower.includes('criar documento')) {
74
+ const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, '').trim();
75
+ return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
76
+ }
77
+
78
+ if (mensagemLower.includes('gerar podcast')) {
79
+ const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, '').trim();
80
+ return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
81
+ }
82
+
83
+ if (mensagemLower.includes('pesquisar')) {
84
+ const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, '').trim();
85
+ return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
86
+ }
87
+
88
+ if (mensagemLower.includes('arquivo') || mensagemLower.includes('documento')) {
89
+ return 'Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!';
90
+ }
91
+
92
+ // Resposta genérica inteligente
93
+ const respostasGenericas = [
94
+ 'Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?',
95
+ 'Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?',
96
+ 'Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?',
97
+ 'Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?'
98
+ ];
99
+
100
+ return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
101
+ };
@@ -81,12 +81,12 @@ function AssistantTooltipContent({
81
81
  /**
82
82
  * Tipos de mensagem suportados pelo assistente
83
83
  */
84
- export type MessageType = 'user' | 'assistant';
84
+ export type MessageType = 'user' | 'assistant' | 'system';
85
85
 
86
86
  /**
87
87
  * Tipos de anexo que podem ser incluídos em mensagens
88
88
  */
89
- export type AttachmentType = 'file' | 'audio' | 'image' | 'document' | 'podcast' | 'search';
89
+ export type AttachmentType = 'file' | 'audio' | 'image' | 'video' | 'document' | 'podcast' | 'search';
90
90
 
91
91
  /**
92
92
  * Tipo de busca que pode ser realizada
@@ -141,6 +141,15 @@ export interface Message {
141
141
  searchResults?: SearchResult[];
142
142
  searchSources?: SearchSource[];
143
143
  searchCommands?: SearchCommand[];
144
+ chartData?: any[];
145
+ chartConfig?: any;
146
+ tableData?: {
147
+ caption?: string;
148
+ headers: string[];
149
+ rows: (string | React.ReactNode)[][];
150
+ };
151
+ evaluation?: 'like' | 'dislike';
152
+ evaluationReason?: string;
144
153
  }
145
154
 
146
155
  /**
@@ -177,6 +186,9 @@ export type AssistantTab = 'chat' | 'historico' | 'favoritos';
177
186
  // Props do Componente
178
187
  // ============================================================================
179
188
 
189
+ import type { MockResponse } from '../../contexts/AssistenteContext';
190
+ import { gerarResposta } from '../assistant-utils';
191
+
180
192
  export interface XerticaAssistantProps {
181
193
  /**
182
194
  * Modo de exibição do assistente
@@ -207,6 +219,16 @@ export interface XerticaAssistantProps {
207
219
  */
208
220
  showApiWarning?: boolean;
209
221
 
222
+ /**
223
+ * Ativa o modo de demonstração (sem API key)
224
+ */
225
+ demoMode?: boolean;
226
+
227
+ /**
228
+ * Respostas customizadas para o modo de demonstração
229
+ */
230
+ customResponses?: MockResponse[];
231
+
210
232
  /**
211
233
  * Chave da API do Gemini (se disponível)
212
234
  */
@@ -330,6 +352,8 @@ export function XerticaAssistant({
330
352
  height,
331
353
  className = '',
332
354
  mobileFloating = false,
355
+ demoMode = false,
356
+ customResponses = []
333
357
  }: XerticaAssistantProps) {
334
358
  // ============================================================================
335
359
  // State Management
@@ -435,10 +459,37 @@ export function XerticaAssistant({
435
459
 
436
460
  setMensagens(prev => [...prev, novaMensagem]);
437
461
 
462
+
438
463
  if (onSendMessage) {
439
464
  onSendMessage(mensagem);
440
465
  }
441
466
 
467
+ if (demoMode) {
468
+ // Simular resposta no modo demo se não houver handler externo ou se o handler for apenas para log/side-effect
469
+ // Mas cuidado para não duplicar se onSendMessage também gerar resposta.
470
+ // Assumindo que demoMode é autossuficiente.
471
+ const mensagemAtual = mensagem;
472
+ setTimeout(() => {
473
+ const resposta = gerarResposta(mensagemAtual, customResponses);
474
+
475
+ let novaMensagemIA: Message = {
476
+ id: `msg-${Date.now()}-ia`,
477
+ type: 'assistant',
478
+ content: '',
479
+ timestamp: new Date(),
480
+ isFavorite: false
481
+ };
482
+
483
+ if (typeof resposta === 'string') {
484
+ novaMensagemIA.content = resposta;
485
+ } else {
486
+ novaMensagemIA = { ...novaMensagemIA, ...resposta };
487
+ }
488
+
489
+ setMensagens(prev => [...prev, novaMensagemIA]);
490
+ }, 1000 + Math.random() * 1000);
491
+ }
492
+
442
493
  setMensagem('');
443
494
  };
444
495
 
@@ -33,6 +33,12 @@ export interface Message {
33
33
  evaluationReason?: string;
34
34
  }
35
35
 
36
+ export interface MockResponse {
37
+ trigger: string | RegExp;
38
+ response: string | Partial<Message>;
39
+ delay?: number;
40
+ }
41
+
36
42
  export interface Conversa {
37
43
  id: string;
38
44
  titulo: string;
@@ -4,5 +4,14 @@ interface AssistenteXerticaProps {
4
4
  onToggleWithTab?: (tab: 'chat' | 'historico' | 'favoritos') => void;
5
5
  isFullPage?: boolean;
6
6
  }
7
- export declare function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage }: AssistenteXerticaProps): import("react/jsx-runtime").JSX.Element;
7
+ import type { MockResponse } from '../contexts/AssistenteContext';
8
+ interface AssistenteXerticaProps {
9
+ isExpanded: boolean;
10
+ onToggle: () => void;
11
+ onToggleWithTab?: (tab: 'chat' | 'historico' | 'favoritos') => void;
12
+ isFullPage?: boolean;
13
+ demoMode?: boolean;
14
+ customResponses?: MockResponse[];
15
+ }
16
+ export declare function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage, demoMode, customResponses }: AssistenteXerticaProps): import("react/jsx-runtime").JSX.Element;
8
17
  export {};
@@ -0,0 +1,4 @@
1
+ import type { Message, MockResponse, Sugestao } from '../contexts/AssistenteContext';
2
+ export declare const sugestoesPadrao: Sugestao[];
3
+ export declare const sugestoesRicas: Sugestao[];
4
+ export declare const gerarResposta: (mensagemUsuario: string, customResponses?: MockResponse[]) => string | Partial<Message>;
@@ -1,11 +1,12 @@
1
+ import React from 'react';
1
2
  /**
2
3
  * Tipos de mensagem suportados pelo assistente
3
4
  */
4
- export type MessageType = 'user' | 'assistant';
5
+ export type MessageType = 'user' | 'assistant' | 'system';
5
6
  /**
6
7
  * Tipos de anexo que podem ser incluídos em mensagens
7
8
  */
8
- export type AttachmentType = 'file' | 'audio' | 'image' | 'document' | 'podcast' | 'search';
9
+ export type AttachmentType = 'file' | 'audio' | 'image' | 'video' | 'document' | 'podcast' | 'search';
9
10
  /**
10
11
  * Tipo de busca que pode ser realizada
11
12
  */
@@ -55,6 +56,15 @@ export interface Message {
55
56
  searchResults?: SearchResult[];
56
57
  searchSources?: SearchSource[];
57
58
  searchCommands?: SearchCommand[];
59
+ chartData?: any[];
60
+ chartConfig?: any;
61
+ tableData?: {
62
+ caption?: string;
63
+ headers: string[];
64
+ rows: (string | React.ReactNode)[][];
65
+ };
66
+ evaluation?: 'like' | 'dislike';
67
+ evaluationReason?: string;
58
68
  }
59
69
  /**
60
70
  * Interface para uma conversa salva
@@ -82,6 +92,7 @@ export type AssistantMode = 'collapsed' | 'expanded' | 'fullPage';
82
92
  * Abas disponíveis no assistente
83
93
  */
84
94
  export type AssistantTab = 'chat' | 'historico' | 'favoritos';
95
+ import type { MockResponse } from '../../contexts/AssistenteContext';
85
96
  export interface XerticaAssistantProps {
86
97
  /**
87
98
  * Modo de exibição do assistente
@@ -107,6 +118,14 @@ export interface XerticaAssistantProps {
107
118
  * @default true
108
119
  */
109
120
  showApiWarning?: boolean;
121
+ /**
122
+ * Ativa o modo de demonstração (sem API key)
123
+ */
124
+ demoMode?: boolean;
125
+ /**
126
+ * Respostas customizadas para o modo de demonstração
127
+ */
128
+ customResponses?: MockResponse[];
110
129
  /**
111
130
  * Chave da API do Gemini (se disponível)
112
131
  */
@@ -193,4 +212,4 @@ export interface XerticaAssistantProps {
193
212
  * />
194
213
  * ```
195
214
  */
196
- export declare function XerticaAssistant({ mode, isExpanded: controlledIsExpanded, onToggle, defaultTab, showApiWarning, apiKey, onNavigateSettings, onNavigateFullPage, userName, initialMessages, savedConversations, suggestions: propSuggestions, onSendMessage, onFileAttach, isProcessing, width, height, className, mobileFloating, }: XerticaAssistantProps): import("react/jsx-runtime").JSX.Element;
215
+ export declare function XerticaAssistant({ mode, isExpanded: controlledIsExpanded, onToggle, defaultTab, showApiWarning, apiKey, onNavigateSettings, onNavigateFullPage, userName, initialMessages, savedConversations, suggestions: propSuggestions, onSendMessage, onFileAttach, isProcessing, width, height, className, mobileFloating, demoMode, customResponses }: XerticaAssistantProps): import("react/jsx-runtime").JSX.Element;
@@ -28,6 +28,11 @@ export interface Message {
28
28
  evaluation?: 'like' | 'dislike';
29
29
  evaluationReason?: string;
30
30
  }
31
+ export interface MockResponse {
32
+ trigger: string | RegExp;
33
+ response: string | Partial<Message>;
34
+ delay?: number;
35
+ }
31
36
  export interface Conversa {
32
37
  id: string;
33
38
  titulo: string;
package/dist/index.es.js CHANGED
@@ -19687,6 +19687,80 @@ function TooltipContent({
19687
19687
  }
19688
19688
  ) });
19689
19689
  }
19690
+ const sugestoesPadrao = [
19691
+ { id: "1", texto: "O que posso pedir para você fazer?" },
19692
+ { id: "2", texto: "O que você faz?" },
19693
+ { id: "3", texto: "Com quais projetos devo me preocupar agora?" },
19694
+ { id: "4", texto: "Qual meu próximo projeto?" },
19695
+ { id: "5", texto: "Qual projetos está tendo o melhor desempenho?" }
19696
+ ];
19697
+ const sugestoesRicas = [
19698
+ { id: "rich-1", texto: "Ver exemplo de Gráfico", icon: React__default.createElement(ChartColumn, { className: "w-4 h-4 mr-2" }) },
19699
+ { id: "rich-2", texto: "Ver exemplo de Imagem", icon: React__default.createElement(Image$1, { className: "w-4 h-4 mr-2" }) },
19700
+ { id: "rich-3", texto: "Ver exemplo de Tabela", icon: React__default.createElement(Table$1, { className: "w-4 h-4 mr-2" }) },
19701
+ { id: "rich-4", texto: "Ver exemplo de Documento", icon: React__default.createElement(FileText, { className: "w-4 h-4 mr-2" }) }
19702
+ ];
19703
+ const gerarResposta = (mensagemUsuario, customResponses) => {
19704
+ const mensagemLower = mensagemUsuario.toLowerCase();
19705
+ if (customResponses && customResponses.length > 0) {
19706
+ for (const mock of customResponses) {
19707
+ const trigger = mock.trigger;
19708
+ let match2 = false;
19709
+ if (trigger instanceof RegExp) {
19710
+ match2 = trigger.test(mensagemUsuario);
19711
+ } else {
19712
+ match2 = mensagemLower.includes(trigger.toLowerCase());
19713
+ }
19714
+ if (match2) {
19715
+ return mock.response;
19716
+ }
19717
+ }
19718
+ }
19719
+ const mensagemOriginal = mensagemUsuario;
19720
+ if (mensagemLower.includes("o que") && (mensagemLower.includes("fazer") || mensagemLower.includes("pedir"))) {
19721
+ return "Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?";
19722
+ }
19723
+ if (mensagemLower.includes("o que você faz") || mensagemLower.includes("quem é você")) {
19724
+ return "Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.";
19725
+ }
19726
+ if (mensagemLower.includes("projeto") && (mensagemLower.includes("preocupar") || mensagemLower.includes("atenção"))) {
19727
+ return "Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?";
19728
+ }
19729
+ if (mensagemLower.includes("próximo projeto") || mensagemLower.includes("próxima tarefa")) {
19730
+ return "Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?";
19731
+ }
19732
+ if (mensagemLower.includes("desempenho") || mensagemLower.includes("performance") || mensagemLower.includes("melhor")) {
19733
+ return "Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parabéns!\n\nQuer ver métricas detalhadas?";
19734
+ }
19735
+ if (mensagemLower.includes("olá") || mensagemLower.includes("oi") || mensagemLower.includes("bom dia") || mensagemLower.includes("boa tarde") || mensagemLower.includes("boa noite")) {
19736
+ return "Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.";
19737
+ }
19738
+ if (mensagemLower.includes("obrigado") || mensagemLower.includes("obrigada")) {
19739
+ return "Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!";
19740
+ }
19741
+ if (mensagemLower.includes("criar documento")) {
19742
+ const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, "").trim();
19743
+ return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
19744
+ }
19745
+ if (mensagemLower.includes("gerar podcast")) {
19746
+ const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, "").trim();
19747
+ return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
19748
+ }
19749
+ if (mensagemLower.includes("pesquisar")) {
19750
+ const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, "").trim();
19751
+ return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
19752
+ }
19753
+ if (mensagemLower.includes("arquivo") || mensagemLower.includes("documento")) {
19754
+ return "Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!";
19755
+ }
19756
+ const respostasGenericas = [
19757
+ "Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?",
19758
+ "Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?",
19759
+ "Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?",
19760
+ "Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?"
19761
+ ];
19762
+ return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
19763
+ };
19690
19764
  const __vite_import_meta_env__$2 = {};
19691
19765
  function AssistantTooltipContent$1({
19692
19766
  className,
@@ -19737,7 +19811,9 @@ function XerticaAssistant({
19737
19811
  width,
19738
19812
  height,
19739
19813
  className = "",
19740
- mobileFloating = false
19814
+ mobileFloating = false,
19815
+ demoMode = false,
19816
+ customResponses = []
19741
19817
  }) {
19742
19818
  const isFullPage = mode === "fullPage";
19743
19819
  const [internalIsExpanded, setInternalIsExpanded] = useState(controlledIsExpanded ?? true);
@@ -19802,6 +19878,25 @@ function XerticaAssistant({
19802
19878
  if (onSendMessage) {
19803
19879
  onSendMessage(mensagem);
19804
19880
  }
19881
+ if (demoMode) {
19882
+ const mensagemAtual = mensagem;
19883
+ setTimeout(() => {
19884
+ const resposta = gerarResposta(mensagemAtual, customResponses);
19885
+ let novaMensagemIA = {
19886
+ id: `msg-${Date.now()}-ia`,
19887
+ type: "assistant",
19888
+ content: "",
19889
+ timestamp: /* @__PURE__ */ new Date(),
19890
+ isFavorite: false
19891
+ };
19892
+ if (typeof resposta === "string") {
19893
+ novaMensagemIA.content = resposta;
19894
+ } else {
19895
+ novaMensagemIA = { ...novaMensagemIA, ...resposta };
19896
+ }
19897
+ setMensagens((prev) => [...prev, novaMensagemIA]);
19898
+ }, 1e3 + Math.random() * 1e3);
19899
+ }
19805
19900
  setMensagem("");
19806
19901
  };
19807
19902
  const handleToggleFavorite = (messageId) => {
@@ -56387,67 +56482,14 @@ function AssistantTooltipContent({
56387
56482
  }
56388
56483
  ) });
56389
56484
  }
56390
- const sugestoesPadrao = [
56391
- { id: "1", texto: "O que posso pedir para você fazer?" },
56392
- { id: "2", texto: "O que você faz?" },
56393
- { id: "3", texto: "Com quais projetos devo me preocupar agora?" },
56394
- { id: "4", texto: "Qual meu próximo projeto?" },
56395
- { id: "5", texto: "Qual projetos está tendo o melhor desempenho?" }
56396
- ];
56397
- const sugestoesRicas = [
56398
- { id: "rich-1", texto: "Ver exemplo de Gráfico", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(ChartColumn, { className: "w-4 h-4 mr-2" }) },
56399
- { id: "rich-2", texto: "Ver exemplo de Imagem", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "w-4 h-4 mr-2" }) },
56400
- { id: "rich-3", texto: "Ver exemplo de Tabela", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Table$1, { className: "w-4 h-4 mr-2" }) },
56401
- { id: "rich-4", texto: "Ver exemplo de Documento", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "w-4 h-4 mr-2" }) }
56402
- ];
56403
- const gerarResposta = (mensagemUsuario) => {
56404
- const mensagemLower = mensagemUsuario.toLowerCase();
56405
- const mensagemOriginal = mensagemUsuario;
56406
- if (mensagemLower.includes("o que") && (mensagemLower.includes("fazer") || mensagemLower.includes("pedir"))) {
56407
- return "Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?";
56408
- }
56409
- if (mensagemLower.includes("o que você faz") || mensagemLower.includes("quem é você")) {
56410
- return "Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.";
56411
- }
56412
- if (mensagemLower.includes("projeto") && (mensagemLower.includes("preocupar") || mensagemLower.includes("atenção"))) {
56413
- return "Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?";
56414
- }
56415
- if (mensagemLower.includes("próximo projeto") || mensagemLower.includes("próxima tarefa")) {
56416
- return "Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?";
56417
- }
56418
- if (mensagemLower.includes("desempenho") || mensagemLower.includes("performance") || mensagemLower.includes("melhor")) {
56419
- return "Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parab��ns!\n\nQuer ver métricas detalhadas?";
56420
- }
56421
- if (mensagemLower.includes("olá") || mensagemLower.includes("oi") || mensagemLower.includes("bom dia") || mensagemLower.includes("boa tarde") || mensagemLower.includes("boa noite")) {
56422
- return "Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.";
56423
- }
56424
- if (mensagemLower.includes("obrigado") || mensagemLower.includes("obrigada")) {
56425
- return "Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!";
56426
- }
56427
- if (mensagemLower.includes("criar documento")) {
56428
- const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, "").trim();
56429
- return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
56430
- }
56431
- if (mensagemLower.includes("gerar podcast")) {
56432
- const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, "").trim();
56433
- return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
56434
- }
56435
- if (mensagemLower.includes("pesquisar")) {
56436
- const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, "").trim();
56437
- return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
56438
- }
56439
- if (mensagemLower.includes("arquivo") || mensagemLower.includes("documento")) {
56440
- return "Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!";
56441
- }
56442
- const respostasGenericas = [
56443
- "Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?",
56444
- "Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?",
56445
- "Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?",
56446
- "Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?"
56447
- ];
56448
- return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
56449
- };
56450
- function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage = false }) {
56485
+ function AssistenteXertica({
56486
+ isExpanded,
56487
+ onToggle,
56488
+ onToggleWithTab,
56489
+ isFullPage = false,
56490
+ demoMode = false,
56491
+ customResponses = []
56492
+ }) {
56451
56493
  const navigate = useNavigate();
56452
56494
  const { geminiApiKey, isApiKeyValid } = useApiKey();
56453
56495
  const {
@@ -56633,8 +56675,8 @@ function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage =
56633
56675
  const simularRespostaIA = async (mensagemUsuario) => {
56634
56676
  setIsTyping(true);
56635
56677
  try {
56636
- let resposta;
56637
- if (isApiKeyValid && geminiApiKey) {
56678
+ let novaMensagemParcial = {};
56679
+ if (isApiKeyValid && geminiApiKey && !demoMode) {
56638
56680
  const conversaAtiva2 = conversas.find((c2) => c2.id === conversaAtual);
56639
56681
  const historico = [];
56640
56682
  const systemPrompt = buildSystemPrompt();
@@ -56664,7 +56706,8 @@ function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage =
56664
56706
  });
56665
56707
  }
56666
56708
  try {
56667
- resposta = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
56709
+ const respostaTexto = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
56710
+ novaMensagemParcial = { content: respostaTexto };
56668
56711
  } catch (error) {
56669
56712
  console.error("Erro ao chamar API Gemini:", error);
56670
56713
  const errorMessage = error instanceof Error ? error.message : "❌ Erro desconhecido";
@@ -56674,7 +56717,8 @@ function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage =
56674
56717
  description: "Sua chave foi reportada como vazada. Gere uma nova em Google AI Studio.",
56675
56718
  duration: 6e3
56676
56719
  });
56677
- resposta = `🔐 **Chave de API Desativada por Segurança**
56720
+ novaMensagemParcial = {
56721
+ content: `🔐 **Chave de API Desativada por Segurança**
56678
56722
 
56679
56723
  ${errorMessage}
56680
56724
 
@@ -56683,29 +56727,39 @@ ${errorMessage}
56683
56727
  2. Gere uma nova chave de API
56684
56728
  3. Configure a nova chave em **Configurações > API**
56685
56729
 
56686
- ⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`;
56730
+ ⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`
56731
+ };
56687
56732
  } else {
56688
56733
  ue$1.error("Erro ao processar mensagem", {
56689
56734
  description: "Verifique sua chave de API nas Configurações.",
56690
56735
  duration: 4e3
56691
56736
  });
56692
- resposta = `**Erro ao processar sua mensagem**
56737
+ novaMensagemParcial = {
56738
+ content: `**Erro ao processar sua mensagem**
56693
56739
 
56694
56740
  ${errorMessage}
56695
56741
 
56696
- 💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`;
56742
+ 💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`
56743
+ };
56697
56744
  }
56698
56745
  }
56699
56746
  } else {
56700
56747
  await new Promise((resolve) => setTimeout(resolve, 1e3 + Math.random() * 1e3));
56701
- resposta = gerarResposta(mensagemUsuario);
56748
+ const resultadoMock = gerarResposta(mensagemUsuario, customResponses);
56749
+ if (typeof resultadoMock === "string") {
56750
+ novaMensagemParcial = { content: resultadoMock };
56751
+ } else {
56752
+ novaMensagemParcial = resultadoMock;
56753
+ }
56702
56754
  }
56703
56755
  const novaMensagem = {
56704
56756
  id: Date.now().toString() + "-ia",
56705
56757
  type: "assistant",
56706
- content: resposta,
56758
+ content: "",
56759
+ // Valor padrão se não vier no partial
56707
56760
  timestamp: /* @__PURE__ */ new Date(),
56708
- isFavorite: false
56761
+ isFavorite: false,
56762
+ ...novaMensagemParcial
56709
56763
  };
56710
56764
  setConversas((prev) => prev.map((conv) => {
56711
56765
  if (conv.id === conversaAtual) {
@@ -56713,7 +56767,7 @@ ${errorMessage}
56713
56767
  return {
56714
56768
  ...conv,
56715
56769
  mensagens: novasMensagens,
56716
- ultimaMensagem: resposta.substring(0, 50) + "...",
56770
+ ultimaMensagem: (novaMensagem.content || "").substring(0, 50) + "...",
56717
56771
  timestamp: (/* @__PURE__ */ new Date()).toLocaleString("pt-BR")
56718
56772
  };
56719
56773
  }
package/dist/index.umd.js CHANGED
@@ -19706,6 +19706,80 @@
19706
19706
  }
19707
19707
  ) });
19708
19708
  }
19709
+ const sugestoesPadrao = [
19710
+ { id: "1", texto: "O que posso pedir para você fazer?" },
19711
+ { id: "2", texto: "O que você faz?" },
19712
+ { id: "3", texto: "Com quais projetos devo me preocupar agora?" },
19713
+ { id: "4", texto: "Qual meu próximo projeto?" },
19714
+ { id: "5", texto: "Qual projetos está tendo o melhor desempenho?" }
19715
+ ];
19716
+ const sugestoesRicas = [
19717
+ { id: "rich-1", texto: "Ver exemplo de Gráfico", icon: React.createElement(ChartColumn, { className: "w-4 h-4 mr-2" }) },
19718
+ { id: "rich-2", texto: "Ver exemplo de Imagem", icon: React.createElement(Image$1, { className: "w-4 h-4 mr-2" }) },
19719
+ { id: "rich-3", texto: "Ver exemplo de Tabela", icon: React.createElement(Table$1, { className: "w-4 h-4 mr-2" }) },
19720
+ { id: "rich-4", texto: "Ver exemplo de Documento", icon: React.createElement(FileText, { className: "w-4 h-4 mr-2" }) }
19721
+ ];
19722
+ const gerarResposta = (mensagemUsuario, customResponses) => {
19723
+ const mensagemLower = mensagemUsuario.toLowerCase();
19724
+ if (customResponses && customResponses.length > 0) {
19725
+ for (const mock of customResponses) {
19726
+ const trigger = mock.trigger;
19727
+ let match2 = false;
19728
+ if (trigger instanceof RegExp) {
19729
+ match2 = trigger.test(mensagemUsuario);
19730
+ } else {
19731
+ match2 = mensagemLower.includes(trigger.toLowerCase());
19732
+ }
19733
+ if (match2) {
19734
+ return mock.response;
19735
+ }
19736
+ }
19737
+ }
19738
+ const mensagemOriginal = mensagemUsuario;
19739
+ if (mensagemLower.includes("o que") && (mensagemLower.includes("fazer") || mensagemLower.includes("pedir"))) {
19740
+ return "Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?";
19741
+ }
19742
+ if (mensagemLower.includes("o que você faz") || mensagemLower.includes("quem é você")) {
19743
+ return "Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.";
19744
+ }
19745
+ if (mensagemLower.includes("projeto") && (mensagemLower.includes("preocupar") || mensagemLower.includes("atenção"))) {
19746
+ return "Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?";
19747
+ }
19748
+ if (mensagemLower.includes("próximo projeto") || mensagemLower.includes("próxima tarefa")) {
19749
+ return "Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?";
19750
+ }
19751
+ if (mensagemLower.includes("desempenho") || mensagemLower.includes("performance") || mensagemLower.includes("melhor")) {
19752
+ return "Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parabéns!\n\nQuer ver métricas detalhadas?";
19753
+ }
19754
+ if (mensagemLower.includes("olá") || mensagemLower.includes("oi") || mensagemLower.includes("bom dia") || mensagemLower.includes("boa tarde") || mensagemLower.includes("boa noite")) {
19755
+ return "Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.";
19756
+ }
19757
+ if (mensagemLower.includes("obrigado") || mensagemLower.includes("obrigada")) {
19758
+ return "Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!";
19759
+ }
19760
+ if (mensagemLower.includes("criar documento")) {
19761
+ const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, "").trim();
19762
+ return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
19763
+ }
19764
+ if (mensagemLower.includes("gerar podcast")) {
19765
+ const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, "").trim();
19766
+ return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
19767
+ }
19768
+ if (mensagemLower.includes("pesquisar")) {
19769
+ const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, "").trim();
19770
+ return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
19771
+ }
19772
+ if (mensagemLower.includes("arquivo") || mensagemLower.includes("documento")) {
19773
+ return "Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!";
19774
+ }
19775
+ const respostasGenericas = [
19776
+ "Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?",
19777
+ "Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?",
19778
+ "Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?",
19779
+ "Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?"
19780
+ ];
19781
+ return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
19782
+ };
19709
19783
  const __vite_import_meta_env__$2 = {};
19710
19784
  function AssistantTooltipContent$1({
19711
19785
  className,
@@ -19756,7 +19830,9 @@
19756
19830
  width,
19757
19831
  height,
19758
19832
  className = "",
19759
- mobileFloating = false
19833
+ mobileFloating = false,
19834
+ demoMode = false,
19835
+ customResponses = []
19760
19836
  }) {
19761
19837
  const isFullPage = mode === "fullPage";
19762
19838
  const [internalIsExpanded, setInternalIsExpanded] = React.useState(controlledIsExpanded ?? true);
@@ -19821,6 +19897,25 @@
19821
19897
  if (onSendMessage) {
19822
19898
  onSendMessage(mensagem);
19823
19899
  }
19900
+ if (demoMode) {
19901
+ const mensagemAtual = mensagem;
19902
+ setTimeout(() => {
19903
+ const resposta = gerarResposta(mensagemAtual, customResponses);
19904
+ let novaMensagemIA = {
19905
+ id: `msg-${Date.now()}-ia`,
19906
+ type: "assistant",
19907
+ content: "",
19908
+ timestamp: /* @__PURE__ */ new Date(),
19909
+ isFavorite: false
19910
+ };
19911
+ if (typeof resposta === "string") {
19912
+ novaMensagemIA.content = resposta;
19913
+ } else {
19914
+ novaMensagemIA = { ...novaMensagemIA, ...resposta };
19915
+ }
19916
+ setMensagens((prev) => [...prev, novaMensagemIA]);
19917
+ }, 1e3 + Math.random() * 1e3);
19918
+ }
19824
19919
  setMensagem("");
19825
19920
  };
19826
19921
  const handleToggleFavorite = (messageId) => {
@@ -56406,67 +56501,14 @@ ${colorConfig.map(([key, itemConfig]) => {
56406
56501
  }
56407
56502
  ) });
56408
56503
  }
56409
- const sugestoesPadrao = [
56410
- { id: "1", texto: "O que posso pedir para você fazer?" },
56411
- { id: "2", texto: "O que você faz?" },
56412
- { id: "3", texto: "Com quais projetos devo me preocupar agora?" },
56413
- { id: "4", texto: "Qual meu próximo projeto?" },
56414
- { id: "5", texto: "Qual projetos está tendo o melhor desempenho?" }
56415
- ];
56416
- const sugestoesRicas = [
56417
- { id: "rich-1", texto: "Ver exemplo de Gráfico", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(ChartColumn, { className: "w-4 h-4 mr-2" }) },
56418
- { id: "rich-2", texto: "Ver exemplo de Imagem", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "w-4 h-4 mr-2" }) },
56419
- { id: "rich-3", texto: "Ver exemplo de Tabela", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Table$1, { className: "w-4 h-4 mr-2" }) },
56420
- { id: "rich-4", texto: "Ver exemplo de Documento", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "w-4 h-4 mr-2" }) }
56421
- ];
56422
- const gerarResposta = (mensagemUsuario) => {
56423
- const mensagemLower = mensagemUsuario.toLowerCase();
56424
- const mensagemOriginal = mensagemUsuario;
56425
- if (mensagemLower.includes("o que") && (mensagemLower.includes("fazer") || mensagemLower.includes("pedir"))) {
56426
- return "Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?";
56427
- }
56428
- if (mensagemLower.includes("o que você faz") || mensagemLower.includes("quem é você")) {
56429
- return "Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.";
56430
- }
56431
- if (mensagemLower.includes("projeto") && (mensagemLower.includes("preocupar") || mensagemLower.includes("atenção"))) {
56432
- return "Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?";
56433
- }
56434
- if (mensagemLower.includes("próximo projeto") || mensagemLower.includes("próxima tarefa")) {
56435
- return "Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?";
56436
- }
56437
- if (mensagemLower.includes("desempenho") || mensagemLower.includes("performance") || mensagemLower.includes("melhor")) {
56438
- return "Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parab��ns!\n\nQuer ver métricas detalhadas?";
56439
- }
56440
- if (mensagemLower.includes("olá") || mensagemLower.includes("oi") || mensagemLower.includes("bom dia") || mensagemLower.includes("boa tarde") || mensagemLower.includes("boa noite")) {
56441
- return "Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.";
56442
- }
56443
- if (mensagemLower.includes("obrigado") || mensagemLower.includes("obrigada")) {
56444
- return "Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!";
56445
- }
56446
- if (mensagemLower.includes("criar documento")) {
56447
- const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, "").trim();
56448
- return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
56449
- }
56450
- if (mensagemLower.includes("gerar podcast")) {
56451
- const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, "").trim();
56452
- return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
56453
- }
56454
- if (mensagemLower.includes("pesquisar")) {
56455
- const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, "").trim();
56456
- return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
56457
- }
56458
- if (mensagemLower.includes("arquivo") || mensagemLower.includes("documento")) {
56459
- return "Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!";
56460
- }
56461
- const respostasGenericas = [
56462
- "Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?",
56463
- "Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?",
56464
- "Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?",
56465
- "Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?"
56466
- ];
56467
- return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
56468
- };
56469
- function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage = false }) {
56504
+ function AssistenteXertica({
56505
+ isExpanded,
56506
+ onToggle,
56507
+ onToggleWithTab,
56508
+ isFullPage = false,
56509
+ demoMode = false,
56510
+ customResponses = []
56511
+ }) {
56470
56512
  const navigate = useNavigate();
56471
56513
  const { geminiApiKey, isApiKeyValid } = useApiKey();
56472
56514
  const {
@@ -56652,8 +56694,8 @@ ${colorConfig.map(([key, itemConfig]) => {
56652
56694
  const simularRespostaIA = async (mensagemUsuario) => {
56653
56695
  setIsTyping(true);
56654
56696
  try {
56655
- let resposta;
56656
- if (isApiKeyValid && geminiApiKey) {
56697
+ let novaMensagemParcial = {};
56698
+ if (isApiKeyValid && geminiApiKey && !demoMode) {
56657
56699
  const conversaAtiva2 = conversas.find((c2) => c2.id === conversaAtual);
56658
56700
  const historico = [];
56659
56701
  const systemPrompt = buildSystemPrompt();
@@ -56683,7 +56725,8 @@ ${colorConfig.map(([key, itemConfig]) => {
56683
56725
  });
56684
56726
  }
56685
56727
  try {
56686
- resposta = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
56728
+ const respostaTexto = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
56729
+ novaMensagemParcial = { content: respostaTexto };
56687
56730
  } catch (error) {
56688
56731
  console.error("Erro ao chamar API Gemini:", error);
56689
56732
  const errorMessage = error instanceof Error ? error.message : "❌ Erro desconhecido";
@@ -56693,7 +56736,8 @@ ${colorConfig.map(([key, itemConfig]) => {
56693
56736
  description: "Sua chave foi reportada como vazada. Gere uma nova em Google AI Studio.",
56694
56737
  duration: 6e3
56695
56738
  });
56696
- resposta = `🔐 **Chave de API Desativada por Segurança**
56739
+ novaMensagemParcial = {
56740
+ content: `🔐 **Chave de API Desativada por Segurança**
56697
56741
 
56698
56742
  ${errorMessage}
56699
56743
 
@@ -56702,29 +56746,39 @@ ${errorMessage}
56702
56746
  2. Gere uma nova chave de API
56703
56747
  3. Configure a nova chave em **Configurações > API**
56704
56748
 
56705
- ⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`;
56749
+ ⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`
56750
+ };
56706
56751
  } else {
56707
56752
  ue$1.error("Erro ao processar mensagem", {
56708
56753
  description: "Verifique sua chave de API nas Configurações.",
56709
56754
  duration: 4e3
56710
56755
  });
56711
- resposta = `**Erro ao processar sua mensagem**
56756
+ novaMensagemParcial = {
56757
+ content: `**Erro ao processar sua mensagem**
56712
56758
 
56713
56759
  ${errorMessage}
56714
56760
 
56715
- 💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`;
56761
+ 💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`
56762
+ };
56716
56763
  }
56717
56764
  }
56718
56765
  } else {
56719
56766
  await new Promise((resolve) => setTimeout(resolve, 1e3 + Math.random() * 1e3));
56720
- resposta = gerarResposta(mensagemUsuario);
56767
+ const resultadoMock = gerarResposta(mensagemUsuario, customResponses);
56768
+ if (typeof resultadoMock === "string") {
56769
+ novaMensagemParcial = { content: resultadoMock };
56770
+ } else {
56771
+ novaMensagemParcial = resultadoMock;
56772
+ }
56721
56773
  }
56722
56774
  const novaMensagem = {
56723
56775
  id: Date.now().toString() + "-ia",
56724
56776
  type: "assistant",
56725
- content: resposta,
56777
+ content: "",
56778
+ // Valor padrão se não vier no partial
56726
56779
  timestamp: /* @__PURE__ */ new Date(),
56727
- isFavorite: false
56780
+ isFavorite: false,
56781
+ ...novaMensagemParcial
56728
56782
  };
56729
56783
  setConversas((prev) => prev.map((conv) => {
56730
56784
  if (conv.id === conversaAtual) {
@@ -56732,7 +56786,7 @@ ${errorMessage}
56732
56786
  return {
56733
56787
  ...conv,
56734
56788
  mensagens: novasMensagens,
56735
- ultimaMensagem: resposta.substring(0, 50) + "...",
56789
+ ultimaMensagem: (novaMensagem.content || "").substring(0, 50) + "...",
56736
56790
  timestamp: (/* @__PURE__ */ new Date()).toLocaleString("pt-BR")
56737
56791
  };
56738
56792
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xertica-ui",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "Xertica UI - Design System completo com componentes React e Tailwind CSS",
5
5
  "type": "module",
6
6
  "main": "./dist/index.umd.js",