Для получения данных из банка по сети есть стандартизированный async Fetch API.
Есть собственный неглобальный декоратор fetch API fetchJson, который за вас может сделать:
-
serialize/parse json,
-
залогировать request/response через
console.debug().
TODO: описать наше отношение к персональным данным и необходимость зачищать
ненужные разработчику плагина поля, привести примеры работы sanitize().
Для логирования есть знакомый всем стандартизированный Console API.
Все вызовы console на мобильных устройствах превращаются в текст лога. Вместе с текстом, как и везде, можно передавать структуры данных любой глубины.
Например,
console.log("что-то тут не так", {deadBodies: 999});напишет в лог работы плагина
[log] что-то тут не так {deadBodies: 999}
Логи с мобильных устройств пользователи отправляют в случае, если что-то пошло не так (например, плагин выбросил ошибку), или специально (если поведение плагина некорректное, в настройках плагина есть кнопочка "отправить лог последней синхронизации".
console.assert(condition, ...args) ведёт себя везде так, как в node.js
(бросает AssertionError если значение condition ложно) во всех окружениях,
так что можно его смело использовать для строгих утверждений.
Вызов
console.assert(response.status === 200, "Не удалось получить транзакции", {response});прервёт выполнение и пользователь на UI увидит
`Не удалось получить транзакции {response: { status: ... } }
Для того, чтобы прервать выполнение, достаточно выбросить любое исключение.
throw new Error("Всё не так =[");Также есть возможность подсказать мобильному приложению, как обрабатывать
ошибку, используя ZenMoney.Error как конструктор ошибки:
ZenMoney.Error(message: String?, logIsNotImportant: Bool?, forcePluginReinstall: Bool?)
Мы пока можем представить два юзкейса, когда это может понадобиться:
-
Ошибка временная (сеть пропала, уборщица уронила сервер банка) и мы явно об этом знаем, и ничего не можем с этим поделать (пробовали делать retry), и просто не хотим, чтобы пользователь слал нам такие ошибки.
В таком случае мы используем:
throw new ZenMoney.Error("ДОКОЛЕ!", true /*logIsNotImportant*/, false);
и на UI у пользователя не показывается кнопка "Отправить лог разработчикам"
-
Настройки пользователя неверны (логин/пароль неверный) и мы не видим смысла запускать плагин еще раз с теми же самыми настройками.
В таком случае мы используем:
throw new ZenMoney.Error("Поправь настройки: неверные учетные данные!", false, /* forcePluginReinstall*/ true);
и на UI пользователь видит ошибку и перенаправляется в окно настроек.
ZenMoney.getPreferences() возвращает введённые пользователем настройки
плагина.
Ключами объекта являются значения key из
preferences.xml
// При условии наличия в preferences.xml:
// <EditTextPreference key="login" ... />
// <EditTextPreference key="password" ... />
// Получаем так:
const {login, password} = ZenMoney.getPreferences();Например, для аутентификации понадобился SMS код, который банк прислал владельцу аккаунта.
const smsCode = await ZenMoney.readLine("Введите код из СМС сообщения");
if (!smsCode) {
throw new Error("Без SMS-кода не смогу =[");
}ZenMoney.retrieveCode(message, imageUrl, options: {time, inputType})
options.time: Int? - время, через которое ввод станет неактуальным и окно
закроется, вернув null.
options.inputType: ('text' | 'textPassword' | 'number' | 'numberDecimal' | 'numberPassword' | 'phone' | 'textEmailAddress')? -
тип текстового ввода. Набор значений тот же, что и у EditTextPreference в
preferences.xml.
const smsCode = ZenMoney.retrieveCode("Введите код из СМС сообщения");
if (!smsCode) {
throw new Error("Без SMS-кода не смогу =[");
}Функция ZenMoney.retrieveCode в браузерном отладчике реализована не очень
хорошо: она читает значение файла zp_pipe.txt в папке плагина до тех пор,
пока файл пустой.
После каждого использования этой функции рекомендуется опустошить файл
zp_pipe.txt, иначе retrieveCode будет возвращать устаревший пользовательский
ввод.
Когда-нибудь мы заменим этот костыль на браузерный confirm
Иногда может понадобиться сохранение данных между несколькими вызовами плагина. Примером таких данных может быть accessToken банка, выданный банком в ответ на успешное подтверждение выданного пользователю SMS-кода (мы же не хотим, чтобы при каждом запуске синхронизации пользователь вводил значение из SMS?).
ZenMoney.setData(key: String, value: Any?)
Удалить значение по ключу можно при помощи вызова
ZenMoney.setData(key, null).
ZenMoney.getData(key: String, defaultValue: Any?) -> Any?
ZenMoney.clearData()
ZenMoney.saveData()
Физически данные сохраняются или очищаются только после вызова
ZenMoney.saveData().
ZenMoney.isAccountSkipped(id: String) -> Bool
Метод существует для того, чтобы не выполнять ненужную работу по выгрузке данных, которые решил пропустить пользователь.
Пропущенными счётами можно управлять в настройках подключения.
Необходимо его использовать для фильтрации полученных из банка счетов, до того как запрашивать по ним транзакции.
Можно найти здесь