Please use this identifier to cite or link to this item:
https://er.chdtu.edu.ua/handle/ChSTU/8999| Title: | Дослідження інформаційних систем для надання психологічних послуг |
| Authors: | Чичужко, Марина Володимирівна Ковальчук, Сергій Андрійович |
| Issue Date: | Jan-2025 |
| Abstract: | В результаті виконаної роботи отримано такі ключові результати:: Розроблена модель класифікації психологічних застосунків, що дозволяє чітко визначити підхід до проектування таких систем і відрізняти їх за функціональними можливостями для надання психологічної допомоги користувачам. Проведено аналіз сучасних вітчизняних і закордонних технологій, що використовуються в області надання психологічної підтримки через цифрові платформи, що дозволило вибрати оптимальні засоби для створення додатку. Розроблена узагальнена модель програмно-апаратних засобів для психологічного застосунку, що включає необхідні технології, інструменти і програмні засоби для розробки ефективного і зручного інтерфейсу та функціоналу. Система, яка забезпечує анонімність і конфіденційність, адаптована до потреб користувачів і дозволяє отримати психологічну допомогу у зручному і доступному форматі. Зроблений акцент на наданні зворотного зв'язку для оперативного реагування на потреби користувачів. Верифікація працездатності застосунку проведена через тестування, що підтвердило відсутність помилок та забезпечило безперебійну роботу всіх функцій. Це дозволило значно зменшити час на впровадження та підвищити ефективність надання психологічної допомоги через мобільний додаток |
| URI: | https://er.chdtu.edu.ua/handle/ChSTU/8999 |
| Appears in Collections: | 123 Комп’ютерна інженерія (Спеціалізовані комп’ютерні системи) |
Files in This Item:
| File | Description | Size | Format | |
|---|---|---|---|---|
| М_123_2023_Ковальчук.pdf Restricted Access | 1.97 MB | Adobe PDF | View/Open Request a copy |
Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.
Extracted text
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОІЧНИЙ УНІВЕРСИТЕТ
ФАКУЛЬТЕТ ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ І СИСТЕМ
КАФЕДРА РОБОТОТЕХНІКИ ТА СПЕЦІАЛІЗОВАНИХ
КОМП’ЮТЕРНИХ СИСТЕМ
Пояснювальна записка
до кваліфікаційної роботи
освітнього ступеню «магістр»
на тему: ДОСЛІДЖЕННЯ ІНФОРМАЦІЙНИХ СИСТЕМ ДЛЯ
НАДАННЯ ПСИХОЛОГІЧНИХ ПОСЛУГ
Виконав: студент 2 курсу, групи МСКС-2307
спеціальності 123 «Комп’ютерна інженерія»
(освітня програма «Спеціалізовані
комп’ютерні системи»)
Сергій КОВАЛЬЧУК
(прізвище та ініціали)
Керівник Марина ЧИЧУЖКО
(прізвище та ініціали)
Рецензент Людмила ПОНОМАР
(прізвище та ініціали)
Черкаси 2024 рік
2
ОСНОВНІ УМОВИ
ВСТУП ..................................................................................................................... 3
РОЗДІЛ 1 СТАН ПРЕДМЕТУ ДОСЛІДЖЕННЯ ТА ФОРМУВАННЯ ЗАДАЧ
................................................................................................................................... 8
1.1 Сфери застосування додатків психологічної допомоги ............................ 9
1.2 Класифікація психологічних онлайн-платформ ...................................... 14
1.3 Аналіз спеціалізованих, готових платформ ............................................. 20
1.3.1 Аналіз інформації платформи «Ти як?» ............................................ 20
1.3.2 Аналіз інформації онлайн-платформи TellMe .................................. 24
1.3.3 Аналіз інформації американського сайту BetterHelp ....................... 29
1.4 Основні характеристики інформаційних систем, призначених для
надання психологічних послуг ........................................................................ 33
Висновки до розділу 1 ...................................................................................... 34
РОЗДІЛ 2. УЗАГАЛЬНЕНА МОДЕЛЬ ПРОГРАМНО-АПАРАТНИХ
ЗАСОБІВ ІНФОРМАЦІЙНОЇ СИСТЕМИ ДЛЯ НАДАННЯ
ПСИХОЛОГІЧНИХ ПОСЛУГ ЧЕРЕЗ ВЕБ-САЙТ ........................................... 35
2.1 Дослідження програмних засобів .............................................................. 35
2.2 Апаратні засоби використані під час розробки застосунку
психологічної підтримки .................................................................................. 43
Висновки до розділу 2 ...................................................................................... 44
РОЗДІЛ 3. РОЗРОБКА ЗАСТОСУНКУ ДЛЯ НАДАННЯ ПСИХОЛОГІЧНОЇ
ДОПОМОГИ. ТЕСТУВАННЯ ............................................................................. 45
3.1 Узагальнена структура застосунку психологічної допомоги ................. 45
3.2 Принцип декомпозиції концептуальних моделей ................................... 46
3.3 Проектування дизайну застосунку психологічної допомоги та
програмного коду .............................................................................................. 46
Висновки до розділу 3 ...................................................................................... 51
ВИСНОВКИ ........................................................................................................... 52
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ ............................................................. 53
3
СПИСОК УМОВНИХ ПОЗНАЧЕНЬ ТА СКОРОЧЕНЬ
DS (Discord) – це безкоштовна платформа для текстового, голосового
та відеоспілкування, що дозволяє створювати сервери для спілкування в
спільнотах або з друзями. Використовується як для особистих, так і
професійних цілей.
DSB (Discord Bot) – це програмний агент, інтегрований у Discord, який
виконує автоматизовані завдання. Боти можуть керувати сервером,
забезпечувати розваги, обробляти команди та багато іншого.
TG (Telegram) – це безкоштовний месенджер з акцентом на швидкість і
безпеку, що дозволяє користувачам обмінюватися текстовими
повідомленнями, медіа, файлами та створювати чати різного масштабу,
включаючи публічні канали і групи.
JS (JavaScript) – це високорівнева мова програмування, яка
використовується для створення динамічних і інтерактивних елементів на
веб-сайтах. JavaScript дозволяє змінювати контент на сторінках, створювати
анімації, обробляти події та взаємодіяти з сервером.
NJS (Node.js) – це середовище виконання JavaScript на сервері. Воно
дозволяє запускати JavaScript поза браузером і розробляти серверні додатки
високої продуктивності.
EJS (Express.js) – це мінімалістичний веб-фреймворк для Node.js, який
спрощує створення серверних додатків і API. Express.js забезпечує гнучкість
і масштабованість під час розробки веб-додатків.
4
Вступ
Актуальність теми.
В останні роки актуальність психологічної допомоги через засоби IT
значно зросла, що обумовлено розвитком технологій і потребами сучасного
суспільства. Використання IT у сфері психології дозволяє надавати
підтримку швидше і доступніше для широкої аудиторії. Основні переваги
психологічної допомоги через IT:
1) Одна з основних характеристик – це висока швидкість доступу до
допомоги. Психологічні консультації можуть бути надані в онлайн-режимі
без затримок, що дозволяє оперативно вирішувати проблеми.
2) IT-засоби дозволяють персоналізувати підхід до кожного клієнта,
враховуючи їхні індивідуальні потреби. Платформи для психологічної
підтримки можуть адаптуватися під запити користувача.
3) Інтерактивність технологій дозволяє встановлювати діалог між
психологом і клієнтом у зручному форматі, забезпечуючи постійний
зворотний зв'язок і можливість моніторингу емоційного стану. Схильність
користувачів Internet до отримання інформації сприяє позитивному
сприйняттю та високій засвоюваності матеріалу.
4) Онлайн-засоби допомагають краще засвоювати психологічні
техніки завдяки доступності і можливості постійного використання різних
матеріалів і вправ.
5) Психологічна допомога через IT не обмежена територіальними або
часовими рамками, що дозволяє отримувати підтримку незалежно від місця
знаходження.
6) Вартість таких послуг часто є нижчою порівняно з традиційними
консультаціями, що робить психологічну допомогу більш доступною.
5
7) Психологічна допомога через IT є необхідною частиною сучасного
життя і сприяє збереженню ментального здоров’я в умовах швидких змін та
стресу.
Розвитку психології присвячено низку робіт таких видатних
дослідників, як Зигмунд Фройд, Карл Юнг, Абрахам Маслоу, Б. Ф. Скіннер,
Карл Роджерс, Жан Піаже, Альберт Бандура, Ерік Еріксон та ін. У їхніх
працях отримано багато цінних результатів, що стосуються розвитку теорій
особистості, поведінки та когнітивного розвитку. Проте питання
застосування сучасних психологічних концепцій у різних галузях життя та
суспільства залишається частково невирішеним, тому ця тема є актуальною
для подальших досліджень.
Зв'язок роботи з науковими програмами, планами, темами.
Дослідження виконано відповідно до тематики бюджетних науково-
досліджних робіт ЧДТУ: «Методи, моделі при обробці інтелектуальних,
інформаційних технологій для високоефективних обчислювальних та
локальних підсистем управління в проблемно-орієнтованих системах» (№
0106U004501).
Мета дослідження та формування задач.
Метою дослідження є створення ефективного додатку для надання
безкоштовної психологічної допомоги всім бажаючим шляхом синтезування
основних найкращих моделей психологічної підтримки, визначених через
якісне оцінювання існуючих сучасних відчизняних та закордонних
платформ. Для досягнення поставленої мети розв’язуються наступні задачі:
− проведення аналізу стану предмету дослідження та формування задач;
− узагальнена модель програмно-апаратних засобів психологічної
підтримки через додаток;
6
− розробка моделі додатку для надання психологічної допомоги та його
тестування;
Об’єкт дослідження.
Об’єктом дослідження є процеси відомих платформ для надання
психологічної допомоги.
Предмет дослідження.
Предметом дослідження є моделі відомих платформ для психологічної
допомоги.
Методи дослідження.
Методи дослідження базуються на використанні методів теорії
психологічної підтримки, алгоритмів, візуалізації, програмування,
налаштування та тестування додатків.
Наукова новизна отриманих результатів полягає в
наступному:
1. Розроблена унікальна модель класифікації додатків для надання
психологічної допомоги на основі дослідження сучасних вітчизняних і
закордонних платформ, що використовуються в цій сфері. Це сприяє
подальшому розвитку підходу до побудови детальних класифікацій, які
дозволяють чітко визначити відповідну модель в рамках проєктованої
системи.
2. Створена модель додатку для психологічної підтримки, базуючись
на інформаційних особливостях, що впливають на його ефективність.
Застосовано принцип декомпозиції частин концептуальних моделей додатку,
що полегшує і прискорює процес його розробки.
Практична значимість результатів дослідження.
Практична значимість проведеного дослідження полягає у реалізації
наукових висновків у вигляді конкретних інженерних рішень у сфері
психологічної підтримки:
− На основі аналізу та реляційного моделювання даних, проведеного
щодо популярних програм для надання психологічної допомоги, було
7
виконано якісне та кількісне оцінювання їх характеристик. Це дозволило
визначити ключові напрями для вдосконалення функціоналу аналогічних
продуктів.
− Проведене тестування розробленого застосунку «Анонімний
психолог» підтвердило його працездатність. Завдяки візуалізації результатів
оцінювання була виявлена відсутність технічних помилок, що гарантує
коректність роботи програми.
Апробація.
Апробація роботи проведена на студентській науковопрактичної
конференції ЧДТУ: 18–20 квітня 2023 р.
Публікації.
1. Інформаційні технології у сфері надання психологічних послуг /
С. А. Ковальчук, М. В. Чичужко // Збірник тез доповідей студентської
науковопрактичної конференції ЧДТУ: 18–20 квітня 2023 р. [Електронний
ресурс] / [упоряд.: Єгорова О. В., Захарова О. В., Кисельов В. Б. та ін.]; Мво
освіти і науки України, Черкас. держ. технол. унт. – Черкаси: ЧДТУ, 2023. –
C. 23.
2. Аналіз таблично-алгоритмічних методів формування функцій у
двійково-кодованих системах числення / В. М. Лукашенко, Л. Р. Педченко, С.
А. Ковальчук, Г. А. Лукашенко // Комп’ютерне моделювання та оптимізація
складних систем (КМОСС-2023): матеріали VІІI Міжнародної науково-
технічної конференції (м. Дніпро, 1-3 листопада 2023 року); Міністерство
освіти і науки України, Державний вищий навчальний заклад «Український
державний хіміко-технологічний університет». Дніпро : ДВНЗ УДХТУ, 2023.
С. 90-91.
8
РОЗДІЛ 1
СТАН ПРЕДМЕТУ ДОСЛІДЖЕННЯ ТА ФОРМУВАННЯ ЗАДАЧ
Відомо, що додаток психологічної допомоги – це спеціально
розроблений мобільний або веб-додаток, спрямований на надання
психологічної підтримки та допомоги користувачам у різних життєвих
ситуаціях, наприклад, для:
− покращення психічного здоров'я,
− зниження рівня стресу,
− подолання тривожності,
− підтримки в кризових ситуаціях,
− стимулювання користувачів до саморозвитку та роботи над собою,
− надання доступу до практик самодопомоги (наприклад, медитацій,
вправ для дихання),
− консультаційної підтримки від спеціалістів або штучного інтелекту.
Під час створення таких додатків особливо важливу роль відіграє
користувацький інтерфейс, оскільки дизайн і зручність використання
визначають перше враження користувача та фактично формують оцінку
всього сервісу.
Додатки психологічної допомоги стали необхідністю в сучасному світі,
оскільки вони надають:
− ефективний засіб підтримки психічного здоров'я,
− доступ до надійних ресурсів психологічної допомоги,
− можливість швидкої комунікації з психологами,
− інші функції, які сприяють покращенню добробуту.
Аналіз існуючих додатків психологічної допомоги дозволяє краще
реалізувати спеціалізований додаток, який дасть змогу уникнути недоліків,
виявлених в інших рішеннях, та об'єднати всі переваги оглянутих аналогів
для розробки або вдосконалення сучасної моделі психологічної допомоги.
9
Для аналізу сучасних додатків інтерес представляє сфера їхнього
застосування, яка розглянута нижче.
1.1 Сфери застосування додатків психологічної допомоги
Сучасний світ базується на інформації та спілкуванні, і психологічні
додатки стали невід'ємною складовою цієї реальності.
Вони знаходять застосування в безлічі сфер, деякі представлено на
рис.1.1.
Рис. 1.1. Блоксхема сфери використання психологічних додатків
10
Аналіз блок-схеми сфер застосування додатків психологічної допомоги
(рис. 1.1) свідчить, що такі програми є важливим інструментом для доступу
до психологічної допомоги в різноманітних сферах та темах.
Значення та універсальність додатків психологічної допомоги можна
класифікувати таким чином
1. Забезпечують зручний доступ до психологічної підтримки та
знань, дозволяючи користувачам:
− отримувати рекомендації щодо самопомочі,
− вивчати методи подолання стресу,
− покращувати навички саморегуляції,
− отримувати консультації з питань психічного здоров'я,
− розвивати емоційну стійкість,
− підвищувати самооцінку,
− та охоплювати інші важливі аспекти особистісного розвитку.
Такі додатки відкривають доступ до підтримки у сферах, де раніше її
отримати було важко або взагалі неможливо.
2. Розширення доступності психологічної допомоги.
Для психотерапевтів онлайн-платформа це не просто спосіб
представлення себе, а потужний інструмент для надання підтримки більшій
кількості людей, які її потребують. Цифрові рішення дозволяють фахівцям:
− пропонувати психологічну підтримку та терапевтичний супровід
усім, хто цього потребує, незалежно від їх місцезнаходження,
− забезпечують зручний доступ до консультацій та постійний
терапевтичний контакт між клієнтом і психологом.
− Спеціалізовані платформи психологічної допомоги, такі як
"Телетерапія" або "Mindly", стали надійними помічниками у забезпеченні
емоційного благополуччя людей у цифрову епоху.
11
Спеціалізовані майданчики для психологічної допомоги, на кшталт
Psychology Today чи 7 Cups, перетворилися на еталони сучасного
дистанційного консультування.
3. Психологічна просвіта та особистісне зростання.
Завдяки впровадженню інноваційних методів підтримки психічного
здоров'я, спеціалізовані онлайн-ресурси трансформують традиційну
психотерапію у доступний формат психологічної допомоги, що дає змогу
клієнтам:
− отримувати професійну підтримку незалежно від географічного
розташування,
− мати цілодобовий доступ до корисних матеріалів та рекомендацій з
самодопомоги,
− взаємодіяти з досвідченими фахівцями та групами підтримки у
безпечному онлайн-просторі.
4. Терапевтична взаємодія та підтримка.
Спеціалізовані канали психологічної комунікації:
− Індивідуальні онлайн-сесії,
− Групова терапія,
− Кризові чати; Захищені засоби терапевтичного зв'язку:
− Відеоконсультації,
− Захищені чат-системи, які забезпечують конфіденційне спілкування з
психологом у зручний час із будь-якої локації. Формування терапевтичного
простору для:
− людей зі схожими проблемами,
− груп взаємодопомоги,
− учасників психотерапевтичних програм у безпечному онлайн-
середовищі.
12
6. Доступність та комфорт психологічної допомоги.
Цифрові платформи для запису на консультації, вибору зручного часу
терапії та формату психологічної підтримки роблять процес отримання
фахової допомоги простішим та більш персоналізованим. Клієнти мають
можливість оперативно знайти відповідного спеціаліста та записатися на
сеанс через інтернет, уникаючи зайвих дзвінків чи особистих візитів для
попереднього запису, що особливо важливо для людей у кризовому стані чи з
підвищеною тривожністю.
7. Ефективність психологічної підтримки. Спеціалізовані онлайн-
платформи оптимізують процес отримання психотерапевтичної допомоги.
Вони раціоналізують такі аспекти як:
− пошук відповідного фахівця за конкретним запитом,
− гнучке планування сеансів терапії,
− доступ до корисних матеріалів з самодопомоги,
− забезпечують комплексний супровід в єдиному цифровому просторі,
що значно полегшує процес роботи над психологічним здоров'ям та
особистісним зростанням.
Демократизація психологічної допомоги та підтримки.
Спеціалізовані психологічні платформи роблять ментальну допомогу більш
доступною. Вони надають можливість фахівцям створювати персональні
кабінети, ділитися професійним досвідом та публікувати корисні матеріали.
Це розширює доступ до якісної психологічної підтримки для всіх, хто її
потребує.
Сучасні платформи психологічної допомоги активно розвиваються у
різних напрямках, оскільки вони забезпечують широкі можливості для
терапевтичної роботи, психоедукації та взаємодії. Основні переваги
використання спеціалізованих платформ у сфері психологічної допомоги:
13
1. Професійна присутність Онлайн-платформа виступає професійним
простором психолога, доступним для клієнтів цілодобово, де можна
ознайомитися з методами роботи та спеціалізацією фахівця
2. Психоедукація та просвітництво.
Платформи дозволяють розміщувати освітній контент, статті та
відеоматеріали, що сприяє підвищенню психологічної грамотності
населення
3. Онлайн-консультування.
Розвинена система дистанційних консультацій дозволяє клієнтам
отримувати психологічну допомогу в зручному форматі
4. Обмін досвідом.
Платформи забезпечують простір для обміну професійним
досвідом між фахівцями та поширення важливої інформації про
психічне здоров'я
5. Навчання та розвиток.
Ресурси використовуються для проведення онлайн-тренінгів,
групової терапії та доступу до методичних матеріалів
6. Терапевтичні спільноти.
Спеціалізовані форуми та групи підтримки дозволяють людям зі
схожими проблемами знаходити розуміння та підтримку
7. Запис на консультації.
Платформи забезпечують зручну систему запису на
індивідуальні та групові сесії через інтернет
8. Кризова підтримка.
Спеціалізовані сервіси надають можливість отримати екстрену
психологічну допомогу через онлайн-чати та гарячі лінії
9. Інформаційні ресурси.
Психологи використовують платформи для публікації
професійних матеріалів, рекомендацій та практичних порад
10. Координація роботи.
14
Платформи дозволяють ефективно організовувати
терапевтичний процес, вести документацію та аналізувати результати
роботи
Загалом, спеціалізовані психологічні платформи відкривають широкі
можливості для надання професійної допомоги, розвитку психологічної
культури та підтримки ментального здоров'я населення. Вони стали
невід'ємною складовою сучасної системи психологічної допомоги.
Онлайн-платформи психологічної підтримки трансформували
традиційний формат надання психологічних послуг завдяки своїй
доступності та функціональності. Вони виступають надійним містком між
фахівцями та людьми, які потребують допомоги, забезпечуючи
конфіденційний та безпечний простір для терапевтичної роботи. Аналізуючи
різні аспекти використання таких платформ, можна констатувати їх ключову
роль у розвитку сучасної психологічної допомоги, сприяючи підвищенню її
доступності, ефективності та якості.
1.2 Класифікація психологічних онлайн-платформ
Сучасні цифрові рішення у сфері психологічної допомоги представлені
різними типами платформ, кожна з яких має своє призначення та
особливості. Основні типи психологічних онлайн-платформ включають:
− Базова психологічна платформа виступає початковим рівнем онлайн-
присутності спеціаліста. Хоча сучасні версії мають покращений інтерфейс та
функціональність, їх основне призначення залишається незмінним.
Аналіз показує, що базова платформа зазвичай містить декілька
ключових розділів з інформацією про психолога, напрямки роботи, формати
консультування та контактні дані. Можуть бути додані розділи "Корисні
матеріали" чи "Актуальне". Важливо зазначити, що такі платформи мають
обмежену інтерактивність, а взаємодія з клієнтом відбувається переважно
через форму запису на консультацію або зворотного зв'язку.
15
− Професійна терапевтична платформа являє собою комплексний
ресурс, що поєднує інформаційну та практичну складові надання
психологічної допомоги. Фактично, це повноцінний цифровий кабінет
психолога.
Аналіз показує, що порівняно з базовою платформою, професійний
ресурс можна порівняти з повноцінним терапевтичним центром, який
забезпечує всебічну підтримку клієнтів. Такі платформи створюють
враження надійності та професіоналізму фахівця.
− Психологічні портали є багатофункціональними онлайн-системами,
орієнтованими на різноманітні запити у сфері ментального здоров'я. Це
ресурси, що пропонують широкий спектр психологічних послуг та
матеріалів.
Аналіз показує, що ключовою особливістю таких порталів є високий
рівень інтерактивності. Вони можуть включати:
− відеотеку терапевтичних сесій
− освітні матеріали
− групи підтримки
− онлайн-тестування
− системи зворотного зв'язку
− різноманітні інструменти для самодопомоги.
Визначальною рисою порталів є їхня здатність комплексно
задовольняти різні потреби клієнтів у сфері психологічної допомоги та
особистісного розвитку.
Психологічні портали можуть об'єднувати різноманітні ресурси та
сервіси в єдиному інтегрованому інтерфейсі, що робить їх унікальними в
порівнянні з іншими типами додатків.
Однією з ключових особливостей таких порталів є їхня здатність
задовольняти різні потреби користувачів, пропонуючи індивідуалізовані
послуги та можливості для різних груп людей.
16
Успішні психологічні портали враховують різноманітні інтереси своєї
аудиторії, забезпечуючи зручний та інтуїтивно зрозумілий інтерфейс для
взаємодії та отримання корисної інформації.
Психологічні сервіси є платформами, які спеціалізуються на вирішенні
конкретних потреб користувачів або наданні певних послуг. Це віртуальні
ресурси, що виконують одну або кілька схожих функцій. Однією з основних
характеристик таких сервісів є акцент на вирішенні конкретної проблеми або
наданні певної підтримки для користувачів.
Аналіз функціоналу показує, що сервіси можуть включати широкий
спектр можливостей, від онлайн-консультацій до інтерактивних тренінгів з
саморозвитку. Важливою рисою є спрощення процесів або вирішення
конкретних задач. Такі ресурси зазвичай спрямовані на ефективну взаємодію
з користувачами, пропонуючи різноманітні канали комунікації, такі як чати,
форуми та системи обміну повідомленнями. Успішний психологічний сервіс
враховує потреби своєї цільової аудиторії та надає їм зручні інструменти для
досягнення їхніх цілей або вирішення специфічних проблем. Однією з
основних вимог до таких сервісів є їхній фокус на конкретній допомозі чи
задачі, яку вони пропонують.
Психологічні онлайн-платформи функціонують як електронні ресурси,
що надають можливість користувачам отримувати психологічні послуги
через Інтернет. Їхнє основне завдання полягає в створенні віртуального
простору для надання психологічної підтримки. Головна відмінність онлайн-
платформ від традиційних методів консультування полягає в тому, що вони
функціонують в режимі онлайн, не вимагаючи фізичної присутності клієнтів
у конкретному місці.
На рис. 1.2 приведено приклад проєкту психологічної підтримки, cайт
розташований за посиланням: https://howareu.com// [1].
17
Рис. 1.2. Модель онлайн-платформи “Ти як?”
Аналіз даних показує, що психологічні платформи стали важливою
частиною електронної комерції, сприяючи розвитку та спрощенню процесів
надання послуг у сфері психічного здоров'я. Такі платформи пропонують
широкий спектр послуг і ресурсів, охоплюючи різноманітні напрямки, від
онлайн-консультацій і психотерапії до програм саморозвитку та медитацій. У
цілому, психологічні платформи стали невід’ємною частиною сучасної
системи надання допомоги, відображаючи та впливаючи на зміни в потребах
користувачів та підходах до психічного здоров'я. На рис. 1.7 наведено
приклад такої психологічної платформи.
Промо-сайти – це веб-ресурси, створені спеціально для організації
різноманітних заходів, таких як конкурси, акції, розіграші призів або
презентації нових психологічних послуг і програм. Їхня мета полягає в тому,
щоб виділити певну подію чи акцію, відокремлюючи її від основного сайту
або корпоративного порталу.
Аналіз інформації визначає, що промо-сайти стали важливою
складовою електронних платформ для психологічної допомоги, адже вони
створюють специфічне середовище, яке підтримує ефективну взаємодію.
Ці сайти допомагають організаціям виділитися серед конкурентів,
привертаючи увагу аудиторії через цікаві та захопливі ініціативи. Промо-
18
сайти, зазвичай, мають яскравий і привабливий дизайн, який відповідає
тематиці заходу чи кампанії.
Засоби взаємодії, такі як:
− опитування,
− коментарі,
− конкурсні форми
дозволяють створити активну спільноту, заохочуючи користувачів до
участі та спілкування. Промо-сайти особливо корисні для великих установ,
які вже мають основний ресурс, оскільки вони допомагають акцентувати
увагу на певних ініціативах, не перевантажуючи головну платформу.
Це є особливо ефективним для тривалих програм підтримки, акцій чи
заходів, які можуть тривати від кількох тижнів до кількох місяців.
Сайти-форуми виступають в якості онлайн-платформ для обговорення
різноманітних тем і обміну інформацією між користувачами. Головна мета
форумів полягає в створенні спільноти, де люди можуть обговорювати:
− свої інтереси,
− ділитися думками,
− ставити питання,
− отримувати відповіді від інших учасників.
Це є одним з шляхів вдосконалення сучасних платформ для
психологічної допомоги.
Аналіз інформації визначає, що основною характеристикою сайтів-
форумів є можливість створення тематичних розділів і підтем, що допомагає
користувачам знаходити відповідні теми для обговорення. Форум може
охоплювати широкий спектр тем, від психологічних методик до обговорення
особистих досвідів, надаючи користувачам можливість ділитися своїми
думками та отримувати підтримку від однодумців.
Сайти-форуми також можуть слугувати важливим ресурсом для
отримання порад, обговорення трендів у психології та розвитку спільноти в
онлайн-середовищі.
19
Інформаційні сайти, створені для надання користувачам різноманітної
інформації на теми психологічної допомоги, сприяють поширенню знань та
взаєморозумінню. Ці ресурси надають доступ до актуальних, цікавих і
корисних матеріалів, що є важливим для тих, хто шукає підтримку та
інформацію.
Вони можуть охоплювати широкий спектр тем, від наукових статей про
психологічне здоров’я до порад щодо самодопомоги. Інформаційні ресурси
також можуть бути використані для сприяння обміну думками, дискусій та
створення спільнот, які об'єднують людей за інтересами або проблематикою.
Блог-сайти, як платформи для публікації думок та матеріалів на
психологічні теми, дозволяють авторам ділитися досвідом, знаннями або
просто висловлювати свої думки. Цей формат став популярним завдяки
простоті використання.
Аналіз інформації визначає, що блоги можуть включати різноманітний
контент, що сприяє створенню особистих зв’язків між блогерами та
читачами, формуючи віртуальні спільноти. Блоги можуть служити важливим
інструментом для контент-маркетингу в психологічній сфері, залучаючи
увагу та взаємодію з аудиторією.
Інформаційно-рекламні сайти, спеціально розроблені для презентації
послуг у сфері психологічної допомоги, фокусуються на переконанні
відвідувачів в їхній корисності. Ці сайти, як правило, містять візуально
привабливі елементи та переконливий контент, що допомагає користувачам
усвідомити переваги послуг.
Загалом, розвиток і аналіз веб-ресурсів для психологічної допомоги
стає важливим завданням, оскільки це сприяє покращенню доступу до
психологічних ресурсів і підтримки. На прикладі існуючих веб-сайтів у цій
сфері буде проведено детальний аналіз їхніх переваг та недоліків, щоб
виявити можливості для розвитку та вдосконалення.
Успішні додатки або веб-сайти в сфері психологічної допомоги
повинні враховувати потреби своєї цільової аудиторії, пропонуючи зручні та
20
доступні інструменти для підтримки. Важливим аспектом є адаптивність
платформ, що дозволяє враховувати різноманітні формати взаємодії, від
текстових матеріалів до інтерактивних елементів, таких як відео або онлайн-
консультації. Це допомагає створити позитивний досвід для користувачів,
сприяючи їхньому залученню та активності. Крім того, акцент на безпеці
даних і конфіденційності інформації є критично важливим, адже користувачі
повинні відчувати себе захищеними, звертаючись за психологічною
підтримкою через онлайн-платформи.
1.3 Аналіз спеціалізованих, готових платформ
1.3.1 Аналіз інформації платформи «Ти як»?
Насамперед досліджено сайт «Howareyou». Сайт розташований за
посиланням: https://howareu.com/materials/10-rannikh-oznak-emotsiinoho-
vyhorannia. Розглянемо його переваги та недоліки.
Для аналізу інтерфейсу і основних характеристик веб-сайту проєкту
«Ти як?» приведені малюнки рис.1.3 – 1.7.
Рис. 1.3. Головна сторінка і сайту «Howareu»
21
Рис. 1.4. Корисна інформація та навігація «Howareyou»
Рис. 1.5. Посилання на звернення до проєкту «Howareyou»
22
Рис. 1.6. Інтерфейс з новинами «Howareyou»
Рис.1.7. Фрагмент частини відео щодо здоров’я людей
23
Аналіз через візуалізацію інформації приведний на рис. 1.3 – 1.7
дозволів визначити основні переваги та недоліки представленого сайту, а
саме:
Переваги:
1. Зручний інтерфейс: простий і інтуїтивно зрозумілий дизайн, що
сприяє легкому навігації.
2. Актуальний контент: регулярне оновлення матеріалів, що робить
інформацію свіжою і релевантною.
3. Форма зворотного зв’язку: наявність можливості зв’язатися з
консультантами чи експертами для отримання допомоги.
4. Інтерактивні елементи: використання опитувань, тестів та інших
інтерактивних форматів, які залучають користувачів.
5. Мультимедійний контент: включення відео, аудіо та графіки, що
допомагає краще донести інформацію.
6. Фокус на психологічному здоров'ї: висвітлення важливих тем,
пов’язаних із психічним здоров’ям, що може бути корисним для
користувачів.
Недоліки:
1. Перевантаження інформації: іноді надмірна кількість контенту може
ускладнювати сприйняття.
2. Проблеми з оптимізацією: деякі елементи можуть завантажуватися
повільно або не коректно відображатися на мобільних пристроях.
3. Кольорова палітра: яскраві кольори можуть відволікати або
ускладнювати читабельність тексту.
4. Обмежена доступність: відсутність адаптацій для людей з особливими
потребами, що може ускладнити використання ресурсу.
5. Недостатня інформація про деякі послуги: користувачі можуть
відчувати брак детальної інформації з конкретних тем.
Ці пункти можуть слугувати основою для вашого аналізу, вказуючи на
сильні та слабкі сторони сайту "Ти як"
24
1.3.2 Аналіз інформації онлайн-платформи TellMe
Слідуючим в роботі досліджено сайт проєкту «Розкажи мені». Сайт
розташований за посиланням: https://tellme.com.ua/ [2].
Розглянемо його переваги та недоліки.
Для аналізу інтерфейсу і основних характеристик проєкту «TellMe»
приведені на рис. 1.8 – 1.12.
Рис. 1.8. Головна частина сайту «Розкажи мені»
25
Рисунок 1.9. Інтерфейс сайту «Розкажи мені»
26
Рис. 1.10. Анкета звернення «Розкажи мені»
27
Рис.1.11. Відгуки «Розкажи мені»
Аналізуючи сайт "Розкажи мені", можна визначити основні переваги та
недоліки його функціонування:
Переваги:
1. Оптимізація: сайт має достатній рівень оптимізації, що забезпечує
швидке завантаження та зручність використання, полегшуючи
навігацію для користувачів.
2. Форма зворотного зв’язку: наявність форми зворотного зв’язку
дозволяє користувачам легко зв’язатися з фахівцями для отримання
допомоги або консультацій, що підвищує доступність сервісу.
3. Зручність використання: інтерфейс сайту продуманий для легкого
орієнтування, що сприяє комфортному користуванню платформою.
Недоліки:
1. Старомодний дизайн: дизайн сайту може виглядати застарілим, що
негативно впливає на загальне враження від ресурсу та може
відштовхувати потенційних користувачів.
2. Недостатня інформативність: користувачі можуть не отримувати
достатньої інформації про послуги, які надає компанія, що ускладнює
їхню взаємодію з сайтом.
28
3. Погана впорядкованість контенту: вміст може бути подано
неструктуровано, що ускладнює його сприйняття та веде до труднощів
у навігації.
4. Недоліки в оптимізації: деякі елементи сайту можуть не коректно
відображатися або працювати, що негативно впливає на досвід
користувачів.
5. Довгий час очікування: процес заповнення анкети і очікування
відповіді може відштовхувати користувачів, які прагнуть отримати
миттєву допомогу.
Загальний висновок:
Аналізуючи сайт "Розкажи мені", можна стверджувати, що,
незважаючи на деякі позитивні аспекти, такі як оптимізація та зручність
використання, суттєві недоліки, як-от старомодний дизайн і проблеми з
інформативністю, можуть ускладнити залучення та утримання користувачів.
Додатково, тривалий час очікування на відповідь може вплинути на загальне
враження від сервісу.
29
1.3.3 Аналіз інформації американського сайту BetterHelp
У рамках дослідження було розглянуто американський проєкт
психологічної підтримки під назвою «BetterHelp», який доступний за
посиланням: https://www.betterhelp.com// [3].
Аналіз проведено з метою виявлення її переваг і недоліків. Основні
аспекти, що стосуються інтерфейсу та ключових характеристик проєкту
психологічної підтримки «BetterHelp», детально відображені на ілюстраціях,
представлених у вигляді рисунків 1.22 – 1.26.
Рис. 1.12. Головна сторінка проєкту «BetterHelp»
30
Рис. 1.13. Статистика звернень до проєкту «BetterHelp»
31
Рис. 1.14. Опис роботи проєкту «BetterHelp»
32
Рис. 1.15. Форма звернення до проєкту «BetterHelp»
Рис. 1.16. Інформація та відгуки роботи проєкту «BetterHelp»
Аналіз через візуалізацію інформації, представлений на рис. 1.22–1.26,
дозволив виявити основні переваги та недоліки веб-платформи BetterHelp,
яка надає послуги психологічної допомоги.
Переваги:
− сучасний і привабливий дизайн;
− добре структурований контент;
− висока якість оптимізації для пошукових систем;
− широкий спектр інформативності про послуги;
− наявність зручної форми для зворотного зв’язку;
− інтуїтивно зрозумілий інтерфейс, зручний для користувачів.
Недоліки:
− Обмежений формат взаємодії: Онлайн-спілкування через текстові
повідомлення, аудіо- чи відеозв’язок не завжди може замінити живу
33
консультацію, особливо в складних випадках, які потребують
особистої присутності фахівця.
− Відсутність екстреної допомоги: Платформа не призначена для
кризових ситуацій, коли потрібна негайна допомога, що може бути
недоліком для користувачів у критичних станах.
− наявність зручної форми для зворотного зв’язку;
1.4 Основні характеристики інформаційних систем, призначених
для надання психологічних послуг.
Ключові аспекти інформаційних систем для надання психологічних
послуг, які сприяють покращенню якості їх використання:
− Гнучкість у використанні. Інформаційна система має автоматично
підлаштовуватись під різні типи пристроїв та розміри екранів, включаючи
смартфони, планшети та монітори комп'ютерів.
− Постійна доступність. Забезпечення цілодобового доступу
користувачам для безперервного отримання психологічних послуг у будь-
який час доби.
− Різноманітність доступних послуг. Наявність у системі повного
каталогу запропонованих послуг, таких як консультації, психологічні тести,
тренінги та інші форми підтримки.
− Можливість швидкого зворотного зв’язку. Наявність інтерактивних
елементів, що сприяють ефективній комунікації між користувачами та
спеціалістами.
− Зручність у навігації. Система повинна мати інтуїтивний інтерфейс,
що дозволяє користувачам швидко знаходити потрібну інформацію та
послуги.
− Привабливий та функціональний дизайн. Інтерфейс повинен бути
сучасним та естетично приємним, щоб створювати позитивний
користувацький досвід.
34
− Дотримання цих принципів у створенні інформаційних систем для
психологічних послуг дозволяє підвищити зручність їх використання та
ефективність взаємодії користувачів із платформою.
1.5 Висновоки до розділу
У цьому розділі було проведено аналіз сучасних інформаційних
систем, що використовуються для надання психологічних послуг як в
Україні, так і за кордоном. Розроблено модель класифікації інформаційних
систем залежно від сфер їх застосування.
Здійснено суб'єктивне кількісне оцінювання ключових характеристик
програмних платформ для психологічних центрів, таких як: HowAreYou, Tell
me та BetterHelp. Створено реляційну модель даних для цих характеристик, а
також проведено якісний і кількісний аналіз характеристик міжнародних
інформаційних систем для психологічної підтримки.
Таким чином, було розроблено удосконалений підхід до створення
класифікацій, що сприяє точному визначенню місця конкретної моделі в
загальній архітектурі проектованої системи.
35
РОЗДІЛ 2
УЗАГАЛЬНЕНА МОДЕЛЬ ПРОГРАМНО-АПАРАТНИХ ЗАСОБІВ
ІНФОРМАЦІЙНОЇ СИСТЕМИ ДЛЯ НАДАННЯ ПСИХОЛОГІЧНИХ
ПОСЛУГ ЧЕРЕЗ ВЕБ-САЙТ.
2.1 Дослідження програмних засобів
Для створення застосунку, орієнтованого на надання психологічних
послуг, у кваліфікаційній роботі було застосовано такі інструменти (рис. 2.1):
- HTML, CSS для структуризації та стилізації інтерфейсу;
- Мова програмування Rust для розробки бекенду та забезпечення
високої продуктивності та безпеки;
- JavaScript для створення інтерактивних елементів на стороні клієнта.
Kotlin для створення шаблону усередині застосунку
Рис. 2.1. Використані технології
HTML (Hypertext Markup Language) – це стандартна мова розмітки, яка
використовується для розробки та оформлення веб-сторінок. Вона забезпечує
створення структури і відображення контенту у веб-браузерах. HTML є
основою для веб-розробки, оскільки визначає, як елементи сторінки будуть
організовані та виглядати.
HTML працює на принципі "гіпертексту", що дозволяє включати
посилання на інші сторінки чи ресурси в Інтернеті. Це забезпечує можливість
створення інтерактивних документів, які дозволяють користувачам зручно
переміщуватись між різними частинами сторінки або переходити до інших
36
веб-ресурсів.
Основною метою HTML є організація та структура інформації на веб-
сторінках, зокрема визначення таких елементів, як:
- заголовки;
- абзаци;
- списки;
- посилання;
- таблиці;
- зображення та інші компоненти.
HTML-документ складається з різних тегів, кожен з яких вказує
браузеру, як відобразити конкретний елемент на сторінці. Теги формують
основу для правильного виведення вмісту та організації контенту.
HTML є необхідним для створення веб-сторінок, які будуть
доступними і зручними для користувачів по всьому світу. Це також дозволяє
вбудовувати мультимедійні елементи, створювати форми для взаємодії з
користувачами та служить базою для розробки веб-додатків. В парі з CSS
(Cascading Style Sheets) і JavaScript, HTML є основою для більшості веб-
сайтів, визначаючи їх зовнішній вигляд і функціональність.
CSS (Cascading Style Sheets, або каскадні таблиці стилів) – це мова, яка
застосовується для визначення візуального вигляду та форматування веб-
сторінок, створених за допомогою HTML. Вона дає змогу розробникам
змінювати вигляд елементів на сторінці, зокрема кольори, шрифти, відступи,
маргіні та інші параметри, які впливають на зовнішній вигляд контенту.
Основною метою CSS є розділення структури веб-сторінки (визначеної
через HTML) від її стилістичного оформлення. Це дозволяє утримувати код
HTML чистим і простим для розуміння, а також значно полегшує процес
зміни вигляду сторінки без необхідності змінювати саму розмітку.
Ключові аспекти CSS включають:
1. Кольори та фони: можливість встановлювати кольори фону, тексту,
посилань і інших елементів.
37
2. Шрифти: налаштування типу, розміру і стилю шрифтів для тексту
на сторінці.
3. Розміри та відступи: можливість контролювати розміри елементів,
їх відступи та інтервали.
4. Рамки та тіні: застосування рамок і тіней до елементів для
створення візуальної глибини.
5. Анімації та переходи: створення анімацій та плавних переходів між
різними станами елементів.
6. Позиціонування: визначення розташування елементів на сторінці,
включаючи абсолютне, відносне та фіксоване позиціонування.
CSS є незамінним інструментом у веб-розробці, оскільки дає змогу
створювати стильні, привабливі та професійно виглядаючі веб-сторінки,
покращуючи доступність і користувацький досвід. Без CSS веб-сайти не
змогли б досягти сучасного вигляду, який користувачі очікують від Інтернет-
ресурсів.
JavaScript – це високо рівнева мова програмування, яка виконується
безпосередньо в браузері користувача і використовується для створення
динамічних та інтерактивних веб-сайтів. Вона дозволяє змінювати вміст і
поведінку сторінок в реальному часі під час взаємодії користувача.
Основні функції JavaScript включають::
1. Взаємодія з користувачем.
JavaScript дає змогу створювати веб-сторінки, де користувачі можуть
заповнювати форми, обробляти події з мишкою та клавіатурою, а також
перемикати вкладки і виконувати інші дії.
2. Зміна вмісту сторінки.
Мова дозволяє динамічно додавати, видаляти або змінювати елементи
HTML на сторінці без необхідності її перезавантаження, що робить сторінки
більш адаптивними до потреб користувача.
3. Валідація даних.
38
JavaScript забезпечує перевірку введених користувачем даних у формах
до їх відправки на сервер, що дозволяє запобігти відправці помилкової
інформації.
4. Взаємодія з сервером.
JavaScript може надсилати запити на сервер за допомогою технології
AJAX, отримуючи або передаючи дані без необхідності перезавантажувати
веб-сторінку. Це забезпечує асинхронне оновлення контенту.
5. Розробка веб-додатків.
JavaScript є ключовою технологією для створення веб-додатків,
наступних:
- онлайн-комунікації;
- громадські сервіси;
- соціальні мережі та багато інших.
JavaScript є важливим інструментом для покращення користувацького
досвіду WEB-сайтів і забезпечує можливість створювати
багатофункціональні, динамічні та інтерактивні веб-додатки. Він
використовується в поєднанні з HTML і CSS для створення повноцінних
WEB-сайтів, які задовольняють потреби сучасних користувачів Інтернету.
Мова програмування Rust — це сучасна системна мова, розроблена для
забезпечення високої безпеки пам'яті, продуктивності та паралелізму. Rust
став популярним завдяки своєму фокусу на безпечному управлінні пам'яттю
без необхідності використання зборщика сміття (garbage collector). Вона була
створена для того, щоб дозволяти розробникам писати швидкий і ефективний
код, при цьому забезпечуючи стійкість до помилок і зручний досвід
програмування.
Основні характеристики мови Rust:
Безпечне управління пам'яттю: Однією з найбільших переваг Rust є
його система управління пам'яттю. У Rust немає необхідності в
автоматичному зборі сміття, як у більшості інших мов. Замість цього мова
використовує концепції "володіння" (ownership), "позичок" (borrowing) і
39
"ссувань" (references), щоб гарантувати, що пам'ять не буде доступна після її
вивільнення. Це дозволяє усунути проблеми, пов'язані з витоками пам'яті та
доступом до невизначеної пам'яті (dangling pointers), не жертвуючи
продуктивністю.
Конкурентність і паралелізм: Rust має вбудовану підтримку
багатопоточності. Мова дозволяє одночасно виконувати кілька операцій
(паралелізм), при цьому забезпечуючи безпеку від гонок даних (data races).
Завдяки власній системі "позичок" та "володіння" Rust дозволяє
програмістам писати багатопотоковий код, який не призведе до помилок,
типових для конкурентних систем.
Продуктивність: Мова програмування Rust проектувалась з
урахуванням максимальної продуктивності, і код, написаний на Rust,
здебільшого працює так швидко, як код, написаний на C або C++. Це
забезпечується завдяки відсутності збірки сміття та наявності інструментів
для низькорівневої оптимізації. Rust використовує компілятор, який виконує
численні перевірки під час компіляції, що дозволяє уникати багатьох
помилок на етапі виконання.
Система типів: Rust має потужну систему типів, яка допомагає
запобігати багатьом помилкам. Це включає статичну типізацію, що дозволяє
виявляти типові помилки компіляції на етапі написання коду. Мова також
підтримує "не нульові" типи (Option, Result), що дозволяє явно працювати з
помилками та відсутністю значень, роблячи код надійнішим.
Сумісність із C/C++: Оскільки Rust розроблений для системного
програмування, він має високий рівень сумісності з C та C++. Мова дозволяє
легко інтегруватися з існуючими бібліотеками на C, забезпечуючи високу
продуктивність і можливість використовувати вже написані бібліотеки.
Зручність у використанні: Незважаючи на свою "низькорівневу"
природу, Rust має дуже зручний та інтуїтивно зрозумілий синтаксис, який
дозволяє розробникам писати чистий і читабельний код. Багато елементів
синтаксису розроблені для того, щоб зробити програмування більш
40
ефективним та зручним. Також наявні вбудовані інструменти, як-от система
управління пакетами Cargo, яка полегшує процес розробки, тестування та
розповсюдження програмного забезпечення.
Завжди актуальна документація та активне співтовариство:
Документація для Rust є однією з найбільш повних і детальних серед усіх
мов програмування. Крім того, мова має активне та дружнє співтовариство,
яке допомагає новачкам швидко освоїтись. Спільнота також активно
підтримує розвиток багатьох бібліотек та інструментів для Rust, що полегшує
розробку програм.
Екосистема та інструменти: Однією з сильних сторін Rust є його
екосистема. У мові є вбудована підтримка пакувальної системи Cargo, яка
спрощує керування залежностями, а також автоматичне тестування і
компіляцію проектів. Крім того, існують потужні інструменти для аналізу
коду, такі як rustfmt для форматування коду і clippy для виявлення можливих
помилок.
Мобільність та підтримка для різних платформ: Rust підтримує
розробку не тільки для класичних ПК, але й для вбудованих систем,
мобільних пристроїв, а також для WebAssembly (для розробки в браузері). Це
робить Rust універсальним вибором для багатьох типів розробки.
Переваги використання Rust:
Безпечність: У порівнянні з мовами як C або C++, Rust дозволяє
уникнути багатьох типових помилок, пов'язаних з управлінням пам'яттю
(наприклад, переповнення буфера або доступ до вивільненої пам'яті).
Продуктивність: Rust дозволяє досягти високої продуктивності при
виконанні програм, майже не поступаючись C/C++.
Конкурентність: Завдяки системі "позичок" і "володіння" Rust
дозволяє писати багатопотоковий код без побоювань, що з'являться помилки
гонок даних.
41
Можливості для інтеграції: Rust забезпечує високу сумісність з
іншими мовами, особливо C і C++, дозволяючи використовувати вже існуючі
бібліотеки та фреймворки.
Активна спільнота і документація: Спільнота Rust забезпечує чудову
підтримку та якісну документацію, що дозволяє швидко освоїти мову і
знайти відповіді на питання.
Сфери застосування Rust:
Системне програмування: Завдяки низькому рівню та високій
ефективності, Rust ідеально підходить для створення операційних систем,
драйверів та інших низькорівневих програм.
Веб-розробка: Завдяки підтримці WebAssembly, Rust стає все
популярнішим для розробки високопродуктивних веб-додатків.
Розробка вбудованих систем: Мова активно використовується для
розробки програмного забезпечення для мікроконтролерів та інших
вбудованих систем.
Розподілені системи: Rust зручний для розробки програм, що
використовують паралельні обчислення і мають високу вимогу до безпеки і
продуктивності.
Kotlin — це сучасна, багатофункціональна мова програмування, яка
розроблена компанією JetBrains і набирає популярність завдяки своїй
простоті, гнучкості і можливостям для розробки програмного забезпечення
на різних платформах. Kotlin працює на Java Virtual Machine (JVM), що
дозволяє йому бути сумісним з уже існуючим екосистемою Java. Однак
Kotlin додає кілька потужних функцій і покращує продуктивність, що робить
його привабливим вибором для розробників. У цьому матеріалі ми
розглянемо популярні технології та проекти, створені за допомогою Kotlin.
1. Android-розробка
Kotlin став офіційно рекомендованою мовою для розробки під Android.
У 2017 році Google оголосив Kotlin як «перше класне» рішення для розробки
Android-додатків, що дало поштовх до широкого використання цієї мови в
42
мобільній розробці. Kotlin пропонує значні покращення для розробників
Android порівняно з Java, зокрема:
Коротший і чистіший код: Kotlin дозволяє писати код в меншому обсязі
завдяки функціям, таким як синтаксис для обробки null-значень,
розширенням функцій і лямбда-виразами.
Легке підключення до Java-коду: Kotlin повністю сумісний з Java, що
дозволяє інтегрувати його в існуючі проекти без необхідності переписувати
код з нуля.
Безпека від помилок null: Kotlin надає можливість працювати з null-
значеннями без загрози NullPointerException через систему типів.
Це зробило Kotlin мовою номер один для багатьох розробників, що
займаються Android-розробкою, і його популярність продовжує зростати.
2. Backend-розробка (серверна частина)
Kotlin активно використовується в серверній розробці завдяки своїй
ефективності та здатності працювати з великою кількістю даних. Ось кілька
популярних технологій і проектів, які використовують Kotlin для серверного
програмування:
Ktor — це фреймворк для створення веб-додатків і мікросервісів на
Kotlin. Він забезпечує підтримку асинхронних запитів і може бути
використаний для створення RESTful API, мікросервісів або навіть
повноцінних веб-сайтів. Ktor дуже гнучкий і дозволяє налаштовувати сервер
під конкретні потреби проекту.
Spring Boot — Spring підтримує Kotlin як офіційну мову програмування
для розробки на платформі JVM. Spring Boot забезпечує швидку розробку
мікросервісів, REST API та інших серверних додатків. Kotlin, завдяки своїй
простоті, дозволяє зменшити обсяг коду та покращити продуктивність,
зберігаючи при цьому всі переваги Spring.
Exposed — це ORM-фреймворк для Kotlin, що дозволяє легко
працювати з базами даних. Відмінною рисою Exposed є його чистий,
43
типобезпечний синтаксис, що допомагає уникати помилок при взаємодії з
SQL-запитами.
Kotlin має всі необхідні функції для високопродуктивного серверного
програмування, що робить його ідеальним вибором для мікросервісної
архітектури та масштабованих веб-додатків.
3. Kotlin Multiplatform
Однією з найбільш інноваційних особливостей Kotlin є Kotlin
Multiplatform, що дозволяє розробникам писати один код для декількох
платформ. За допомогою Kotlin Multiplatform можна створювати додатки, які
працюватимуть на різних платформах, таких як Android, iOS, веб і навіть
десктопи. Це особливо корисно для тих, хто хоче підтримувати різні
платформи з мінімальними витратами на розробку.
Kotlin/Native дозволяє запускати Kotlin-код на платформах без JVM,
таких як iOS, macOS, Windows, Linux і навіть мікроконтролери.
Kotlin/JS дає змогу компілювати Kotlin-код у JavaScript, що дозволяє
використовувати одну кодову базу для веб-додатків, створюючи швидкі,
масштабовані та кроссплатформенні рішення.
Завдяки Kotlin Multiplatform розробники можуть використовувати одну
мову для розробки програмного забезпечення для різних екосистем, що
значно економить час і ресурси.
2.2 Апаратні засоби використані під час розробки застосунку
психологічної підтримки
Для створення психологічної системи для надання підтримки
необхідно належно технічно оснащити робоче місце. Вибір технічних засобів
залежить від специфіки виконуваних завдань. Нижче наведені інструменти,
що використовувалися при розробці додатка для психологічної підтримки:
− операційна система: Windows 11 Pro;
− процесор: Intel Core I9-14900k;
44
− відео карта: MSI RTX 4080 Gaming trio X;
− оперативна пам’ять: 4 x KINGSTON DDR5 6000MHZ 16Gb;
− материнська плата: Aorus Z790 pro;
− бездротовий зв’язок: MClaut network;
− наушники: Sennheiser HD 650;
− комп’ютерна миша: Logitech G305 wireless white;
− клавіатура: ASUS ROG fx low;
− монітор: Gigabyte M34WQ 144hz.
Висновки до розділу
У даному розділі було здійснено дослідження програмних засобів,
таких як HTML, CSS, Rust, JavaScript та Kotlin, а також апаратних
засобів,щовикористовуються при розробці застосунку. Аналізувалися їх
інформаційніособливості, які впливають на якість роботи такого застосунку.
Було розроблено узагальнену модель програмно-апаратних засобів для
інформаційно-психологічного застосунку, яка значно спрощує та
пришвидшує процес проектування, створення та верифікації працездатності
системи.
45
РОЗДІЛ 3
РОЗРОБКА ЗАСТОСУНКУ ДЛЯ НАДАННЯ ПСИХОЛОГІЧНОЇ
ДОПОМОГИ. ТЕСТУВАННЯ
3.1 Узагальнена структура застосунку психологічної допомоги
Одним з основних елементів є структура додатка, що включає перелік
екранів або, в контексті інформаційної платформи, блоків. Візуалізація
узагальненої інформаційної моделі допомагає спростити розуміння та
освоєння його складових.
Основні особливості, що покращують модель мобільного додатка,
включають:
Назва додатка: Проста та оригінальна назва сприяє легкому
запам'ятовуванню користувачами та клієнтами.
Дизайн: Необхідно уникати надмірно яскравих кольорів, що можуть
викликати дискомфорт або втому очей, а також відволікати від основного
контенту. Важливо забезпечити комфортні умови для користувачів.
Швидкість завантаження: Забезпечення швидкого завантаження
великих обсягів інформації для зручності користувачів.
Контент: Контент має відповідати цілям додатка та бізнес-завданням,
надаючи користувачам корисну та якісну інформацію.
Адаптація: Оскільки більшість користувачів використовують мобільні
пристрої, важливо забезпечити адаптацію додатка для різних екранів і
пристроїв.
Зручний зв'язок: Усі контактні дані, такі як телефони, соціальні
мережі та адреси, повинні бути легко доступні в додатку для зручності
зв'язку.
Зворотний зв'язок: Доцільно інтегрувати форму зворотного зв'язку
для покращення взаємодії з користувачами та оперативного вирішення їх
запитів.
46
3.3 Принцип декомпозиції концептуальних моделей
Концептуальна модель інформаційно-психологічного мобільного
додатка складається з кількох основних частин::
- головна сторінка;
- вибір чатів спілкування,
- вибір чату спілкування з психологом чи ботом.
Концептуальна модель інформаційно-психологічного мобільного
додатка є синтез наведених частин, що у майбутньому сприятимуть
швидкому реагуванню психолога, до якого надійде запит
Запропонована декомпозиція концептуальної моделі, наведеної вище
дозволила спростити процес створення для них програмного коду.
3.2 Проектування дизайну застосунку психологічної допомоги та
програмного коду
Відомо, що перше, на що звертає увагу користувач при заході у
застосунок це основна частина застосунку та кнопка звернення до психолога.
Особливістю головної частини застосунку є початкова сторінка з
кнопками та автоматичний перехід на створення діалогового вікна у разі
натискання кнопки «Почати розмову»:
47
Рис. 3.1. Сторінка з кнопками для створення чату
Нижче (рис. 3.2) відкрита форма звернення до психолога (після
натискання на кнопку «Talk to real psychologist”
48
Рис. 3.2. Форма, де можна вводити текст, після відправки якого буде
створений тікет (звернення до психолога)
Створення звернення полягає в тому, що відправлене повідомлення
спочатку обробляється на сервері, а потім переходить до головної бази даних
і відправляється психологам.
49
Для прийняття тікету, було створено спеціальний аккаунт психолога, в
який можна увійти лише з допомогою системного доступу, який надається
адміністратором застосунку. Код блоку психолога:
Спілкування з клієнтом та обробка інформації, яка була відправлена на
сервер, а потім до бази даних є ключовою особливістю застосунку, тому що
під час відправки звернення, за допомогою штучного інтелекту, на сервері
автоматично аналізується текст клієнта, та тікету надається рівень важкості,
який потім сортується і відправляється до психологів певного рівня. Код:
Під час очікування відповіді від психолога, клієнт може прочитати
певні статті та інформації щодо певних психологічних питань у розділі
«Новини» в застосунку (рис. 3.3)
50
Рис. 3.3. Інформаційне вікно з публікацією інформації щодо проєкта та
інших психологічних питань та відповідей.
51
Висновки до розділу
У цьому розділі розроблено синтез відповідних концептуальних
моделей для мобільного додатка "Анонімний психолог", призначеного для
надання психологічної допомоги. Ця узагальнена концептуальна модель є
важливим етапом розробки і значно спрощує та пришвидшує процес
створення інтерфейсу додатка та його функціоналу за допомогою
запропонованого програмного коду.
Також представлено результат розробки додатка, включаючи всі
основні екрани та функціональні блоки. Проведено тестування додатка,
результати якого підтвердили його працездатність, правильність
відображення інформації та відсутність помилок в роботі.
52
ВИСНОВКИ
В результаті виконаної роботи отримано такі ключові результати::
− Розроблена модель класифікації психологічних застосунків, що
дозволяє чітко визначити підхід до проектування таких систем і відрізняти їх
за функціональними можливостями для надання психологічної допомоги
користувачам.
− Проведено аналіз сучасних вітчизняних і закордонних технологій,
що використовуються в області надання психологічної підтримки через
цифрові платформи, що дозволило вибрати оптимальні засоби для створення
додатку.
− Розроблена узагальнена модель програмно-апаратних засобів для
психологічного застосунку, що включає необхідні технології, інструменти і
програмні засоби для розробки ефективного і зручного інтерфейсу та
функціоналу.
− Система, яка забезпечує анонімність і конфіденційність, адаптована
до потреб користувачів і дозволяє отримати психологічну допомогу у
зручному і доступному форматі. Зроблений акцент на наданні зворотного
зв'язку для оперативного реагування на потреби користувачів.
− Верифікація працездатності застосунку проведена через тестування,
що підтвердило відсутність помилок та забезпечило безперебійну роботу всіх
функцій. Це дозволило значно зменшити час на впровадження та підвищити
ефективність надання психологічної допомоги через мобільний додаток
53
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Howareyou (Ти як?) [Електронний ресурс]. – Режим доступу :
https://howareu.com/.
2. TellMe [Електронний ресурс]. – Режим доступу: https://tellme.com.ua/
3. BetterHelp [Електронний ресурс]. – Режим доступу:
https://www.betterhelp.com//
4. Jon Duckett, “Web Design with HTML, CSS, JavaScript and jQuery Set”,
2014, pp – 1152.
5. CSS [Електронний ресурс]. – Режим доступу :
https://en.wikipedia.org/wiki/CSS.
6. David Kadavy, “Design for Hackers: Reverse Engineering Beauty”, 2011,
pp – 352.
7. Електронний HTML і CSS довідник [Електронний ресурс]. – Режим
доступу : https://html-css.co.ua/.
8. W3shooulsua [Електронний ресурс]. – Режим доступу :
https://w3schoolsua.github.io/css/css_examples.html#gsc.tab=0
9. Ethan Brown, “Python Development by everyone: apps and others”, 2014,
pp – 329.
10. John Smiley, “Developing Psychological Support Applications”, 2021, pp
– 245.
11. Psychology Tools [Електронний ресурс]. – Режим доступу:
https://www.psychologytools.com/.
12. Martin Fowler, “Refactoring: Improving the Design of Existing Code”,
2018, pp – 448..
13. OpenAI [Електронний ресурс]. – Режим доступу:
https://www.openai.com/
14. Adobe XD [Електронний ресурс]. – Режим доступу:
https://www.adobe.com/products/xd.html/.
15. Jakob Nielsen, “Usability Engineering”, 1993, pp – 362/.
54
16. MindTools [Електронний ресурс]. – Режим доступу:
https://www.mindtools.com/
17. Alan Cooper, “About Face: The Essentials of Interaction Design”, 2014,
pp – 720.
18. Verywell Mind [Електронний ресурс]. – Режим доступу:
https://www.verywellmind.com/.
19. Jason Fried, “Remote: Office Not Required”, 2013, pp – 256.
20. Codecademy [Електронний ресурс]. – Режим доступу:
https://www.codecademy.com/.
21. Gerald Weinberg, “The Psychology of Computer Programming”, 1998, pp
– 288..
22. wikipedia [Електронний ресурс]. – Режим доступу :
https://uk.wikipedia.org/.
55
ДОДАТОК А
ДОСЛІДЖЕННЯ ІНФОРМАЦІЙНИХ СИСТЕМ ДЛЯ НАДАННЯ
ПСИХОЛОГІЧНИХ ПОСЛУГ
Програмний код застосунку «Анонімний психолог»
Листів 1
Розробник _________________ Сергій КОВАЛЬЧУК.
Керівник _ ________________ Марина ЧИЧУЖКО.
___
Черкаси–2024
56
Startticketsys.
package com.svteam.anonimniipsiholog
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.ActivityInfo
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.core.view.WindowCompat
import com.svteam.anonimniipsiholog.model.UserRole
import com.svteam.anonimniipsiholog.ui.screen.StartScreen
import com.svteam.anonimniipsiholog.ui.theme.AnonimniiPsihologTheme
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
class StartActivity : ComponentActivity() {
@SuppressLint("SourceLockedOrientationActivity")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (resources.getBoolean(R.bool.portrait_only)) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT
}
val containsAccessToken = runBlocking {
dataStore.data.first().contains(CONFIG_KEY_ACCESS_TOKEN)
}
val currentViewRole = runBlocking {
getCurrentViewRole(this@StartActivity).first()
}
if (containsAccessToken) {
val intent = if (currentViewRole == UserRole.PSYCHOLOGIST) {
Intent(this, PsychologActivity::class.java)
} else {
Intent(this, MainActivity::class.java)
}
startActivity(intent)
finish()
return
}
WindowCompat.setDecorFitsSystemWindows(window, false)
setContent {
AnonimniiPsihologTheme {
StartScreen()
}
}
}
}
Ticketcontrol
@file:OptIn(
ExperimentalMaterial3Api::class,
ExperimentalLayoutApi::class
)
package com.svteam.anonimniipsiholog.ui.screen
import android.content.Intent
import androidx.activity.compose.BackHandler
import androidx.annotation.DrawableRes
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
57
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.isImeVisible
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawingPadding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.svteam.anonimniipsiholog.AuthActivity
import com.svteam.anonimniipsiholog.R
import com.svteam.anonimniipsiholog.SettingsActivity
import com.svteam.anonimniipsiholog.api.UserProvider
import com.svteam.anonimniipsiholog.getActivity
import com.svteam.anonimniipsiholog.globalUser
import com.svteam.anonimniipsiholog.model.ApiError
import com.svteam.anonimniipsiholog.showError
import com.svteam.anonimniipsiholog.ui.screen.main.TabChats
import com.svteam.anonimniipsiholog.ui.screen.main.TabNews
import com.svteam.anonimniipsiholog.ui.screen.main.TabRequestPsychologist
import com.svteam.anonimniipsiholog.ui.viewmodel.MainScreenRoutes
import com.svteam.anonimniipsiholog.ui.viewmodel.MainScreenViewModel
data class BottomNavItem(val route: String, @DrawableRes val icon: Int, val label:
String)
val TABS = arrayOf(
BottomNavItem(MainScreenRoutes.NEWS, R.drawable.round_house_24, "Main"),
// BottomNavItem(TAB_ROUTE_PROFILE, R.drawable.round_person_2_24, "Profile"),
58
BottomNavItem(MainScreenRoutes.REQUEST_PSYCHO, R.drawable.round_edit_note_24,
"Submit issue"),
BottomNavItem(MainScreenRoutes.CHATS, R.drawable.round_chat_24, "Chats")
)
@Composable
fun NavTabButton(checked: Boolean, onClick: () -> Unit, tab: BottomNavItem) {
Column(
modifier = Modifier
.wrapContentWidth()
.height(60.dp)
.clickable(
onClick = onClick,
role = Role.RadioButton,
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(
bounded = false,
radius = 50.dp,
)
),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
Icon(
painterResource(id = tab.icon),
contentDescription = tab.label,
tint = if (checked) MaterialTheme.colorScheme.primary else
LocalContentColor.current,
modifier = Modifier.size(36.dp),
)
Text(text = tab.label, fontSize = 12.sp, textAlign = TextAlign.Center,
lineHeight = 12.sp)
}
}
@Preview
@Composable
fun MainScreen() {
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val mainViewModel: MainScreenViewModel = viewModel()
val mainState by mainViewModel.uiState.collectAsState()
val ctx = LocalContext.current.getActivity()!!
fun navigateToSettings() {
val intent = Intent(ctx, SettingsActivity::class.java)
ctx.startActivity(intent)
}
fun onBack() {
ctx.finish()
}
LaunchedEffect(mainState.currMenuRoute) {
navController.navigate(mainState.currMenuRoute) {
launchSingleTop = true
restoreState = true
navController.graph.startDestinationRoute?.let { route ->
popUpTo(route) {
saveState = true
}
}
}
}
LaunchedEffect(Unit) {
val userRes = UserProvider.get()
59
when (userRes.error) {
null -> {
globalUser.emit(userRes.result)
mainViewModel.setBalance(userRes.result!!.balance)
}
ApiError.INVALID_ACCESS_TOKEN, ApiError.USER_NOT_FOUND -> {
val intent = Intent(ctx, AuthActivity::class.java)
ctx.startActivity(intent)
ctx.finishAffinity()
}
else -> {
ctx.showError(userRes.error)
}
}
}
Scaffold(
modifier = Modifier.safeDrawingPadding(),
topBar = {
Row(
Modifier
.fillMaxWidth()
.padding(horizontal = 10.dp)
.height(64.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Box(Modifier.weight(1.0f), contentAlignment = Alignment.CenterStart) {
mainState.backAction?.let {
IconButton(onClick = { it() }) {
Icon(Icons.Rounded.ArrowBack, contentDescription = "")
}
}
}
Box(Modifier.padding(end = 10.dp), contentAlignment = Alignment.Center)
{
val title = mainState.title
?: TABS.find { it.route ==
navBackStackEntry?.destination?.route }?.label
Text(
title ?: "",
style = MaterialTheme.typography.titleLarge,
maxLines = 1,
textAlign = TextAlign.Center
)
}
Row(Modifier.weight(1.0f)) {
FilledTonalButton(
onClick = { },
contentPadding = PaddingValues(vertical = 4.dp, horizontal =
12.dp)
) {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
painter = painterResource(id =
R.drawable.baseline_currency_bitcoin_24),
contentDescription = "balance"
)
Text(
mainState.currUserBalance.toString(),
fontSize = 22.sp,
fontWeight = FontWeight.SemiBold,
maxLines = 1,
)
60
}
}
IconButton(onClick = { navigateToSettings() }) {
Icon(
painter = painterResource(id =
R.drawable.round_settings_24),
contentDescription = "settings"
)
}
}
}
},
bottomBar = {
if (!WindowInsets.isImeVisible) {
Surface {
Row(
Modifier
.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
TABS.forEach { item ->
NavTabButton(
navBackStackEntry?.destination?.route == item.route,
{
mainViewModel.navigateMenu(item.route)
},
item
)
}
}
}
}
},
// Has effect on IME: removes unnecessary space between keyboard and some
bottom element (input field)
contentWindowInsets = WindowInsets(0, 0, 0, 0)
) { padd ->
NavHost(
modifier = Modifier
.fillMaxSize()
.padding(padd),
navController = navController,
startDestination = MainScreenRoutes.REQUEST_PSYCHO,
enterTransition = { fadeIn(tween(150)) },
exitTransition = { fadeOut(tween(150)) },
) {
composable(MainScreenRoutes.NEWS) {
BackHandler { onBack() }
TabNews(mainViewModel)
}
composable(MainScreenRoutes.PROFILE) {
BackHandler { onBack() }
TabProfile(mainViewModel)
}
composable(MainScreenRoutes.REQUEST_PSYCHO) {
BackHandler { onBack() }
TabRequestPsychologist(mainViewModel)
}
composable(MainScreenRoutes.CHATS) {
BackHandler { onBack() }
TabChats(mainViewModel)
}
}
}
Column(
Modifier
61
.fillMaxWidth()
.fillMaxHeight()
.safeDrawingPadding(),
) {
Surface {
Row(
Modifier
.fillMaxWidth()
.padding(horizontal = 10.dp)
.height(64.dp),
verticalAlignment = Alignment.CenterVertically,
) {
IconButton(onClick = { /*TODO*/ }) {
}
Box(modifier = Modifier.weight(1.0f))
Text(
mainState.currentNavTab?.label ?: "",
style = MaterialTheme.typography.titleLarge
)
Box(modifier = Modifier.weight(1.0f))
IconButton(onClick = { /*TODO*/ }) {
Icon(
painter = painterResource(id = R.drawable.round_settings_24),
contentDescription = "settings"
)
}
}
}
Surface(
Modifier
.fillMaxWidth()
.weight(1.0f)
) {
NavHost(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight(),
navController = navController,
startDestination = "null",
enterTransition = { fadeIn(tween(150)) },
exitTransition = { fadeOut(tween(150)) },
) {
composable("null") {}
composable(TAB_ROUTE_PROFILE) {
TabProfile()
}
composable(TAB_ROUTE_REQUEST_PSYCHO) {
TabRequestPsychologist(
mainViewModel
)
}
composable(TAB_ROUTE_CHATS) {
TabChats()
}
}
}
Surface(
color = NavigationBarDefaults.containerColor,
tonalElevation = NavigationBarDefaults.Elevation
) {
Row(
62
Modifier
.fillMaxWidth()
.wrapContentHeight(),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
TABS.forEach { item ->
NavTabButton(
navBackStackEntry?.destination?.route == item.route,
{
mainViewModel.navigateToTab(item.route)
},
item
)
}
}
}
}
}
ticketlist
@file:OptIn(
ExperimentalMaterial3Api::class,
)
package com.svteam.anonimniipsiholog.ui.screen
import android.content.Intent
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawingPadding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
63
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.svteam.anonimniipsiholog.AuthActivity
import com.svteam.anonimniipsiholog.MainActivity
import com.svteam.anonimniipsiholog.R
import com.svteam.anonimniipsiholog.SettingsActivity
import com.svteam.anonimniipsiholog.api.UserProvider
import com.svteam.anonimniipsiholog.getActivity
import com.svteam.anonimniipsiholog.globalUser
import com.svteam.anonimniipsiholog.model.ApiError
import com.svteam.anonimniipsiholog.model.UserRole
import com.svteam.anonimniipsiholog.showError
import com.svteam.anonimniipsiholog.ui.element.ChatView
import com.svteam.anonimniipsiholog.ui.screen.psycholog.TicketList
import com.svteam.anonimniipsiholog.ui.viewmodel.ChatViewModel
import com.svteam.anonimniipsiholog.ui.viewmodel.PsychologScreenViewModel
const val VIEW_ROUTE_TICKETS = "tickets"
const val VIEW_ROUTE_CHAT_VIEW = "chat"
@Composable
fun PsychologScreen() {
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val viewModel: PsychologScreenViewModel = viewModel()
val mainState by viewModel.uiState.collectAsState()
val ctx = LocalContext.current.getActivity()!!
fun navigateToSettings() {
val intent = Intent(ctx, SettingsActivity::class.java)
ctx.startActivity(intent)
64
}
fun onSelectTicket(chatViewModel: ChatViewModel) {
viewModel.setCurrentTicket(chatViewModel)
navController.navigate(VIEW_ROUTE_CHAT_VIEW)
}
fun onBack() {
navController.popBackStack()
viewModel.setTopBarProps(null, null)
}
// LaunchedEffect(mainState.currMenuRoute) {
// navController.navigate(mainState.currMenuRoute) {
// launchSingleTop = true
// restoreState = true
// navController.graph.startDestinationRoute?.let { route ->
// popUpTo(route) {
// saveState = true
// }
// }
// }
// }
LaunchedEffect(Unit) {
val userRes = UserProvider.get()
when (userRes.error) {
null -> {
globalUser.emit(userRes.result)
if (userRes.result!!.role.isNot(UserRole.PSYCHOLOGIST)) {
val intent = Intent(ctx, MainActivity::class.java)
ctx.startActivity(intent)
ctx.finishAffinity()
}
}
ApiError.INVALID_ACCESS_TOKEN, ApiError.USER_NOT_FOUND -> {
val intent = Intent(ctx, AuthActivity::class.java)
ctx.startActivity(intent)
ctx.finishAffinity()
}
else -> {
ctx.showError(userRes.error)
}
65
}
}
Scaffold(
modifier = Modifier.safeDrawingPadding(),
topBar = {
Row(
Modifier
.fillMaxWidth()
.padding(horizontal = 10.dp)
.height(64.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Box(modifier = Modifier.weight(1.0f), contentAlignment =
Alignment.CenterStart) {
mainState.backAction?.let {
IconButton(onClick = { it() }) {
Icon(Icons.Rounded.ArrowBack, contentDescription = "")
}
}
}
Box(modifier = Modifier.weight(1.0f), contentAlignment =
Alignment.Center) {
val title =
mainState.title ?: TABS.find { it.route ==
navBackStackEntry?.destination?.route }?.label
Text(
title ?: "",
style = MaterialTheme.typography.titleLarge,
maxLines = 1,
textAlign = TextAlign.Center
)
}
Row(Modifier.weight(1.0f)) {
Spacer(Modifier.weight(1.0f))
IconButton(onClick = { navigateToSettings() }) {
Icon(
painter = painterResource(id =
R.drawable.round_settings_24),
contentDescription = "settings"
)
}
}
66
}
},
// Has effect on IME: removes unnecessary space between keyboard and some
bottom element (input field)
// contentWindowInsets = WindowInsets(0, 0, 0, 0)
) { padd ->
NavHost(
modifier = Modifier
.fillMaxSize()
.padding(padd),
navController = navController,
startDestination = VIEW_ROUTE_TICKETS,
enterTransition = { fadeIn(tween(150)) },
exitTransition = { fadeOut(tween(150)) },
) {
composable(VIEW_ROUTE_TICKETS,
enterTransition = {
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right) },
exitTransition = {
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left)
},
popEnterTransition = {
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right) },
popExitTransition = {
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left)
})
{
LaunchedEffect(Unit) {
viewModel.setTopBarProps("Tickets")
}
BackHandler { onBack() }
TicketList(viewModel) { onSelectTicket(it) }
}
composable(VIEW_ROUTE_CHAT_VIEW,
enterTransition = {
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left) },
exitTransition = {
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right)
},
popEnterTransition = {
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left) },
popExitTransition = {
67
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right)
})
{
BackHandler { onBack() }
LaunchedEffect(Unit) {
val recipientName =
mainState.currentTicket?.uiState?.value?.recipientName?.ifBlank
{ "NONAME" } ?: ""
viewModel.setTopBarProps(recipientName) { onBack() }
}
mainState.currentTicket?.let { ticketChatView ->
ChatView(ticketChatView, psychologScreenViewModel = viewModel) {
onBack() }
}
}
}
}
}
Mainmenucotrolpanel
@file:OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
package com.svteam.anonimniipsiholog.ui.screen.main
import android.util.Log
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Surface
68
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.svteam.anonimniipsiholog.Constants
import com.svteam.anonimniipsiholog.TAG
import com.svteam.anonimniipsiholog.UserServicePricing
import com.svteam.anonimniipsiholog.api.ChatbotProvider
import com.svteam.anonimniipsiholog.getActivity
import com.svteam.anonimniipsiholog.model.ChatbotAnswerType
import com.svteam.anonimniipsiholog.model.SingleAskForReplyPayload
import com.svteam.anonimniipsiholog.showError
import com.svteam.anonimniipsiholog.ui.Ads
import com.svteam.anonimniipsiholog.ui.element.ChatView
import com.svteam.anonimniipsiholog.ui.viewmodel.MainScreenViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@Composable
fun RequestButtonsView(
mainScreenViewModel: MainScreenViewModel, onRequestPsychologist: () -> Unit,
onTalkToBot: () -> Unit
) {
LaunchedEffect(Unit) {
mainScreenViewModel.setTopBarProps(null, null)
}
69
Column(
Modifier
.fillMaxSize()
.padding(10.dp), verticalArrangement = Arrangement.SpaceEvenly
) {
Button(modifier = Modifier
.fillMaxWidth()
.weight(1f), onClick = { onRequestPsychologist() }) {
Text(
text = "WRITE TO REAL PSYCHOLOGIST", textAlign = TextAlign.Center,
fontSize = 34.sp, lineHeight = 34.sp
)
}
Spacer(Modifier.height(10.dp))
Button(modifier = Modifier
.fillMaxWidth()
.weight(1f), onClick = { onTalkToBot() }) {
Text(
text = "TALK TO BOT", textAlign = TextAlign.Center, fontSize = 34.sp,
lineHeight = 34.sp
)
}
}
}
@Composable
fun BotOptionsDialog(
mainScreenViewModel: MainScreenViewModel,
onDismiss: () -> Unit = {},
onSelect: (ChatbotAnswerType) -> Unit,
) {
val ctx = LocalContext.current
val mainState by mainScreenViewModel.uiState.collectAsState()
val adAvailable by Ads.adAvailable.collectAsState()
fun onSeeAd() {
Ads.tryShowAnyRewardedAd(ctx.getActivity()!!, true) {
mainScreenViewModel.addBalance(Constants.AD_REWARD_CREDITS)
}
}
Log.d(TAG, "GOV: ${mainState.currUserBalance >=
Constants.PRICE_CHATBOT_SMALL_QUESTION}")
Dialog(onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false)) {
70
Surface {
Column(
Modifier
.fillMaxWidth()
.padding(10.dp), horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Chatbot options", fontSize = 24.sp)
Text("Balance: $${mainState.currUserBalance}", fontSize = 18.sp)
Spacer(Modifier.height(20.dp))
Button(
{ onSelect(ChatbotAnswerType.SMALL) },
enabled = mainState.currUserBalance >=
Constants.PRICE_CHATBOT_SMALL_QUESTION
) {
Text(text = "Get a small answer (up to 200 characters) for $15",
fontSize = 16.sp)
}
Spacer(Modifier.height(10.dp))
Button(
{ onSelect(ChatbotAnswerType.LARGER) },
enabled = mainState.currUserBalance >=
Constants.PRICE_CHATBOT_LARGER_QUESTION,
) {
Text(text = "Get a larger answer (up to 500 characters) for $30",
fontSize = 16.sp)
}
Spacer(Modifier.height(10.dp))
Button({ onSeeAd() }, enabled = adAvailable) {
Text(
text = "See an ad to get $30" + if (!adAvailable) {
" – not available now, please try later."
} else {
""
},
fontSize = 16.sp
)
}
}
}
71
}
}
@Composable
fun BotQuestionDialog(
mainScreenViewModel: MainScreenViewModel,
question: String,
answerType: ChatbotAnswerType,
onQuestionChange: (String) -> Unit,
onDismiss: () -> Unit = {},
onAnswer: (String) -> Unit = {}
) {
val ctx = LocalContext.current
val keyboardController = LocalSoftwareKeyboardController.current
val cost = UserServicePricing.calculateChatbotCost(answerType)
var loading by remember { mutableStateOf(false) }
fun onSend() {
keyboardController?.hide()
CoroutineScope(Dispatchers.IO).launch {
loading = true
val res = ChatbotProvider.askSingle(SingleAskForReplyPayload(question,
answerType))
if (res.error != null) {
ctx.showError(res.error)
} else {
mainScreenViewModel.withdrawBalance(cost)
withContext(Dispatchers.Main) {
onAnswer(res.result!!.answer)
}
}
loading = false
}
}
Dialog(onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false)) {
Surface {
Column(
Modifier
.fillMaxWidth()
.padding(10.dp)
) {
Text("Ask the Chatbot", fontSize = 24.sp, modifier =
Modifier.align(Alignment.CenterHorizontally))
Spacer(Modifier.height(20.dp))
72
OutlinedTextField(
question,
onValueChange = {
if (it.length <= Constants.CHATBOT_QUESTION_MAX_LENGTH) {
onQuestionChange(it)
}
},
placeholder = { Text("Write your quesiton here...") },
singleLine = false,
modifier = Modifier
.fillMaxWidth()
.height(300.dp)
)
Text("${question.length} / ${Constants.CHATBOT_QUESTION_MAX_LENGTH}
used")
Spacer(Modifier.height(10.dp))
Row {
AnimatedVisibility(visible = loading) {
CircularProgressIndicator()
}
Spacer(Modifier.weight(1.0f))
FilledTonalButton(onDismiss) {
Text(text = "Close")
}
Spacer(Modifier.width(20.dp))
Button(onClick = { onSend() }, enabled = !loading) {
Text(text = "Send ($$cost)")
}
}
}
}
}
}
@Preview
@Composable
fun BotAnswerDialog(answer: String = "", onDismiss: () -> Unit = {}) {
Dialog(onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false)) {
Surface {
Column(
Modifier
.fillMaxWidth()
.padding(10.dp)
73
) {
Text("Chatbot's answer:", fontSize = 24.sp, modifier =
Modifier.align(Alignment.CenterHorizontally))
Spacer(Modifier.height(20.dp))
Text(answer, modifier = Modifier.fillMaxWidth())
Spacer(Modifier.height(10.dp))
Button(onDismiss, modifier = Modifier.align(Alignment.End)) {
Text(text = "Ok, thanks!")
}
}
}
}
}
private const val REQUEST_HELP_TAB_BUTTONS = "requestHelpButtons"
private const val REQUEST_HELP_TAB_CHAT_VIEW = "requestHelpChatView"
@Composable
fun TabRequestPsychologist(mainScreenViewModel: MainScreenViewModel) {
val navController = rememberNavController()
val reqHelpViewModel = mainScreenViewModel.reqHelpViewModel
val reqHelpState by reqHelpViewModel.uiState.collectAsState()
var failedToShowAdDialogVisible by remember { mutableStateOf(false) }
var botQuestionDialogVisible by remember { mutableStateOf(false) }
var botQuestion by remember { mutableStateOf("") }
var botAnswerType by remember { mutableStateOf(ChatbotAnswerType.SMALL) }
var botAnswer by remember { mutableStateOf("") }
fun onBack() {
navController.popBackStack()
mainScreenViewModel.setTopBarProps(null, null)
}
fun onTalkToBot() {
reqHelpViewModel.setBotOptionsDialogVisible(true)
// botQuestionDialogVisible = true
// val adSuccessful = Ads.tryShowAnyRewardedAd(ctx.getActivity()!!) {
// botViewVisible = true
// }
// if (!adSuccessful) {
// failedToShowAdDialogVisible = true
74
// }
}
fun onRequestPsychologist() {
navController.navigate(REQUEST_HELP_TAB_CHAT_VIEW)
}
LaunchedEffect(Unit) {
mainScreenViewModel.setTopBarProps(null, null)
}
NavHost(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight(),
navController = navController,
startDestination = REQUEST_HELP_TAB_BUTTONS,
) {
composable(REQUEST_HELP_TAB_BUTTONS,
enterTransition = {
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right) },
exitTransition = {
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left)
},
popEnterTransition = {
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Right) },
popExitTransition = {
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left)
}) {
BackHandler { onBack() }
RequestButtonsView(mainScreenViewModel,
onRequestPsychologist = { onRequestPsychologist() },
onTalkToBot = { onTalkToBot() })
}
composable(REQUEST_HELP_TAB_CHAT_VIEW,
enterTransition = {
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left) },
exitTransition = {
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right)
},
popEnterTransition = {
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left) },
popExitTransition = {
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right)
75
})
{
BackHandler { onBack() }
LaunchedEffect(Unit) {
mainScreenViewModel.setTopBarProps("Psychologist") { onBack() }
}
ChatView(
mainScreenViewModel.reqHelpViewModel.psychologistChatViewModel,
reqHelpViewModel = mainScreenViewModel.reqHelpViewModel
) { onBack() }
}
}
if (failedToShowAdDialogVisible) {
AlertDialog(onDismissRequest = { failedToShowAdDialogVisible = false },
confirmButton = {
Button(onClick = { failedToShowAdDialogVisible = false }) {
Text("OK...")
}
}, text = {
Text("Please try later...")
})
}
if (reqHelpState.botOptionsDialogVisible) {
BotOptionsDialog(
mainScreenViewModel,
onDismiss = { reqHelpViewModel.setBotOptionsDialogVisible(false) },
onSelect = {
reqHelpViewModel.setBotOptionsDialogVisible(false)
botAnswerType = it
botQuestionDialogVisible = true
},
)
}
if (botQuestionDialogVisible) {
BotQuestionDialog(
mainScreenViewModel,
question = botQuestion,
answerType = botAnswerType,
onQuestionChange = { botQuestion = it },
onDismiss = { botQuestionDialogVisible = false },
onAnswer = {
botQuestionDialogVisible = false
botQuestion = ""
botAnswer = it
})
76
}
if (botAnswer.isNotBlank()) {
BotAnswerDialog(botAnswer, onDismiss = { botAnswer = "" })
}
}
Newssystemcontrol
@file:OptIn(ExperimentalMaterial3Api::class)
package com.svteam.anonimniipsiholog.ui.screen.main
import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.svteam.anonimniipsiholog.api.NewsProvider
import com.svteam.anonimniipsiholog.model.NewsMessage
import com.svteam.anonimniipsiholog.ui.viewmodel.MainScreenViewModel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.datetime.Clock
@Composable
fun NewsCard(msg: NewsMessage) {
Card {
77
}
Surface(
onClick = { },
shape = RoundedCornerShape(30.dp),
color = MaterialTheme.colorScheme.primaryContainer,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp),
) {
Box(Modifier.padding(20.dp)) {
Text(text = msg.text.getLocalized(), fontSize = 16.sp)
}
}
}
@Composable
fun TabNews(mainScreenViewModel: MainScreenViewModel) {
var newLoadInstant by remember { mutableStateOf(Clock.System.now()) }
val allNews = remember { mutableStateListOf<NewsMessage>() }
val listState = rememberLazyListState()
var loading by remember { mutableStateOf(false) }
val ctx = LocalContext.current
LaunchedEffect(newLoadInstant) {
loading = true
val news = NewsProvider.getLatest(newLoadInstant)
if (news.error == null) {
val result = news.result ?: listOf()
if (result.isNotEmpty()) {
allNews.addAll(result)
}
} else {
Toast.makeText(ctx, "Unable to load news, please try later.",
Toast.LENGTH_LONG).show()
}
loading = false
}
LaunchedEffect(listState) {
snapshotFlow {
listState.layoutInfo.visibleItemsInfo.lastOrNull()?.index
}.collectLatest { idx ->
if (loading || idx == null || idx < allNews.size 10) {
78
return@collectLatest
}
newLoadInstant = allNews.last().created_at
}
}
LazyColumn(state = listState) {
itemsIndexed(allNews, key = { _, item -> item.id }) { idx, item ->
NewsCard(msg = item)
Spacer(Modifier.height(20.dp))
if (idx == allNews.size 1 && loading) {
Row(Modifier.fillMaxWidth(), horizontalArrangement =
Arrangement.Center) {
CircularProgressIndicator()
}
Spacer(Modifier.height(20.dp))
}
}
}
}