Розробка системи коментарів в мобільній програмі
Коментарі складніші за лайки багато разів: вложеність (або її відсутність за дизайном), пагінація, клавіатура перекриває поле введення, @упоминання всередині тексту, модерація. Найчастіша скарга на самописні реалізації — «при відкритті коментарів скролинг прискочує» або «клавіатура перекриває останній коментар». Почнемо саме з цього.
Проблема з клавіатурою
На iOS UITableView або UICollectionView зі списком коментарів + UITextField внизу. При появі клавіатури потрібно піднести весь контент. Правильний спосіб — не трогати contentInset вручну, а використовувати KeyboardLayoutGuide (iOS 15+): view.keyboardLayoutGuide.topAnchor.constraint(equalTo: inputView.bottomAnchor). На iOS 14 та нижче — підписка на UIResponder.keyboardWillShowNotification та оновлення tableView.contentInset.bottom.
Після додавання нового коментара — прокрутка до нього: tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: true). Проблема: якщо scrollToRow викликаний до того як UITableView обробив вставку (insertRows(at:with:)), крахується на NSInternalInconsistencyException. Порядок: спочатку beginUpdates → insertRows → endUpdates, потім scrollToRow.
На Android з Compose — LazyColumn з reverseLayout = true (нові повідомлення внизу) та imePadding() на рівні колони. reverseLayout позбавляє ручного скролу вниз при додаванні коментара.
Структура даних та вложеність
Flat-структура (всі коментарі на одному рівні) — простіше і працює для більшості програм. Instagram так зробив: один рівень коментарів + replies через окремий запит.
Якщо потрібна вложеність: зберігайте parent_comment_id (nullable). Відображайте максимум 2 рівні — глибше не читають. Завантажуйте replies ліниво: за замовчуванням показуйте «N відповідей», по тапу завантажте.
Пагінація — cursor-based: GET /posts/{id}/comments?cursor=<last_id>&limit=20. Для вложених replies — окремий endpoint GET /comments/{id}/replies.
Додавання коментара
Оптимістичне додавання — обов'язково. Локально генеруйте client_comment_id, додайте у список з isPending = true, покажіть спіннер або сіро текст. При успіху — замініть на серверний об'єкт. При помилці — покажіть кнопку «Повторити» рядом з коментарем.
Поле введення — UITextView з авторасширенням (не UITextField): коментарі бувають довгими. Ліміт 500-1000 символів з лічильником. Кнопка «Надіслати» — активна при непустому тексту.
Видалення та модерація
Видалення свого коментара — свайп (iOS) або лонг-тап з bottom sheet. Не видаляйте коментар повністю з ленти, якщо у нього є replies — замініть текст на «Коментар видалений». Іншче дочірні відповіді теряють контекст.
Скарга на коментар — report_comment_id → черга модерації. Автоматичне скриття при N скаргах (настоюється) + ручна перевірка.
Лічильник коментарів у стрічці
Денормалізоване поле comments_count у таблиці поста, інкрементується/декрементується триггером або чергою. При додаванні коментара через програму — оновіть лічильник у UI оптимістично.
Часові рамки
Flat-коментарі з пагінацією, оптимістичним додаванням, видаленням — 2-3 робочих дні. З вложеними replies, упоминаннями, модерацією — 5-7 днів. Вартість розраховується індивідуально.







