Здесь проповедник разработчиков Twilio.
Я думаю, что Уилл Сэмс хорошо подметил в своем комментарии. Вам действительно необходимо установить индекс непрочитанных сообщений, чтобы канал мог иметь действительный индекс непрочитанных сообщений. Из документов:
Примечание: Chat не устанавливает автоматически горизонт потребления . Если вы не установите это явно в своем приложении, горизонт потребления не будет существовать для пользователя в канале. Без горизонта потребления горизонт потребления вашего пользователя (состояние чтения) не будет правильно синхронизироваться между клиентами. Если для пользователя не установлен горизонт потребления на канале, получение неизрасходованных сообщений всегда будет возвращать 0 . Если член канала не имеет статуса потребления, его последний использованный индекс и временная метка будут равны нулю или 0 в зависимости от платформы.
Итак, при создании канала я бы установил сообщения канала неизрасходованному , чтобы начать эту меру. Вы также можете использовать функцию setAllMessagesConsumed
вместо того, чтобы читать индекс последнего сообщения.
Я также заметил, что когда вы устанавливаете последнее сообщение, вы пропускаете установку его индекса на единицу point:
const recent_message = messages.items[messages.items.length - 1]
setLastMessage({
body: recent_message.body,
time: recent_message.timestamp,
})
, что может вызвать проблемы.
Меня беспокоит способ настройки ваших обратных вызовов и эффектов. Когда вы запускаете onTaskSelect
, это выглядит так, как будто вы отправляете идентификатор задачи обратно родителю.
props.onTaskClick(props.task.id.toString());
Предположительно это так, чтобы вы могли видеть все сообщения на главной панели.
Однако я также предполагаю, что это устанавливает задачу в родительском элементе, которая затем передается как props.tasks
этому дочернему элементу. Обратный вызов joinOrCreate
настроен на обновление при обновлении props.task.id
, а useEffect
основан на изменении joinOrCreate
. Поэтому я предполагаю, что всякий раз, когда вы переходите между задачами, вы запускаете очистку и переоценку joinOrCreate
. За исключением того, что здесь нет функции очистки, поэтому вы каждый раз перезагружаете канал для каждого из этих компонентов. Я бы предположил, что это как-то связано с нарушением событий и возможными ошибками, которые вы получаете при повторном щелчке. жизненный цикл объекта канала. Я бы загрузил и присоединил к списку каналов, которые вы собираетесь отображать в родительском компоненте, а затем передал бы объект канала в TaskCard
. Это упростило бы компоненты, поскольку родительский элемент будет обрабатывать данные, а TaskCard
может обрабатывать только рендеринг. Это также будет означать, что при изменении статуса карты (с показа на не показ) вы только повторно визуализируете данные. Таким образом, вы также можете поделиться объектом канала между TaskCard
и представлением чата справа от скриншота (в противном случае я предполагаю, что вам нужно загрузить его и в этот компонент, и это, вероятно, тоже не поможет).
Это лишь некоторые идеи, основанные на том, что я вижу в вашем приложении. Надеюсь, они помогут!