feat: appbar
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import 'package:immich_mobile/domain/models/server-info/server_config.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_disk_info.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_features.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_version.model.dart';
|
||||
|
||||
abstract interface class IServerApiRepository {
|
||||
/// Pings and check if server is reachable
|
||||
@@ -10,4 +12,10 @@ abstract interface class IServerApiRepository {
|
||||
|
||||
/// Fetches the server configuration and settings
|
||||
Future<ServerConfig?> getServerConfig();
|
||||
|
||||
/// Fetches the server disk info
|
||||
Future<ServerDiskInfo?> getServerDiskInfo();
|
||||
|
||||
/// Fetches the server version
|
||||
Future<ServerVersion?> getServerVersion();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
class ServerDiskInfo {
|
||||
final int diskAvailableInBytes;
|
||||
final int diskSizeInBytes;
|
||||
final int diskUseInBytes;
|
||||
final double diskUsagePercentage;
|
||||
|
||||
const ServerDiskInfo({
|
||||
required this.diskAvailableInBytes,
|
||||
required this.diskSizeInBytes,
|
||||
required this.diskUseInBytes,
|
||||
required this.diskUsagePercentage,
|
||||
});
|
||||
|
||||
const ServerDiskInfo.initial()
|
||||
: diskSizeInBytes = -1,
|
||||
diskUseInBytes = -1,
|
||||
diskAvailableInBytes = -1,
|
||||
diskUsagePercentage = -1;
|
||||
|
||||
ServerDiskInfo copyWith({
|
||||
int? diskAvailableInBytes,
|
||||
int? diskSizeInBytes,
|
||||
int? diskUseInBytes,
|
||||
double? diskUsagePercentage,
|
||||
}) {
|
||||
return ServerDiskInfo(
|
||||
diskAvailableInBytes: diskAvailableInBytes ?? this.diskAvailableInBytes,
|
||||
diskSizeInBytes: diskSizeInBytes ?? this.diskSizeInBytes,
|
||||
diskUseInBytes: diskUseInBytes ?? this.diskUseInBytes,
|
||||
diskUsagePercentage: diskUsagePercentage ?? this.diskUsagePercentage,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ServerDiskInfo(diskAvailableInBytes: $diskAvailableInBytes, diskSizeInBytes: $diskSizeInBytes, diskUseInBytes: $diskUseInBytes, diskUsagePercentage: $diskUsagePercentage)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(covariant ServerDiskInfo other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return other.diskAvailableInBytes == diskAvailableInBytes &&
|
||||
other.diskSizeInBytes == diskSizeInBytes &&
|
||||
other.diskUseInBytes == diskUseInBytes &&
|
||||
other.diskUsagePercentage == diskUsagePercentage;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
return diskAvailableInBytes.hashCode ^
|
||||
diskSizeInBytes.hashCode ^
|
||||
diskUseInBytes.hashCode ^
|
||||
diskUsagePercentage.hashCode;
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
import 'package:immich_mobile/domain/models/server-info/server_config.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_features.model.dart';
|
||||
|
||||
class ServerFeatureConfig {
|
||||
final ServerFeatures features;
|
||||
final ServerConfig config;
|
||||
|
||||
const ServerFeatureConfig({required this.features, required this.config});
|
||||
|
||||
ServerFeatureConfig copyWith({
|
||||
ServerFeatures? features,
|
||||
ServerConfig? config,
|
||||
}) {
|
||||
return ServerFeatureConfig(
|
||||
features: features ?? this.features,
|
||||
config: config ?? this.config,
|
||||
);
|
||||
}
|
||||
|
||||
const ServerFeatureConfig.initial()
|
||||
: features = const ServerFeatures.initial(),
|
||||
config = const ServerConfig.initial();
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
'ServerFeatureConfig(features: $features, config: $config)';
|
||||
|
||||
@override
|
||||
bool operator ==(covariant ServerFeatureConfig other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return other.features == features && other.config == config;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => features.hashCode ^ config.hashCode;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
import 'package:immich_mobile/domain/models/server-info/server_config.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_disk_info.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_features.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_version.model.dart';
|
||||
|
||||
class ServerInfo {
|
||||
final ServerFeatures features;
|
||||
final ServerConfig config;
|
||||
final ServerDiskInfo disk;
|
||||
final ServerVersion version;
|
||||
|
||||
const ServerInfo({
|
||||
required this.features,
|
||||
required this.config,
|
||||
required this.disk,
|
||||
required this.version,
|
||||
});
|
||||
|
||||
ServerInfo copyWith({
|
||||
ServerFeatures? features,
|
||||
ServerConfig? config,
|
||||
ServerDiskInfo? disk,
|
||||
ServerVersion? version,
|
||||
}) {
|
||||
return ServerInfo(
|
||||
features: features ?? this.features,
|
||||
config: config ?? this.config,
|
||||
disk: disk ?? this.disk,
|
||||
version: version ?? this.version,
|
||||
);
|
||||
}
|
||||
|
||||
const ServerInfo.initial()
|
||||
: features = const ServerFeatures.initial(),
|
||||
config = const ServerConfig.initial(),
|
||||
disk = const ServerDiskInfo.initial(),
|
||||
version = const ServerVersion.initial();
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
'ServerInfo(features: $features, config: $config, disk: $disk, version: $version)';
|
||||
|
||||
@override
|
||||
bool operator ==(covariant ServerInfo other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return other.features == features &&
|
||||
other.config == config &&
|
||||
other.disk == disk &&
|
||||
other.version == version;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode =>
|
||||
features.hashCode ^ config.hashCode ^ disk.hashCode ^ version.hashCode;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
class ServerVersion {
|
||||
final int major;
|
||||
final int minor;
|
||||
final int patch;
|
||||
|
||||
const ServerVersion({
|
||||
required this.major,
|
||||
required this.minor,
|
||||
required this.patch,
|
||||
});
|
||||
|
||||
ServerVersion copyWith({int? major, int? minor, int? patch}) {
|
||||
return ServerVersion(
|
||||
major: major ?? this.major,
|
||||
minor: minor ?? this.minor,
|
||||
patch: patch ?? this.patch,
|
||||
);
|
||||
}
|
||||
|
||||
const ServerVersion.initial()
|
||||
: major = 1,
|
||||
minor = 1,
|
||||
patch = 1;
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
'ServerVersion(major: $major, minor: $minor, patch: $patch)';
|
||||
|
||||
@override
|
||||
bool operator ==(covariant ServerVersion other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return other.major == major && other.minor == minor && other.patch == patch;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => major.hashCode ^ minor.hashCode ^ patch.hashCode;
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:immich_mobile/domain/interfaces/api/server_api.interface.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_config.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_disk_info.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_features.model.dart';
|
||||
import 'package:immich_mobile/domain/models/server-info/server_version.model.dart';
|
||||
import 'package:immich_mobile/utils/mixins/log.mixin.dart';
|
||||
import 'package:openapi/api.dart' as api;
|
||||
|
||||
@@ -40,6 +42,32 @@ class ServerApiRepository with LogMixin implements IServerApiRepository {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<ServerDiskInfo?> getServerDiskInfo() async {
|
||||
try {
|
||||
final storage = await _serverApi.getStorage();
|
||||
if (storage != null) {
|
||||
return _fromStorageDto(storage);
|
||||
}
|
||||
} catch (e, s) {
|
||||
log.e("Exception occured while fetching server disk info", e, s);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<ServerVersion?> getServerVersion() async {
|
||||
try {
|
||||
final version = await _serverApi.getServerVersion();
|
||||
if (version != null) {
|
||||
return _fromVersionDto(version);
|
||||
}
|
||||
} catch (e, s) {
|
||||
log.e("Exception occured while fetching server version", e, s);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
ServerConfig _fromConfigDto(api.ServerConfigDto dto) => ServerConfig(
|
||||
@@ -50,3 +78,14 @@ ServerFeatures _fromFeatureDto(api.ServerFeaturesDto dto) => ServerFeatures(
|
||||
hasPasswordLogin: dto.passwordLogin,
|
||||
hasOAuthLogin: dto.oauth,
|
||||
);
|
||||
|
||||
ServerDiskInfo _fromStorageDto(api.ServerStorageResponseDto dto) =>
|
||||
ServerDiskInfo(
|
||||
diskAvailableInBytes: dto.diskAvailableRaw,
|
||||
diskSizeInBytes: dto.diskSizeRaw,
|
||||
diskUseInBytes: dto.diskUseRaw,
|
||||
diskUsagePercentage: dto.diskUsagePercentage,
|
||||
);
|
||||
|
||||
ServerVersion _fromVersionDto(api.ServerVersionResponseDto dto) =>
|
||||
ServerVersion(major: dto.major, minor: dto.minor, patch: dto.patch_);
|
||||
|
||||
@@ -19,7 +19,7 @@ import 'package:immich_mobile/domain/models/user.model.dart';
|
||||
import 'package:immich_mobile/domain/services/album_sync.service.dart';
|
||||
import 'package:immich_mobile/domain/services/asset_sync.service.dart';
|
||||
import 'package:immich_mobile/presentation/states/gallery_permission.state.dart';
|
||||
import 'package:immich_mobile/presentation/states/server_feature_config.state.dart';
|
||||
import 'package:immich_mobile/presentation/states/server_info.state.dart';
|
||||
import 'package:immich_mobile/service_locator.dart';
|
||||
import 'package:immich_mobile/utils/immich_api_client.dart';
|
||||
import 'package:immich_mobile/utils/mixins/log.mixin.dart';
|
||||
@@ -115,7 +115,7 @@ class LoginService with LogMixin {
|
||||
ServiceLocator.registerPostGlobalStates();
|
||||
|
||||
// Fetch server features
|
||||
await di<ServerFeatureConfigProvider>().getFeatures();
|
||||
await di<ServerInfoProvider>().fetchFeatures();
|
||||
}
|
||||
|
||||
Future<User?> handlePostLogin() async {
|
||||
@@ -132,6 +132,7 @@ class LoginService with LogMixin {
|
||||
}
|
||||
|
||||
ServiceLocator.registerCurrentUser(user);
|
||||
await di<ServerInfoProvider>().fetchServerDisk();
|
||||
|
||||
// sync assets in background
|
||||
unawaited(di<AssetSyncService>().performFullRemoteSyncIsolate(user));
|
||||
|
||||
Reference in New Issue
Block a user