Chat
Чат приложения состоит из 2 каналов:
1. Связь приложения с сокет-сервером.
2. Связь приложения с бекендом.
Для реализации статусов доставлено/прочитано при подгрузке сообщений с бекенда приложения, необходимо при запросе
https://kitappchat.docs.apiary.io/#reference/0/get-chat-history/get-chat-history
{ "id": 11, "chat_id": 5, "user_id": 5, "message": "test", "created_at": "2019-05-30 19:21:40", "is_read": 0, "first_name": "delete", "last_name": "user" }
считывать параметр is_read у каждого сообщения(где user_id равен текущему пользователю), если он равен 1 - выводить что сообщение прочитано, в противном случае - доставлено.
Логика обработки сообщений чата следующая:
Когда пользователь открывает чат X, (X - chat ID) необходимо сразу слушать этот канал через метод history, вместе с этим отправить запрос на получение истории чата на N последних сообщений(например, количество непрочитанных)
https://kitappchat.docs.apiary.io/#reference/0/get-chat-history/get-chat-history
собрать все id сообщений у которых is_read != 1 в массив и пометить их как прочитанные методом
https://kitappchat.docs.apiary.io/#reference/0/send-messages-statuses-as-read/send-messages-statuses-as-read
Далее, слушать из канала X все новые сообщения(если какие-то сообщения есть на данный момент в history этого канала, игнорируем их).
Если пользователь отправляет сообщение, необходимо в момент отправки проверять дополнительно методом presense канал "X_online" X - chat ID на наличие user_id отличного от текущего(отправителя данного сообщения), если есть, то помечать сообщение как прочитанное, если нет - помечать как доставленное.
При прослушивании же истории добавлять все новые сообщения из канала "X" в конец списка
{ "result": { "publications": [ { "data": { "user_id": 65, "first_name": "Test", "last_name": "_live", "message": "Test" } } ] } }
при этом выполняя скролл вверх, необходимо пропустить при подгрузке N сообщений, которые были выведены из сокет-канала.
https://github.com/centrifugal/centrifuge-js