vas3k.club
vas3k.club copied to clipboard
Баг: При отправке нового комментария сбрасывается счетчик непрочитанных
Ситуация
Приходишь в тему почитать комментарии, но когда отвечаешь на один из них, страница перезагружается и все непрочитанные комменты становятся прочитанными.
Решение
Отправлять комментарии асинхронно на сервер.
Сервер все так же будет обновлять все свои счетчики просмотренных сообщений, но в рамках текущего экрана ничего не сбросится, т.к. не будет ререндера
Шаги
- [x] Новый шаблон для отображения комментариев в поиске и профиле. При клике переходить в пост
- [ ] Перенести рендер комментариев на клиент
- [ ] Асинхронная отправка комментариев
Вот я бы тоже с удовольствием послушал best practices для такого. Фича нужная так-то.
Отправлять с сервера отрендеренный HTML кажется странным, но дублировать шаблоны комментариев — ещё большее зло. Мы моментально запутаемся где вносить правки и всё проебём.
Мой вариант: придерживаться json api и попробовать как-то аккуратно перенести рендеринг комментариев с сервера на клиент. Только тех, что под постом. Но не подгружать их асинхронно, а только рендерить, как сейчас сделано с голосованием, например. Так мы избежим раздражающих лоадеров и SPA.
Вещи, которые надо не забыть при этом:
- Комментарии рендерятся не только в постах, но и в профиле юзера или в поиске, например. Самый лучший вариант там — сделать для них отдельный шаблон и оставить его на сервере. На них давно жалуются, что они выглядят как комментарии, но не работают как они (кнопка ответить например ничего не делает). Вот и пофиксим :)
- Сам виджет vote теперь тоже нужно будет как-то засунуть внутрь клиентского рендеринга (лучше с минимальными изменениями), а в остальных местах использовать заглушку, как ты сделал в поиске. Так норм.
- У комментариев есть несколько типов (комент, реплай, пиннед, батл) и в будущем они могут расширяться. Хз как принято делать такое на Vue-виджетах, наверное нужна какая-то иерархия или базовый класс.
- JSON-эндпоинты решили делать через добавление .json к уже имеющимся. Посмотри как сделано получение профиля юзера, там есть сразу и вьюха и вся нужная авторизация.
Мне нравится подход, аналогичный upvote. Не вижу большой проблемы отрендерить и комментарий, и кнопку.
Я посмотрю, как можно решить историю с шаблонами, у меня нет опыта во vue, может есть какое-то умное решение. В идеале сервер больше ничего о них не должен знать.
Одним PR тут не обойдешься, давай делать кусками:
- перенос рендеринга комментариев на клиент
- новый шаблон для рендера комментариев в профиле пользователя и поиске
- добавление нового комментария
В идеале сервер больше ничего о них не должен знать.
Да, именно. На сервере теперь можно будет завести один общий шаблон комментария, который мы будем использовать в поиске или профиле юзера. Потом подтюним ему стили и добавим в его блок название поста, а то многие спрашивают как из поиска по комментам перейти в пост. Одного шаблона для этого хватит.
Одним PR тут не обойдешься, давай делать кусками
Я бы поменял местами 1 и 2. Ведь если ты сразу перенесешь рендеринг на клиент, это автоматом сломает поиск и профиль :)
Добавил туду в первый пост
Есть два варианта показать комменты — использовать стандартный блок комментария, либо уменьшенный (ака reply). Я не уверен, что комменты это самое важное в поиске, поэтому показывать их минифицированно мне кажется хорошей идеей.
Ниже сравнение норм vs сжато:
Норм | Мини |
---|---|
![]() |
![]() |
![]() |
![]() |
Давай показывать полноценные. Пока не уверен как лучше, но если чо потом поправим
Заметочка на будущее — надо делать тизеры. В поиске комменты занимают кучу места, а посты торчат в виде заголовков :(