mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-03 19:17:11 -05:00 
			
		
		
		
	* add lint rule * update usages * stragglers * use dcm * formatting * test ci * Revert "test ci" This reverts commit 8f864c4e4d3a7ec1a7e820b1afb3e801f2e82bc5. * revert whitespace change
		
			
				
	
	
		
			120 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
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';
 | 
						|
import 'package:immich_mobile/utils/debug_print.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) {
 | 
						|
      dPrint(() => "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()),
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |