This commit is contained in:
Florian Amsallem 2026-08-15 13:25:51 +02:00 committed by GitHub
commit 5328bb40e6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 67 additions and 2 deletions

View file

@ -31,4 +31,9 @@ class DriftPeopleService {
await _personApiRepository.update(personId, birthday: birthday);
return _repository.updateBirthday(personId, birthday);
}
Future<int> updateVisibility(String personId, bool isHidden) async {
await _personApiRepository.update(personId, isHidden: isHidden);
return _repository.updateVisibility(personId, isHidden);
}
}

View file

@ -73,6 +73,12 @@ class DriftPeopleRepository extends DriftDatabaseRepository {
return query.write(PersonEntityCompanion(birthDate: Value(birthday), updatedAt: Value(DateTime.now())));
}
Future<int> updateVisibility(String personId, bool isHidden) {
final query = _db.update(_db.personEntity)..where((row) => row.id.equals(personId));
return query.write(PersonEntityCompanion(isHidden: Value(isHidden), updatedAt: Value(DateTime.now())));
}
}
extension on PersonEntityData {

View file

@ -2,14 +2,19 @@ import 'dart:async';
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/person.model.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/presentation/widgets/people/person_option_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/people.provider.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:immich_mobile/utils/people.utils.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:immich_mobile/widgets/common/person_sliver_app_bar.dart';
@RoutePage()
@ -51,6 +56,35 @@ class _DriftPersonPageState extends ConsumerState<DriftPersonPage> {
}
}
Future<void> handleEditVisibility(BuildContext context) async {
final newIsHidden = !_person.isHidden;
try {
final result = await ref.read(driftPeopleServiceProvider).updateVisibility(_person.id, newIsHidden);
if (result != 0) {
ref.invalidate(driftGetAllPeopleProvider);
ContextHelper(context).pop(newIsHidden);
}
} catch (error) {
dPrint(() => 'Error updating visibility: $error');
if (!context.mounted) {
return;
}
ImmichToast.show(
context: context,
msg: 'scaffold_body_error_occurred'.t(context: context),
gravity: ToastGravity.BOTTOM,
toastType: ToastType.error,
);
}
setState(() {
_person = _person.copyWith(isHidden: newIsHidden);
});
}
Future<void> showOptionSheet(BuildContext context) {
return showModalBottomSheet(
context: context,
@ -66,7 +100,12 @@ class _DriftPersonPageState extends ConsumerState<DriftPersonPage> {
await handleEditBirthday(context);
ContextHelper(context).pop();
},
onEditVisibility: () async {
await handleEditVisibility(context);
ContextHelper(context).pop();
},
birthdayExists: _person.birthDate != null,
isHidden: _person.isHidden,
);
},
);

View file

@ -2,11 +2,20 @@ import 'package:flutter/material.dart';
import 'package:immich_mobile/generated/translations.g.dart';
class PersonOptionSheet extends StatelessWidget {
const PersonOptionSheet({super.key, this.onEditName, this.onEditBirthday, this.birthdayExists = false});
const PersonOptionSheet({
super.key,
this.onEditName,
this.onEditBirthday,
this.onEditVisibility,
this.birthdayExists = false,
this.isHidden = false,
});
final VoidCallback? onEditName;
final VoidCallback? onEditBirthday;
final VoidCallback? onEditVisibility;
final bool birthdayExists;
final bool isHidden;
@override
Widget build(BuildContext context) {
@ -28,6 +37,11 @@ class PersonOptionSheet extends StatelessWidget {
title: Text(birthdayExists ? context.t.edit_birthday : context.t.add_birthday, style: textStyle),
onTap: onEditBirthday,
),
ListTile(
leading: Icon((isHidden ? Icons.visibility : Icons.visibility_off)),
title: Text((isHidden ? "unhide_person" : 'hide_person').t(context: context), style: textStyle),
onTap: onEditVisibility,
),
],
),
),

View file

@ -11,11 +11,12 @@ class PersonApiRepository extends ApiRepository {
PersonApiRepository(this._api);
Future<Person> update(String id, {String? name, DateTime? birthday}) async {
Future<Person> update(String id, {String? name, DateTime? birthday, bool? isHidden}) async {
final birthdayUtc = birthday == null ? null : DateTime.utc(birthday.year, birthday.month, birthday.day);
final dto = PersonUpdateDto(
name: name == null ? const Optional.absent() : Optional.present(name),
birthDate: birthdayUtc == null ? const Optional.absent() : Optional.present(birthdayUtc),
isHidden: isHidden == null ? const Optional.absent() : Optional.present(isHidden),
);
final response = await checkNull(_api.updatePerson(id, dto));
return _toPerson(response);