mirror of
https://github.com/immich-app/immich.git
synced 2026-04-25 18:49:52 -04:00
81 lines
2.5 KiB
Dart
81 lines
2.5 KiB
Dart
import 'package:collection/collection.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:immich_mobile/models/activities/activity.model.dart';
|
|
import 'package:immich_mobile/providers/activity_service.provider.dart';
|
|
|
|
/// Maintains the current list of all activities for [share-album-id, asset]
|
|
|
|
final albumActivityProvider = AsyncNotifierProvider.autoDispose
|
|
.family<AlbumActivity, List<Activity>, (String, String?)>(AlbumActivity.new);
|
|
|
|
class AlbumActivity extends AsyncNotifier<List<Activity>> {
|
|
final String albumId;
|
|
final String? assetId;
|
|
|
|
AlbumActivity((String albumId, String? assetId) args) : albumId = args.$1, assetId = args.$2;
|
|
|
|
@override
|
|
Future<List<Activity>> build() async {
|
|
return ref.watch(activityServiceProvider).getAllActivities(albumId, assetId: assetId);
|
|
}
|
|
|
|
Future<void> removeActivity(String id) async {
|
|
if (await ref.watch(activityServiceProvider).removeActivity(id)) {
|
|
final removedActivity = _removeFromState(id);
|
|
if (removedActivity == null) {
|
|
return;
|
|
}
|
|
|
|
if (assetId != null) {
|
|
ref.read(albumActivityProvider((albumId, assetId)).notifier)._removeFromState(id);
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<void> addLike() async {
|
|
final activity = await ref.watch(activityServiceProvider).addActivity(albumId, ActivityType.like, assetId: assetId);
|
|
if (activity.hasValue) {
|
|
_addToState(activity.requireValue);
|
|
if (assetId != null) {
|
|
ref.read(albumActivityProvider((albumId, assetId)).notifier)._addToState(activity.requireValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<void> addComment(String comment) async {
|
|
final activity = await ref
|
|
.watch(activityServiceProvider)
|
|
.addActivity(albumId, ActivityType.comment, assetId: assetId, comment: comment);
|
|
|
|
if (activity.hasValue) {
|
|
_addToState(activity.requireValue);
|
|
if (assetId != null) {
|
|
ref.read(albumActivityProvider((albumId, assetId)).notifier)._addToState(activity.requireValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
void _addToState(Activity activity) {
|
|
final activities = state.value ?? [];
|
|
if (activities.any((a) => a.id == activity.id)) {
|
|
return;
|
|
}
|
|
state = AsyncData([...activities, activity]);
|
|
}
|
|
|
|
Activity? _removeFromState(String id) {
|
|
final activities = state.value;
|
|
if (activities == null) {
|
|
return null;
|
|
}
|
|
final activity = activities.firstWhereOrNull((a) => a.id == id);
|
|
if (activity == null) {
|
|
return null;
|
|
}
|
|
|
|
final updated = [...activities]..remove(activity);
|
|
state = AsyncData(updated);
|
|
return activity;
|
|
}
|
|
}
|