Skip to content

Commit

Permalink
fix(mobile): asset description is not shown on the sheet when opened …
Browse files Browse the repository at this point in the history
…for the first time (#10377)

* fix: invalidate asset's description when asset details changed

* refactor(exif-sheet): use description from exif instead

* refactor(asset-description): remove asset_description.provider

* fix(asset-description): set is empty based on exifInfo.description

* chore: rename service to provider
  • Loading branch information
RanKKI authored Jun 17, 2024
1 parent 7ce87ab commit 29e4666
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 123 deletions.
87 changes: 0 additions & 87 deletions mobile/lib/providers/asset_viewer/asset_description.provider.dart

This file was deleted.

43 changes: 17 additions & 26 deletions mobile/lib/services/asset_description.service.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/entities/exif_info.entity.dart';
import 'package:immich_mobile/providers/api.provider.dart';
import 'package:immich_mobile/providers/db.provider.dart';
Expand All @@ -12,46 +13,36 @@ class AssetDescriptionService {
final Isar _db;
final ApiService _api;

setDescription(
String description,
String remoteAssetId,
int localExifId,
Future<void> setDescription(
Asset asset,
String newDescription,
) async {
final remoteAssetId = asset.remoteId;
final localExifId = asset.exifInfo?.id;

// Guard [remoteAssetId] and [localExifId] null
if (remoteAssetId == null || localExifId == null) {
return;
}

final result = await _api.assetsApi.updateAsset(
remoteAssetId,
UpdateAssetDto(description: description),
UpdateAssetDto(description: newDescription),
);

if (result?.exifInfo?.description != null) {
final description = result?.exifInfo?.description;

if (description != null) {
var exifInfo = await _db.exifInfos.get(localExifId);

if (exifInfo != null) {
exifInfo.description = result!.exifInfo!.description;
exifInfo.description = description;
await _db.writeTxn(
() => _db.exifInfos.put(exifInfo),
);
}
}
}

Future<String> readLatest(String assetRemoteId, int localExifId) async {
final latestAssetFromServer =
await _api.assetsApi.getAssetInfo(assetRemoteId);
final localExifInfo = await _db.exifInfos.get(localExifId);

if (latestAssetFromServer != null && localExifInfo != null) {
localExifInfo.description =
latestAssetFromServer.exifInfo?.description ?? '';

await _db.writeTxn(
() => _db.exifInfos.put(localExifInfo),
);

return localExifInfo.description!;
}

return "";
}
}

final assetDescriptionServiceProvider = Provider(
Expand Down
19 changes: 11 additions & 8 deletions mobile/lib/widgets/asset_viewer/description_input.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,23 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/entities/exif_info.entity.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/providers/asset_viewer/asset_description.provider.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/services/asset_description.service.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:logging/logging.dart';

class DescriptionInput extends HookConsumerWidget {
DescriptionInput({
super.key,
required this.asset,
this.exifInfo,
});

final Asset asset;
final ExifInfo? exifInfo;
final Logger _log = Logger('DescriptionInput');

@override
Expand All @@ -25,25 +28,25 @@ class DescriptionInput extends HookConsumerWidget {
final focusNode = useFocusNode();
final isFocus = useState(false);
final isTextEmpty = useState(controller.text.isEmpty);
final descriptionProvider =
ref.watch(assetDescriptionProvider(asset).notifier);
final description = ref.watch(assetDescriptionProvider(asset));
final descriptionProvider = ref.watch(assetDescriptionServiceProvider);

final owner = ref.watch(currentUserProvider);
final hasError = useState(false);

useEffect(
() {
controller.text = description;
isTextEmpty.value = description.isEmpty;
controller.text = exifInfo?.description ?? '';
isTextEmpty.value = exifInfo?.description?.isEmpty ?? true;
return null;
},
[description],
[exifInfo?.description],
);

submitDescription(String description) async {
hasError.value = false;
try {
await descriptionProvider.setDescription(
asset,
description,
);
} catch (error, stack) {
Expand Down Expand Up @@ -85,7 +88,7 @@ class DescriptionInput extends HookConsumerWidget {
isFocus.value = false;
focusNode.unfocus();

if (description != controller.text) {
if (exifInfo?.description != controller.text) {
await submitDescription(controller.text);
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ class ExifBottomSheet extends HookConsumerWidget {
child: Column(
children: [
dateWidget,
if (asset.isRemote) DescriptionInput(asset: asset),
if (asset.isRemote)
DescriptionInput(asset: asset, exifInfo: exifInfo),
],
),
),
Expand Down Expand Up @@ -132,7 +133,8 @@ class ExifBottomSheet extends HookConsumerWidget {
child: Column(
children: [
dateWidget,
if (asset.isRemote) DescriptionInput(asset: asset),
if (asset.isRemote)
DescriptionInput(asset: asset, exifInfo: exifInfo),
Padding(
padding: EdgeInsets.only(top: asset.isRemote ? 0 : 16.0),
child: ExifLocation(
Expand Down

0 comments on commit 29e4666

Please sign in to comment.