fix: action provider overrides (#30480)

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong 2026-08-03 19:53:12 +05:30 committed by GitHub
parent c2db36934f
commit 4d9a27691e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 31 additions and 26 deletions

View file

@ -33,6 +33,7 @@ final assetsActionProvider = Provider.family.autoDispose<AssetFilter<BaseAsset>,
null => const <BaseAsset>{},
},
}),
dependencies: [multiSelectProvider],
);
final clearSelectionProvider = Provider.family.autoDispose<VoidCallback, ActionSource>((ref, source) {
@ -41,10 +42,11 @@ final clearSelectionProvider = Provider.family.autoDispose<VoidCallback, ActionS
}
return () {};
});
}, dependencies: [multiSelectProvider]);
final ownedAssetsActionProvider = Provider.family.autoDispose<AssetFilter<RemoteAsset>, ActionSource>(
(ref, source) => ref.watch(assetsActionProvider(source)).owned(ref.watch(authUserProvider).id),
dependencies: [assetsActionProvider],
);
abstract class AssetActionBuilder extends ActionBuilder {

View file

@ -22,7 +22,7 @@ final _stateProvider = Provider.family.autoDispose<_State?, ActionSource>((ref,
.map((asset) => asset.id)
.toList(growable: false);
return assetIds.isEmpty ? null : (shouldArchive: shouldArchive, assetIds: assetIds);
});
}, dependencies: [ownedAssetsActionProvider]);
class ArchiveAction extends AssetActionBuilder {
const ArchiveAction({required super.source});

View file

@ -40,7 +40,7 @@ final _stateProvider = Provider.family.autoDispose<_State?, ActionSource>((ref,
final trash = trashEnabled && !ownedRemote.every((asset) => asset.isTrashed || asset.isLocked);
return (localIds: localIds, remoteIds: ownedRemote.map((asset) => asset.id).toList(growable: false), trash: trash);
});
}, dependencies: [assetsActionProvider]);
class DeleteAction extends AssetActionBuilder {
const DeleteAction({required super.source});
@ -149,7 +149,7 @@ final _cleanupStateProvider = Provider.family.autoDispose<List<String>?, ActionS
final assets = ref.watch(assetsActionProvider(source));
final assetIds = assets.backedUp().map((asset) => asset.localId).nonNulls.toList(growable: false);
return assetIds.isEmpty ? null : assetIds;
});
}, dependencies: [assetsActionProvider]);
class CleanupLocalAction extends AssetActionBuilder {
const CleanupLocalAction({required super.source});

View file

@ -14,7 +14,7 @@ final _stateProvider = Provider.family.autoDispose<List<RemoteAsset>?, ActionSou
final assets = ref.watch(assetsActionProvider(source));
final remote = assets.remote().toList(growable: false);
return remote.isEmpty ? null : remote;
});
}, dependencies: [assetsActionProvider]);
class DownloadAction extends AssetActionBuilder {
const DownloadAction({required super.source});

View file

@ -28,7 +28,7 @@ final _stateProvider = Provider.family.autoDispose<RemoteAsset?, ActionSource>((
final assets = ref.watch(ownedAssetsActionProvider(source));
return assets.where((asset) => asset.isEditable).singleOrNull;
});
}, dependencies: [ownedAssetsActionProvider]);
class EditAssetAction extends AssetActionBuilder {
const EditAssetAction({required super.source});

View file

@ -21,7 +21,7 @@ final _stateProvider = Provider.family.autoDispose<_State?, ActionSource>((ref,
}
return (assetIds: assets.map((asset) => asset.id).toList(growable: false), origin: assets.singleOrNull);
});
}, dependencies: [ownedAssetsActionProvider]);
class EditDateTimeAction extends AssetActionBuilder {
const EditDateTimeAction({required super.source});

View file

@ -21,7 +21,7 @@ final _stateProvider = Provider.family.autoDispose<_State?, ActionSource>((ref,
}
return (assetIds: assets.map((asset) => asset.id).toList(growable: false), origin: assets.singleOrNull);
});
}, dependencies: [ownedAssetsActionProvider]);
class EditLocationAction extends AssetActionBuilder {
const EditLocationAction({required super.source});

View file

@ -18,7 +18,7 @@ final _stateProvider = Provider.family.autoDispose<_State?, ActionSource>((ref,
final shouldFavorite = assets.favorite(isFavorite: false).isNotEmpty;
final assetIds = assets.favorite(isFavorite: !shouldFavorite).map((asset) => asset.id).toList(growable: false);
return (shouldFavorite: shouldFavorite, assetIds: assetIds);
});
}, dependencies: [ownedAssetsActionProvider]);
class FavoriteAction extends AssetActionBuilder {
const FavoriteAction({required super.source});

View file

@ -23,7 +23,7 @@ final _stateProvider = Provider.family.autoDispose<_State?, ActionSource>((ref,
// Only locking has an on-device copy to clean up; unlocking leaves the device alone.
localIds: shouldLock ? targets.map((asset) => asset.localId).nonNulls.toList(growable: false) : const [],
);
});
}, dependencies: [ownedAssetsActionProvider]);
class LockAction extends AssetActionBuilder {
const LockAction({required super.source});

View file

@ -11,7 +11,7 @@ final _stateProvider = Provider.family.autoDispose<List<String>?, ActionSource>(
final assets = ref.watch(assetsActionProvider(source));
final assetIds = assets.remote().map((asset) => asset.id).toList(growable: false);
return assetIds.isEmpty ? null : assetIds;
});
}, dependencies: [assetsActionProvider]);
class RemoveFromAlbumAction extends AssetActionBuilder {
final String albumId;

View file

@ -11,7 +11,7 @@ final _stateProvider = Provider.family.autoDispose<List<String>?, ActionSource>(
final assets = ref.watch(ownedAssetsActionProvider(source));
final assetIds = assets.trashed().map((asset) => asset.id).toList(growable: false);
return assetIds.isEmpty ? null : assetIds;
});
}, dependencies: [ownedAssetsActionProvider]);
class RestoreAction extends AssetActionBuilder {
const RestoreAction({required super.source});

View file

@ -11,7 +11,7 @@ import 'package:immich_mobile/utils/error_handler.dart';
final _stateProvider = Provider.family.autoDispose<String?, ActionSource>((ref, source) {
final assets = ref.watch(assetsActionProvider(source));
return assets.remote().map((asset) => asset.id).singleOrNull;
});
}, dependencies: [assetsActionProvider]);
class SetAlbumCoverAction extends AssetActionBuilder {
final String albumId;

View file

@ -16,7 +16,7 @@ final _stateProvider = Provider.family.autoDispose<List<BaseAsset>?, ActionSourc
final assets = ref.watch(assetsActionProvider(source));
final shareable = assets.toList(growable: false);
return shareable.isEmpty ? null : shareable;
});
}, dependencies: [assetsActionProvider]);
class ShareAction extends AssetActionBuilder {
const ShareAction({required super.source});

View file

@ -12,7 +12,7 @@ final _stateProvider = Provider.family.autoDispose<List<String>?, ActionSource>(
final assets = ref.watch(assetsActionProvider(source));
final remoteIds = assets.remote().map((asset) => asset.id).toList(growable: false);
return remoteIds.isEmpty ? null : remoteIds;
});
}, dependencies: [assetsActionProvider]);
class ShareLinkAction extends AssetActionBuilder {
const ShareLinkAction({required super.source});

View file

@ -23,7 +23,7 @@ final _stateProvider = Provider.family.autoDispose<_State?, ActionSource>((ref,
assetIds: assets.map((asset) => asset.id).toList(growable: false),
stackIds: assets.map((asset) => asset.stackId).nonNulls.toList(growable: false),
);
});
}, dependencies: [ownedAssetsActionProvider]);
class StackAction extends AssetActionBuilder {
const StackAction({required super.source});

View file

@ -21,7 +21,7 @@ final _stateProvider = Provider.family.autoDispose<List<String>?, ActionSource>(
final assets = ref.watch(ownedAssetsActionProvider(source));
final assetIds = assets.map((asset) => asset.id).toList(growable: false);
return assetIds.isEmpty ? null : assetIds;
});
}, dependencies: [ownedAssetsActionProvider]);
class TagAction extends AssetActionBuilder {
const TagAction({required super.source});

View file

@ -16,7 +16,7 @@ final _stateProvider = Provider.family.autoDispose<List<LocalAsset>?, ActionSour
final assets = ref.watch(assetsActionProvider(source));
final local = assets.backedUp(isBackedUp: false).local().toList(growable: false);
return local.isEmpty ? null : local;
});
}, dependencies: [assetsActionProvider]);
class UploadAction extends AssetActionBuilder {
final bool showProgress;

View file

@ -101,15 +101,18 @@ extension PumpPresentationWidget on WidgetTester {
useFallbackTranslations: true,
assetLoader: const CodegenLoader(),
child: ProviderScope(
overrides: [...context.overrides, ...overrides],
overrides: context.overrides,
child: Builder(
builder: (context) => MaterialApp(
debugShowCheckedModeBanner: false,
scaffoldMessengerKey: scaffoldMessengerKey,
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
home: Scaffold(body: widget),
builder: (context) => ProviderScope(
overrides: overrides,
child: MaterialApp(
debugShowCheckedModeBanner: false,
scaffoldMessengerKey: scaffoldMessengerKey,
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
home: Scaffold(body: widget),
),
),
),
),