mirror of
https://github.com/immich-app/immich.git
synced 2026-02-28 17:49:05 +03:00
The existing implementation for showing asset details uses a bottom sheet, and is not in sync with the preview or scroll intent. Other apps use inline details, which is much cleaner and feels better to use.
53 lines
1.4 KiB
Dart
53 lines
1.4 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
|
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
|
|
|
|
final currentAssetNotifier = AutoDisposeNotifierProvider<CurrentAssetNotifier, BaseAsset?>(CurrentAssetNotifier.new);
|
|
|
|
class CurrentAssetNotifier extends AutoDisposeNotifier<BaseAsset?> {
|
|
KeepAliveLink? _keepAliveLink;
|
|
StreamSubscription<BaseAsset?>? _assetSubscription;
|
|
|
|
@override
|
|
BaseAsset? build() => null;
|
|
|
|
void setAsset(BaseAsset asset) {
|
|
_keepAliveLink?.close();
|
|
_assetSubscription?.cancel();
|
|
state = asset;
|
|
_assetSubscription = ref.watch(assetServiceProvider).watchAsset(asset).listen((updatedAsset) {
|
|
if (updatedAsset != null) {
|
|
state = updatedAsset;
|
|
}
|
|
});
|
|
_keepAliveLink = ref.keepAlive();
|
|
}
|
|
|
|
void dispose() {
|
|
_keepAliveLink?.close();
|
|
_assetSubscription?.cancel();
|
|
}
|
|
}
|
|
|
|
class ScopedAssetNotifier extends CurrentAssetNotifier {
|
|
final BaseAsset _asset;
|
|
|
|
ScopedAssetNotifier(this._asset);
|
|
|
|
@override
|
|
BaseAsset? build() {
|
|
setAsset(_asset);
|
|
return _asset;
|
|
}
|
|
}
|
|
|
|
final currentAssetExifProvider = FutureProvider.autoDispose((ref) {
|
|
final currentAsset = ref.watch(currentAssetNotifier);
|
|
if (currentAsset == null) {
|
|
return null;
|
|
}
|
|
return ref.watch(assetServiceProvider).getExif(currentAsset);
|
|
});
|