mirror of
https://github.com/smmarty/friflex_flutter_starter.git
synced 2025-12-22 09:30:45 +00:00
feat(update): добавить модуль управления Hard & Soft обновлений (#30)
1. Реализован интерфейс и репозитории для проверки обновлений. 2. Добавлены состояния и кубит для управления процессом обновления. 3. Созданы UI-компоненты для отображения информации об обновлениях. 4. Обновлен README.md с описанием нового модуля и его интеграции
This commit is contained in:
88
lib/features/update/README.md
Normal file
88
lib/features/update/README.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# Модуль Hard/Soft Updates
|
||||
|
||||
Модуль для управления обновлениями приложения. Поддерживает мягкие (soft) и обязательные (hard) обновления.
|
||||
|
||||
## Ключевые сущности и состояния
|
||||
|
||||
- **`UpdateEntity`**: доменная сущность с данными об обновлении
|
||||
- `availableVersion`: доступная версия
|
||||
- `updateUrl`: ссылка на обновление
|
||||
- `updateType`: тип (`soft` | `hard`), см. `UpdateType`
|
||||
- `whatIsNew`: описание изменений
|
||||
|
||||
- **`UpdateType`**: перечисление типов обновления
|
||||
- `UpdateType.soft`
|
||||
- `UpdateType.hard`
|
||||
- `UpdateType.none`
|
||||
|
||||
- **`UpdateCubit`**: управление состоянием проверки обновлений
|
||||
- Состояния: `UpdateInitialState`, `UpdateLoadingState`, `UpdateSuccessState(UpdateEntity?)`, `UpdateErrorState(message)`
|
||||
- Метод: `checkForUpdates({required String versionCode, required String platform})`
|
||||
|
||||
## Репозитории
|
||||
|
||||
- **`IUpdateRepository`**: Интерфейс, описывающий методы для проверки обновлений.
|
||||
- Возвращает `Future<UpdateEntity>` (не может быть `null`)
|
||||
|
||||
- **`UpdateRepository`**: заготовка для реальной интеграции (бэкенд/стор)
|
||||
- Реализуйте логику в `checkForUpdates`
|
||||
|
||||
- **`UpdateMockRepository`**: мок-реализация для разработки/демо
|
||||
- Возвращает фиктивное обновление (по умолчанию soft)
|
||||
|
||||
## UI
|
||||
|
||||
- **Soft update** — `SoftUpdateModal`
|
||||
- BottomSheet с заголовком, списком изменений и кнопками: «Отложить» и «Обновить»
|
||||
- Статический метод `show` безопасно не откроет модалку, если `updateEntity == null`
|
||||
|
||||
Пример показа модального окна:
|
||||
```dart
|
||||
await SoftUpdateModal.show(
|
||||
context,
|
||||
updateEntity: updateEntity, // экземпляр UpdateEntity
|
||||
onUpdate: () {
|
||||
// TODO: переход в стор/браузер по updateEntity.updateUrl
|
||||
},
|
||||
);
|
||||
```
|
||||
|
||||
- **Hard update** — `HardUpdateScreen`
|
||||
- Блокирующий экран, информирует и не даёт продолжить без обновления
|
||||
|
||||
## Роуты
|
||||
|
||||
- `UpdateRoutes.buildRoutes()` — регистрирует экран hard-обновления по пути `/update`
|
||||
|
||||
|
||||
## Структура модуля
|
||||
|
||||
```
|
||||
features/update/
|
||||
├── data/
|
||||
│ └── repository/
|
||||
│ ├── update_repository.dart # реализация для интеграции
|
||||
│ └── update_mock_repository.dart # мок-репозиторий
|
||||
├── domain/
|
||||
│ ├── entity/
|
||||
│ │ └── update_entity.dart # доменная сущность
|
||||
│ ├── repository/
|
||||
│ │ └── i_update_repository.dart # контракт репозитория
|
||||
│ └── state/
|
||||
│ └── cubit/
|
||||
│ ├── update_cubit.dart # кубит и логика
|
||||
│ └── update_state.dart # состояния
|
||||
├── presentation/
|
||||
│ ├── components/
|
||||
│ │ └── soft_modal_sheet.dart # модалка для soft-обновления
|
||||
│ └── screens/
|
||||
│ └── hard_update_screen.dart # экран для hard-обновления
|
||||
├── update_type.dart # константы типов обновления
|
||||
└── update_routes.dart # роут на hard-экран
|
||||
```
|
||||
|
||||
## Заметки по реализации
|
||||
|
||||
- Для продакшена реализуйте переход в магазин или браузер по `updateUrl`
|
||||
- Для soft-обновления не блокируйте UX; для hard — перенаправляйте на блокирующий экран
|
||||
- Возвращайте `null` из репозитория, если обновлений нет
|
||||
Reference in New Issue
Block a user