Компоненты UI
Для детальной настройки UI можно модифицировать стандартные компоненты или заменять их кастомными
Ниже приведены условные иерархические структуры имеющихся компонентов
Во всех случаях layout — это замыкание (builder) компоновки, которое отвечает за расположение слотов/подкомпонентов. В него передаётся контекст и набор готовых View-слотов
Тикет
TicketPage- экран для ввода логина, пароля и запросаheader- верхняя панельlogo- логотипtext- текст на панелиcloseButton- кнопка закрытия чатаlayout
globalLoading- компонент загрузкиwaitForReply- компонент-сообщение об отправленном вопросеstaffOffline- компонент-сообщение о том что сотрудников нет в сетиname- элемент ввода имениemail- элемент ввода электронной почтыcontent- элемент ввода запросаpolicyConsent- компонент-ссылка на обработку перс. данныхcheckbox- чекбоксticketPolicy- надписьticketPolicyLink- кликабельная ссылкаerrorMessage- сообщение об ошибкеlayout
sendButton- кнопка отправкиlayout
Пример кастомизации экрана тикета:
- заменена стандартная верхняя панель
- изменена компоновка элементов (верхняя панель будет состоять из текста и кнопки закрытия, без иконки агента)
ChatHDE.shared.makeChatView()
.ticket {tvm, cvm in
TicketPage(tvm, cvm)
.header {ctx in
Header(ctx)
.layout {slots in
HStack {
slots.text
slots.closeButton
}
}
}
}
Чат
ChatPage- экран чатаheader- верхняя панельlogo- логотипtext- текст на панелиcloseButton- кнопка закрытия чатаlayout
footer- нижняя панель для отправки сообщенийglobalLoading- экран загрузки страницыrate- экран оценки сервисаtitle- текст заголовкаrateButtons- кнопки оценкиleaveCommentText- текстcommentField- поле ввода комментарияsubmitButton- кнопка отправки отзываlayout
errorBanner- баннер ошибкиprependMessages- кнопка загрузки предыдущих сообщенийchatList- компонент-список сообщенийserverTextMessage- текстовое сообщение от сервераserverFileMessage- сообщение с файлом от сервераserverImageMessage- сообщение с изображением от сервераuserTextMessage- текстовое сообщение клиентаuserFileMessage- сообщение с файлом клиентаuserImageMessage- сообщение с изображением клиентаstartDate- дата создания тикета
layout
Пример кастомизации экрана чата:
ChatHDE.shared.makeChatView()
.chat {cvm in
ChatPage(cvm)
.prependMessages {ctx in
Button {
ctx.showPrependMessages()
} label: {
Text("Ранние сообщения")
.frame(maxWidth: .infinity)
.foregroundStyle(.red)
.padding(10)
.background(.white)
}
.buttonStyle(.plain)
}
.chatList {ctx in
ChatList(ctx)
.serverTextMessage {uimes in
// UI...
}
.serverFileMessage {uimes, file in
// UI...
}
}
}
Environment
В кастомных компонентах SDK доступны общие зависимости через @Environment:
- Настройки оформления (цвета, шрифты, размеры, тексты):
@Environment(\.chatUIConfig) var ui
- Стандартные действия SDK:
@Environment(\.chatActions) var actions
Реализации по умолчанию
Для каждого UI-компонента в SDK доступна стандартная реализация (Default-версия). Стандартные компоненты можно использовать как есть, либо взять за основу, скопировать в проект и адаптировать под требования приложения. Ниже приведён список основных стандартных компонентов, доступных для кастомизации.
TicketLayoutDefaultNameInputDefaultEmailInputDefaultContentInputDefaultTicketSubmitButtonDefaultStaffOfflineDefaultPolicyLayoutDefaultPolicyCheckboxDefaultPolicyErrorDefaultPolicyLinkDefaultPolicyTextDefaultHeaderLayoutDefaultHeaderLogoDefaultHeaderTextDefaultHeaderCloseButtonDefaultGlobalLoadingDefaultChatFooterDefaultChatPageLayoutDefaultErrorBannerDefaultPrependMessagesButtonDefaultRatingCompleteDefaultRateChatLayoutDefaultRateChatTitleDefaultRateChatButtonsDefaultRateChatLeaveCommentTextDefaultRateChatCommentFieldDefaultRateChatSubmitButtonDefaultServerFileMessageDefaultServerImageMessageDefaultServerTextMessageDefaultStartDateDefaultUserFileMessageDefaultUserImageMessageDefaultUserTextMessageDefault
Контексты
Каждый UI-компонент в SDK настраивается через builder-замыкание, которое получает контекст компонента. Контекст — это объект, содержащий дополнительные данные и действия, необходимые для построения и управления UI.
Ниже приведен список основных контекстов с данными
Ticket
-
TicketLayoutContextisGlobalLoading:Boolean- показывать ли общий лоадер экрана тикетаticketStatus:TicketStatus- текущее состояние тикета (ожидание ответа, офлайн и др.)ticketOptions:TicketOptions- настройки формы тикетаeffects: AnyPublisher<TicketEffect, Never>- эффект для отслеживания старта нового чатаsetGlobalLoading(Bool)- глобальная загрузкаstartChat(StartVisitorChatData)- запуситить новый чат
-
NameInputContextname:String- текущее значение поля «Имя»showNameError:Boolean- флаг показа ошибки под полем имениonNameChange(String)- обработчик ввода имени
-
EmailInputContextemail:String- текущее значение e-mailshowEmptyEmailError:Boolean- показать ошибку «e-mail пуст»showIncorrectEmailError:Boolean- показать ошибку «e-mail некорректен»onEmailChange(String)- обработчик ввода e-mail
-
ContentInputContextcontent:String- текст обращенияshowEmptyContentError:Boolean- показать ошибку «сообщение пусто»onContentChange(String)- обработчик ввода текста обращения
-
PolicyConsentContextoptions:TicketOptions- данные для ссылки на политику конфиденциальностиunacceptedConsentError:Boolean- показать ошибку «согласие не принято»isConsented:Bool- принято ли соглашениеonConsentAgreementChange(Bool)- изменение статуса соглашения
-
TicketSubmitButtonContextonSubmit()- действие отправки формы
Chat
-
ChatLayoutContextisGlobalLoading:Boolean- показывать ли общий лоадер экрана чатаisRating:Boolean- показывать ли экран оценки сервисаisRatingCompleted:Boolean- отправлена ли оценка пользователемshowErrorBanner:Boolean- показать ли баннер ошибкиshowPrepend:Boolean- показывать ли кнопку «Загрузить предыдущие сообщения»cancelRating()- отменить оценивание (скрыть страницу оценки)
-
ChatListContextallMessages:[UiMessage]- все сообщения в чате
-
HeaderContextstaff:Staff?- данные оператора (имя, аватар)closeChat()- закрыть чат
-
ChatFooterContextisConnected:Boolean- есть ли подключение к серверуmessageText:String- текущий текст в поле вводаfilePickerExpanded:Boolean- открыт ли блок выбора файловonMessageTextChange(String)- обработчик ввода текстаonFileExpandedChange(Boolean)- открыть/закрыть выбор файловsendMessage(String)-> Unit - отправить текстовое сообщение
-
RateChatContextformat:String- шаблон оценкиmaxRateCommentLength:Int- максимум символов в комментарииmaxRate:Int- максимум оценкиrate:Int- оценкаonSubmit(Int, String)- отправить оценку и комментарийonCancel()- закрыть/пропустить оценкуonChangeRate(Int)- изменение оценки
-
PrependMessagesScopeshowPrependMessages()- загрузить более ранние сообщения
-
ErrorBannerContexterror:UploadError- вид ошибкиshowError:Bool- показывать ли ошибку