Reaja ao bate-papo com vários usuários com o back-end do Chatix

Chatix chatroom


Agora vou mostrar como fazer um bate-papo para a equipe / usuários / amigos, se você não possui seu back-end ou não deseja gastar tempo desenvolvendo-o. Faremos um simples bate-papo por texto e levará cerca de uma hora.


Para escrever um bate-papo em rede sem um back-end, é quase impossível, ele deve ser de uma forma ou de outra. Usaremos o Chatix e seu JavaScript SDK. O Chatix e o SDK estarão envolvidos no armazenamento de mensagens e nas tarefas de rede, e lidaremos com o front-end.


O código do projeto finalizado está disponível no GitHub
Demo


Estrutura do projeto


  • App (o componente raiz do aplicativo, atua como guardião do estado, porque nesta lição não adicionaremos Redux ou qualquer outro gerente de estado)
    • Cabeçalho (o cabeçalho do nosso aplicativo que exibe o logotipo, o nome do bate-papo e permite que o usuário escreva seu nome)
    • LogoHeader
    • Roomtitle
    • Principal
    • MemberList (lista de bate-papo)
      • MemberItem []
    • ChatField (um contêiner para tudo relacionado a mensagens de bate-papo)
      • Messagecontainer
      • Mensagem [] (apresentação da mensagem; nesta lição, trabalharemos apenas com mensagens de texto)
      • SendMessageForm (formulário para enviar uma nova mensagem de bate-papo)
    • ChatixSDK (componente sem cabeça responsável por trabalhar com o back-end)

Nota importante sobre o armazenamento do estado. Obviamente, seria mais conveniente adicionar Redux aqui e processar alterações de estado por meio dele, mas, para economizar tempo, armazenaremos o estado no componente raiz do aplicativo e encaminharemos os dados para os componentes filhos e chamaremos seus pais a partir dos métodos filhos.
Por exemplo, quando obtemos o nome do bate-papo, vamos salvá-lo no estado do componente App e transmiti-lo através de props : App → Header → RoomTitle . Quando o usuário escreve uma mensagem, a transferiremos do SendMessageForm para o aplicativo: SendMessageForm → ChatField → Main → App .

Nosso bate-papo terá algo parecido com isto no design:


chatix.io


Interação entre componentes


Nossos componentes devem transmitir dados uns aos outros e, para que tudo funcione como deveria, vamos determinar agora como eles irão interagir.


Interação de componentes


Como você pode ver na figura, o principal componente para nós é o App , que fornece dados para os componentes filhos (devido à reatividade, simplesmente atribuímos prop e o componente filho responde a alterações), e os componentes filhos sucessivamente chamam o método para o App . Essa não é a melhor arquitetura que pode (e deve) ser feita para um projeto de produção, mas servirá para a nossa lição.


Criação de projeto


Crie componentes visuais


Chapéu


  1. Primeiro você precisa criar um novo projeto, para isso usaremos create-react-app .


     npx create-react-app chatix-chatroom cd chatix-chatroom 

    Execute o projeto com o comando


     npm start 

  2. Vamos começar criando um cabeçalho.
    Primeiro, adicione um logotipo ao cabeçalho. Para fazer isso, dentro da pasta src, crie a pasta componentes e nela a pasta logo_header . Carregamos o logotipo nesta pasta e criamos 2 arquivos LogoHeader.js e LogoHeader.css



LogoHeader.js


 import React from 'react' import logo from './chatix_logo.svg'; import './LogoHeader.css'; function LogoHeader(){ return ( <div className="LogoHeader"> <img src={logo} className="App-logo" alt="Chatix logo" /> </div> ); } export default LogoHeader; 

LogoHeader.css


 .LogoHeader{ flex-basis: 200px; flex-grow: 0; flex-shrink: 0; } 

Tudo está claro aqui, neste componente um arquivo com um logotipo e estilos é simplesmente importado.


Não adicionarei mais o código para as folhas de estilo aqui, você pode vê-las na página do projeto finalizado


Agora exiba o nome da sala de bate-papo. Para fazer isso, crie uma pasta com o título da sala e nela o componente RoomTitle . Vamos colocar o nome nesse componente por meio de props, então escrevemos props.chatroomName e agora o transferimos aqui.


Roomtitle


 import React from 'react'; import './RoomTitle.css'; function RoomTitle(props){ return ( <div className="RoomTitle"> <h1>{props.chatroomName}</h1> </div> ); } export default RoomTitle; 

Em seguida, criamos o próprio componente do cabeçalho e colocamos nele o logotipo e o nome da sala de bate-papo. Jogue imediatamente o nome do bate-papo no componente filho por meio do prop chatroomName .


Lembro que concordamos que todos os dados (estado do aplicativo) serão armazenados pelo componente raiz do aplicativo . A partir dele, transferiremos o cabeçalho primeiro para o cabeçalho e do cabeçalho para o RoomTitle .


components \ header \ Header.js


Header.js


 import React from 'react'; import './Header.css' import LogoHeader from '../logo_header/LogoHeader'; import RoomTitle from '../room-title/RoomTitle'; function Header(props) { return ( <header> <LogoHeader/> <RoomTitle chatroomName={props.chatroomName} /> </header> ); } export default Header; 

Em seguida, abra o arquivo App.js e adicione o componente Header.js .
Em seguida, adicionamos o nome ao estado e o encaminhamos ao cabeçalho via adereços .
Também no cabeçalho, você precisa adicionar o nome do usuário atual. Para fazer isso, adicione o objeto de usuário ao estado e encaminhe-o da mesma forma para o cabeçalho


 import React from 'react'; import './App.css'; import Header from './components/header/Header'; class App extends React.Component { constructor(props){ super(props); chatroomName: '-', me: { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" } } render() { return ( <div className="App"> <Header chatroomName={this.state.chatroomName} me={this.state.me} /> </div> ); }; } export default App; 

Agora, no cabeçalho, você precisa adicionar uma entrada com o nome do usuário atual e atribuir um manipulador à alteração, para que possamos transferir o novo nome de usuário para o componente App .


Para isso, adicionamos a função handleChangeName props.updateVisitor à entrada com o nome e chamamos a função de retorno de chamada props.updateVisitor na qual passamos o objeto de usuário com o nome atualizado.


Header.js


 function Header(props) { const [name, setName] = useState(props.me.name ? props.me.name : props.me.uuid.substr(-10)) const handleChangeName = (e) => { setName(e.target.value) let visitor = {...props.me}; visitor.name = e.target.value; props.updateVisitor(visitor) } return ( <header> <LogoHeader/> <RoomTitle chatroomName={props.chatroomName}/> { props.me ? <input className='name-input' value={name} placeholder=' ' onChange={(e) => handleChangeName(e)} /> : null } </header> ); } 

Agora adicione esta função props.updateVisitor ao aplicativo e props.updateVisitor -a para o props.updateVisitor . Até agora, ele apenas atualiza o objeto de usuário no estado, mas, por meio dele, atualizaremos o usuário no servidor.


 onUpdateVisitor = (visitor) => { this.setState({me: visitor}) } 

Então, agora nosso aplicativo se parece com isso e até agora só sabe como atualizar o nome. Seguir em frente


Cabeçalho da sala de bate-papo


Barra lateral


Agora vamos começar a criar uma barra lateral.
A barra lateral estará localizada dentro do componente principal na página Main.js.
Nós criamos componentes \ main \ Main.js , depois criamos um componente com uma lista de usuários components \ member-list \ MemberList.js e criamos imediatamente um componente que exibirá os próprios usuários components \ member-item \ MemberItem.js .


Para deixar mais claro como esses três componentes estão relacionados, dê uma olhada no esboço do projeto no início do artigo.


Os componentes são criados, agora vamos em ordem.
Primeiro, adicione a matriz de usuários ao estado do componente App e adicione o componente Principal . Em seguida, encaminharemos esses usuários para ele.


O aplicativo


 class App extends React.Component { constructor(props) { super(props); this.state = { chatroomName: '-', members: [ { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" }, { is_online: true, name: "", uuid: "mnzxcv97zx6chvo" }, { is_online: false, name: "", uuid: "kjuhv987ashdfoua" }, { is_online: false, name: "", uuid: "jdhnf978WEHJSNDL" }, ], me: { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" } }; } render() { return ( <div className="App"> <Header chatroomName={this.state.chatroomName} me={this.state.me} /> <Main members={this.state.members} me={this.state.me} /> </div> ); }; } 

No componente Principal , adicione o componente MemberList e encaminhe a matriz de usuários para ele.


Main.js


 function Main(props) { return( <section className="Main"> <MemberList members={props.members} /> </section> ); } 

E no componente MemberList, percorremos todos os usuários e, para cada retorno, o componente MemberItem e passamos o objeto de usuário para ele.


MemberList.js


 function MemberList(props) { const members = props.members.map((member) => <MemberItem key={member.uuid} member={member} /> ); return ( <section className="MemberList"> {members} </section> ); } 

O componente MemberItem já está exibindo diretamente o usuário na barra lateral. Nele, verificamos o nome do usuário, se não estiver instalado, e exibimos os 10 primeiros caracteres do identificador. Também verificamos o status online / offline e comparamos o identificador com o identificador do usuário atual, de modo que, ao lado dele, exiba a marca "(Você)".


 function MemberItem(props) { function getName(){ let name = '' if (props.member.uuid === props.me.uuid) { if(props.me.name) { name = props.me.name } else { name = props.me.uuid.substring(props.me.uuid.length-10, props.me.uuid.length); } } else { if(props.member.name){ name = props.member.name } else { name = props.member.uuid.substring(props.member.uuid.length-10, props.member.uuid.length); } } return name; } return( <div className="MemberItem"> <img src={ icon } alt={ props.member.name }/> <span> { getName() } { props.member.uuid === props.me.uuid && " () " } </span> { props.member.is_online && <span className="online">•</span> } </div> ); } 

Feito. Agora, o aplicativo já se parece com isso


Cabeçalho da sala de bate-papo


Lista de Mensagens e Formulário de Submissão


Agora vamos lidar com a lista de mensagens e o formulário de envio.
Primeiro, adicione uma matriz com mensagens ao estado do componente App .


O aplicativo


 this.state = { chatroomName: '-', messages: [ { content: " 1", sender_id: "mnzxcv97zx6chvo", uuid: "dg897sdfg" }, { content: " 2", sender_id: "98s7dfh9a8s7dhf", uuid: "8723hernm" }, { content: "  ", sender_id: "mnzxcv97zx6chvo", uuid: "435nbcv98234" } ], members: [ { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" }, { is_online: true, name: "", uuid: "mnzxcv97zx6chvo" }, { is_online: false, name: "", uuid: "kjuhv987ashdfoua" }, { is_online: false, name: "", uuid: "jdhnf978WEHJSNDL" }, ], me: { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" } }; 

E encaminhe-os para o componente Principal


O aplicativo


  <Main members={this.state.members} messages={this.state.messages} me={this.state.me} /> 

Agora crie os componentes do componente / chat-field / ChatField.js
Conecte-o ao Main e encaminhe as mensagens para ele.


Principal


 function Main(props) { return( <section className="Main"> <MemberList me={props.me} members={props.members} /> <ChatField messages={props.messages} /> </section> ); } 

Em seguida, crie os componentes componentes / message-container / MessageContainer.js
Conecte-o ao ChatField e também encaminhe mensagens para ele.


Chatfield


 function Main(props) { return( <section className="Main"> <MemberList me={props.me} members={props.members} /> <ChatField messages={props.messages} /> </section> ); } 

Depois, percorreremos todas as mensagens e, para cada retorno, o componente que o mostrará.
Vamos criar conponents / message / Message.js . Nele, exibimos o ícone do visitante, seu nome ou identificador, se o nome não for especificado e o próprio texto da mensagem.


Mensagem


 function Message(props) { const getSenderName = () => { if (props.sender) { return props.sender.name ? props.sender.name : props.sender.uuid.substr(-10); } return "Unknown sender"; }; return( <div className="Message"> <div className="message-sender-icon"> <img src={icon} alt="visitor icon"/> </div> <div className="message-bubble"> <div className="message-sender-name">{getSenderName()}</div> <div className="message-content">{props.message.content}</div> </div> </div> ); } 

Agora, em um MessageContainer, percorremos todas as mensagens e, para cada retorno, o componente Message para o qual passamos o objeto de mensagem


Messagecontainer


 function MessageContainer(props) { const messageList = props.messages.map(message => <Message key={message.uuid} sender={props.members.find((member) => member.uuid === message.sender_id)} message={message} /> ); return ( <section className="MessageContainer" ref={messagesContainer}> {messageList} </section> ); } 

Agora o projeto fica assim:


Mensagens na sala de chat


Agora crie um componente com um formulário para enviar mensagens components / send-message-form / SendMessageForm.js . Nele, criaremos uma entrada e um botão para enviar. Quando a entrada é alterada, o texto é gravado no estado e, quando você clica no botão, chamamos a função de retorno de chamada onSendNewMessage e transferimos a mensagem do estado para ele. onSendNewMessage função onSendNewMessage um pouco mais tarde no componente App e a encaminharemos por meio de adereços.


Sendmessageform


 class SendMessageForm extends React.Component { constructor(props) { super(props); this.state = { message: '' }; } currentMessageChanged = (e) => { this.setState({message: e.target.value }); } sendMessageClicked = async (e) => { e.preventDefault(); if (this.state.message.length > 0) { await this.props.onSendNewMessage(this.state.message); this.setState({...this.state, ...{message : ''}}); } } render(){ return ( <section className="SendMessageForm"> <form> <input type="text" value={this.state.message} onChange={this.currentMessageChanged} placeholder="Type message to send"/> <button type="submit" onClick={this.sendMessageClicked} > Send </button> </form> </section> ); } } 

Agora coloque o componente SendMessageForm dentro do ChatField .


Chatfield


 function ChatField(props) { return( <section className="ChatField"> <MessageContainer members={props.members} messages={props.messages} /> <SendMessageForm onSendNewMessage={props.onSendNewMessage}/> </section> ); } 

No componente Principal , também onSendNewMessage função onSendNewMessage no ChatField .


Principal


 <ChatField members={props.members} messages={props.messages} onSendNewMessage={props.onSendNewMessage} /> 

Agora crie esta função no aplicativo e encaminhe-a para Main .


O aplicativo


 onSendNewMessage = async (message) => { console.log(message) } 

O aplicativo


 <Main members={this.state.members} messages={this.state.messages} onSendNewMessage={this.onSendNewMessage} me={this.state.me} /> 

Feito. Agora, quando você clicar no botão enviar mensagem, ele será transferido para o componente App .
Agora, o aplicativo fica assim:


Chatroom final


Portanto, agora tudo é exibido em nosso aplicativo e tudo funciona como deveria, mas até agora com dados estáticos e, para revitalizar nosso bate-papo, você precisa associá-lo ao back-end.


Conexão de back-end


Para fazer isso, a primeira coisa a fazer é instalar o pacote chatix-core .


 npm i chatix-core 

Em seguida, crie uma conta no chatix e crie uma sala de bate-papo. Para fazer isso, vá para chatix.io e registre-se.
Após o registro, você pode ver o identificador do site websiteId na interface do administrador na página de configurações de bate-papo.


Agora criamos uma nova sala de bate-papo com a qual trabalharemos.


Criando uma sala de bate-papo


Retornamos ao nosso projeto e criamos um novo componente através do qual trabalharemos com o servidor.
components \ chatix \ ChatixSDK.js


Nós importamos o ChatixCore nele.


 import ChatixCore from 'chatix-core'; 

No componente ChatixSDK, crie uma instância da classe ChatixCore e passe websiteId como argumento.


 const websiteId = "_WEBSITE_ID"; this.sdk = new ChatixCore(websiteId); 

Agora no this.sdk você pode usar os métodos para trabalhar com a sala de bate-papo. Você pode visualizar a lista de métodos na página do projeto chatix-core


Em seguida, precisamos nos conectar ao servidor e obter dados sobre a sala de bate-papo criada anteriormente. Existem métodos assíncronos start () e getChatroom () para isso .


Depois de receber o objeto da sala de bate-papo, vamos imediatamente pegar o nome e transferi-lo para o aplicativo . Para fazer isso, adicione a função de retorno de chamada updateChatroomTitle(chatroom.title) no aplicativo e chame-a no ChatixSDK .


ChatixSDK


 class ChatixSDK extends React.Component { constructor(props){ super(props); const websiteId = "_WEBSITE_ID"; this.chatroomId = "_CHATROOM_ID"; this.sdk = new ChatixCore(websiteId); this.sdk.start() .then( async () => { try { // refresh information about chatroom and call passed handler const chatroom = await this.sdk.getChatroom(this.chatroomId); if (props.updateChatroomTitle) { props.updateChatroomTitle(chatroom.title); } } catch (err) { console.error(err); } }) .catch((e) => { console.error(e); }); } render(){ return null; } } 

você pode ver this.chatroomId na interface do gerente abrindo a sala de bate-papo desejada.


ChatroomID


Agora, no aplicativo , conectaremos o componente ChatixSDK e lançaremos a função updateChatroomTitle, que atualizará o nome do bate-papo. Também adicionamos um link ref para que possamos acessar esse componente.


O aplicativo


 this.chatixSDK = React.createRef(); 

 setChatroomTitle = (newName) => { const newStateFragment = { chatroomName: newName}; this.setState({...this.state, ...newStateFragment}); }; 

O aplicativo


 render() { return ( <div className="App"> <Header chatroomName={this.state.chatroomName} me={this.state.me} updateVisitor={this.onUpdateVisitor} /> <Main members={this.state.members} messages={this.state.messages} onSendNewMessage={this.onSendNewMessage} me={this.state.me} /> <ChatixSDK ref={this.chatixSDK} updateChatroomTitle={this.setChatroomTitle} /> </div> ); }; 

Feito. Agora, imediatamente após a conexão com o servidor, solicitamos dados de bate-papo, obtemos seu nome e os escrevemos no estado do componente App , e como as alterações no estado fazem com que o componente seja renderizado novamente, o nome no cabeçalho será atualizado automaticamente. Agora, o nome padrão no estado pode ser substituído por uma sequência vazia.


O aplicativo


 chatroomName: '' 

Agora vamos preencher a barra lateral com usuários reais.
Mas antes de obter a lista de usuários, você precisa se conectar ao chat, para isso, no ChatixSDK dentro da função this.sdk.start() , obtemos uma lista de todas as salas de chat do usuário, verifique se ele está conectado à atual e, se não, conecte-o.


ChatixSDK


 const myChatrooms = await this.sdk.getMyChatrooms(); if (myChatrooms.filter(x => x.id===this.chatroomId).length === 0) { await this.sdk.connectToChatroom(this.chatroomId); } 

Depois de garantir que nosso usuário esteja conectado à sala de bate-papo, podemos obter uma lista de participantes desse bate-papo.


ChatixSDK


 // lets get all chatroom members using infinite loop with break on empty server response let membersPage = 1; let allChatroomMembers = []; while(true) { let pagedMembers = await this.sdk.getChatroomMembers(this.chatroomId, membersPage++, 10); allChatroomMembers = [...allChatroomMembers, ...pagedMembers]; if (pagedMembers.length === 0) { break; } } 

Aqui, em um loop infinito, solicitamos aos usuários página por página até conseguirmos todos, assim que conseguimos todos, quebramos o loop. Depois disso, assim como o nome da sala de bate-papo, encaminhamos para o componente pai usando a função de retorno de chamada.


ChatixSDK


 if (props.setChatroomMembers) { props.setChatroomMembers(allChatroomMembers); } 

Agora, no componente App , crie esta função de retorno de chamada setChatroomMembers que classificará os usuários pelo status online / offline e alfabeticamente e os registrará no estado.


App.js


 setChatroomMembers = (members) => { members.sort(this.sortMembers); const newStateFragment = { members: members}; this.setState({...this.state, ...newStateFragment}); } 

Adicione a função de classificação sortMembers . Classifica os usuários por status e em ordem alfabética.


App.js


 sortMembers(a, b) { if (a.is_online === true && b.is_online === false) { return -1; } else if (b.is_online === true && a.is_online === false) { return 1; } else { if (a.name && b.name) { if (a.name.toLocaleUpperCase() > b.name.toLocaleUpperCase()) { return 1; } else if (a.name.toLocaleUpperCase() < b.name.toLocaleUpperCase()) { return -1; } } else if (a.name && !b.name) { return -1; } else if (!a.name && b.name) { return 1; } if (a.uuid > b.uuid) { return -1; } else { return 1; } } } 

Em seguida, encaminhamos a função setChatroomMembers no ChatixSDK .


O aplicativo


 render() { return ( <div className="App"> <Header chatroomName={this.state.chatroomName} me={this.state.me} updateVisitor={this.onUpdateVisitor} /> <Main members={this.state.members} messages={this.state.messages} onSendNewMessage={this.onSendNewMessage} me={this.state.me} /> <ChatixSDK ref={this.chatixSDK} updateChatroomTitle={this.setChatroomTitle} setChatroomMembers={this.setChatroomMembers} /> </div> ); }; 

Agora, imediatamente após a conexão com o servidor, nós, assim como o cabeçalho, solicitamos uma lista de todos os usuários conectados e a escrevemos no estado do componente do aplicativo . E também altere o valor padrão da lista de usuários no estado.


O aplicativo


 members: [] 

Agora, exatamente pelo mesmo princípio, obtemos o objeto do usuário atual e uma matriz de mensagens e também as escrevemos no estado App


ChatixSDK


 // lets load 100 last messages from current chatroom const lastMessages = await this.sdk.getChatroomMessages(this.chatroomId, null, 100); if (props.setChatroomMessages) { props.setChatroomMessages(lastMessages); } if (props.setMe) { const me = this.sdk.getVisitor(); this.props.setMe(me); } 

O aplicativo


 <ChatixSDK ref={this.chatixSDK} setMe={this.setMe} updateChatroomTitle={this.setChatroomTitle} setChatroomMembers={this.setChatroomMembers} setChatroomMessages={this.setChatroomMessages} /> 

Em seguida, enviaremos mensagens.


Nós no aplicativo já temos uma função em onSendNewMessage que exibe enviar uma mensagem para o console. Em vez disso, simplesmente chamaremos o método sendChatroomMessage para enviar uma mensagem do ChatixSDK .
Este é um método assíncrono e retorna o objeto da mensagem enviada na resposta, que adicionamos imediatamente à matriz de mensagens no estado. A propósito, observe que estamos this.chatixSDK link this.chatixSDK criado anteriormente.


O aplicativo


 onSendNewMessage = async (message) => { let receivedMsg = await this.chatixSDK.current.sendChatroomMessage(message); const currentMessages = this.state.messages; currentMessages.push(receivedMsg); const newStateFragment = {messages: currentMessages}; this.setState({...this.state, ...newStateFragment}); } 

Como uma alteração no estado faz com que seja renderizada novamente, a lista de mensagens será atualizada automaticamente. Mas precisamos garantir que, ao adicionar mensagens, a rolagem no bloco de mensagens desça.


Para fazer isso, abra o componente MessageContainer e, usando o gancho useEffect, monitore a matriz de mensagens para alterações e, assim que ela for alterada e as mensagens forem adicionadas, obtemos um bloco scrollHeight com mensagens e role-o na mesma quantidade


 function MessageContainer(props) { const messagesContainer = React.createRef(); useEffect(() => { messagesContainer.current.scrollTop = messagesContainer.current.scrollHeight }, [props, messagesContainer]); const messageList = props.messages.map(message => <Message key={message.uuid} sender={props.members.find((member) => member.uuid === message.sender_id)} message={message} /> ); return ( <section className="MessageContainer" ref={messagesContainer}> {messageList} </section> ); } 

Agora vamos terminar de atualizar o nome de usuário. Já criamos uma entrada no cabeçalho e, quando alterada, encaminhamos o objeto de usuário atualizado para o componente App e lá o exibimos no console. Vamos terminar esta função. Para fazer isso, adicione o método chamado this.chatixSDK.current.updateVisitor(user) a ele, isso atualizará os dados no servidor. E basta atualizar os dados no estado local, para isso, atualizamos o objeto this.state.me e, no array this.state.members também encontramos o usuário atual e o atualizamos. Isso é necessário para atualizar o nome do usuário atual nas mensagens enviadas a ele.


O aplicativo


 onUpdateVisitor = (user) => { this.chatixSDK.current.updateVisitor(user) this.setMe(user) let currentUser = this.state.members.find((member) => (member.uuid === user.uuid)) let currentUserIndex = this.state.members.indexOf(currentUser) let newMembers = [...this.state.members] newMembers[currentUserIndex] = user; this.setState({ members: newMembers }) } 

Agora precisamos aprender como responder às mensagens recebidas, conectando / desconectando usuários e alterando informações e usuários conectados.


Para fazer isso, no arquivo ChatixSDK.js no construtor, precisamos substituir as funções de retorno de chamada. Você pode ver a lista completa de funções e argumentos na página do projeto chatix-core .


No momento, estamos interessados ​​em onChatroomMessageReceived , onMemberConnectedToChatroom , onMemberDisconnectedFromChatroom e onApplyVisitorInfo .


Nós os redefinimos e, para cada função, chamamos nosso retorno de chamada que criaremos no aplicativo .


 this.sdk.onChatroomMessageReceived = (chatroomId, message) => { if (chatroomId === this.chatroomId) { this.props.onNewMessageReceived(message); } }; this.sdk.onMemberConnectedToChatroom = (chatroomId, member) => { if (chatroomId === this.chatroomId && props.addChatroomMember) { this.props.addChatroomMember(member); } }; this.sdk.onMemberDisconnectedFromChatroom = (chatroomId, member) => { if (chatroomId === this.chatroomId && props.removeChatroomMember) { this.props.removeChatroomMember(member); } }; this.sdk.onApplyVisitorInfo = (visitor) => { this.props.onMemberUpdated(visitor) } 

Em seguida, vá para o aplicativo e crie essas funções.


onNewMessageReceived (mensagem)
Essa função pega um objeto de mensagem e simplesmente o adiciona ao estado com o restante das mensagens. , .


App


 onNewMessageReceived = (message) => { const currentMessages = this.state.messages; currentMessages.push(message); const newStateFragment = {messages: currentMessages}; this.setState({...this.state, ...newStateFragment}); } 

App
addChatroomMember(member)
state members. .


App


 addChatroomMember = (member) => { const newStateFragment = {}; const currentMembers = this.state.members; currentMembers.push(member); currentMembers.sort(this.sortMembers); newStateFragment.members = currentMembers; this.setState({...this.state, ...newStateFragment}); } 

App
removeChatroomMember(memberId)
state members state .


 removeChatroomMember = (memberId) => { const currentMembers = this.state.members; const filteredMembers = currentMembers.filter(x=> x.uuid !== memberId); const newStateFragment = {members: filteredMembers}; this.setState({...this.state, ...newStateFragment}); } 

onMemberUpdated(updatedMember)
. . state .


App


 onMemberUpdated = (updatedMember) => { let oldMember = this.state.members.find(member => member.uuid === updatedMember.uuid); oldMember = this.state.members.indexOf(oldMember); let newStateMembers = this.state.members; newStateMembers[oldMember] = updatedMember; this.setState({ members: newStateMembers }) } 

ChatixSDK


ChatixSDK


 <ChatixSDK ref={this.chatixSDK} setMe={this.setMe} updateChatroomTitle={this.setChatroomTitle} setChatroomMembers={this.setChatroomMembers} addChatroomMember={this.addChatroomMember} removeChatroomMember={this.removeChatroomMember} setChatroomMessages={this.setChatroomMessages} onNewMessageReceived={this.onNewMessageReceived} onMemberUpdated={this.onMemberUpdated} /> 

Feito! \ , , / .


alekseyso
Materiais adicionais:
SDK Chatix ()
SDK Chatix (npm)
192 -

Source: https://habr.com/ru/post/pt474492/


All Articles