feat: favorite action (#19623)
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user