mirror of
https://github.com/immich-app/immich
synced 2026-08-15 13:03:57 +00:00
feat: mobile add hide people button
Adding "Hide/Unhide person" button to the person option widget. Signed-off-by: Florian Amsallem <florian.amsallem@gmail.com>
This commit is contained in:
parent
652ef8a427
commit
73ac98d34c
5 changed files with 67 additions and 2 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue