Visão geral do bate-papo React

    O componente Ignite UI for React Chat fornece uma solução completa para a criação de interfaces de conversação em seus aplicativos. Esteja você criando uma ferramenta de suporte ao cliente, um espaço de trabalho colaborativo ou um assistente de chatbot, o componente Chat oferece os blocos de construção de que você precisa: enviar e receber mensagens de texto, fazer upload de anexos de arquivos, exibir sugestões de resposta rápida, mostrar indicadores de digitação quando o outro participante está escrevendo uma resposta.

    Ao contrário de uma lista de mensagens estática, oIgrChatComponent componente é interativo e projetado para comunicação em tempo real. Ele gerencia entrada, renderização e interação do usuário, além de dar controle total sobre como mensagens e anexos são exibidos. Também expõe uma API de renderização extensa que permite sobrescrever qualquer parte do layout ou dos visuais.

    Instalação

    Para começar, instale o Ignite UI for React executando o seguinte comando:

    npm install igniteui-react
    

    Depois de instalado, você pode importar o componente em seu projeto e registrá-lo para que ele fique disponível como um elemento personalizado:

    import { IgrChat } from "igniteui-react";
    import 'igniteui-webcomponents/themes/light/bootstrap.css';
    

    O arquivo CSS inclui um dos nossos temas padrão. Você pode substituí-lo por um tema diferente ou criar um personalizado se quiser que combineIgrChatComponent com a marca do seu aplicativo.

    Uso

    A maneira mais simples de usar oIgrChatComponent é declará-lo da seguinte forma:

    import { IgrChat, IgrChatOptions } from 'igniteui-react';
    
    const options: IgrChatOptions = {
      currentUserId: 'me',
      headerText: 'Support Chat',
    };
    
    return (
      <IgrChat options={options} />
    );
    

    Aqui, acurrentUserId propriedade informa ao componente quais mensagens são "enviadas" (enviadas pelo usuário atual) e quais mensagens estão "recebidas" (enviadas por outros). EleheaderText fornece um título para a janela de chat.

    Depois de renderizado, você pode adicionar mensagens programaticamente:

    import { useRef } from 'react';
    import { IgrChat } from 'igniteui-react';
    
    const ChatExample = () => {
      const chatRef = useRef<IgrChat>(null);
    
      const sendMessage = () => {
        const newMessage = {
          id: '1',
          sender: 'me',
          text: 'Hello! How can I help you?',
          timestamp: Date.now().toString()
        };
        chatRef.current!.messages = [...chatRef.current!.messages, newMessage];
      };
    
      return (
        <>
          <IgrChat ref={chatRef} options={{ currentUserId: 'me', headerText: 'Support Chat' }} />
          <button onClick={sendMessage}>Send Message</button>
        </>
      );
    };
    

    Essa abordagem facilita a conexão do Chat à sua própria fonte de dados, como um endpoint de servidor, um mecanismo de chatbot ou um back-end de aplicativo colaborativo.

    Propriedades

    OIgrChatComponent componente expõe várias propriedades importantes que permitem controlar seu estado e configuração:

    Nome Descrição
    messages Matriz de mensagens (ChatMessage[]) exibidas no chat. Você pode vincular a isso para controlar quais mensagens são mostradas.
    draftMessage A mensagem não enviada atual, representada como um objeto contendotext e opcionalattachments. Isso é útil para salvar ou restaurar rascunhos de mensagens.
    options Configuração de bate-papo (IgrChatOptions), como ID de usuário atual, espaços reservados de entrada, tipos de arquivo aceitos, sugestões de resposta rápida, atraso de digitação e renderizadores personalizados.
    resourceStrings Cadeias de caracteres de recursos localizadas para rótulos, cabeçalhos e texto do sistema. Use essa propriedade para adaptar o componente para diferentes idiomas.

    Essas propriedades facilitam a sincronização da interface do usuário do Chat com o estado e o back-end do aplicativo.

    Attachments

    Conversas modernas raramente se limitam apenas ao texto. O componente Chat inclui suporte embutido para anexos de arquivos, permitindo que os usuários compartilhem imagens, documentos e outros arquivos. Por padrão, a área de entrada inclui um botão de anexo. Você pode controlar quais tipos de arquivo são permitidos definindo a propriedadeacceptedFiles:

    const options: IgrChatOptions = {
      acceptedFiles="image/*,.pdf",
    };
    

    Neste exemplo, os usuários só poderão fazer upload de imagens e arquivos PDF. Se o seu caso de uso não exigir anexos, você poderá desativá-los facilmente:

    const options: IgrChatOptions = {
      disableInputAttachments: true,
    };
    

    Sugestões

    Sugestões de resposta rápida oferecem aos usuários respostas pré-definidas que podem tocar para responder instantaneamente. Esse recurso é particularmente útil em chatbots, fluxos de atendimento ao cliente ou ao guiar usuários por um processo estruturado. Você pode fornecer sugestões vinculando um array de strings à propriedade de sugestões. Osuggestions-position atributo permite que você controle onde elas são exibidas: seja abaixo da área de entrada ou abaixo da lista de mensagens.

    const options: IgrChatOptions = {
      currentUserId: "me",
      suggestions: ['Yes', 'No', 'Maybe later'],
      suggestionsPosition: "below-input"
    };
    
    return (
      <IgrChat ref={chatRef} options={{ options }} />
    );
    

    Essa abordagem ajuda a simplificar as interações do usuário, reduzindo a necessidade de digitar respostas repetitivas e melhora a experiência geral em conversas guiadas.

    Typing Indicator

    As conversas parecem mais naturais quando os participantes veem que a outra pessoa está digitando. O componente Chat fornece esse comportamento por meio daisTyping propriedade do objeto options. Quando configurado como verdadeiro, o chat mostra um indicador sutil de digitação abaixo das mensagens:

    const options: IgrChatOptions = {
      isTyping: true
    };
    

    Esse recurso normalmente é alternado programaticamente, por exemplo, ao receber um evento de digitação do serviço de back-end.

    Custom Renderers

    Embora o componente Chat funcione de fábrica com sua interface padrão, muitos aplicativos precisam personalizar a aparência e a sensação. Por exemplo, você pode querer adicionar recibos de leitura, exibir avatares ou substituir a área de entrada por um botão de gravação de voz. OIgrChatComponent componente atende a essa necessidade com um sistema de renderização. Um renderizador é simplesmente uma função que retorna um template para uma determinada parte da interface. Você pode sobrescrever quantos ou poucos renderizadores quiser.

    ChatTemplateRenderer

    Cada renderizador segue a mesma assinatura de função:

    export type ChatTemplateRenderer<T> = (ctx: T) => unknown;
    

    O parâmetro ctx fornece dados contextuais diferentes, dependendo do que está sendo renderizado.

    Renderer Contexts

    Context Type Provided Data
    ChatRenderContext instance(a instância do componente de bate-papo).
    ChatInputRenderContext HerdaChatRenderContext e adicionaattachments (matriz deIgrChatMessageAttachment) evalue (texto de entrada atual).
    ChatMessageRenderContext HerdaChatRenderContext e adicionaIgrChatMessage (oIgrChatMessage que está sendo renderizado).
    ChatAttachmentRenderContext HerdaChatMessageRenderContext e adicionaattachment (oIgrChatMessageAttachment que está sendo renderizado).

    Renderizadores disponíveis

    As seguintes partes do bate-papo podem ser personalizadas:

    • Message-level: message, messageHeader, messageContent, messageAttachments, messageActions
    • Attachment-level: attachment, attachmentHeader, attachmentContent
    • Input-level: input, inputActions, inputActionsStart, inputActionsEnd, inputAttachments, fileUploadButton, sendButton
    • Suggestions: suggestionPrefix
    • Miscellaneous: typingIndicator

    Esse nível de granularidade significa que você pode ajustar apenas uma parte (por exemplo, a aparência dos anexos) sem reescrever todo o layout do chat.

    Exemplo: Conteúdo de mensagem personalizada

    Este exemplo mostra como substituir o balão de mensagem por seu próprio modelo:

    const options = {
      renderers: {
        messageContent: (ctx) => {
          const { message } = ctx;
          return (
            <div className="bubble custom">${message.content}</div>
          );
        }
      }
    };
    

    Example: Custom Input Area

    Por padrão, a entrada de chat é uma área de texto. Você pode substituí-lo para fornecer uma experiência mais personalizada, como adicionar um botão de entrada de voz:

    const options = {
      renderers: {
        input: (ctx) => {
          return (
            <>
              <textarea placeholder={ctx.instance?.options?.inputPlaceholder || 'Type here...'}>{ctx.value}</textarea>
              <button onClick={() => alert('Voice input!')}>🎤</button>
            </>
          );
        }
      }
    };
    

    Exemplo: Estendendo ações de entrada

    OIgrChatComponent componente fornece dois renderizadores que são úteis quando você quer manter as ações padrão (upload e envio), mas estendê-las com controles adicionais:

    • inputActionsStart– permite que você injete conteúdo personalizado após o botão de upload embutido.
    • inputActionsEnd– permite injetar conteúdo personalizado após o botão de enviar embutido.

    Por exemplo, você pode querer adicionar um botão de gravação de voz após o botão de upload ou um menu de opções extras após o botão enviar. No exemplo a seguir, o botão de upload padrão é preservado, mas adicionamos um botão de microfone ao lado dele. Por outro lado, removemos o botão de envio padrão e o substituímos por um botão Ask personalizado e um menu "mais":

    const _actionsStartTemplate = () => (
      <IgrIconButton variant="flat">🎤</IgrIconButton>
    );
    
    const _actionsEndTemplate = (ctx) => (
      <div>
        <IgrButton onClick={() => handleCustomSendClick(ctx.instance)}>Ask</IgrButton>
        <IgrIconButton variant="flat" name="more_horiz"></IgrIconButton>
      </div>
    );
    
    const options = {
      renderers: {
        inputActionsStart: _actionsStartTemplate,
        inputActionsEnd: _actionsEndTemplate,
        sendButton: () => null,
      },
    };
    

    Nesta configuração:

    • O botão de upload permanece no lugar.
    • Um botão de microfone é adicionado depois dele (inputActionsStart).
    • O botão de envio padrão é removido e substituído por um botão Perguntar personalizado e um ícone "mais" (inputActionsEnd).

    Essa abordagem oferece flexibilidade total na barra de entrada do chat, permitindo adicionar, remover ou reordenar ações sem reconstruir a área de entrada do zero.

    Markdown Rendering

    O componente Chat inclui suporte embutido para conteúdo Markdown através docreateMarkdownRenderer helper, que é exportado a partir do igniteui-react/extras ponto de entrada do pacote principal. Isso permite exibir mensagens com texto formatado, links, listas e até blocos de código destacados com sintaxe, garantindo que todo o HTML renderizado seja limpo para segurança.

    [! Nota] Para usar o renderizador Markdown, você precisa instalar as seguintes dependências entre pares no seu projeto:

    npm install marked marked-shiki shiki dompurify
    

    Por padrão, as mensagens são renderizadas como texto sem formatação. Se você quiser habilitar o suporte a Markdown, poderá substituir o renderizador messageContent e usar o renderizador Markdown, conforme mostrado abaixo:

    import { createMarkdownRenderer } from 'igniteui-react/extras';
    
    // Create a reusable Markdown renderer instance
    const markdownRenderer = await createMarkdownRenderer();
    
    const options = {
      renderers: {
        messageContent: async ({ message }) => markdownRenderer(message),
      }
    };
    

    Neste exemplo:

    • A propriedade text de cada mensagem será analisada como Markdown usando a biblioteca marcada.
    • O renderizador limpa a saída usando DOMPurify
    • Os links são abertos automaticamente em uma nova guia com atributos rel seguros.

    Realce de sintaxe

    O renderizador Markdown também dá suporte ao realce de sintaxe para blocos de código usando Shiki. Por padrão, ele inclui realce para JavaScript, TypeScript, HTML e CSS com o tema github-light. Você pode personalizar esse comportamento por meio de MarkdownRendererOptions:

    const markdownRenderer = await createMarkdownRenderer({
      theme: { light: 'min-light' },
      languages: ['javascript', 'python']
    });
    

    Isso habilitará blocos de código destacados para JavaScript, Python e Go, estilizados com o tema escuro do GitHub.

    Configuration Options

    Opção Descrição
    noHighlighter Iftrue, desabilita totalmente o realce de sintaxe.
    languages Lista de linguagens de programação a serem suportadas em blocos de código destacados.
    theme Um objeto que especifica temas Shiki para aplicar. Suporta valores separados paralight edark modo (por exemplo,{ light: 'github-light', dark: 'github-dark' }).
    sanitizer Uma função personalizada para limpar o HTML final. O padrão éDOMPurify.sanitize.

    Eventos

    Para se integrar à lógica do aplicativo, o componente Chat emite um conjunto de eventos:

    • onMessageCreated – quando uma nova mensagem é criada.
    • onMessageReact – quando uma mensagem é reagida.
    • onAttachmentClick – quando um anexo é clicado.
    • onAttachmentAdded – quando um anexo é adicionado.
    • onAttachmentRemoved – quando um anexo é removido.
    • onAttachmentDrag – enquanto arrasta um anexo.
    • onAttachmentDrop – quando um anexo é descartado.
    • onTypingChange – when typing status changes.
    • onInputFocus / onInputBlur – input focus events.
    • onInputChange – quando o valor de entrada é alterado.

    Você pode ouvir esses eventos e sincronizá-los com seu back-end:

    const chatRef = useRef<IgrChat>(null);
    chatRef.current.addEventListener('onMessageCreated', (e) => {
      console.log('Message:', e.detail);
    });
    

    Estilização

    OIgrChatComponent componente expõe tanto peças CSS quanto slots para personalização detalhada de sua aparência e estrutura.

    Partes CSS

    Nome da peça Descrição
    "contêiner-chat" Estiliza o contêiner de bate-papo principal.
    "cabeçalho" Estiliza o contêiner de cabeçalho de chat.
    "prefixo" Estiliza o elemento antes do título do bate-papo (por exemplo, avatar).
    "título" Estiliza o título do cabeçalho do chat.
    "contêiner-área-mensagem" Estiliza o contêiner que contém as mensagens e sugestões (opcionais).
    "lista de mensagens" Estiliza o contêiner da lista de mensagens.
    "item-mensagem" Estiliza cada wrapper de mensagem.
    "indicador de digitação" Estiliza o contêiner do indicador de digitação.
    "ponto de digitação" Estilos de pontos indicadores de digitação individuais.
    "Recipiente de Sugestões" Estiliza o contêiner que contém todas as sugestões.
    "cabeçalho-sugestões" Estiliza o cabeçalho de sugestões.
    "Sugestão" Estiliza cada item de sugestão.
    "sugestão-prefixo" Estiliza o ícone ou prefixo em uma sugestão.
    "sugestão-título" Estiliza o texto/título de uma sugestão.
    "estado vazio" Estiliza o contêiner de estado vazio quando não há mensagens.
    "contêiner-área-entrada" Estiliza o wrapper ao redor da área de entrada do chat.
    "contêiner-entrada" Estiliza o contêiner de entrada principal.
    "contêiner-adjuntos-entrada" Estiliza o contêiner para anexos na entrada.
    "Contêiner-Entrada-Anexo" Estiliza um único anexo na área de entrada.
    "nome-anexo-entrada" Estiliza o nome do arquivo de um anexo.
    "ícone de acessório de entrada" Estiliza o ícone de um anexo.
    "entrada de texto" Estiliza o campo de entrada de texto para digitar mensagens.
    "contêiner-ações-de entrada" Estiliza o contêiner para ações de entrada.
    "input-actions-start" Estiliza o grupo de ações no início da entrada após o upload do arquivo padrão.
    "fim-ações-entrada" Estiliza o grupo de ações no final da entrada.
    "contêiner-de upload de arquivo" Estiliza o contêiner para a entrada de upload de arquivo.
    "upload de arquivo" Estiliza a própria entrada de upload de arquivo.
    "Recipiente de botão de enviar" Estiliza o contêiner ao redor do botão enviar.
    "botão de enviar" Estiliza o botão enviar.
    "contêiner-mensagem" Estiliza o contêiner de uma única mensagem.
    "Lista de mensagens (encaminhada)" Estiliza a lista interna de mensagens.
    "cabeçalho de mensagem" Estiliza o cabeçalho de uma mensagem (por exemplo, remetente, carimbo de data/hora).
    "conteúdo da mensagem" Estiliza o conteúdo de texto de uma mensagem.
    "contêiner-anexos-de mensagens" Estiliza o contêiner para anexos de mensagens.
    "anexo de mensagem" Estiliza um único anexo de mensagem.
    "contêiner-de de ações-mensagem" Estiliza o contêiner que contém as ações da mensagem.
    "mensagem enviada" Define as mensagens marcadas como enviadas pelo usuário atual.
    "cabeçalho de anexo" Estiliza o cabeçalho de um bloco de anexo.
    "conteúdo de apego" Estiliza o conteúdo de um bloco de anexo.
    "ícone de anexo" Estiliza o ícone de um anexo.
    "nome do arquivo" Estiliza o nome do arquivo mostrado em um anexo.

    Slots

    Nome do slot Descrição
    "prefixo" Slot para injetar conteúdo (por exemplo, avatar ou ícone) antes do título do bate-papo.
    "título" Slot para substituir o conteúdo do título do bate-papo.
    "Ações" Slot para injetar ações de cabeçalho (por exemplo, botões, menus).
    "cabeçalho-sugestões" Slot para renderizar um cabeçalho personalizado para a lista de sugestões.
    "Sugestões" Slot para renderizar uma lista personalizada de sugestões de resposta rápida.
    "sugestões-ações" Slot para renderizar ações adicionais.
    "Sugestão" Slot para renderizar um único item de sugestão.
    "estado vazio" Slot mostrado quando não há mensagens.

    Adoção de estilo raiz (adoptRootStyles)

    As opções do componente Chat incluem um sinalizador especial para cenários de estilo avançados:

    Opção Tipo Padrão Descrição
    adoptRootStyles boolean falso Quandotrue, o componente permite que o conteúdo renderizado dentro de seu Shadow DOM (por exemplo, de renderizadores personalizados) herde estilos da raiz do documento. Isso fornece uma solução rápida para o estilo, mas não é recomendado para uso em produção.

    Essa propriedade pode ser útil se você preferir não lidar com o encapsulamento Shadow DOM ao aplicar CSS global a modelos renderizados personalizados. No entanto, ele vem com compensações:

    • ✅ Conveniência: permite que os estilos globais (do documento) afetem os renderizadores de mensagens personalizados.
    • ⚠️ Arriscado: quebra o encapsulamento e pode levar ao vazamento de estilo, onde o CSS global altera involuntariamente os visuais internos.
    • 🔒 Configuração única: Esta opção só pode ser definida na inicialização. Alterá-lo em tempo de execução não tem efeito.

    É altamente recomendável usar as abordagens de estilo padrão do Web Component antes de recorrer a esta propriedade:

    • Variáveis CSS e API ::p art – Prefira personalizar por meio de partes e variáveis expostas.
    • "" elements – For larger stylesheets, inject them inside the Shadow DOM.
    • Inline "