immich/mobile/lib/presentation/actions/action.dart
shenlong fe5c8ed0fb
refactor: base action (#29617)
* 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>
2026-07-30 17:02:14 -04:00

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});
}