Реагировать - Объект доступен через компонент

Поэтому я пытаюсь использовать chatkit, и у них есть функция подключения, которую мы используем.

Однако я пытаюсь получить объект currentuser, чтобы использовать его в других функциях. Тем не менее, объект всегда неопределен, и функция также не определена.

Я использую этот SDK https://docs.pusher.com/chatkit/reference/javascript

Я пробовал как const user, так и this.user.

import React, { Component } from 'react';
import ToggleButton from './ToggleButton';
import ChatBox from './ChatBox';
import { ChatManager, TokenProvider } from '@pusher/chatkit'



class App extends Component {

    constructor(props) {
        super(props);
        this.state = {
            chatbox: true,
            user: ''
        }
        const chatManager = new ChatManager({
            instanceLocator: 'somestring',
            userId: 'JaneLowTeu',
            tokenProvider: new TokenProvider({ url: 'https://us1.pusherplatform.io/services/chatkit_token_provider/v1/somestring/token' })
        })

        this.user = chatManager.connect() // <-- I want to save the object. Tried both this.user and const user =
            .then(currentUser => {

             console.log('Successful connection', currentUser)
                return currentUser;
            })
            .catch(err => {
             console.log('Error on connection', err)
    })
}




    joinRoom = () => {
        this.user.createRoom({ //<- When I click the button i want to createRoom but now it says user is undefined, function is undefined.
              name: 'general',
              private: true,
              addUserIds: ['craig', 'kate']
            }).then(room => {
              console.log(`Created room called ${room.name}`)
            })
            .catch(err => {
              console.log(`Error creating room ${err}`)
            })
    }



    showChatBox = () => {
        console.log(this.state.chatbox);
        if (this.state.chatbox) {
            return (<ChatBox />);
        }
    }

    toggleChatBox = () => {
        this.setState(prevState => ({ chatbox: !prevState.chatbox }))
    }
    render() {
        return (
            <div>
            <div 
            onClick={() => this.joinRoom()}
            >Join Room</div>

            <ToggleButton onClick={this.toggleChatBox}/>
            {this.showChatBox()}
            </div>
            )
    }
}

export default App;

1 ответ

Решение

connect возвращает Promise не currentUser:

// Connect does not return the `currentUser`
this.user = chatManager.connect()
  .then(currentUser => {
    // You need to access the `currentUser` here
    console.log('Successful connection', currentUser)
    return currentUser;
  })
  .catch(err => {
    console.log('Error on connection', err)
  })

Ты почти там. Вам просто нужно получить доступ currentUser от then функционировать и обновлять состояние вашего компонента:

constructor(props) {
  super(props);
  this.state = {
    chatbox: true,
    user: { }
  }
}

chatManager.connect()
  .then(currentUser => {
    this.setState({
      user: currentUser
    });
    console.log('Successful connection', currentUser);
    return currentUser;
  })
  .catch(err => {
    console.log('Error on connection', err)
  })

Тогда вы можете получить доступ this.state.user:

joinRoom = () => {
  this.state.user.createRoom({
     name: 'general',
     private: true,
     addUserIds: ['craig', 'kate']
   }).then(room => {
     console.log(`Created room called ${room.name}`)
   })
   .catch(err => {
     console.log(`Error creating room ${err}`)
   })
 }

Не забудьте изменить user из строки ('') к пустому объекту ({}).

Другие вопросы по тегам