mirror of
https://github.com/immich-app/immich
synced 2026-08-22 13:13:05 +00:00
* refactor: existing actions to new structure # Conflicts: # mobile/lib/presentation/actions/action.widget.dart # mobile/lib/presentation/widgets/action_buttons/favorite_action_button.widget.dart # mobile/lib/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart # mobile/test/unit/presentation/partner_page_test.dart * rename to actionitem * more cleanup * review changes * lint changes --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
54 lines
1.9 KiB
Dart
54 lines
1.9 KiB
Dart
import 'dart:async';
|
|
|
|
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/asset/base_asset.model.dart';
|
|
import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart';
|
|
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
|
import 'package:immich_mobile/providers/user.provider.dart';
|
|
import 'package:immich_mobile/utils/asset_filter.dart';
|
|
|
|
class ActionItem {
|
|
final IconData icon;
|
|
final String label;
|
|
final FutureOr<void> Function() onAction;
|
|
final FutureOr<void> Function()? onSecondaryAction;
|
|
|
|
const ActionItem({required this.icon, required this.label, required this.onAction, this.onSecondaryAction});
|
|
}
|
|
|
|
abstract class ActionBuilder {
|
|
const ActionBuilder();
|
|
|
|
// null when the action is not applicable for the current context
|
|
ActionItem? create(BuildContext context, WidgetRef ref);
|
|
}
|
|
|
|
final assetsActionProvider = Provider.family.autoDispose<AssetFilter<BaseAsset>, ActionSource>(
|
|
(ref, source) => AssetFilter(switch (source) {
|
|
.timeline => ref.watch(multiSelectProvider.select((s) => s.selectedAssets)),
|
|
.viewer => switch (ref.watch(assetViewerProvider.select((s) => s.currentAsset))) {
|
|
final BaseAsset asset => {asset},
|
|
null => const <BaseAsset>{},
|
|
},
|
|
}),
|
|
);
|
|
|
|
final clearSelectionProvider = Provider.family.autoDispose<VoidCallback, ActionSource>((ref, source) {
|
|
if (source == .timeline) {
|
|
return ref.read(multiSelectProvider.notifier).reset;
|
|
}
|
|
|
|
return () {};
|
|
});
|
|
|
|
final ownedAssetsActionProvider = Provider.family.autoDispose<AssetFilter<RemoteAsset>, ActionSource>(
|
|
(ref, source) => ref.watch(assetsActionProvider(source)).owned(ref.watch(authUserProvider).id),
|
|
);
|
|
|
|
abstract class AssetActionBuilder extends ActionBuilder {
|
|
final ActionSource source;
|
|
|
|
const AssetActionBuilder({required this.source});
|
|
}
|