Обновить

Комментарии 4

Посмотрел пример с post-data в документации: в success показывается сообщение «The task has been created!». А в офлайне success срабатывает после сохранения операции в локальную очередь или только после ответа Appwrite? Для интерфейса это разные обещания пользователю: «сохранено на устройстве» и «принято сервером».

Например, пользователь отправил форму без сети, а затем закрыл экран с ней. При синхронизации сервер отклонил запись. Как в этом случае приложение узнает об ошибке — через тот же error или через состояние очереди? Было бы полезно добавить пример со статусами pending / synced / failed: он прояснил бы, что именно можно показывать пользователю на разных этапах синхронизации.

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

В оффлайне сработает success, данные формы запишутся в localStorage, когда появится соединение с сервером, запустится отправка данных в Appwrite, пользователь увидит уведомление о синхронизации. И если в момент синхронизации произошла ошибка, должно быть уведомление, что что-то пошло не так. Сейчас проверил код, такого уведомления о ошибке нет, добавлю.

Вы можете показать пользователю разные уведомления в оффлайн и онлайн, для этого необходимо подключить стор networkState и использовать состояние переменной isBackendAvailable для того, чтобы показать разные уведомления:

  stores:
    - networkState
  ...

  success:
    set-notification:
      type: info
      message: "{{ stores.networkState.isBackendAvailable ? 'Принято сервером' : 'Сохранено локально' }}"

Интересный подход, особенно автономность PWA и связка с Appwrite. Вопрос по спецификации: как решаете миграции, когда спека меняется, а у пользователей уже есть локальные данные в офлайне? Например, поле переименовали или поменяли тип. Генерируется ли какой-то слой миграций для IndexedDB, или пока предполагается, что локальное хранилище просто сбрасывается?

Спасибо. Я вижу несколько разных вопросов, отвечу на них по отдельности.

Миграция при изменении версии спецификации: Сейчас в app.yaml указана версия спецификации specs-version: 0.1, в будущем Vite-адаптер будет проверять версию спецификации при генерации кода приложения, чтобы ничего не сломать при изменении схем спецификации.

Но, кажется, вы про миграцию локальной БД: Сейчас getData работает только с localStorage и sessionStorage, данные записываются в массив. И здесь нет строгой типизации, если Appwrite ответил другим набором полей, запись просто обновится, и если в ответе Appwrite больше нет таких записей, они удалятся. При обновлении приложения localStorage никак не затрагивается, но хранилище файлов сбрасывается. Я планирую добавить поддержку IndexedDB в getData, скорее всего, схема работы будет аналогичная с localStorage.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации