如何在聊天的左侧显示消息

How to display messages on the left side of the chat

我正在尝试设置一个聊天页面,用户可以与我已经创建的聊天机器人进行交互。用户消息在页面右侧弹出,但是当消息发送到服务器并返回响应时,我不确定如何在左侧显示它。

const [messages, setMessages] = useState([
    {
      _id: 0,
      text: 'Hello! How may I assist you?',
      createdAt: new Date().getTime(),
      user: {
        _id: 2,
        name: 'System',
        avatar: require('./assets/splash.png')
      }
    },
    {
      _id: 1,
      text: 'New chat started.',
      createdAt: new Date().getTime(),
      system: true
    }
    
  ]);

  function systemResponse(answer){
    <GiftedChat
    
    />
  }
function handleSend(newMessage = []){

    setMessages(GiftedChat.append(messages, newMessage));
    console.log(newMessage);

    var userText = newMessage[0].text;
    console.log(userText);

    fetch('http://ec2-3-23-33-73.us-east-2.compute.amazonaws.com:5000/chatbot',
    {
      method: 'POST',
      body: JSON.stringify({
        textString: userText,
      })
  })
  .then((response) => response.json())
  .then((json) => {<GiftedChat
  user={{_id: 2, name:"System", avatar: require('./assets/splash.png')}}
  text = 'hello' 
  />})
 
}

  return(
    <GiftedChat
    onSend={newMessage => handleSend(newMessage)}
    messages={messages}
    user={{ _id: 1, name: 'Luke' }}
    placeholder="Ask your quesiton here..."
    showUserAvatar
    alwaysShowSend
    scrollToBottom
    />
  );

您可以使用用户 ID。所以如果消息的UserID和你的userID一样就在右边显示。否则显示在左边。

position: item.user._id === user._id ? 'right' : 'left',

嗨,卢克,你能告诉我们你的消息数组和对象是什么样子的吗,因为它们需要有正确的格式。如果您可以使用此信息更新您的问题,我会更新我的答案。

为此,消息对象必须包含用户 属性,例如:

 {
    _id: 1,
    text: 'Hello developer',
    createdAt: new Date(),
    user: {
      _id: 2,
      name: 'React Native',
      avatar: 'https://placeimg.com/140/140/any',
    },
  },

然后使用 user 属性传递当前用户 ID 的详细信息。喜欢:

 <GiftedChat
  messages={messages}
  onSend={messages => onSend(messages)}
  user={{
    _id: 1,
  }}
/>

该库包含所有逻辑并将消息 ID 与用户 ID 进行比较。如果它们相同,则消息显示在具有不同 ID 的消息的另一侧。

此信息取自文档 React Native Gifted Chat

您的代码正在将 GiftedChat 的一个组件解析为 GiftedChat 组件,而它应该只解析活动用户的消息和对象。我有 re-written 你的代码。

const [messages, setMessages] = useState([
    {
      _id: 0,
      text: 'Hello! How may I assist you?',
      createdAt: new Date().getTime(),
      user: {
        _id: 2,
        name: 'System',
        avatar: require('./assets/splash.png')
      }
    },
    {
      _id: 1,
      text: 'New chat started.',
      createdAt: new Date().getTime(),
      system: true
    }
    
  ]);

function handleSend(newMessage = []){

    setMessages(prevState => [...prevState, newMessage]);
    

    var userText = newMessage[0].text;
    console.log(userText);

    fetch('http://ec2-3-23-33-73.us-east-2.compute.amazonaws.com:5000/chatbot',
    {
      method: 'POST',
      body: JSON.stringify({
        textString: userText,
      })
  })
  .then((response) => response.json())
  .then((json) => {
    setMessages(prevState => [...prevSate, {
      _id: 3,
      text: 'Hello',
      createdAt: new Date().getTime(),
      system: true
   }
  })
 
}

  return(
    <GiftedChat
    onSend={newMessage => handleSend(newMessage)}
    messages={messages}
    user={{ _id: 1, name: 'Luke' }}
    placeholder="Ask your quesiton here..."
    showUserAvatar
    alwaysShowSend
    scrollToBottom
    />
  );

我现在没有时间对此进行测试,但这应该可以。您只需要一个有天赋的聊天实例。对于每条新消息,您应该更新消息状态,这将 re-render 与新消息聊天