feat(mobile): remove announcement overlay and show in app bar dialog (#5104)

Co-authored-by: shalong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong
2023-11-17 21:46:18 +00:00
committed by GitHub
parent 63a745c7ad
commit 4daf2478aa
13 changed files with 159 additions and 239 deletions
@@ -11,7 +11,6 @@ import 'package:immich_mobile/modules/memories/providers/memory.provider.dart';
import 'package:immich_mobile/modules/onboarding/providers/gallery_permission.provider.dart';
import 'package:immich_mobile/modules/settings/providers/notification_permission.provider.dart';
import 'package:immich_mobile/shared/providers/asset.provider.dart';
import 'package:immich_mobile/shared/providers/release_info.provider.dart';
import 'package:immich_mobile/shared/providers/server_info.provider.dart';
import 'package:immich_mobile/shared/providers/tab.provider.dart';
import 'package:immich_mobile/shared/providers/websocket.provider.dart';
@@ -70,8 +69,6 @@ class AppStateNotiifer extends StateNotifier<AppStateEnum> {
_ref.read(websocketProvider.notifier).connect();
_ref.read(releaseInfoProvider.notifier).checkGithubReleaseInfo();
_ref
.read(notificationPermissionProvider.notifier)
.getNotificationPermission();
@@ -1,57 +0,0 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:http/http.dart';
import 'package:immich_mobile/shared/models/store.dart';
import 'package:immich_mobile/shared/views/version_announcement_overlay.dart';
import 'package:logging/logging.dart';
class ReleaseInfoNotifier extends StateNotifier<String> {
ReleaseInfoNotifier() : super("");
final log = Logger('ReleaseInfoNotifier');
void checkGithubReleaseInfo() async {
final Client client = Client();
try {
final String? localReleaseVersion =
Store.tryGet(StoreKey.githubReleaseInfo);
final res = await client.get(
Uri.parse(
"https://api.github.com/repos/immich-app/immich/releases/latest",
),
headers: {"Accept": "application/vnd.github.v3+json"},
);
if (res.statusCode == 200) {
final data = jsonDecode(res.body);
String latestTagVersion = data["tag_name"];
state = latestTagVersion;
if (localReleaseVersion == null && latestTagVersion.isNotEmpty) {
VersionAnnouncementOverlayController.appLoader.show();
return;
}
if (latestTagVersion.isNotEmpty &&
localReleaseVersion != latestTagVersion) {
VersionAnnouncementOverlayController.appLoader.show();
return;
}
}
} catch (e) {
debugPrint("Error gettting latest release version");
state = "";
}
}
void acknowledgeNewVersion() {
Store.put(StoreKey.githubReleaseInfo, state);
VersionAnnouncementOverlayController.appLoader.hide();
}
}
final releaseInfoProvider = StateNotifierProvider<ReleaseInfoNotifier, String>(
(ref) => ReleaseInfoNotifier(),
);
@@ -18,6 +18,11 @@ class ServerInfoNotifier extends StateNotifier<ServerInfo> {
minor: 0,
patch: 0,
),
latestVersion: const ServerVersion(
major: 0,
minor: 0,
patch: 0,
),
serverFeatures: const ServerFeatures(
map: true,
trash: true,
@@ -32,6 +37,7 @@ class ServerInfoNotifier extends StateNotifier<ServerInfo> {
diskUsagePercentage: 0,
),
isVersionMismatch: false,
isNewReleaseAvailable: false,
versionMismatchErrorMessage: "",
),
);
@@ -55,6 +61,10 @@ class ServerInfoNotifier extends StateNotifier<ServerInfo> {
return;
}
await _checkServerVersionMismatch(serverVersion);
}
_checkServerVersionMismatch(ServerVersion serverVersion) async {
state = state.copyWith(serverVersion: serverVersion);
var packageInfo = await PackageInfo.fromPlatform();
@@ -67,7 +77,15 @@ class ServerInfoNotifier extends StateNotifier<ServerInfo> {
versionMismatchErrorMessage:
"Server is out of date. Please update to the latest major version.",
);
return;
}
if (appVersion["major"]! < serverVersion.major) {
state = state.copyWith(
isVersionMismatch: true,
versionMismatchErrorMessage:
"Mobile App is out of date. Please update to the latest major version.",
);
return;
}
@@ -75,9 +93,17 @@ class ServerInfoNotifier extends StateNotifier<ServerInfo> {
state = state.copyWith(
isVersionMismatch: true,
versionMismatchErrorMessage:
"Server is out of date. Consider updating to the latest minor version.",
"Server is out of date. Please update to the latest minor version.",
);
return;
}
if (appVersion["minor"]! < serverVersion.minor) {
state = state.copyWith(
isVersionMismatch: true,
versionMismatchErrorMessage:
"Mobile App is out of date. Please update to the latest minor version.",
);
return;
}
@@ -87,6 +113,25 @@ class ServerInfoNotifier extends StateNotifier<ServerInfo> {
);
}
handleNewRelease(
ServerVersion serverVersion,
ServerVersion latestVersion,
) {
// Update local server version
_checkServerVersionMismatch(serverVersion);
final majorEqual = latestVersion.major == serverVersion.major;
final minorEqual = majorEqual && latestVersion.minor == serverVersion.minor;
final newVersionAvailable = latestVersion.major > serverVersion.major ||
(majorEqual && latestVersion.minor > serverVersion.minor) ||
(minorEqual && latestVersion.patch > serverVersion.patch);
state = state.copyWith(
latestVersion: latestVersion,
isNewReleaseAvailable: newVersionAvailable,
);
}
getServerFeatures() async {
final serverFeatures = await _serverInfoService.getServerFeatures();
if (serverFeatures == null) {
@@ -120,5 +165,5 @@ class ServerInfoNotifier extends StateNotifier<ServerInfo> {
final serverInfoProvider =
StateNotifierProvider<ServerInfoNotifier, ServerInfo>((ref) {
return ServerInfoNotifier(ref.watch(serverInfoServiceProvider));
return ServerInfoNotifier(ref.read(serverInfoServiceProvider));
});
@@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/models/server_info/server_version.model.dart';
import 'package:immich_mobile/shared/models/store.dart';
import 'package:immich_mobile/shared/providers/asset.provider.dart';
import 'package:immich_mobile/shared/providers/server_info.provider.dart';
@@ -130,6 +131,7 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
socket.on('on_asset_trash', _handleServerUpdates);
socket.on('on_asset_restore', _handleServerUpdates);
socket.on('on_asset_update', _handleServerUpdates);
socket.on('on_new_release', _handleReleaseUpdates);
} catch (e) {
debugPrint("[WEBSOCKET] Catch Websocket Error - ${e.toString()}");
}
@@ -204,6 +206,36 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
addPendingChange(PendingAction.assetDelete, data);
_debounce(handlePendingChanges);
}
_handleReleaseUpdates(dynamic data) {
// Json guard
if (data is! Map) {
return;
}
final json = data.cast<String, dynamic>();
final serverVersionJson =
json.containsKey('serverVersion') ? json['serverVersion'] : null;
final releaseVersionJson =
json.containsKey('releaseVersion') ? json['releaseVersion'] : null;
if (serverVersionJson == null || releaseVersionJson == null) {
return;
}
final serverVersionDto =
ServerVersionResponseDto.fromJson(serverVersionJson);
final releaseVersionDto =
ServerVersionResponseDto.fromJson(releaseVersionJson);
if (serverVersionDto == null || releaseVersionDto == null) {
return;
}
final serverVersion = ServerVersion.fromDto(serverVersionDto);
final releaseVersion = ServerVersion.fromDto(releaseVersionDto);
_ref
.read(serverInfoProvider.notifier)
.handleNewRelease(serverVersion, releaseVersion);
}
}
final websocketProvider =