mirror of
https://github.com/immich-app/immich.git
synced 2026-07-28 22:51:21 -07:00
refactor: cleanup actions & action tests
This commit is contained in:
@@ -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<SettingsKey, AppConfig
|
||||
return _instance!;
|
||||
}
|
||||
|
||||
@visibleForTesting
|
||||
static Future<void> reset() async {
|
||||
final instance = _instance;
|
||||
if (instance != null) {
|
||||
await instance.clear(SettingsKey.values);
|
||||
_instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
List<SettingsKey> get keys => SettingsKey.values;
|
||||
|
||||
|
||||
@@ -43,13 +43,14 @@ class ViewerBottomBar extends ConsumerWidget {
|
||||
final originalTheme = context.themeData;
|
||||
|
||||
final actions = <Widget>[
|
||||
..._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)]),
|
||||
|
||||
@@ -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<ArchiveBottomSheet> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final multiselect = ref.watch(multiSelectProvider);
|
||||
|
||||
Future<void> addToAlbum(RemoteAlbum album) async {
|
||||
final result = await ref.read(actionProvider.notifier).addToAlbum(ActionSource.timeline, album);
|
||||
|
||||
@@ -75,20 +72,18 @@ class _ArchiveBottomSheetState extends ConsumerState<ArchiveBottomSheet> {
|
||||
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 <ActionColumnButton>[
|
||||
.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(),
|
||||
|
||||
@@ -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 <ActionColumnButton>[
|
||||
.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)]
|
||||
|
||||
@@ -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<GeneralBottomSheet> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final multiselect = ref.watch(multiSelectProvider);
|
||||
|
||||
Future<void> addToAlbum(RemoteAlbum album) async {
|
||||
final result = await ref.read(actionProvider.notifier).addToAlbum(ActionSource.timeline, album);
|
||||
|
||||
@@ -77,23 +74,20 @@ class _GeneralBottomSheetState extends ConsumerState<GeneralBottomSheet> {
|
||||
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 <ActionColumnButton>[
|
||||
.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(),
|
||||
|
||||
@@ -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<LocalAlbumBottomSheet> {
|
||||
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 <ActionColumnButton>[
|
||||
.new(action: ShareAction(source: .timeline)),
|
||||
.new(action: DeleteAction(source: .timeline)),
|
||||
.new(action: CleanupLocalAction(source: .timeline)),
|
||||
.new(action: UploadAction(source: .timeline)),
|
||||
],
|
||||
slivers: [
|
||||
const AddToAlbumHeader(),
|
||||
|
||||
@@ -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: <ActionColumnButton>[
|
||||
.new(action: ShareAction(source: .timeline)),
|
||||
.new(action: DownloadAction(source: .timeline)),
|
||||
.new(action: DeleteAction(source: .timeline)),
|
||||
.new(action: LockAction(source: .timeline)),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
+4
-4
@@ -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<PartnerDetailBottomSh
|
||||
initialChildSize: 0.25,
|
||||
maxChildSize: 0.85,
|
||||
shouldCloseOnMinExtent: false,
|
||||
actions: const [
|
||||
ActionColumnButton(action: ShareAction(source: .timeline)),
|
||||
ActionColumnButton(action: DownloadAction(source: .timeline)),
|
||||
actions: const <ActionColumnButton>[
|
||||
.new(action: ShareAction(source: .timeline)),
|
||||
.new(action: DownloadAction(source: .timeline)),
|
||||
],
|
||||
slivers: [
|
||||
const AddToAlbumHeader(),
|
||||
|
||||
+16
-20
@@ -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<RemoteAlbumBottomSheet>
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final multiselect = ref.watch(multiSelectProvider);
|
||||
final ownsAlbum = ref.watch(currentUserProvider)?.id == widget.album.ownerId;
|
||||
|
||||
Future<void> addToAlbum(RemoteAlbum album) async {
|
||||
@@ -85,25 +83,23 @@ class _RemoteAlbumBottomSheetState extends ConsumerState<RemoteAlbumBottomSheet>
|
||||
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: <ActionColumnButton>[
|
||||
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),
|
||||
|
||||
@@ -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: <ActionColumnButton>[
|
||||
.new(action: DeleteAction(source: .timeline)),
|
||||
.new(action: RestoreAction(source: .timeline)),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -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<DriftLocalAlbumRepository>();
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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<String?> Function() get getOriginalFilename =>
|
||||
() => api.getOriginalFilename(any());
|
||||
}
|
||||
|
||||
extension type const DownloadRepositoryStub(MockDownloadRepository repo) implements Stub<MockDownloadRepository> {
|
||||
|
||||
@@ -26,8 +26,8 @@ void main() {
|
||||
albumService = context.service.album.service;
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
List<Override> withMockToast() => [toastRepositoryProvider.overrideWithValue(context.repository.toast)];
|
||||
|
||||
@@ -20,8 +20,8 @@ void main() {
|
||||
assetService = context.service.asset.service;
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
RemoteAsset owned({AssetVisibility visibility = .timeline}) =>
|
||||
|
||||
@@ -16,8 +16,8 @@ void main() {
|
||||
await StoreService.I.put(StoreKey.advancedTroubleshooting, true);
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
group('AssetDebugAction', () {
|
||||
|
||||
@@ -13,8 +13,8 @@ void main() {
|
||||
context = await PresentationContext.create();
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
void Function(bool) captureConnectionListener() =>
|
||||
|
||||
@@ -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}) =>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -28,8 +28,8 @@ void main() {
|
||||
assetService = context.service.asset.service;
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
RemoteAsset owned({AssetType type = .image}) =>
|
||||
|
||||
@@ -20,8 +20,8 @@ void main() {
|
||||
assetService = context.service.asset.service;
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
RemoteAsset owned({bool isFavorite = false}) =>
|
||||
|
||||
@@ -18,8 +18,8 @@ void main() {
|
||||
assetService = context.service.asset.service;
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
RemoteAsset owned({AssetVisibility visibility = .timeline}) =>
|
||||
|
||||
@@ -13,8 +13,8 @@ void main() {
|
||||
context = await PresentationContext.create();
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
group('webPathFor', () {
|
||||
|
||||
@@ -19,8 +19,8 @@ void main() {
|
||||
partnerService = context.service.partner.service;
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
List<Override> overrides({List<User> candidates = const []}) => [
|
||||
|
||||
@@ -18,8 +18,8 @@ void main() {
|
||||
assetService = context.service.asset.service;
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
RemoteAsset owned({bool trashed = true}) =>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -27,8 +27,8 @@ void main() {
|
||||
uploadService = context.service.upload;
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
context.dispose();
|
||||
tearDown(() async {
|
||||
await context.dispose();
|
||||
});
|
||||
|
||||
List<Override> uploadOverrides() => [
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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<void> dispose() async {
|
||||
await SettingsRepository.reset();
|
||||
service.resetAll();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user