import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/partner_detail_bottom_sheet.widget.dart'; import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart'; import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; import 'package:immich_mobile/providers/infrastructure/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart'; @RoutePage() class DriftPartnerDetailPage extends StatelessWidget { final PartnerUserDto partner; const DriftPartnerDetailPage({super.key, required this.partner}); @override Widget build(BuildContext context) { return ProviderScope( overrides: [ timelineServiceProvider.overrideWith((ref) { final timelineService = ref.watch(timelineFactoryProvider).remoteAssets(partner.id); ref.onDispose(timelineService.dispose); return timelineService; }), ], child: Timeline( appBar: MesmerizingSliverAppBar(title: partner.name, icon: Icons.person_outline), topSliverWidget: _InfoBox(partner: partner), topSliverWidgetHeight: 110, bottomSheet: const PartnerDetailBottomSheet(), ), ); } } class _InfoBox extends ConsumerStatefulWidget { final PartnerUserDto partner; const _InfoBox({required this.partner}); @override ConsumerState<_InfoBox> createState() => _InfoBoxState(); } class _InfoBoxState extends ConsumerState<_InfoBox> { bool _inTimeline = false; @override void initState() { super.initState(); _inTimeline = widget.partner.inTimeline; } _toggleInTimeline() async { final user = ref.read(currentUserProvider); if (user == null) { return; } try { await ref.read(partnerUsersProvider.notifier).toggleShowInTimeline(widget.partner.id, user.id); setState(() { _inTimeline = !_inTimeline; }); } catch (error, stack) { debugPrint("Failed to toggle in timeline: $error $stack"); ImmichToast.show( context: context, toastType: ToastType.error, durationInSecond: 1, msg: "Failed to toggle the timeline setting", ); return; } } @override Widget build(BuildContext context) { return SliverToBoxAdapter( child: SizedBox( height: 110, child: Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0, top: 16.0), child: Container( decoration: BoxDecoration( border: Border.all(color: context.colorScheme.onSurface.withAlpha(10), width: 1), borderRadius: const BorderRadius.all(Radius.circular(20)), gradient: LinearGradient( colors: [context.colorScheme.primary.withAlpha(10), context.colorScheme.primary.withAlpha(15)], begin: Alignment.topCenter, end: Alignment.bottomCenter, ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: ListTile( title: Text( "Show in timeline", style: context.textTheme.titleSmall?.copyWith(color: context.colorScheme.primary), ), subtitle: Text( "Show photos and videos from this user in your timeline", style: context.textTheme.bodyMedium, ), trailing: Switch(value: _inTimeline, onChanged: (_) => _toggleInTimeline()), ), ), ), ), ), ); } }