feat: favorite action (#19623)

This commit is contained in:
Alex
2025-06-30 12:21:09 -05:00
committed by GitHub
parent fa5f30d9ca
commit 4c3fcdc745
16 changed files with 238 additions and 56 deletions
@@ -0,0 +1,28 @@
import 'package:immich_mobile/services/action.service.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
final actionProvider = NotifierProvider<ActionNotifier, void>(
ActionNotifier.new,
dependencies: [
actionServiceProvider,
],
);
class ActionNotifier extends Notifier<void> {
late final ActionService _service;
ActionNotifier() : super();
@override
void build() {
_service = ref.watch(actionServiceProvider);
}
Future<void> favorite(List<String> ids) async {
await _service.favorite(ids);
}
Future<void> unFavorite(List<String> ids) async {
await _service.unFavorite(ids);
}
}
@@ -13,9 +13,11 @@ final multiSelectProvider =
class MultiSelectState {
final Set<BaseAsset> selectedAssets;
final int lastUpdatedTime;
const MultiSelectState({
required this.selectedAssets,
required this.lastUpdatedTime,
});
bool get isEnabled => selectedAssets.isNotEmpty;
@@ -30,25 +32,29 @@ class MultiSelectState {
MultiSelectState copyWith({
Set<BaseAsset>? selectedAssets,
int? lastUpdatedTime,
}) {
return MultiSelectState(
selectedAssets: selectedAssets ?? this.selectedAssets,
lastUpdatedTime: lastUpdatedTime ?? this.lastUpdatedTime,
);
}
@override
String toString() => 'MultiSelectState(selectedAssets: $selectedAssets)';
String toString() =>
'MultiSelectState(selectedAssets: $selectedAssets, lastUpdatedTime: $lastUpdatedTime)';
@override
bool operator ==(covariant MultiSelectState other) {
if (identical(this, other)) return true;
final listEquals = const DeepCollectionEquality().equals;
return listEquals(other.selectedAssets, selectedAssets);
return listEquals(other.selectedAssets, selectedAssets) &&
other.lastUpdatedTime == lastUpdatedTime;
}
@override
int get hashCode => selectedAssets.hashCode;
int get hashCode => selectedAssets.hashCode ^ lastUpdatedTime.hashCode;
}
class MultiSelectNotifier extends Notifier<MultiSelectState> {
@@ -60,6 +66,7 @@ class MultiSelectNotifier extends Notifier<MultiSelectState> {
return const MultiSelectState(
selectedAssets: {},
lastUpdatedTime: 0,
);
}
@@ -97,6 +104,13 @@ class MultiSelectNotifier extends Notifier<MultiSelectState> {
);
}
void reset() {
state = MultiSelectState(
selectedAssets: {},
lastUpdatedTime: DateTime.now().millisecondsSinceEpoch,
);
}
/// Bucket bulk operations
void selectBucket(int offset, int bucketCount) async {
final assets = await _timelineService.loadAssets(offset, bucketCount);