import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/extensions/asyncvalue_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/presentation/widgets/album/drift_activity_text_field.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; import 'package:immich_mobile/providers/activity.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/widgets/activities/activity_tile.dart'; import 'package:immich_mobile/widgets/activities/dismissible_activity.dart'; class ActivitiesBottomSheet extends HookConsumerWidget { final DraggableScrollableController controller; final double initialChildSize; final bool scrollToBottomInitially; const ActivitiesBottomSheet({ required this.controller, this.initialChildSize = 0.35, this.scrollToBottomInitially = true, super.key, }); @override Widget build(BuildContext context, WidgetRef ref) { final album = ref.watch(currentRemoteAlbumProvider)!; final asset = ref.watch(currentAssetNotifier) as RemoteAsset?; final user = ref.watch(currentUserProvider); final activityNotifier = ref.read(albumActivityProvider(album.id, asset?.id).notifier); final activities = ref.watch(albumActivityProvider(album.id, asset?.id)); Future onAddComment(String comment) async { await activityNotifier.addComment(comment); } Widget buildActivitiesSliver() { return activities.widgetWhen( onLoading: () => const SliverToBoxAdapter(child: SizedBox.shrink()), onData: (data) { return SliverList( delegate: SliverChildBuilderDelegate((context, index) { if (index == data.length) { return const SizedBox.shrink(); } final activity = data[data.length - 1 - index]; final canDelete = activity.user.id == user?.id || album.ownerId == user?.id; return Padding( padding: const EdgeInsets.symmetric(vertical: 1), child: DismissibleActivity( activity.id, ActivityTile(activity, isBottomSheet: true), onDismiss: canDelete ? (activityId) async => await activityNotifier.removeActivity(activity.id) : null, ), ); }, childCount: data.length + 1), ); }, ); } return BaseBottomSheet( actions: [], slivers: [buildActivitiesSliver()], footer: Padding( // TODO: avoid fixed padding, use context.padding.bottom padding: const EdgeInsets.only(bottom: 32), child: Column( children: [ const Divider(indent: 16, endIndent: 16), DriftActivityTextField( isEnabled: album.isActivityEnabled, isBottomSheet: true, // likeId: likedId, onSubmit: onAddComment, ), ], ), ), controller: controller, initialChildSize: initialChildSize, minChildSize: 0.1, maxChildSize: 0.88, expand: false, shouldCloseOnMinExtent: false, resizeOnScroll: false, backgroundColor: context.isDarkTheme ? Colors.black : Colors.white, ); } }