https://a.storyblok.com/f/270183/183838/db182fd012/elevate_addvideotochat-1.png

Como adicionar Video ao seu aplicativo de bate-papo em React com o Nexmo

Publicado em May 7, 2021

Tempo de leitura: 10 minutos

Na Nexmo, estamos muito entusiasmados com a possibilidade de criar jornadas do cliente por meio de conversas com nossa nova Conversation API. Ela permite que os usuários não apenas implementem uma experiência omnicanal, combinando voz, mensagens e vídeo em uma única experiência, mas também mantenha o contexto dessas conversas para oferecer uma experiência superior ao cliente.

As possibilidades que essa API vai revelar parecem infinitas e, por isso, me diverti muito explorando as diferentes maneiras de incorporá-la às minhas Applications nas últimas semanas.

Por que estamos animados com isso

  • A comunicação omnicanal permite que você faça tudo — Voice, mensagens e eventos personalizados — ao mesmo tempo e em tempo real

  • É um modelo robusto — tudo é construído com base nele, o que significa que você pode adicionar qualquer canal ou evento personalizado que desejar

  • Nós mantemos o contexto para você, tornando o histórico das suas conversas acessível

Vamos criar um aplicativo com a Conversation API

Hoje, vamos desenvolver algo com base no aplicativo de bate-papo que foi criado no este tutorial introdutório. Esse aplicativo original usa o Client SDK da Nexmo e se conecta à Conversation API. E hoje, vamos adicionar o chat por vídeo a esse aplicativo React usando a API da TokBox.

demo of appdemo of app

Caso de uso do nosso aplicativo

Imagine que você está conversando com um cliente no seu site. Talvez ele esteja entrando em contato porque está insatisfeito com um serviço e, para que se sinta ouvido e valorizado, é necessário oferecer um atendimento extra. Este tutorial vai orientá-lo passo a passo sobre como adicionar facilmente a possibilidade de resolver o problema com ele cara a cara, por meio de um chat por Video!

Pré-requisitos

Para resumir, vamos supor que você tenha seguido o tutorial do React e do Express. Para começar, você precisará novamente de um Account na Vonage e do Node instalado em seu ambiente de desenvolvimento. Se quiser pular direto para um projeto pronto, você pode remixar o código aqui no Glitch. Caso contrário, em apenas algumas etapas, você pode criar seu próprio aplicativo de videochamada do zero!

Criar um aplicativo

No seu terminal, execute:

nexmo app:create "My Client SDK App" https://example.com/answer https://example.com/event --type=rtc --keyfile=private.key

O primeiro item na saída é o ID do aplicativo, que você deve salvar em um local seguro. Vamos nos referir a ele como YOUR_APP_ID mais tarde. O último valor na saída é a localização da chave privada. A chave privada é usada para gerar JWTs, que servem para autenticar suas interações com a Nexmo.

Criar uma conversa

Crie uma conversa dentro do aplicativo:

nexmo conversation:create display_name="Nexmo Chat"

O resultado é o ID da conversa. Salve-o, pois esse é o identificador exclusivo da conversa que foi criada. Vamos nos referir a ele como YOUR_CONVERSATION_ID mais tarde.

Criar um usuário

Crie um usuário que participará da conversa:

nexmo user:create name="lauren"

O resultado é o ID do usuário. Mais uma vez, salve esse ID, pois ele é o identificador exclusivo do usuário que foi criado. Vamos nos referir a ele como YOUR_USER_ID mais tarde.

Criar uma aplicação TokBox

Depois de fazer login na sua conta do TokBox, no canto esquerdo da página, selecione Projects e, no menu suspenso, clique em Create New Project.

New project tok-boxNew project tok-box

A partir daí, selecione Create Custom Project e dê a ele o nome que quiser. Depois de criar o projeto, clique View Project e salve a chave de API na parte superior. Em seguida, role a página até a seção intitulada Project Tools e clique no botão azul para Create Session ID.

session IDsession ID

Copie e cole esse sessionID na seção abaixo Generate Token. Fique à vontade para prolongar o tempo de validade além do padrão de 1 hora, se desejar. Em seguida, clique no botão azul Generate Token e salve o token gerado.

Organizar o aplicativo

Retomando de onde o último tutorial parou, vamos mover todos os componentes do chat para uma ChatComponents pasta e criar uma nova VideoComponents pasta para nossos novos arquivos.

Directory structureDirectory structure

No NexmoApp.js arquivo, substitua um dos IDs de conversa por YOUR_CONVERSATION_ID que acabamos de gerar no terminal.

Adicionar o componente de vídeo

Instale a API do TokBox executando o seguinte comando no seu terminal:

npm install opentok-react

Dentro da VideoComponents pasta, crie os arquivos: CheckBox.js ConnectionStatus.js Publisher.js Subscriber.js VideoComponent.js

No Chatroom.js, importe o VideoComponent na parte superior e chame <VideoComponent /> abaixo do botão “Chat”, dentro da instrução return.

Criar o componente VideoComponent

Você chamará o Publisher, Subscriber, e ConnectionStatus componentes de seu VideoComponent.js:

// VideoComponent.js

import React from 'react';
import { OTSession, OTStreams, preloadScript } from 'opentok-react';
import ConnectionStatus from './ConnectionStatus';
import Publisher from './Publisher';
import Subscriber from './Subscriber';

class VideoComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      error: null,
      connected: false
    };
    this.sessionEvents = {
      sessionConnected: () => {
        this.setState({ connected: true });
      },
      sessionDisconnected: () => {
        this.setState({ connected: false });
      }
    };
  }
 onError = (err) => {
    this.setState({ error: `Failed to connect: ${err.message}` });
  }

  render() {
    return (
      <OTSession
        apiKey=YOUR_TOKBOX_API_KEY
        sessionId=YOUR_TOKBOX_SESSION_ID
        token=YOUR_TOKBOX_TOKEN
        eventHandlers={this.sessionEvents}
        onError={this.onError}
        >
        {this.state.error ? <div id="error">{this.state.error}</div> : null}

        <ConnectionStatus connected={this.state.connected} />

        <Publisher />
        <OTStreams>
          <Subscriber />
        </OTStreams>
      </OTSession>
    );
  }
}

export default preloadScript(VideoComponent);

Preencha os campos apikey, sessionId e token com as credenciais que criamos ao criar o aplicativo TokBox.

Compilar o componente Publisher

O Publisher será um componente baseado em classe e terá a seguinte aparência:

// Publisher.js

import React from "react";
import { OTPublisher } from "opentok-react";
import CheckBox from "./CheckBox";

class Publisher extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      error: null,
      audio: true,
      video: true,
      videoSource: "camera"
    };
  }

  setAudio = audio => {
    this.setState({ audio });
  };

  setVideo = video => {
    this.setState({ video });
  };

  changeVideoSource = videoSource => {
    this.state.videoSource !== "camera"
      ? this.setState({ videoSource: "camera" })
      : this.setState({ videoSource: "screen" });
  };

  onError = err => {
    this.setState({ error: `Failed to publish: ${err.message}` });
  };

  render() {
    return (
      <div className="publisher">
        Publisher
        {this.state.error ? <div id="error">{this.state.error}</div> : null}
        <OTPublisher
          properties={{
            publishAudio: this.state.audio,
            publishVideo: this.state.video,
            videoSource:
              this.state.videoSource === "screen" ? "screen" : undefined
          }}
          onError={this.onError}
        />
        <CheckBox label="Share Screen" onChange={this.changeVideoSource} />
        <CheckBox
          label="Publish Audio"
          initialChecked={this.state.audio}
          onChange={this.setAudio}
        />
        <CheckBox label="Publish Video" initialChecked={this.state.video} onChange={this.setVideo} />
      </div>
    );
  }
}
export default Publisher;

Observe que, dentro do <OTPublisher /> estamos passando publishAudio, publishVideo, e videoSource para o properties prop e à função onError() para o onError adereço.

Agora, o Publisher componente exibirá um avatar até que o usuário conceda permissão ao OpenTok para acessar a câmera do computador.

publisher

Criar o componente de assinante

O Subscriber também será um componente baseado em classe com subscribeToAudio e subscribeToVideo como propriedades:

// Subscriber.js

import React from "react";

import { OTSubscriber } from "opentok-react";
import CheckBox from "./CheckBox";

class Subscriber extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      error: null,
      audio: true,
      video: true
    };
  }

  setAudio = audio => {
    this.setState({ audio });
  };

  setVideo = video => {
    this.setState({ video });
  };

  onError = err => {
    this.setState({ error: `Failed to subscribe: ${err.message}` });
  };

  render() {
    return (
      <div className="subscriber">
        Subscriber
        {this.state.error ? <div id="error">{this.state.error}</div> : null}
        <OTSubscriber
          properties={{
            subscribeToAudio: this.state.audio,
            subscribeToVideo: this.state.video
          }}
          onError={this.onError}
        />
        <CheckBox
          label="Subscribe to Audio"
          initialChecked={this.state.audio}
          onChange={this.setAudio}
        />
        <CheckBox
          label="Subscribe to Video"
          initialChecked={this.state.video}
          onChange={this.setVideo}
        />
      </div>
    );
  }
}
export default Subscriber;

Crie o componente ConnectionStatus

Vamos usar o ConnectionStatus.js arquivo para exibir o status da conexão ao usuário:

// ConnectionStatus.js

import React from "react";

class ConnectionStatus extends React.Component {
  render() {
    let status = this.props.connected ? "Connected" : "Disconnected";
    return (
      <div className="connectionStatus">
        <strong>Status:</strong> {status}
      </div>
    );
  }
}
export default ConnectionStatus;

Isso ajuda o usuário a saber se o Video foi reproduzido com sucesso ou não:

Connection statusConnection status

Criar o componente CheckBox

Vamos usar o <CheckBox /> componente tanto no <Publisher /> e <Subscriber /> :

// CheckBox.js

import React from "react";
import { uniqueId } from "lodash";

class CheckBox extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      id: uniqueId("Checkbox"),
      isChecked: this.props.initialChecked
    };
  }

  onChange = event => {
    let isChecked = event.currentTarget.checked;
    this.setState({ isChecked });
  };

  componentDidUpdate(prevProps, prevState) {
    if (
      prevState.isChecked !== this.state.isChecked &&
      typeof this.props.onChange === "function"
    ) {
      this.props.onChange(this.state.isChecked);
    }
  }

  render() {
    return (
      <div>
        <label htmlFor={this.state.id}>{this.props.label}</label>

        <input
          type="checkbox"
          checked={this.state.isChecked}
          id={this.state.id}
          onChange={this.onChange}
        />
      </div>
    );
  }
}
export default CheckBox;

A inclusão do CheckBox componente ajuda a fazer com que a interface do usuário do aplicativo funcione da maneira que os usuários esperam:

checkbox gifcheckbox gif

Teste seu aplicativo de videochamada

Você já criou todos os 5 componentes do React:

  • VideoComponent

  • Editora

  • Assinante

  • Status da conexão

  • Caixa de seleção

Executar npm start a partir da raiz do seu projeto deve fazer com que seu aplicativo seja iniciado e comece a funcionar. Ao selecionar o menu suspenso ao lado de User Name, você deverá ver o nome lauren já preenchido.

Tente adicionar seu nome na caixa de texto e clique no Create user botão. Selecione o chat sincronizado no menu suspenso.

Agora você pode verificar se o aplicativo está sincronizado corretamente com sua conversa executando esta solicitação no seu terminal:

nexmo member:list YOUR_CONVERSATION_ID -v

Além disso, lauren, seu nome já deve estar visível nessa lista:

name                                     | user_id                                  | user_name | state  
---------------------------------------------------------------------------------------------------------
MEM-aaaaaaaa-bbbb-cccc-dddd-0123456789ab | USR-aaaaaaaa-bbbb-cccc-dddd-0123456789ab | lauren     | JOINED
MEM-vvvvvvvv-eeee-ffff-eeee-3456789ab012 | USR-bbbbbbbb-cccc-dddd-eeee-3456789ab012 | your-name  | JOINED

Conceda ao navegador permissão para acessar sua câmera e seu microfone, e agora você deverá ver o componente de Video na tela! Se você abrir outro navegador com o mesmo código e entrar no chat como um usuário diferente, verá que outro componente de Video também foi adicionado.

demo of appdemo of app

Para ver o aplicativo em funcionamento, confira-o em 👉 Falha! Para personalizá-lo, modifique-o e insira suas próprias credenciais do Nexmo e do TokBox no .env arquivo.

🌟Vamos colaborar!🌟

Parabéns! Você conseguiu adicionar vídeo ao seu aplicativo de bate-papo. Não é demais?! Eu, pelo menos, estou bem empolgado e já comecei a procurar todas as oportunidades possíveis no meu dia a dia para incluir o bate-papo por vídeo nas minhas conversas!

Se você tiver interesse em experimentar nossa nova Conversation API, por favor, compartilhe 🤩

Estamos sempre tentando pensar em casos de uso criativos ou inovadores para isso e, por isso, ficaria MUITO animado em colaborar e criar novos aplicativos juntos.

É importante observar que a Conversation API está atualmente em fase beta e está em constante evolução com base nas suas sugestões e comentários. Como sempre, ficaremos felizes em ajudar com qualquer dúvida em nosso Slack da comunidade ou pelo e-mail support@nexmo.com.

Compartilhar:

https://a.storyblok.com/f/270183/250x250/708316e4e8/laurenlee.png
Lauren LeeEx-funcionários da Vonage

Um professor de inglês que se tornou um engenheiro de software empático. Um otimista curioso, apaixonado por criar conteúdo acessível e ajudar desenvolvedores a aprimorar suas habilidades.