Розробка публікування текстових постів в мобільній програмі
Текстовий пост — найбільш базовий контент у соціальних програмах. Але «просто TextField + кнопка Надіслати» працює погано: користувач пише довгий текст, мінімізує програму, повертається — чернетка втрачена. Або набирає текст з поганим інтернетом, натискає «Опублікувати», отримує помилку — і знову той же порожній екран. Ці деталі і відрізняють нормальну реалізацію від швидкої.
Редактор текста та форматування
Простий варіант
UITextView (iOS) або BasicTextField/OutlinedTextField (Compose) — якщо форматування не потрібне. Обов'язково: autocorrectionType, spellCheckingType, мінімальна висота з автозбільшенням до максимуму (5-6 рядків). На iOS автозбільшення UITextView — через NSLayoutConstraint на висоту з оновленням у textViewDidChange.
З форматуванням (жирний, курсив, списки)
UITextView + NSAttributedString — мінімальний варіант для iOS. Для повноцінного редактора — RichTextKit (open source, Swift) або кастомна реалізація на NSTextStorage. На Android — Spannable/SpannableStringBuilder з EditText, або Markwon якщо потрібен preview Markdown.
У Flutter популярен flutter_quill — Delta-формат, підтримує вставку зображень, списки, заголовки. Але додає ~2 МБ до бінарника і потребує серіалізації Delta → backend-формат.
Зберігайте текст на сервері в нейтральному форматі — HTML або Markdown — не в Delta і не в NSAttributedString-blob. Клієнт конвертує при завантаженні.
Чернетки
Чернетка — обов'язкова. Реалізація: при кожній зміні тексту зберігайте у UserDefaults (iOS) або DataStore (Android) з debounce 1-2 секунди. Ключ — draft_post або draft_post_{channel_id} якщо чернетка прив'язана до конкретного контексту.
При відкритті екрана створення поста: перевірте наявність чернетки → якщо є, покажіть UIAlertController «Продовжити чернетку?» або одразу відновіть текст. Після публікування або ручного скидання — очистіть.
На Flutter — SharedPreferences або Hive, оновлення через debounceTime(Duration(seconds: 1)) у stream.
Публікування з поганим інтернетом
Оптимістичне оновлення + черга повторів — стандарт для соціальних програм. При натисканні «Опублікувати»:
- Генеруйте локальний
client_post_id(UUID). - Одразу додайте пост до стрічки зі статусом
pending(сіро/напівпрозорий індикатор). - Надішліть запит на сервер. При успіху — замініть
client_post_idна сервернийid, видаліть индикатор pending. - При помилці — покажіть статус «Не надіслано» з кнопкою «Повторити».
На Android для повтору при відновленні сліда використовуйте WorkManager з NetworkConstraint. На iOS — BGTaskScheduler для фонового повтору або повтор на подію NWPathMonitor.
Обмеження та валідація
Ліміт символів — покажіть лічильник, не блокуйте введення до ліміту (підхід Twitter: покажіть -20 червоним). Все одно валідуйте на сервері — клієнтська валідація не захист.
Заборона порожної публікації: кнопка активна тільки при text.trimmingCharacters(in: .whitespacesAndNewlines).count > 0. На Compose — enabled = text.isNotBlank().
Упоминання та хештеги в тексті — окрема задача (парсинг @username та #tag з виділенням). Якщо потрібні — реалізуйте через NSAttributedString/AnnotatedString з regex-паттернами та окремими tap-обробниками.
Етапи роботи
Проектування структури поста та API → UI редактора з чернеткою → логіка публікування з оптимістичним оновленням → обробка помилок та повтор → тестування офлайн-сценаріїв.
Часові рамки
Простий текстовий редактор з чернеткою та повтором — 2-3 дні. З форматуванням, упоминаннями, хештегами — 5-7 днів. Вартість розраховується індивідуально.







