Все работы

[ Коммерческий продукт ]

InteractiveLAB

Офлайн-клиент на React и Capacitor для школьных Android-панелей с Chrome 83 и нестабильной сетью — раздаётся школам подписанным APK.

interactivelab.kz
Роль
Client frontend owner
Команда
Два разработчика
Период
Июль — сентябрь 2026
Статус
Production
Интерфейс
  • React
  • TypeScript
  • Vite
Офлайн
  • IndexedDB
Платформа
  • Capacitor 7
  • Android
Тесты
  • Vitest
Панель METZ с открытой главной InteractiveLAB: девять предметов и кнопка «Скачать всё»

Панель METZ: Android 11, WebView Chrome 83, экран 4K при CSS-вьюпорте 1280×720. Над кнопками — подсказка скачать предметы заранее, чтобы на уроке не нужен был интернет. Каталог предметов тестовый.

Контекст

InteractiveLAB доставляет интерактивные учебные симуляторы на школьные панели METZ, в том числе в школы со слабой сетью или вовсе без неё.

Целевая панель работает на Android 11 и WebView Chrome 83. Физический 4K-экран отдаёт CSS-вьюпорт 1280×720 при DPR 3, а удалённые DevTools на ней недоступны.

Моя роль / где проходит граница

Я отвечаю за client/: интерфейс на React, модель офлайн-контента, обёртку на Capacitor, совместимость, сборку APK и проверку на панели. Сервер на FastAPI и база данных — зона коллеги. Первую версию админ-панели построил я, затем передал её ему.

Решение 1 / приложение в APK, контент в IndexedDB

Оболочка приложения лежит внутри APK. Предметы, симуляторы и их HTML, инструкции и вложения хранятся в IndexedDB. Service worker сознательно не используется: поверх нативной оболочки он завёл бы второй жизненный цикл кэша.

Скачивание показывает ход, останавливается по просьбе учителя и отчитывается, что не докачалось. На школьной сети загрузка обрывается постоянно, и это обычный сценарий.

Решение 2 / страж по итоговой сборке

Vite собирает под Chrome 80. После сборки отдельный страж проверяет dist на синтаксис и CSS новее Chrome 83, а диагностический оверлей на ES5 показывает ошибки разбора и выполнения прямо на панели, потому что DevTools там нет.

Релизный APK проходит второй страж: подпись не отладочная, cleartext выключен, панели разработчика в сборке нет, бэкенд — только по https://. Пока HTTPS-бэкенда не было, он валил каждую релизную сборку — ровно на этом адресе. Когда бэкенд появился, три поломки прода нашлись запросами по живым доменам ещё до сборки APK, а не на панели.

Решение 3 / общая панель, разные учителя

Офлайн-контент привязан к пользователю через метку владельца. Когда на панель входит другой учитель, IndexedDB предыдущего очищается до загрузки нового каталога.

Результат / проверка

  • релизный APK подписан и раздаётся школам, текущая версия — 0.1.2;
  • офлайн-скачивание, перезапуск, темы, казахский и русский, перемотка видео, инструкции и вложения проверены на реальной панели;
  • клиент в CI: модульные тесты и сборка со стражем совместимости.
Экран входа InteractiveLAB на панели в тёмной теме
Тот же экран входа в светлой теме
Вход на панели в тёмной и светлой теме. Язык переключается там же: ҚАЗ или РУС.

Ограничения

Проект только вышел в школы, и данных об использовании, которые можно показать, пока нет.