Компоненты UI
Для детальной настройки UI можно модифицировать стандартные компоненты или заменять их кастомными
Ниже приведены условные иерархические структуры имеющихся компонентов
Во всех случаях frame - это функция компоновки элементов. Она получает подкомпоненты в виде лямбд и отвечает за расположение этих элементов (порядок, отступы, контейнеры)
Тикет
Ticket- экран для ввода логина, пароля и запросаheader- верхняя панельlogo- логотипtext- текст на панелиcloseButton- кнопка закрытия чатаframe
globalLoading- компонент загрузкиwaitForReply- компонент-сообщение об отправленном вопросеstaffOffline- компонент-сообщение о том что сотрудников нет в сетиnameInput- поле ввода имениemailInput- поле ввода электронной почтыcontentInput- поле ввода запросаpolicyConsent- компонент-ссылка на обработку перс. данныхcheckbox- чекбоксticketPolicy- надписьticketPolicyLink- кликабельная ссылкаerrorMessage- сообщение об ошибкеframe
sendButton- кнопка отправкиframe
Пример кастомизации экрана тикета:
- заменена стандартная верхняя панель
- изменена компоновка элементов (верхняя панель будет состоять из текста и кнопки закрытия, без иконки агента)
ChatView(
...
ticket = { CustomTicket() },
)
@Composable
fun TicketScope.CustomTicket() {
Ticket(
header = {
CustomHeader()
},
)
}
@Composable
fun ChatHeaderScope.CustomHeader() {
ChatHeader(
frame = {
Row {
it.text()
it.closeButton()
}
}
)
}
Чат
ChatPage- экран чатаheader- верхняя панельlogo- логотипtext- текст на панелиcloseButton- кнопка закрытия чатаframe
footer- нижняя панель для отправки сообщенийglobalLoading- экран загрузки страницыrating- экран оценки сервисаtitle- текст заголовкаrateButtons- кнопки оценкиleaveCommentText- текстcommentField- поле ввода комментарияsubmitButton- кнопка отправки отзываframe
errorBanner- баннер ошибкиprependMessages- кнопка загрузки предыдущих сообщенийchatList- компонент-список сообщенийserverMessage- сообщения от сервераserverTextMessage- текстовое сообщение от сервераserverFileMessage- сообщение с файлом от сервераserverImageMessage- сообщение с изображением от сервера
userMessage- сообщение клиентаuserTextMessage- текстовое сообщение клиентаuserFileMessage- сообщение с файлом клиентаuserImageMessage- сообщение с изображением клиента
startDate- дата создания тикета
frame
Пример кастомизации экрана чата:
ChatView(
...
chat = { CustomChat() },
)
@Composable
fun ChatScope.CustomChat() {
ChatPage(
prependMessages = {
Box(
modifier = Modifier
.fillMaxWidth()
.clickable {
showPrependMessages()
}
.background(Color(0xFF03D256))
.padding(uiConfig.dimensions.topPanelPadding)
) {
Box(modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.CenterStart) {
Text(text = "Предыдущие сообщения")
}
Box(modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.CenterEnd) {
Text(text = "Показать")
}
}
},
chatList = {
ChatListMessages(
startDate = {
CustomStartDate(it)
},
serverMessage = {
ServerMessage(
serverTextMessage = {
CustomServerTextMessage()
},
)
},
userMessage = {
UserMessage(
userTextMessage = {
CustomUserTextMessage()
}
)
}
)
}
)
}
@Composable
fun ChatUIScope.CustomStartDate(date: String) {
// реализация
}
@Composable
fun ServerMessageScope.CustomServerTextMessage() {
// реализация
}
@Composable
fun UserMessageScope.CustomUserTextMessage() {
// реализация
}
Скоупы
Каждый UI-компонент оформлен как @Composable с ресивером-скоупом - то есть функция объявляется в виде @Composable SomeScope.Component(...). Скоуп — это интерфейс с дополнительными данными и действиями.
Ниже приведен список основных скоупов с данными
ChatUIScopeuiConfig:ChatUIConfig
Ticket
-
TicketScope:ChatUIScopeisGlobalLoading:Boolean- показывать ли общий лоадер экрана тикетаticketStatus:TicketStatus- текущее состояние тикета (ожидание ответа, офлайн и др.)options:TicketOptions- настройки формы тикета
-
NameInputContextname:String- текущее значение поля «Имя»showNameError:Boolean- флаг показа ошибки под полем имениonNameChange:(String) -> Unit- обработчик ввода имени
-
EmailInputScopeemail:String- текущее значение e-mailonEmailChange:(String) -> Unit- обработчик ввода e-mailshowEmptyEmailError:Boolean- показать ошибку «e-mail пуст»showIncorrectEmailError:Boolean- показать ошибку «e-mail некорректен»
-
ContentInputScopecontent:String- текст обращенияonContentChange:(String) -> Unit- обработчик ввода текста обращенияshowEmptyContentError:Boolean- показать ошибку «сообщение пусто»
-
TicketCheckboxScopeisConsented:Boolean- отмечено ли согласие с политикойonConsentAgreementChange:(Boolean) -> Unit- обработчик переключения чекбокса согласия
-
PolicyConsentScope:TicketCheckboxScopeoptions:TicketOptions- данные для ссылки на политику конфиденциальностиunacceptedConsentError:Boolean- показать ошибку «согласие не принято»
-
TicketSendButtonScopeonSubmit:() -> Unit- действие отправки формы
Chat
-
ChatScopeisGlobalLoading:Boolean- показывать ли общий лоадер экрана чатаisRating:Boolean- показывать ли экран оценки сервисаshowError:Boolean- показать ли баннер ошибкиshowPrepend:Boolean- показывать ли кнопку «Загрузить предыдущие сообщения»
-
ChatHeaderScopestaff:Staff?- данные оператора (имя, аватар)closeChat:() -> Unit- закрыть чат
-
ChatFooterScopeisConnected:Boolean- есть ли подключение к серверуmessageText:String- текущий текст в поле вводаfilePickerExpanded:Boolean- открыт ли блок выбора файловonMessageTextChange:(String) -> Unit- обработчик ввода текстаonFileExpandedChange:(Boolean) -> Unit- открыть/закрыть выбор файловsendMessage:(String) -> Unit- отправить текстовое сообщениеuploadFile:(Uri, Long) -> Unit- загрузить файл (uri, размер)
-
ErrorBannerScopeerror:String- текст ошибкиshowError:Boolean- показывать ли ошибкуonHide:() -> Unit- скрыть баннер ошибки
-
RateChatScopeformat:String- шаблон оценкиmaxRateCommentLength:Int- максимум символов в комментарииmaxRate:Int- максимум оценкиonSubmit:(Int, String) -> Unit- отправить оценку и комментарийonCancel:() -> Unit- закрыть/пропустить оценку
-
PrependMessagesScopeshowPrependMessages:() -> Unit- загрузить более ранние сообщения
-
ServerMessageScopegetTextWidth:(text: String, fontSize: TextUnit) -> Dp- получить размер текстовой строкиuiMessage:UiMessage- данные сообщенияbaseURL:String- базовый URL для относительных ссылокtimeWidth:Dp- ширина текста подписи времениbuttonMaxTextWidth:Dp- максимальная ширина текста на кнопках сообщенияonFileClick:(FileData.Text) -> Unit- клик по вложению-файлуonImageClick:(FileData.Image) -> Unit- клик по изображениюonChatButtonClick:(ChatButton) -> Unit- клик по кнопке в сообщенииshowButtons:Boolean- показывать ли кнопки-ответы под сообщением
-
UserMessageScopegetTextWidth:(text: String, fontSize: TextUnit) -> Dp- получить размер текстовой строкиuiMessage:UiMessage- данные пользовательского сообщенияbaseURL:String- базовый URL для относительных ссылокtimeWidth:Dp- ширина текста подписи времениonFileClick:(FileData.Text) -> Unit- клик по вложению-файлуonImageClick:(FileData.Image) -> Unit- клик по изображению