Kotlin Multiplatform / У нас появилась библиотека для работы с JS — moko-javascript

У нас появилась библиотека для работы с JS — moko-javascript

Во время работы над одним из проектов возникла необходимость в динамическом построении экранов. Раньше вся конфигурация отображения экрана приходила в JSON, поскольку экран представлял собой форму-конструктор. Далее этот JSON попадал в наш движок. Тот на его основе определял отображение полей в соответствии с типом и параметрами, которые были в JSON. Набор полей был фиксированным, и этого функционала хватало до тех пор, пока не появилась потребность в динамике с завязкой на содержимое данных каких-то полей.

Например, нужно было дать возможность пользователю прикрепить вложение, только если он выбрал дистанционную отправку документов. Или предусмотреть дополнительные поля для ввода данных карты, если клиент выбрал в приложении оплату таким способом. Другие виды оплаты не должны при выборе вызывать это поле.

Нужно было, чтобы условие видимости присылал нам бэк, а мы могли интерпретировать его на клиенте. Причем это должно было быть завернуто в общий код, т. к. приложение на базе KMM. Раньше заставить приложение, написанное на KMM, перестроиться вот так сходу было нельзя. Из-за фиксированной логики изменить интерфейс можно было только одним путем: внести правки в код, собрать новый билд, отправить на ревью в Google Play или App Store и дождаться релиза. Из пяти звеньев в этой цепочке действий к разработке относятся только два. Поэтому даже если кодить очень быстро, времени с начала работы над изменениями до релиза пройдет много — не меньше недели, если работы немного и у маркетплейсов нет замечаний.

Мы приняли решение сделать передачу с сервера строки, которая будет содержать JS-код, делающий расчет и возвращающий результат. В случае примера выше — bool. То есть мы передаем в обработчик JS это выражение, состояние формы и данных по юзеру, а он выдает результат видимости этого поля или варианта выбора в списке.

Как еще можно использовать moko-javascript: в случае, когда нужно вычислить значение, но формула расчета не известна на клиенте заранее. Если делать запрос к серверу каждый раз, приходится долго ждать. Решение — запрос, который может вернуть JS-выражение для расчета значения. Мы сможем локально использовать его при вычислении, подставляя нужные параметры.

Например, юзер выбирает две даты, а специальное поле отображает разницу между ними в днях, чтобы показать, сколько дней он выбрал. Это поле нельзя ввести вручную, но оно нужно для отображения. Так как вся форма строится просто по JSON-конфигу, ни одно поле не знает о существовании других, а уж тем более, что значение текущего поля А — это разница в днях между полями Б и В.

Тут нам и помог JS. Мы добавили, что значение поля А — это результат выполнения строчки JS-кода. Движок уже сам выполнит этот код, получит результат, а мы сохраним гибкость конфигурации форм и их полей удаленно, не прибегая к дополнительным изменениям кода на клиенте. Словом, библиотека moko-javascript делает логику приложения более гибкой, избавляет разработчиков и клиентов от головной боли с перевыпуском приложения из-за небольших интерфейсных изменений и этим экономит огромное количество времени. Релиз библиотеки состоялся 16 июня — она доступна на гитхабе. Пользуйтесь!

moko-js.png