Перейти к основному содержимому
Версия: 5.9.0

Пользовательские сценарии (flow)

Flow — это настройки конкретного экрана. Они переопределяют компоненты дизайн-системы точечно: изменения в одном flow не затрагивают другие экраны и базовые настройки.

Архитектура flows

Все flow наследуют от ChatUserFlow. Базовый класс реализует протокол Applicable (метод apply { ... } для группировки настроек) и содержит общие свойства:

СвойствоТипОписание
backgroundColorUIColorЦвет фона экрана (инициализируется из components.colors.background)
navigationBarStyleNavigationBarStyleСтиль верхней панели навигации. По умолчанию ссылается на тот же объект, что и components.navigationBarStyle. Поэтому мутация chatFlow.navigationBarStyle.X = ... затрагивает оба flow и общие компоненты. Для изоляции присвойте новый экземпляр — пример в секции Изоляция navigationBarStyle ниже.

Подклассы — ChatFlow (экран чата) и SearchFlow (экран поиска).

Настройка готового flow:

В текущей версии SDK конструкторы ChatFlow/SearchFlow не входят в публичный API — создавать новые экземпляры извне модуля нельзя. Настройка выполняется через мутацию готового flow, который SDK создал внутри ChatTheme:

let theme = ChatTheme(components: components)

// Настраиваем существующий chatFlow
theme.flows.chatFlow.backgroundColor = .systemBackground
theme.flows.chatFlow.navigationBarStyle.hidden = false

// Аналогично для searchFlow
theme.flows.searchFlow.backgroundColor = .systemBackground

Для группировки изменений используйте apply:

theme.flows.chatFlow.apply {
$0.backgroundColor = .systemBackground
$0.navigationBarStyle.hidden = false
}

Изоляция navigationBarStyle для одного flow:

Так как chatFlow.navigationBarStyle по умолчанию ссылается на тот же объект, что и searchFlow.navigationBarStyle и components.navigationBarStyle, мутация затронет всё. Чтобы поменять навигацию только для одного flow — присвойте новый экземпляр:

Для создания нового экземпляра используется обобщённый билдер ChatStyle.build(with:configure:) — публичный статический метод базового класса ChatStyle, доступный всем его подклассам (включая NavigationBarStyle). Тип создаваемого стиля выводится из контекста присваивания:

// Только для chatFlow — searchFlow и components сохранят прежний navigationBarStyle.
// build(...) унаследован от ChatStyle; конкретный тип (NavigationBarStyle)
// выводится из типа левой части присваивания.
theme.flows.chatFlow.navigationBarStyle = NavigationBarStyle.build(with: theme.components) { nav in
nav.hidden = false
nav.backButtonColor = .systemBlue
}

Пример настройки:

// Создание компонентов дизайн системы
let components = ChatComponents()

// Создание темы из компонентов
let theme = ChatTheme(components: components)

// Получение настроек экрана чата
let chatFlow = theme.flows.chatFlow
chatFlow.incomeMessages.showAvatar = true
chatFlow.outcomeMessages.showAvatar = false

// Получение настроек экрана поиска
let searchFlow = theme.flows.searchFlow
searchFlow.searchMessageStyle.matchTextStyle.color = .red

Чат

Экран чата — основной экран SDK: список сообщений и панель ввода.

Получение стиля сообщений

Метод messageStyle(for:) возвращает стиль сообщений по направлению (входящее или исходящее):

// Получить стиль входящего сообщения
let incomingStyle = chatFlow.messageStyle(for: false)

// Получить стиль исходящего сообщения
let outgoingStyle = chatFlow.messageStyle(for: true)

Метод возвращает объект ChatMessagesStyles — полный набор параметров стилизации (цвета, шрифты, отступы, иконки статусов).

Загрузка данных:

Загрузка чата

Пустой чат:

Пустой чат

Ошибка получения данных:

Отображение ошибки

Список сообщений:

Отображение сообщений

Поиск сообщений

Вспомогательный экран для поиска сообщений в чате и отображения результатов.

Открывается по нажатию на иконку поиска в панели навигации; видимость иконки настраивается в ChatConfig.

Открытие экрана поиска:

Поиск сообщений

Пустые результаты:

Результаты не найдены

Найденные сообщения:

Результаты поиска

Примеры настройки SearchFlow

let searchFlow = theme.flows.searchFlow

// Цвет выделения совпадений в результатах поиска
searchFlow.searchMessageStyle.matchTextStyle.color = UIColor(named: "BrandColor") ?? .systemOrange

// Шрифт выделения
searchFlow.searchMessageStyle.matchTextStyle.font = .systemFont(ofSize: 14, weight: .bold)

// Навигационная панель экрана поиска
searchFlow.navigationBarStyle.apply { nav in
nav.titleTextStyle.color = .white
nav.backgroundColor = UIColor(named: "BrandColor") ?? .systemBlue
nav.backButtonColor = .white
}

// Кнопка «Отмена» в поисковой строке — из-за ограничений UISearchBar API применяется только color.normal,
// см. design-system/known_issues.md
searchFlow.navigationBarStyle.searchBarStyle.cancelButtonStyle.color.normal = .white

// Текст при отсутствии результатов
searchFlow.notFoundTextStyle = ChatTextStyle(
font: .systemFont(ofSize: 15),
color: .secondaryLabel
)

// Фон экрана поиска
searchFlow.backgroundColor = .systemBackground