import 'package:auto_route/auto_route.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/models/search/search_curated_content.model.dart'; import 'package:immich_mobile/providers/asset_viewer/asset_people.provider.dart'; import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/utils/people.utils.dart'; import 'package:immich_mobile/widgets/search/curated_people_row.dart'; import 'package:immich_mobile/widgets/search/person_name_edit_form.dart'; class PeopleInfo extends ConsumerWidget { final Asset asset; final EdgeInsets? padding; const PeopleInfo({super.key, required this.asset, this.padding}); @override Widget build(BuildContext context, WidgetRef ref) { final peopleProvider = ref.watch(assetPeopleNotifierProvider(asset).notifier); final people = ref.watch(assetPeopleNotifierProvider(asset)).value?.where((p) => !p.isHidden); showPersonNameEditModel(String personId, String personName) { return showDialog( context: context, useRootNavigator: false, builder: (BuildContext context) { return PersonNameEditForm(personId: personId, personName: personName); }, ).then((_) { // ensure the people list is up-to-date. peopleProvider.refresh(); }); } final curatedPeople = people ?.map( (p) => SearchCuratedContent( id: p.id, label: p.name, subtitle: p.birthDate != null && p.birthDate!.isBefore(asset.fileCreatedAt) ? formatAge(p.birthDate!, asset.fileCreatedAt) : null, ), ) .toList() ?? []; return AnimatedCrossFade( crossFadeState: (people?.isEmpty ?? true) ? CrossFadeState.showFirst : CrossFadeState.showSecond, duration: const Duration(milliseconds: 200), firstChild: Container(), secondChild: Padding( padding: const EdgeInsets.only(top: 8.0), child: Column( children: [ Padding( padding: padding ?? EdgeInsets.zero, child: Align( alignment: Alignment.topLeft, child: Text( "exif_bottom_sheet_people", style: context.textTheme.labelMedium?.copyWith( color: context.textTheme.labelMedium?.color?.withAlpha(200), fontWeight: FontWeight.w600, ), ).tr(), ), ), Padding( padding: const EdgeInsets.only(top: 16.0), child: CuratedPeopleRow( padding: padding, content: curatedPeople, onTap: (content, index) { context .pushRoute(PersonResultRoute(personId: content.id, personName: content.label)) .then((_) => peopleProvider.refresh()); }, onNameTap: (person, index) => {showPersonNameEditModel(person.id, person.label)}, ), ), ], ), ), ); } }