diff --git a/mobile/lib/infrastructure/repositories/settings.repository.dart b/mobile/lib/infrastructure/repositories/settings.repository.dart index 7063779336..c5f8fb48d8 100644 --- a/mobile/lib/infrastructure/repositories/settings.repository.dart +++ b/mobile/lib/infrastructure/repositories/settings.repository.dart @@ -1,4 +1,5 @@ import 'package:drift/drift.dart'; +import 'package:flutter/foundation.dart'; import 'package:immich_mobile/domain/models/config/app_config.dart'; import 'package:immich_mobile/domain/models/settings_key.dart'; import 'package:immich_mobile/infrastructure/entities/settings.entity.drift.dart'; @@ -29,6 +30,15 @@ class SettingsRepository extends CachedKeyValueRepository reset() async { + final instance = _instance; + if (instance != null) { + await instance.clear(SettingsKey.values); + _instance = null; + } + } + @override List get keys => SettingsKey.values; diff --git a/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart index 466da79fb2..030197641a 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart @@ -43,13 +43,14 @@ class ViewerBottomBar extends ConsumerWidget { final originalTheme = context.themeData; final actions = [ - ..._actionColumnButtons(context, ref, const [RestoreAction(source: .viewer)]), - ..._actionColumnButtons(context, ref, const [ShareAction(source: .viewer)]), + ..._actionColumnButtons(context, ref, const [RestoreAction(source: .viewer), ShareAction(source: .viewer)]), if (!isInLockedView) ...[ if (!isInTrash) ...[ - ..._actionColumnButtons(context, ref, const [UploadAction(source: .viewer, showProgress: true)]), - ..._actionColumnButtons(context, ref, const [EditAssetAction(source: .viewer)]), + ..._actionColumnButtons(context, ref, const [ + UploadAction(source: .viewer, showProgress: true), + EditAssetAction(source: .viewer), + ]), if (asset.hasRemote) AddActionButton(originalTheme: originalTheme), ], ..._actionColumnButtons(context, ref, const [DeleteAction(source: .viewer)]), diff --git a/mobile/lib/presentation/widgets/bottom_sheet/archive_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/archive_bottom_sheet.widget.dart index 09eb2ad626..3e5edaa149 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/archive_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/archive_bottom_sheet.widget.dart @@ -4,20 +4,19 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; +import 'package:immich_mobile/presentation/actions/archive.action.dart'; +import 'package:immich_mobile/presentation/actions/delete.action.dart'; import 'package:immich_mobile/presentation/actions/download.action.dart'; -import 'package:immich_mobile/presentation/actions/share.action.dart'; -import 'package:immich_mobile/presentation/actions/share_link.action.dart'; import 'package:immich_mobile/presentation/actions/edit_datetime.action.dart'; import 'package:immich_mobile/presentation/actions/edit_location.action.dart'; -import 'package:immich_mobile/presentation/actions/delete.action.dart'; -import 'package:immich_mobile/presentation/actions/lock.action.dart'; -import 'package:immich_mobile/presentation/actions/archive.action.dart'; -import 'package:immich_mobile/presentation/actions/stack.action.dart'; import 'package:immich_mobile/presentation/actions/favorite.action.dart'; +import 'package:immich_mobile/presentation/actions/lock.action.dart'; +import 'package:immich_mobile/presentation/actions/share.action.dart'; +import 'package:immich_mobile/presentation/actions/share_link.action.dart'; +import 'package:immich_mobile/presentation/actions/stack.action.dart'; import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; -import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; class ArchiveBottomSheet extends ConsumerStatefulWidget { @@ -44,8 +43,6 @@ class _ArchiveBottomSheetState extends ConsumerState { @override Widget build(BuildContext context) { - final multiselect = ref.watch(multiSelectProvider); - Future addToAlbum(RemoteAlbum album) async { final result = await ref.read(actionProvider.notifier).addToAlbum(ActionSource.timeline, album); @@ -75,20 +72,18 @@ class _ArchiveBottomSheetState extends ConsumerState { initialChildSize: 0.25, maxChildSize: 0.85, shouldCloseOnMinExtent: false, - actions: [ - const ActionColumnButton(action: ShareAction(source: .timeline)), - if (multiselect.hasRemote) ...[ - const ActionColumnButton(action: ShareLinkAction(source: .timeline)), - const ActionColumnButton(action: ArchiveAction(source: .timeline)), - const ActionColumnButton(action: FavoriteAction(source: .timeline)), - const ActionColumnButton(action: DownloadAction(source: .timeline)), - const ActionColumnButton(action: DeleteAction(source: .timeline)), - const ActionColumnButton(action: EditDateTimeAction(source: .timeline)), - const ActionColumnButton(action: EditLocationAction(source: .timeline)), - const ActionColumnButton(action: LockAction(source: .timeline)), - const ActionColumnButton(action: StackAction(source: .timeline)), - ], - const ActionColumnButton(action: CleanupLocalAction(source: .timeline)), + actions: const [ + .new(action: ShareAction(source: .timeline)), + .new(action: ShareLinkAction(source: .timeline)), + .new(action: ArchiveAction(source: .timeline)), + .new(action: FavoriteAction(source: .timeline)), + .new(action: DownloadAction(source: .timeline)), + .new(action: DeleteAction(source: .timeline)), + .new(action: EditDateTimeAction(source: .timeline)), + .new(action: EditLocationAction(source: .timeline)), + .new(action: LockAction(source: .timeline)), + .new(action: StackAction(source: .timeline)), + .new(action: CleanupLocalAction(source: .timeline)), ], slivers: [ const AddToAlbumHeader(), diff --git a/mobile/lib/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart index c076287fa3..66e24617f7 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart @@ -4,16 +4,16 @@ import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; +import 'package:immich_mobile/presentation/actions/archive.action.dart'; +import 'package:immich_mobile/presentation/actions/delete.action.dart'; import 'package:immich_mobile/presentation/actions/download.action.dart'; -import 'package:immich_mobile/presentation/actions/share.action.dart'; -import 'package:immich_mobile/presentation/actions/share_link.action.dart'; import 'package:immich_mobile/presentation/actions/edit_datetime.action.dart'; import 'package:immich_mobile/presentation/actions/edit_location.action.dart'; -import 'package:immich_mobile/presentation/actions/delete.action.dart'; -import 'package:immich_mobile/presentation/actions/lock.action.dart'; -import 'package:immich_mobile/presentation/actions/archive.action.dart'; -import 'package:immich_mobile/presentation/actions/stack.action.dart'; import 'package:immich_mobile/presentation/actions/favorite.action.dart'; +import 'package:immich_mobile/presentation/actions/lock.action.dart'; +import 'package:immich_mobile/presentation/actions/share.action.dart'; +import 'package:immich_mobile/presentation/actions/share_link.action.dart'; +import 'package:immich_mobile/presentation/actions/stack.action.dart'; import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; @@ -71,20 +71,18 @@ class FavoriteBottomSheet extends ConsumerWidget { initialChildSize: 0.4, maxChildSize: 0.7, shouldCloseOnMinExtent: false, - actions: [ - const ActionColumnButton(action: ShareAction(source: .timeline)), - if (multiselect.hasRemote) ...[ - const ActionColumnButton(action: ShareLinkAction(source: .timeline)), - const ActionColumnButton(action: FavoriteAction(source: .timeline)), - const ActionColumnButton(action: ArchiveAction(source: .timeline)), - const ActionColumnButton(action: DownloadAction(source: .timeline)), - const ActionColumnButton(action: DeleteAction(source: .timeline)), - const ActionColumnButton(action: EditDateTimeAction(source: .timeline)), - const ActionColumnButton(action: EditLocationAction(source: .timeline)), - const ActionColumnButton(action: LockAction(source: .timeline)), - const ActionColumnButton(action: StackAction(source: .timeline)), - ], - const ActionColumnButton(action: CleanupLocalAction(source: .timeline)), + actions: const [ + .new(action: ShareAction(source: .timeline)), + .new(action: ShareLinkAction(source: .timeline)), + .new(action: FavoriteAction(source: .timeline)), + .new(action: ArchiveAction(source: .timeline)), + .new(action: DownloadAction(source: .timeline)), + .new(action: DeleteAction(source: .timeline)), + .new(action: EditDateTimeAction(source: .timeline)), + .new(action: EditLocationAction(source: .timeline)), + .new(action: LockAction(source: .timeline)), + .new(action: StackAction(source: .timeline)), + .new(action: CleanupLocalAction(source: .timeline)), ], slivers: multiselect.hasRemote ? [const AddToAlbumHeader(), AlbumSelector(onAlbumSelected: addAssetsToAlbum)] diff --git a/mobile/lib/presentation/widgets/bottom_sheet/general_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/general_bottom_sheet.widget.dart index 1a4bbe3790..6c3e9b837c 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/general_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/general_bottom_sheet.widget.dart @@ -4,22 +4,21 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; -import 'package:immich_mobile/presentation/actions/upload.action.dart'; -import 'package:immich_mobile/presentation/actions/download.action.dart'; -import 'package:immich_mobile/presentation/actions/tag.action.dart'; -import 'package:immich_mobile/presentation/actions/share.action.dart'; -import 'package:immich_mobile/presentation/actions/share_link.action.dart'; -import 'package:immich_mobile/presentation/actions/edit_datetime.action.dart'; -import 'package:immich_mobile/presentation/actions/edit_location.action.dart'; import 'package:immich_mobile/presentation/actions/archive.action.dart'; import 'package:immich_mobile/presentation/actions/delete.action.dart'; +import 'package:immich_mobile/presentation/actions/download.action.dart'; +import 'package:immich_mobile/presentation/actions/edit_datetime.action.dart'; +import 'package:immich_mobile/presentation/actions/edit_location.action.dart'; import 'package:immich_mobile/presentation/actions/favorite.action.dart'; import 'package:immich_mobile/presentation/actions/lock.action.dart'; +import 'package:immich_mobile/presentation/actions/share.action.dart'; +import 'package:immich_mobile/presentation/actions/share_link.action.dart'; import 'package:immich_mobile/presentation/actions/stack.action.dart'; +import 'package:immich_mobile/presentation/actions/tag.action.dart'; +import 'package:immich_mobile/presentation/actions/upload.action.dart'; import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; -import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; class GeneralBottomSheet extends ConsumerStatefulWidget { @@ -46,8 +45,6 @@ class _GeneralBottomSheetState extends ConsumerState { @override Widget build(BuildContext context) { - final multiselect = ref.watch(multiSelectProvider); - Future addToAlbum(RemoteAlbum album) async { final result = await ref.read(actionProvider.notifier).addToAlbum(ActionSource.timeline, album); @@ -77,23 +74,20 @@ class _GeneralBottomSheetState extends ConsumerState { minChildSize: widget.minChildSize, maxChildSize: 0.85, shouldCloseOnMinExtent: false, - actions: [ - const ActionColumnButton(action: FavoriteAction(source: .timeline)), - const ActionColumnButton(action: ShareAction(source: .timeline)), - if (multiselect.hasRemote) ...[ - const ActionColumnButton(action: ShareLinkAction(source: .timeline)), - const ActionColumnButton(action: DownloadAction(source: .timeline)), - const ActionColumnButton(action: FavoriteAction(source: .timeline)), - const ActionColumnButton(action: ArchiveAction(source: .timeline)), - const ActionColumnButton(action: TagAction(source: .timeline)), - const ActionColumnButton(action: EditDateTimeAction(source: .timeline)), - const ActionColumnButton(action: EditLocationAction(source: .timeline)), - const ActionColumnButton(action: LockAction(source: .timeline)), - const ActionColumnButton(action: StackAction(source: .timeline)), - ], - const ActionColumnButton(action: DeleteAction(source: .timeline)), - const ActionColumnButton(action: CleanupLocalAction(source: .timeline)), - const ActionColumnButton(action: UploadAction(source: .timeline)), + actions: const [ + .new(action: ShareAction(source: .timeline)), + .new(action: ShareLinkAction(source: .timeline)), + .new(action: DownloadAction(source: .timeline)), + .new(action: DeleteAction(source: .timeline)), + .new(action: FavoriteAction(source: .timeline)), + .new(action: ArchiveAction(source: .timeline)), + .new(action: TagAction(source: .timeline)), + .new(action: EditDateTimeAction(source: .timeline)), + .new(action: EditLocationAction(source: .timeline)), + .new(action: LockAction(source: .timeline)), + .new(action: StackAction(source: .timeline)), + .new(action: CleanupLocalAction(source: .timeline)), + .new(action: UploadAction(source: .timeline)), ], slivers: [ const AddToAlbumHeader(), diff --git a/mobile/lib/presentation/widgets/bottom_sheet/local_album_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/local_album_bottom_sheet.widget.dart index 8d9e0e283c..478b37212e 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/local_album_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/local_album_bottom_sheet.widget.dart @@ -4,9 +4,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; -import 'package:immich_mobile/presentation/actions/upload.action.dart'; -import 'package:immich_mobile/presentation/actions/share.action.dart'; import 'package:immich_mobile/presentation/actions/delete.action.dart'; +import 'package:immich_mobile/presentation/actions/share.action.dart'; +import 'package:immich_mobile/presentation/actions/upload.action.dart'; import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; @@ -65,11 +65,11 @@ class _LocalAlbumBottomSheetState extends ConsumerState { initialChildSize: 0.25, maxChildSize: 0.85, shouldCloseOnMinExtent: false, - actions: const [ - ActionColumnButton(action: ShareAction(source: .timeline)), - ActionColumnButton(action: DeleteAction(source: .timeline)), - ActionColumnButton(action: CleanupLocalAction(source: .timeline)), - ActionColumnButton(action: UploadAction(source: .timeline)), + actions: const [ + .new(action: ShareAction(source: .timeline)), + .new(action: DeleteAction(source: .timeline)), + .new(action: CleanupLocalAction(source: .timeline)), + .new(action: UploadAction(source: .timeline)), ], slivers: [ const AddToAlbumHeader(), diff --git a/mobile/lib/presentation/widgets/bottom_sheet/locked_folder_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/locked_folder_bottom_sheet.widget.dart index 95909f0428..d7334337ae 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/locked_folder_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/locked_folder_bottom_sheet.widget.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; -import 'package:immich_mobile/presentation/actions/download.action.dart'; -import 'package:immich_mobile/presentation/actions/share.action.dart'; import 'package:immich_mobile/presentation/actions/delete.action.dart'; +import 'package:immich_mobile/presentation/actions/download.action.dart'; import 'package:immich_mobile/presentation/actions/lock.action.dart'; +import 'package:immich_mobile/presentation/actions/share.action.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; class LockedFolderBottomSheet extends ConsumerWidget { @@ -16,11 +16,11 @@ class LockedFolderBottomSheet extends ConsumerWidget { initialChildSize: 0.25, maxChildSize: 0.4, shouldCloseOnMinExtent: false, - actions: [ - ActionColumnButton(action: ShareAction(source: .timeline)), - ActionColumnButton(action: DownloadAction(source: .timeline)), - ActionColumnButton(action: DeleteAction(source: .timeline)), - ActionColumnButton(action: LockAction(source: .timeline)), + actions: [ + .new(action: ShareAction(source: .timeline)), + .new(action: DownloadAction(source: .timeline)), + .new(action: DeleteAction(source: .timeline)), + .new(action: LockAction(source: .timeline)), ], ); } diff --git a/mobile/lib/presentation/widgets/bottom_sheet/partner_detail_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/partner_detail_bottom_sheet.widget.dart index a2d23c052b..8a20f26c73 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/partner_detail_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/partner_detail_bottom_sheet.widget.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart'; -import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; import 'package:immich_mobile/presentation/actions/download.action.dart'; import 'package:immich_mobile/presentation/actions/share.action.dart'; +import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; @@ -64,9 +64,9 @@ class _PartnerDetailBottomSheetState extends ConsumerState[ + .new(action: ShareAction(source: .timeline)), + .new(action: DownloadAction(source: .timeline)), ], slivers: [ const AddToAlbumHeader(), diff --git a/mobile/lib/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart index a7e504187a..1e51a26811 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart @@ -4,9 +4,9 @@ import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; -import 'package:immich_mobile/presentation/actions/download.action.dart'; import 'package:immich_mobile/presentation/actions/archive.action.dart'; import 'package:immich_mobile/presentation/actions/delete.action.dart'; +import 'package:immich_mobile/presentation/actions/download.action.dart'; import 'package:immich_mobile/presentation/actions/edit_datetime.action.dart'; import 'package:immich_mobile/presentation/actions/edit_location.action.dart'; import 'package:immich_mobile/presentation/actions/favorite.action.dart'; @@ -19,7 +19,6 @@ import 'package:immich_mobile/presentation/actions/stack.action.dart'; import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; -import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; @@ -48,7 +47,6 @@ class _RemoteAlbumBottomSheetState extends ConsumerState @override Widget build(BuildContext context) { - final multiselect = ref.watch(multiSelectProvider); final ownsAlbum = ref.watch(currentUserProvider)?.id == widget.album.ownerId; Future addToAlbum(RemoteAlbum album) async { @@ -85,25 +83,23 @@ class _RemoteAlbumBottomSheetState extends ConsumerState minChildSize: 0.22, maxChildSize: 0.85, shouldCloseOnMinExtent: false, - actions: [ - const ActionColumnButton(action: ShareAction(source: .timeline)), - if (multiselect.hasRemote) ...[ - const ActionColumnButton(action: ShareLinkAction(source: .timeline)), + actions: [ + const .new(action: ShareAction(source: .timeline)), + const .new(action: ShareLinkAction(source: .timeline)), - if (ownsAlbum) ...[ - const ActionColumnButton(action: ArchiveAction(source: .timeline)), - const ActionColumnButton(action: FavoriteAction(source: .timeline)), - ], - const ActionColumnButton(action: DownloadAction(source: .timeline)), - if (ownsAlbum) ...[ - const ActionColumnButton(action: DeleteAction(source: .timeline)), - const ActionColumnButton(action: EditDateTimeAction(source: .timeline)), - const ActionColumnButton(action: EditLocationAction(source: .timeline)), - const ActionColumnButton(action: LockAction(source: .timeline)), - const ActionColumnButton(action: StackAction(source: .timeline)), - ], + if (ownsAlbum) ...const [ + .new(action: ArchiveAction(source: .timeline)), + .new(action: FavoriteAction(source: .timeline)), ], - const ActionColumnButton(action: CleanupLocalAction(source: .timeline)), + const .new(action: DownloadAction(source: .timeline)), + if (ownsAlbum) ...const [ + .new(action: DeleteAction(source: .timeline)), + .new(action: EditDateTimeAction(source: .timeline)), + .new(action: EditLocationAction(source: .timeline)), + .new(action: LockAction(source: .timeline)), + .new(action: StackAction(source: .timeline)), + ], + const .new(action: CleanupLocalAction(source: .timeline)), if (ownsAlbum) ...[ ActionColumnButton( action: RemoveFromAlbumAction(source: .timeline, albumId: widget.album.id), diff --git a/mobile/lib/presentation/widgets/bottom_sheet/trash_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/trash_bottom_sheet.widget.dart index 31a36cb970..1d378f1350 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/trash_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/trash_bottom_sheet.widget.dart @@ -19,9 +19,9 @@ class TrashBottomBar extends ConsumerWidget { top: false, child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - ActionColumnButton(action: DeleteAction(source: .timeline)), - ActionColumnButton(action: RestoreAction(source: .timeline)), + children: [ + .new(action: DeleteAction(source: .timeline)), + .new(action: RestoreAction(source: .timeline)), ], ), ), diff --git a/mobile/test/infrastructure/repositories/local_album_repository_test.dart b/mobile/test/infrastructure/repositories/local_album_repository_test.dart index bd4acca483..ada4281e2a 100644 --- a/mobile/test/infrastructure/repositories/local_album_repository_test.dart +++ b/mobile/test/infrastructure/repositories/local_album_repository_test.dart @@ -17,6 +17,10 @@ void main() { mediumFactory = MediumFactory(db); }); + tearDown(() async { + await db.close(); + }); + group('getAll', () { test('sorts albums by backupSelection & isIosSharedAlbum', () async { final localAlbumRepo = mediumFactory.getRepository(); diff --git a/mobile/test/presentation/widgets/asset_viewer/asset_viewer_system_ui_test.dart b/mobile/test/presentation/widgets/asset_viewer/asset_viewer_system_ui_test.dart index 14d876a654..3ec55bb515 100644 --- a/mobile/test/presentation/widgets/asset_viewer/asset_viewer_system_ui_test.dart +++ b/mobile/test/presentation/widgets/asset_viewer/asset_viewer_system_ui_test.dart @@ -39,6 +39,10 @@ void main() { context = await PresentationContext.create(); }); + tearDown(() async { + await context.dispose(); + }); + testWidgets('status bar icons are light while the asset viewer is open in light mode', (tester) async { // Emulate arriving from a light-themed page whose AppBar set dark status // bar icons (the state the viewer is opened from in light mode). diff --git a/mobile/test/unit/mocks.dart b/mobile/test/unit/mocks.dart index ee193f2b97..89ec418f4b 100644 --- a/mobile/test/unit/mocks.dart +++ b/mobile/test/unit/mocks.dart @@ -97,6 +97,7 @@ class RepositoryMocks { void _stubAssetMediaRepository() { when(assetMedia.shareAssets).thenAnswer((_) async => 1); + when(assetMedia.getOriginalFilename).thenAnswer((_) async => null); } void _stubDownloadRepository() { @@ -389,6 +390,9 @@ extension type const AssetMediaRepositoryStub(MockAssetMediaRepository api) impl cancelCompleter: any(named: 'cancelCompleter'), onAssetDownloadProgress: any(named: 'onAssetDownloadProgress'), ); + + Future Function() get getOriginalFilename => + () => api.getOriginalFilename(any()); } extension type const DownloadRepositoryStub(MockDownloadRepository repo) implements Stub { diff --git a/mobile/test/unit/presentation/actions/album_action_test.dart b/mobile/test/unit/presentation/actions/album_action_test.dart index de9c203d07..af5999752f 100644 --- a/mobile/test/unit/presentation/actions/album_action_test.dart +++ b/mobile/test/unit/presentation/actions/album_action_test.dart @@ -26,8 +26,8 @@ void main() { albumService = context.service.album.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); List withMockToast() => [toastRepositoryProvider.overrideWithValue(context.repository.toast)]; diff --git a/mobile/test/unit/presentation/actions/archive_action_test.dart b/mobile/test/unit/presentation/actions/archive_action_test.dart index dde2dbed03..00fcac72d5 100644 --- a/mobile/test/unit/presentation/actions/archive_action_test.dart +++ b/mobile/test/unit/presentation/actions/archive_action_test.dart @@ -20,8 +20,8 @@ void main() { assetService = context.service.asset.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); RemoteAsset owned({AssetVisibility visibility = .timeline}) => diff --git a/mobile/test/unit/presentation/actions/asset_debug_action_test.dart b/mobile/test/unit/presentation/actions/asset_debug_action_test.dart index 1644df0396..f545075809 100644 --- a/mobile/test/unit/presentation/actions/asset_debug_action_test.dart +++ b/mobile/test/unit/presentation/actions/asset_debug_action_test.dart @@ -16,8 +16,8 @@ void main() { await StoreService.I.put(StoreKey.advancedTroubleshooting, true); }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); group('AssetDebugAction', () { diff --git a/mobile/test/unit/presentation/actions/cast_action_test.dart b/mobile/test/unit/presentation/actions/cast_action_test.dart index 45f1a842f5..7c16ea398e 100644 --- a/mobile/test/unit/presentation/actions/cast_action_test.dart +++ b/mobile/test/unit/presentation/actions/cast_action_test.dart @@ -13,8 +13,8 @@ void main() { context = await PresentationContext.create(); }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); void Function(bool) captureConnectionListener() => diff --git a/mobile/test/unit/presentation/actions/delete_action_test.dart b/mobile/test/unit/presentation/actions/delete_action_test.dart index 4b75b01eaf..29d81a5c2c 100644 --- a/mobile/test/unit/presentation/actions/delete_action_test.dart +++ b/mobile/test/unit/presentation/actions/delete_action_test.dart @@ -32,7 +32,7 @@ void main() { tearDown(() async { debugDefaultTargetPlatformOverride = null; await StoreService.I.put(StoreKey.manageLocalMediaAndroid, false); - context.dispose(); + await context.dispose(); }); RemoteAsset owned({AssetVisibility visibility = .timeline, DateTime? deletedAt, String? localId}) => diff --git a/mobile/test/unit/presentation/actions/download_tag_action_test.dart b/mobile/test/unit/presentation/actions/download_tag_action_test.dart index 7d6f2ba265..9630e8e76a 100644 --- a/mobile/test/unit/presentation/actions/download_tag_action_test.dart +++ b/mobile/test/unit/presentation/actions/download_tag_action_test.dart @@ -29,8 +29,8 @@ void main() { tagService = context.service.tag.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); RemoteAsset owned() => RemoteAssetFactory.create(ownerId: context.currentUser.id); diff --git a/mobile/test/unit/presentation/actions/edit_action_test.dart b/mobile/test/unit/presentation/actions/edit_action_test.dart index 063301f9c4..9e8dcfb4b2 100644 --- a/mobile/test/unit/presentation/actions/edit_action_test.dart +++ b/mobile/test/unit/presentation/actions/edit_action_test.dart @@ -28,8 +28,8 @@ void main() { assetService = context.service.asset.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); RemoteAsset owned({AssetType type = .image}) => diff --git a/mobile/test/unit/presentation/actions/favorite_action_test.dart b/mobile/test/unit/presentation/actions/favorite_action_test.dart index e949815499..021d7e8140 100644 --- a/mobile/test/unit/presentation/actions/favorite_action_test.dart +++ b/mobile/test/unit/presentation/actions/favorite_action_test.dart @@ -20,8 +20,8 @@ void main() { assetService = context.service.asset.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); RemoteAsset owned({bool isFavorite = false}) => diff --git a/mobile/test/unit/presentation/actions/lock_action_test.dart b/mobile/test/unit/presentation/actions/lock_action_test.dart index 4ee669d137..9940153105 100644 --- a/mobile/test/unit/presentation/actions/lock_action_test.dart +++ b/mobile/test/unit/presentation/actions/lock_action_test.dart @@ -18,8 +18,8 @@ void main() { assetService = context.service.asset.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); RemoteAsset owned({AssetVisibility visibility = .timeline}) => diff --git a/mobile/test/unit/presentation/actions/open_in_browser_action_test.dart b/mobile/test/unit/presentation/actions/open_in_browser_action_test.dart index 0ed99e7704..edd9ec4a7c 100644 --- a/mobile/test/unit/presentation/actions/open_in_browser_action_test.dart +++ b/mobile/test/unit/presentation/actions/open_in_browser_action_test.dart @@ -13,8 +13,8 @@ void main() { context = await PresentationContext.create(); }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); group('webPathFor', () { diff --git a/mobile/test/unit/presentation/actions/partner_action_test.dart b/mobile/test/unit/presentation/actions/partner_action_test.dart index a1d645ffec..786d2d7f60 100644 --- a/mobile/test/unit/presentation/actions/partner_action_test.dart +++ b/mobile/test/unit/presentation/actions/partner_action_test.dart @@ -19,8 +19,8 @@ void main() { partnerService = context.service.partner.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); List overrides({List candidates = const []}) => [ diff --git a/mobile/test/unit/presentation/actions/restore_action_test.dart b/mobile/test/unit/presentation/actions/restore_action_test.dart index f6bbb15cda..f624c013c3 100644 --- a/mobile/test/unit/presentation/actions/restore_action_test.dart +++ b/mobile/test/unit/presentation/actions/restore_action_test.dart @@ -18,8 +18,8 @@ void main() { assetService = context.service.asset.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); RemoteAsset owned({bool trashed = true}) => diff --git a/mobile/test/unit/presentation/actions/share_action_test.dart b/mobile/test/unit/presentation/actions/share_action_test.dart index ff980c624f..a775e6bb5c 100644 --- a/mobile/test/unit/presentation/actions/share_action_test.dart +++ b/mobile/test/unit/presentation/actions/share_action_test.dart @@ -1,12 +1,8 @@ -import 'package:drift/drift.dart'; -import 'package:drift/native.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; -import 'package:immich_mobile/domain/models/settings_key.dart'; -import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/settings.repository.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; import 'package:immich_mobile/presentation/actions/share.action.dart'; @@ -21,18 +17,12 @@ import '../presentation_context.dart'; void main() { late PresentationContext context; - setUpAll(() async { - final db = Drift(DatabaseConnection(NativeDatabase.memory(), closeStreamsSynchronously: true)); - await SettingsRepository.ensureInitialized(db); - }); - setUp(() async { context = await PresentationContext.create(); - await SettingsRepository.instance.clear([SettingsKey.shareFileType]); }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); late BuildContext actionContext; diff --git a/mobile/test/unit/presentation/actions/stack_action_test.dart b/mobile/test/unit/presentation/actions/stack_action_test.dart index e2b37a3c44..599385e8d4 100644 --- a/mobile/test/unit/presentation/actions/stack_action_test.dart +++ b/mobile/test/unit/presentation/actions/stack_action_test.dart @@ -18,8 +18,8 @@ void main() { assetService = context.service.asset.service; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); RemoteAsset owned({String? stackId}) => RemoteAssetFactory.create(ownerId: context.currentUser.id, stackId: stackId); diff --git a/mobile/test/unit/presentation/actions/upload_action_test.dart b/mobile/test/unit/presentation/actions/upload_action_test.dart index 9c6e894640..8427e097cc 100644 --- a/mobile/test/unit/presentation/actions/upload_action_test.dart +++ b/mobile/test/unit/presentation/actions/upload_action_test.dart @@ -27,8 +27,8 @@ void main() { uploadService = context.service.upload; }); - tearDown(() { - context.dispose(); + tearDown(() async { + await context.dispose(); }); List uploadOverrides() => [ diff --git a/mobile/test/unit/presentation/partner_page_test.dart b/mobile/test/unit/presentation/partner_page_test.dart index e6ff8fc83f..2cabbb9d4c 100644 --- a/mobile/test/unit/presentation/partner_page_test.dart +++ b/mobile/test/unit/presentation/partner_page_test.dart @@ -15,7 +15,7 @@ void main() { late PresentationContext context; setUp(() async => context = await PresentationContext.create()); - tearDown(() => context.dispose()); + tearDown(() async => await context.dispose()); group('PartnerSharedByList', () { testWidgets('shows the empty-state add button when there are no partners', (tester) async { diff --git a/mobile/test/unit/presentation/presentation_context.dart b/mobile/test/unit/presentation/presentation_context.dart index 43c76c8bf8..5b23890ef8 100644 --- a/mobile/test/unit/presentation/presentation_context.dart +++ b/mobile/test/unit/presentation/presentation_context.dart @@ -11,6 +11,7 @@ import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/services/store.service.dart'; import 'package:immich_mobile/generated/codegen_loader.g.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; +import 'package:immich_mobile/infrastructure/repositories/settings.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/store.repository.dart'; import 'package:immich_mobile/presentation/actions/action.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; @@ -37,7 +38,6 @@ class PresentationContext { service = ServiceMocks(), repository = RepositoryMocks() { setup(); - addTearDown(dispose); } static const String serverEndpoint = 'http://localhost:3000'; @@ -75,6 +75,7 @@ class PresentationContext { await StoreService.I.put(StoreKey.serverEndpoint, serverEndpoint); _db = db; } + await SettingsRepository.ensureInitialized(_db!); return PresentationContext._(user: UserFactory.createDto()); } @@ -82,7 +83,8 @@ class PresentationContext { when(service.user.tryGetMyUser).thenReturn(currentUser); } - void dispose() { + Future dispose() async { + await SettingsRepository.reset(); service.resetAll(); } }