#getstream-io
#getstream-io
Вопрос:
У меня есть приложение, которое я создаю, где у одного пользователя (называемого администратором) есть канал один на один с большинством пользователей. Я понимаю, что при создании чата один на один будет существовать только один канал, независимо от того, кто (администратор или пользователь) создаст его первым. Моя проблема в том, что когда я добавляю пользователя и должен быть установлен новый в одном чате, другие каналы дублируются и в моем списке каналов. Либо это, либо иногда канал просто вообще не подключается, и пользователь остается без чата. Код / псевдокод, который я использую, приведен ниже, кто-нибудь знает, как создать несколько чатов один на один с помощью stream, или почему некоторые каналы могут подключаться дважды?
PS Я редактирую код, чтобы упростить его только до соответствующих частей здесь, в stack overflow, поэтому, пожалуйста, игнорируйте любые простые синтаксические ошибки ниже. Спасибо!
setupUserChats = async (chatClient) => {
let { currentUser, participants } = this.props;
if (the current user is an admin) {
for (let i = 0; i < participants.length; i ) {
let participant = participants[i];
if (if the participant is a user) {
let conversation = await chatClient.channel('messaging', {
name: participant.name,
members: [`${currentUser.participant_id}`, `${participant.participant_id}`]
});
await conversation.watch();
}
}
}
if (currentUser is a user) {
for (let i = 0; i < participants.length; i ) {
let participant = participants[i];
if (participant is an admin) {
let conversation = await chatClient.channel('messaging', {
name: currentUser.name,
members: [`${currentUser.participant_id}`, `${participant.participant_id}`]
});
await conversation.watch();
}
}
}
this.setState({ chatClient: chatClient });
}
Я вызываю другую функцию (описанную ниже), чтобы настроить базовый чат, а затем вызываю приведенный выше код внутри этой следующей функции:
setupChat = async () => {
let { currentUser, participants } = this.props;
let chatClient = await new StreamChat(process.env.REACT_APP_STREAM_API_KEY);
let serverResult = await getStreamToken(currentUser.participant_id);
let userToken = serverResult.token;
await chatClient.setUser(
{
id: currentUser.participant_id,
name: currentUser.name,
},
userToken,
);
const moderatorToAdmin = await chatClient.channel('messaging', `conference-ID`, {
name: "moderator-chat"
});
await moderatorToAdmin.watch();
this.setupUserChats(chatClient);
moderatorToAdmin.addMembers([`${currentUser.participant_id}`]);
this.setState({ chatClient: chatClient });
};
И затем все это отображается здесь:
render() {
const { currentUser } = this.props;
const filters = { members: { $in: [currentUser.participant_id] } }
return (
<div>
<Chat client={this.state.chatClient} theme={'messaging light'} >
<div className="title">Chat</div>
<ChannelList
filters={filters}
Preview={MyChannelPreview}
/>
<Channel Message={MyMessageComponent} >
<Window>
<MessageList />
<MessageInput />
</Window>
<Thread />
</Channel>
</Chat>
</div>
);
}
class MyChannelPreview extends React.Component {
render() {
const { setActiveChannel, channel } = this.props;
return (
<div className={`channel_preview` currentChannelClass}>
<a href="#" onClick={(e) => setActiveChannel(channel, e)}>
{channel._data.name || channel.data.name}
</a>
</div>
);
}
}