From 28e42f7e293dc62accab1708e7b7b074c1cbd29a Mon Sep 17 00:00:00 2001 From: Timon Date: Fri, 5 Jun 2026 00:59:13 +0200 Subject: [PATCH] refactor(mobile): use Optional only on API boundary (#28845) --- .../domain/services/remote_album.service.dart | 4 ++-- .../shared_link/shared_link_edit.page.dart | 18 ++++++++---------- .../pages/drift_remote_album.page.dart | 6 +++--- .../infrastructure/remote_album.provider.dart | 4 ++-- .../drift_album_api_repository.dart | 5 +++-- mobile/lib/services/shared_link.service.dart | 13 +++++++------ 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/mobile/lib/domain/services/remote_album.service.dart b/mobile/lib/domain/services/remote_album.service.dart index 3c8999decd..9838fe383f 100644 --- a/mobile/lib/domain/services/remote_album.service.dart +++ b/mobile/lib/domain/services/remote_album.service.dart @@ -8,7 +8,7 @@ import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/infrastructure/repositories/remote_album.repository.dart'; import 'package:immich_mobile/models/albums/album_search.model.dart'; import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart'; -import 'package:openapi/api.dart' show Optional; +import 'package:immich_mobile/utils/option.dart'; import 'package:immich_mobile/repositories/drift_album_api_repository.dart'; import 'package:immich_mobile/services/foreground_upload.service.dart'; import 'package:logging/logging.dart'; @@ -138,7 +138,7 @@ class RemoteAlbumService { Future updateAlbum( String albumId, { String? name, - Optional description = const Optional.absent(), + Option description = const Option.none(), String? thumbnailAssetId, bool? isActivityEnabled, AlbumAssetOrder? order, diff --git a/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart b/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart index 65973918e4..825b1ec2e7 100644 --- a/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart +++ b/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart @@ -11,7 +11,7 @@ import 'package:immich_mobile/models/shared_link/shared_link.model.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/shared_link.provider.dart'; import 'package:immich_mobile/services/shared_link.service.dart'; -import 'package:openapi/api.dart'; +import 'package:immich_mobile/utils/option.dart'; import 'package:immich_mobile/utils/url_helper.dart'; import 'package:immich_mobile/widgets/common/confirm_dialog.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; @@ -366,10 +366,10 @@ class SharedLinkEditPage extends HookConsumerWidget { bool? download; bool? upload; bool? meta; - var password = const Optional.absent(); - var description = const Optional.absent(); + var password = const Option.none(); + var description = const Option.none(); String? slug; - var expiry = const Optional.absent(); + var expiry = const Option.none(); if (allowDownload.value != existingLink!.allowDownload) { download = allowDownload.value; @@ -385,14 +385,12 @@ class SharedLinkEditPage extends HookConsumerWidget { if (descriptionController.text != (existingLink!.description ?? '')) { description = descriptionController.text.isEmpty - ? const Optional.present(null) - : Optional.present(descriptionController.text); + ? const Option.some(null) + : Option.some(descriptionController.text); } if (passwordController.text != (existingLink!.password ?? '')) { - password = passwordController.text.isEmpty - ? const Optional.present(null) - : Optional.present(passwordController.text); + password = passwordController.text.isEmpty ? const Option.some(null) : Option.some(passwordController.text); } if (slugController.text != (existingLink!.slug ?? "")) { @@ -403,7 +401,7 @@ class SharedLinkEditPage extends HookConsumerWidget { final newExpiry = expiryAfter.value; if (newExpiry?.toUtc() != existingLink!.expiresAt?.toUtc()) { - expiry = newExpiry == null ? const Optional.present(null) : Optional.present(newExpiry.toUtc()); + expiry = newExpiry == null ? const Option.some(null) : Option.some(newExpiry.toUtc()); } await ref diff --git a/mobile/lib/presentation/pages/drift_remote_album.page.dart b/mobile/lib/presentation/pages/drift_remote_album.page.dart index 5a5b49a2df..e992608848 100644 --- a/mobile/lib/presentation/pages/drift_remote_album.page.dart +++ b/mobile/lib/presentation/pages/drift_remote_album.page.dart @@ -18,9 +18,9 @@ import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dar import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/routing/router.dart'; +import 'package:immich_mobile/utils/option.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/remote_album_sliver_app_bar.dart'; -import 'package:openapi/api.dart' show Optional; @RoutePage() class RemoteAlbumPage extends ConsumerStatefulWidget { @@ -249,8 +249,8 @@ class _EditAlbumDialogState extends ConsumerState<_EditAlbumDialog> { final newTitle = titleController.text.trim(); final newDescription = descriptionController.text.trim(); final description = newDescription.isEmpty - ? const Optional.present(null) - : Optional.present(newDescription); + ? const Option.some(null) + : Option.some(newDescription); await ref .read(remoteAlbumProvider.notifier) diff --git a/mobile/lib/providers/infrastructure/remote_album.provider.dart b/mobile/lib/providers/infrastructure/remote_album.provider.dart index b7d9b7cfd9..fea43ef13a 100644 --- a/mobile/lib/providers/infrastructure/remote_album.provider.dart +++ b/mobile/lib/providers/infrastructure/remote_album.provider.dart @@ -8,7 +8,7 @@ import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/services/remote_album.service.dart'; import 'package:immich_mobile/models/albums/album_search.model.dart'; import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart'; -import 'package:openapi/api.dart' show Optional; +import 'package:immich_mobile/utils/option.dart'; import 'package:immich_mobile/providers/album/pending_album_uploads.provider.dart'; import 'package:immich_mobile/providers/backup/asset_upload_progress.provider.dart'; import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; @@ -154,7 +154,7 @@ class RemoteAlbumNotifier extends Notifier { Future updateAlbum( String albumId, { String? name, - Optional description = const Optional.absent(), + Option description = const Option.none(), String? thumbnailAssetId, bool? isActivityEnabled, AlbumAssetOrder? order, diff --git a/mobile/lib/repositories/drift_album_api_repository.dart b/mobile/lib/repositories/drift_album_api_repository.dart index c43e1fd4a0..9639f1d6e3 100644 --- a/mobile/lib/repositories/drift_album_api_repository.dart +++ b/mobile/lib/repositories/drift_album_api_repository.dart @@ -3,6 +3,7 @@ import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/providers/api.provider.dart'; import 'package:immich_mobile/repositories/api.repository.dart'; +import 'package:immich_mobile/utils/option.dart'; // ignore: import_rule_openapi import 'package:openapi/api.dart' hide AlbumUserRole; @@ -71,7 +72,7 @@ class DriftAlbumApiRepository extends ApiRepository { String albumId, UserDto owner, { String? name, - Optional description = const Optional.absent(), + Option description = const Option.none(), String? thumbnailAssetId, bool? isActivityEnabled, AlbumAssetOrder? order, @@ -86,7 +87,7 @@ class DriftAlbumApiRepository extends ApiRepository { albumId, UpdateAlbumDto( albumName: name == null ? const Optional.absent() : Optional.present(name), - description: description, + description: description.toOptional(), albumThumbnailAssetId: thumbnailAssetId == null ? const Optional.absent() : Optional.present(thumbnailAssetId), diff --git a/mobile/lib/services/shared_link.service.dart b/mobile/lib/services/shared_link.service.dart index 975070f2a0..86ce409cdf 100644 --- a/mobile/lib/services/shared_link.service.dart +++ b/mobile/lib/services/shared_link.service.dart @@ -2,6 +2,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/models/shared_link/shared_link.model.dart'; import 'package:immich_mobile/providers/api.provider.dart'; import 'package:immich_mobile/services/api.service.dart'; +import 'package:immich_mobile/utils/option.dart'; import 'package:logging/logging.dart'; import 'package:openapi/api.dart'; @@ -88,10 +89,10 @@ class SharedLinkService { required bool? showMeta, required bool? allowDownload, required bool? allowUpload, - Optional password = const Optional.absent(), - Optional description = const Optional.absent(), + Option password = const Option.none(), + Option description = const Option.none(), String? slug, - Optional expiresAt = const Optional.absent(), + Option expiresAt = const Option.none(), }) async { try { final responseDto = await _apiService.sharedLinksApi.updateSharedLink( @@ -100,9 +101,9 @@ class SharedLinkService { showMetadata: showMeta == null ? const Optional.absent() : Optional.present(showMeta), allowDownload: allowDownload == null ? const Optional.absent() : Optional.present(allowDownload), allowUpload: allowUpload == null ? const Optional.absent() : Optional.present(allowUpload), - password: password, - description: description, - expiresAt: expiresAt, + password: password.toOptional(), + description: description.toOptional(), + expiresAt: expiresAt.toOptional(), slug: slug == null ? const Optional.absent() : Optional.present(slug), ), );