From d605a4d976f9ca1a8b7174c8ab22f4d554ebc3e8 Mon Sep 17 00:00:00 2001 From: Thinh CP Date: Thu, 3 Oct 2024 14:03:26 +0700 Subject: [PATCH] feat: pre-rsvp event detail remake --- .../event_detail_base_page.dart | 17 +- .../views/post_guest_event_detail_view.dart | 20 +- .../views/pre_guest_event_detail_view.dart | 75 ++++- ...out.dart => guest_event_detail_about.dart} | 27 +- .../widgets/guest_event_detail_appbar.dart | 14 +- .../guest_event_detail_buy_button.dart | 9 +- .../guest_event_detail_general_info.dart | 205 ++++++++++-- .../widgets/guest_event_detail_hosts.dart | 259 ++++++++------- .../widgets/guest_event_detail_photos.dart | 1 + ....dart => guest_event_detail_programs.dart} | 4 +- ...guest_event_detail_rsvp_status_button.dart | 11 +- ...dart => guest_event_detail_subevents.dart} | 4 +- .../widgets/guest_event_hosts_avatars.dart | 50 +++ .../post_guest_event_detail_hosts.dart | 312 ------------------ .../post_guest_event_detail_photos.dart | 122 ------- 15 files changed, 505 insertions(+), 625 deletions(-) rename lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/{post_guest_event_detail_about.dart => guest_event_detail_about.dart} (79%) rename lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/{post_guest_event_detail_programs.dart => guest_event_detail_programs.dart} (98%) rename lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/{post_guest_event_detail_subevents.dart => guest_event_detail_subevents.dart} (97%) create mode 100644 lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_hosts_avatars.dart delete mode 100644 lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_hosts.dart delete mode 100644 lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_photos.dart diff --git a/lib/core/presentation/pages/event/event_detail_page/event_detail_base_page.dart b/lib/core/presentation/pages/event/event_detail_page/event_detail_base_page.dart index f821dd6a6..92a3ff483 100644 --- a/lib/core/presentation/pages/event/event_detail_page/event_detail_base_page.dart +++ b/lib/core/presentation/pages/event/event_detail_page/event_detail_base_page.dart @@ -98,7 +98,6 @@ class _EventDetailBasePageView extends StatelessWidget { // ).canShowFeature; return const HostEventDetailView(); } - if (!isAttending) return const PreGuestEventDetailView(); return isAttending ? MultiBlocProvider( providers: [ @@ -127,7 +126,21 @@ class _EventDetailBasePageView extends StatelessWidget { ], child: const PostGuestEventDetailView(), ) - : const PreGuestEventDetailView(); + : MultiBlocProvider( + providers: [ + BlocProvider( + create: (context) => GetSubEventsByCalendarBloc( + parentEventId: event.id ?? '', + )..add( + GetSubEventsByCalendarEvent.fetch( + from: event.start?.toUtc(), + to: event.end?.toUtc(), + ), + ), + ), + ], + child: const PreGuestEventDetailView(), + ); }, ), ); diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/views/post_guest_event_detail_view.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/views/post_guest_event_detail_view.dart index 5669671cf..d5d789d5b 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/views/post_guest_event_detail_view.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/views/post_guest_event_detail_view.dart @@ -2,14 +2,14 @@ import 'package:app/core/application/event/get_event_detail_bloc/get_event_detai import 'package:app/core/application/event/get_sub_events_by_calendar_bloc/get_sub_events_by_calendar_bloc.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_basic_info/guest_event_detail_basic_info.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_dashboard.dart'; -import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_about.dart'; -import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_programs.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_about.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_hosts.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_photos.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_programs.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_social_lounge_button.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_poap_offers.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_animated_app_bar.dart'; -import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_hosts.dart'; -import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_photos.dart'; -import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_subevents.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_subevents.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_virtual_link.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_location.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/widgets/create_sub_side_event_button.dart'; @@ -130,7 +130,7 @@ class PostGuestEventDetailView extends StatelessWidget { ), ), ), - child: PostGuestEventDetailPrograms(event: event), + child: GuestEventDetailPrograms(event: event), ), if (event.subeventParent == null && subEvents.isNotEmpty == true) Container( @@ -145,7 +145,7 @@ class PostGuestEventDetailView extends StatelessWidget { ), ), ), - child: PostGuestEventDetailSubEvents( + child: GuestEventDetailSubEvents( event: event, subEvents: subEvents, ), @@ -164,7 +164,7 @@ class PostGuestEventDetailView extends StatelessWidget { ), ), ), - child: PostGuestEventDetailPhotos( + child: GuestEventDetailPhotos( event: event, showTitle: false, ), @@ -181,7 +181,7 @@ class PostGuestEventDetailView extends StatelessWidget { ), ), ), - child: PostGuestEventDetailHosts( + child: GuestEventDetailHosts( event: event, ), ), @@ -200,7 +200,7 @@ class PostGuestEventDetailView extends StatelessWidget { right: Spacing.smMedium, top: Spacing.medium, ), - child: PostGuestEventDetailAbout(event: event), + child: GuestEventDetailAbout(event: event), ), ]; return Scaffold( diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/views/pre_guest_event_detail_view.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/views/pre_guest_event_detail_view.dart index 66d6f27eb..594c26989 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/views/pre_guest_event_detail_view.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/views/pre_guest_event_detail_view.dart @@ -1,5 +1,6 @@ import 'package:app/core/application/auth/auth_bloc.dart'; import 'package:app/core/application/event/get_event_detail_bloc/get_event_detail_bloc.dart'; +import 'package:app/core/application/event/get_sub_events_by_calendar_bloc/get_sub_events_by_calendar_bloc.dart'; import 'package:app/core/application/report/report_bloc/report_bloc.dart'; import 'package:app/core/domain/event/entities/event.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_appbar.dart'; @@ -10,6 +11,8 @@ import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_ import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_rsvp_status/guest_event_detail_rsvp_status_button.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_location.dart'; import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_more_actions.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_programs.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_subevents.dart'; import 'package:app/core/presentation/widgets/back_button_widget.dart'; import 'package:app/core/presentation/widgets/common/list/empty_list_widget.dart'; import 'package:app/core/presentation/widgets/loading_widget.dart'; @@ -46,6 +49,9 @@ class PreGuestEventDetailViewState extends State { authenticated: (session) => session.userId, orElse: () => '', ); + final getSubEventsBloc = context.watch(); + final subEvents = getSubEventsBloc.state.events; + return Scaffold( backgroundColor: colorScheme.primary, body: BlocBuilder( @@ -79,11 +85,62 @@ class PreGuestEventDetailViewState extends State { padding: EdgeInsets.symmetric(horizontal: Spacing.smMedium), child: GuestEventLocation(event: event), ), - if ((event.newNewPhotosExpanded ?? []).isNotEmpty) - GuestEventDetailPhotos(event: event), - GuestEventDetailHosts(event: event), + if ((event.newNewPhotosExpanded ?? []).isNotEmpty && + (event.newNewPhotosExpanded ?? []).length > 1) + GuestEventDetailPhotos( + event: event, + showTitle: false, + ), + if (event.sessions?.isNotEmpty == true) + Container( + padding: EdgeInsets.only( + top: Spacing.medium, + ), + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: colorScheme.outline, + width: 0.5.w, + ), + ), + ), + child: GuestEventDetailPrograms(event: event), + ), + if (event.subeventParent == null && subEvents.isNotEmpty == true) + Container( + padding: EdgeInsets.only( + top: Spacing.medium, + ), + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: colorScheme.outline, + width: 0.5.w, + ), + ), + ), + child: GuestEventDetailSubEvents( + event: event, + subEvents: subEvents, + ), + ), + Container( + padding: EdgeInsets.only( + top: Spacing.medium, + ), + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: colorScheme.outline, + width: 0.5.w, + ), + ), + ), + child: GuestEventDetailHosts(event: event), + ), ]; return SafeArea( + top: false, child: Stack( children: [ CustomScrollView( @@ -104,18 +161,20 @@ class PreGuestEventDetailViewState extends State { return widgets[index]; }, separatorBuilder: (context, index) => SizedBox( - height: Spacing.smMedium * 2, + height: Spacing.medium, ), ), SliverToBoxAdapter( - child: SizedBox(height: 84.w), + child: SizedBox(height: 100.w), ), ], ), if (coverPhoto.isNotEmpty) - _FloatingButtonsBar( - scrollController: _scrollController, - event: event, + SafeArea( + child: _FloatingButtonsBar( + scrollController: _scrollController, + event: event, + ), ), if (!isOwnEvent) Align( diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_about.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_about.dart similarity index 79% rename from lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_about.dart rename to lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_about.dart index 84bb5442a..31d6756da 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_about.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_about.dart @@ -7,13 +7,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:url_launcher/url_launcher.dart'; -class PostGuestEventDetailAbout extends StatelessWidget { - const PostGuestEventDetailAbout({ +class GuestEventDetailAbout extends StatelessWidget { + const GuestEventDetailAbout({ super.key, required this.event, + this.showTitle = true, }); final Event event; + final bool showTitle; @override Widget build(BuildContext context) { @@ -21,17 +23,20 @@ class PostGuestEventDetailAbout extends StatelessWidget { final colorScheme = Theme.of(context).colorScheme; return Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ - Text( - t.event.about, - style: Typo.extraMedium.copyWith( - color: colorScheme.onPrimary, - fontWeight: FontWeight.w600, + if (showTitle) ...[ + Text( + t.event.about, + style: Typo.extraMedium.copyWith( + color: colorScheme.onPrimary, + fontWeight: FontWeight.w600, + ), ), - ), - SizedBox( - height: Spacing.xSmall, - ), + SizedBox( + height: Spacing.xSmall, + ), + ], MarkdownBody( data: event.description ?? '', styleSheet: MarkdownStyleSheet.fromTheme(Theme.of(context)).copyWith( diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_appbar.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_appbar.dart index d4af69641..8546bc492 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_appbar.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_appbar.dart @@ -30,6 +30,11 @@ class GuestEventDetailAppBar extends StatefulWidget { class _GuestEventDetailAppBarState extends State { bool _isSliverAppBarCollapsed = false; + double get bannerHeight { + final isIpad = DeviceUtils.isIpad(); + return isIpad ? 200.h : 325.w; + } + DbFile? get cover { if (widget.event.newNewPhotosExpanded == null || widget.event.newNewPhotosExpanded!.isEmpty) { @@ -65,14 +70,12 @@ class _GuestEventDetailAppBarState extends State { ); } - final isIpad = DeviceUtils.isIpad(); return SliverAppBar( pinned: true, stretch: true, - floating: true, leading: const SizedBox.shrink(), collapsedHeight: kToolbarHeight, - expandedHeight: isIpad ? 280.h : 188.h, + expandedHeight: bannerHeight, centerTitle: true, title: AnimatedOpacity( duration: const Duration(milliseconds: 300), @@ -88,6 +91,7 @@ class _GuestEventDetailAppBarState extends State { expandedTitleScale: 1, collapseMode: CollapseMode.pin, background: _EventDetailCover( + height: bannerHeight, event: widget.event, ), ), @@ -97,14 +101,16 @@ class _GuestEventDetailAppBarState extends State { class _EventDetailCover extends StatelessWidget { final Event event; + final double height; const _EventDetailCover({ required this.event, + required this.height, }); @override Widget build(BuildContext context) { return SizedBox( - height: 188.w, + height: height, child: Stack( children: [ Positioned.fill( diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_buy_button.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_buy_button.dart index b5fded3d6..9bc30213d 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_buy_button.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_buy_button.dart @@ -118,7 +118,14 @@ class _GuestEventDetailBuyButtonView extends StatelessWidget { state is EventBuyTicketsPrerequisiteCheckStateChecking; return SafeArea( child: Container( - color: colorScheme.primary, + decoration: BoxDecoration( + color: colorScheme.primary, + border: Border( + top: BorderSide( + color: colorScheme.outline, + ), + ), + ), padding: EdgeInsets.symmetric( vertical: Spacing.smMedium, horizontal: Spacing.smMedium, diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_general_info.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_general_info.dart index b44f8a64c..4e4fc59a0 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_general_info.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_general_info.dart @@ -1,11 +1,18 @@ import 'package:app/core/domain/event/entities/event.dart'; -import 'package:app/core/presentation/pages/farcaster/widgets/cast_on_farcaster_button/cast_on_farcaster_button.dart'; -import 'package:app/core/presentation/widgets/common/readmore/readmore_widget.dart'; -import 'package:app/core/utils/event_utils.dart'; -import 'package:app/gen/fonts.gen.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_about.dart'; +import 'package:app/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_hosts_avatars.dart'; +import 'package:app/core/presentation/widgets/image_placeholder_widget.dart'; +import 'package:app/core/presentation/widgets/lemon_network_image/lemon_network_image.dart'; +import 'package:app/core/presentation/widgets/theme_svg_icon_widget.dart'; +import 'package:app/core/utils/date_format_utils.dart'; +import 'package:app/gen/assets.gen.dart'; +import 'package:app/router/app_router.gr.dart'; +import 'package:app/theme/color.dart'; import 'package:app/theme/spacing.dart'; import 'package:app/theme/typo.dart'; +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; class GuestEventDetailGeneralInfo extends StatelessWidget { const GuestEventDetailGeneralInfo({ @@ -18,46 +25,190 @@ class GuestEventDetailGeneralInfo extends StatelessWidget { @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; - final (formattedDate, formattedTime) = - EventUtils.getFormattedEventDateAndTime(event); + return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - Text( - event.title ?? '', - style: Typo.extraLarge.copyWith( - fontFamily: FontFamily.nohemiVariable, - color: colorScheme.onPrimary, + InkWell( + onTap: () { + AutoRouter.of(context).push( + ProfileRoute( + userId: event.hostExpanded?.userId ?? '', + ), + ); + }, + child: Row( + children: [ + LemonNetworkImage( + imageUrl: event.hostExpanded?.imageAvatar ?? '', + width: 18.w, + height: 18.w, + borderRadius: BorderRadius.circular(18.w), + placeholder: ImagePlaceholder.avatarPlaceholder(), + ), + SizedBox(width: Spacing.extraSmall), + Text( + (event.hostExpanded?.name ?? '').toUpperCase(), + style: Typo.medium.copyWith( + color: colorScheme.onSecondary, + ), + ), + SizedBox(width: Spacing.superExtraSmall), + ThemeSvgIcon( + color: colorScheme.onSecondary, + builder: (filter) => Assets.icons.icArrowRight.svg( + colorFilter: filter, + ), + ), + ], ), ), - SizedBox(height: Spacing.superExtraSmall / 2), - Text( - formattedDate, - style: Typo.medium.copyWith( - color: colorScheme.onSurfaceVariant, - ), + SizedBox( + height: Spacing.superExtraSmall, ), Text( - formattedTime, - style: Typo.medium.copyWith( - color: colorScheme.onSurfaceVariant, + event.title ?? '', + style: Typo.superLarge.copyWith( + fontWeight: FontWeight.w600, + color: colorScheme.onPrimary, ), ), + SizedBox(height: Spacing.medium), + _InfoCard(event: event), if (event.description != null && event.description!.isNotEmpty) ...[ SizedBox( height: Spacing.smMedium, ), - ReadMoreWidget( - body: event.description ?? '', - isMarkdown: true, + GuestEventDetailAbout( + event: event, + showTitle: false, ), ], - SizedBox( - height: Spacing.smMedium, - ), - CastOnFarcasterButton(event: event), + // CastOnFarcasterButton(event: event), ], ); } } + +class _InfoCard extends StatelessWidget { + final Event event; + const _InfoCard({ + required this.event, + }); + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final formattedStartDate = DateFormatUtils.dateWithTimezone( + dateTime: event.start ?? DateTime.now(), + timezone: event.timezone ?? '', + pattern: 'MMM d, hh:mm a', + ); + final formattedEndDate = DateFormatUtils.dateWithTimezone( + dateTime: event.end ?? DateTime.now(), + timezone: event.timezone ?? '', + pattern: 'MMM, d, hh:mm a', + ); + final wigets = [ + Padding( + padding: EdgeInsets.all( + Spacing.small, + ), + child: Row( + children: [ + ThemeSvgIcon( + color: colorScheme.onSecondary, + builder: (filter) => Assets.icons.icCalendar.svg( + colorFilter: filter, + ), + ), + SizedBox(width: Spacing.small), + Flexible( + child: Text( + '$formattedStartDate - $formattedEndDate', + style: Typo.medium.copyWith( + color: colorScheme.onPrimary, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ), + if (event.address != null) + Padding( + padding: EdgeInsets.all(Spacing.small), + child: Row( + children: [ + ThemeSvgIcon( + color: colorScheme.onSecondary, + builder: (filter) => Assets.icons.icLocationPin.svg( + colorFilter: filter, + ), + ), + SizedBox(width: Spacing.small), + Flexible( + child: Text( + event.address?.title ?? '', + style: Typo.medium.copyWith( + color: colorScheme.onPrimary, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsets.all(Spacing.small), + child: Row( + children: [ + ThemeSvgIcon( + color: colorScheme.onSecondary, + builder: (filter) => Assets.icons.icHostOutline.svg( + colorFilter: filter, + ), + ), + SizedBox(width: Spacing.small), + Expanded( + child: Text( + '${(event.hostExpanded?.name ?? '')} ${event.cohostsExpanded?.isNotEmpty == true ? ' +${event.cohostsExpanded?.length}' : ''}' + .toUpperCase(), + style: Typo.medium.copyWith( + color: colorScheme.onPrimary, + fontWeight: FontWeight.w600, + ), + ), + ), + GuestEventHostsAvatars(event: event), + ], + ), + ), + ]; + + return Container( + width: double.infinity, + decoration: BoxDecoration( + color: LemonColor.atomicBlack, + borderRadius: BorderRadius.circular(LemonRadius.medium), + border: Border.all( + color: colorScheme.outline, + width: 1.w, + ), + ), + child: ListView.separated( + padding: EdgeInsets.zero, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) => wigets[index], + separatorBuilder: (context, index) => Divider( + height: 1.w, + thickness: 1.w, + color: colorScheme.outline, + ), + itemCount: wigets.length, + ), + ); + } +} diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_hosts.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_hosts.dart index 02c6ff5a1..e149efdac 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_hosts.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_hosts.dart @@ -3,21 +3,25 @@ import 'package:app/core/application/profile/user_follows_bloc/user_follows_bloc import 'package:app/core/domain/event/entities/event.dart'; import 'package:app/core/domain/user/entities/user.dart'; import 'package:app/core/domain/user/user_repository.dart'; +import 'package:app/core/presentation/widgets/future_loading_dialog.dart'; import 'package:app/core/presentation/widgets/image_placeholder_widget.dart'; +import 'package:app/core/presentation/widgets/lemon_network_image/lemon_network_image.dart'; import 'package:app/core/presentation/widgets/loading_widget.dart'; import 'package:app/core/presentation/widgets/theme_svg_icon_widget.dart'; +import 'package:app/core/service/matrix/matrix_service.dart'; import 'package:app/core/utils/event_utils.dart'; import 'package:app/core/utils/image_utils.dart'; +import 'package:app/core/utils/matrix_utils.dart'; import 'package:app/core/utils/string_utils.dart'; import 'package:app/gen/assets.gen.dart'; import 'package:app/i18n/i18n.g.dart'; import 'package:app/injection/register_module.dart'; import 'package:app/router/app_router.gr.dart'; +import 'package:app/theme/color.dart'; import 'package:app/theme/sizing.dart'; import 'package:app/theme/spacing.dart'; import 'package:app/theme/typo.dart'; import 'package:auto_route/auto_route.dart'; -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -59,7 +63,7 @@ class GuestEventDetailHosts extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: Spacing.smMedium), child: Text( StringUtils.capitalize(t.common.host(n: 2)), - style: Typo.mediumPlus.copyWith( + style: Typo.extraMedium.copyWith( fontWeight: FontWeight.w600, color: colorScheme.onPrimary, ), @@ -68,24 +72,22 @@ class GuestEventDetailHosts extends StatelessWidget { SizedBox( height: Spacing.xSmall, ), - SizedBox( - height: isAttending ? 178.w : 144.w, - child: ListView.separated( - padding: EdgeInsets.symmetric(horizontal: Spacing.smMedium), - scrollDirection: Axis.horizontal, - separatorBuilder: (context, index) => SizedBox( - width: Spacing.extraSmall, - ), - itemCount: hosts.length, - itemBuilder: (context, index) { - final host = hosts[index]; - return _EventHostItem( - host: host, - colorScheme: colorScheme, - isAttending: isAttending, - ); - }, + ListView.separated( + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: Spacing.smMedium), + shrinkWrap: true, + separatorBuilder: (context, index) => SizedBox( + height: Spacing.xSmall, ), + itemCount: hosts.length, + itemBuilder: (context, index) { + final host = hosts[index]; + return _EventHostItem( + host: host, + colorScheme: colorScheme, + isAttending: isAttending, + ); + }, ), ], ); @@ -117,115 +119,123 @@ class _EventHostItem extends StatelessWidget { .navigate(ProfileRoute(userId: host?.userId ?? '')); }, child: Container( - width: 130.w, - decoration: ShapeDecoration( - color: colorScheme.onPrimary.withOpacity(0.06), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15.r), + padding: EdgeInsets.all(Spacing.small), + decoration: BoxDecoration( + color: LemonColor.atomicBlack, + borderRadius: BorderRadius.circular(LemonRadius.medium), + border: Border.all( + color: colorScheme.outline, + width: 0.5.w, ), ), - child: ClipRRect( - borderRadius: BorderRadius.circular(15.r), - child: Stack( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: Spacing.small, - horizontal: Spacing.extraSmall, - ), - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(60.w), - ), - width: 60.w, - height: 60.w, - child: ClipRRect( - borderRadius: BorderRadius.circular(60.r), - child: CachedNetworkImage( - fit: BoxFit.cover, - placeholder: (_, __) => - ImagePlaceholder.defaultPlaceholder(), - errorWidget: (_, __, ___) => - ImagePlaceholder.defaultPlaceholder(), - imageUrl: ImageUtils.generateUrl( - file: - host?.newPhotosExpanded?.isNotEmpty == true - ? host?.newPhotosExpanded?.firstOrNull - : null, - imageConfig: ImageConfig.eventPhoto, - ), + child: Row( + children: [ + LemonNetworkImage( + width: Sizing.medium, + height: Sizing.medium, + borderRadius: BorderRadius.circular(Sizing.medium), + border: Border.all( + color: colorScheme.outline, + width: 0.5.w, + ), + fit: BoxFit.cover, + placeholder: ImagePlaceholder.avatarPlaceholder(), + imageUrl: ImageUtils.generateUrl( + file: host?.newPhotosExpanded?.isNotEmpty == true + ? host?.newPhotosExpanded?.firstOrNull + : null, + imageConfig: ImageConfig.eventPhoto, + ), + ), + SizedBox(width: Spacing.small), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + host?.displayName ?? host?.name ?? '', + style: Typo.medium.copyWith( + color: colorScheme.onPrimary, + fontWeight: FontWeight.w600, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + SizedBox(height: 3.w), + if (host?.username?.isNotEmpty == true) + Text( + '@${host?.username}', + style: Typo.small.copyWith( + color: colorScheme.onSecondary, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + if (isAttending) ...[ + SizedBox(height: Spacing.xSmall), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _FollowButton(host: host), + SizedBox(width: Spacing.superExtraSmall), + InkWell( + onTap: () async { + final response = await showFutureLoadingDialog( + context: context, + future: () async { + return getIt() + .client + .startDirectChat( + LemonadeMatrixUtils.generateMatrixUserId( + lemonadeMatrixLocalpart: + host?.matrixLocalpart ?? '', + ), + ); + }, + ); + if (response.result?.isNotEmpty == true) { + AutoRouter.of(context).push( + ChatRoute( + roomId: response.result!, ), - ), + ); + } + }, + child: Container( + width: Sizing.medium, + height: Sizing.medium, + padding: EdgeInsets.symmetric( + horizontal: Spacing.superExtraSmall, ), - SizedBox(height: Spacing.xSmall), - Text( - host?.displayName ?? host?.name ?? '', - style: Typo.small.copyWith( - color: colorScheme.onPrimary, + decoration: BoxDecoration( + color: LemonColor.chineseBlack, + borderRadius: BorderRadius.circular( + Sizing.medium, + ), + border: Border.all( + color: colorScheme.outline, + width: 0.5.w, ), - maxLines: 1, - overflow: TextOverflow.ellipsis, ), - Text( - host?.jobTitle ?? '', - style: Typo.small.copyWith( + child: Center( + child: ThemeSvgIcon( color: colorScheme.onSecondary, + builder: (filter) => Assets.icons.icChatBubble.svg( + colorFilter: filter, + width: Sizing.xSmall, + height: Sizing.xSmall, + ), ), - maxLines: 1, - overflow: TextOverflow.ellipsis, ), - if (isAttending) ...[ - SizedBox(height: Spacing.xSmall), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _FollowButton(host: host), - SizedBox(width: Spacing.superExtraSmall), - InkWell( - onTap: () { - AutoRouter.of(context) - .navigate(const ChatListRoute()); - }, - child: Container( - height: 30.w, - padding: EdgeInsets.symmetric( - horizontal: Spacing.superExtraSmall, - ), - decoration: ShapeDecoration( - color: - colorScheme.onPrimary.withOpacity(0.06), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - LemonRadius.xSmall, - ), - ), - ), - child: Center( - child: ThemeSvgIcon( - color: colorScheme.onSecondary, - builder: (filter) => - Assets.icons.icChatBubble.svg( - colorFilter: filter, - width: Sizing.xSmall, - height: Sizing.xSmall, - ), - ), - ), - ), - ), - ], - ), - ], - ], + ), ), - ), + ], ), ], - ), + ], ), ), ), @@ -243,16 +253,18 @@ class _FollowButton extends StatelessWidget { Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; return Container( - height: 30.w, + height: Sizing.medium, padding: EdgeInsets.symmetric( horizontal: Spacing.xSmall, ), - decoration: ShapeDecoration( - color: colorScheme.onPrimary.withOpacity(0.06), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - LemonRadius.xSmall, - ), + decoration: BoxDecoration( + color: LemonColor.chineseBlack, + borderRadius: BorderRadius.circular( + LemonRadius.normal, + ), + border: Border.all( + color: colorScheme.outline, + width: 0.5.w, ), ), child: BlocBuilder( @@ -288,6 +300,7 @@ class _FollowButton extends StatelessWidget { following ? t.common.followed : t.common.actions.follow, style: Typo.small.copyWith( color: colorScheme.onSecondary, + fontWeight: FontWeight.w600, ), ), ), diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_photos.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_photos.dart index 8b5d6b89d..8fd1a3550 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_photos.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_photos.dart @@ -23,6 +23,7 @@ class GuestEventDetailPhotos extends StatelessWidget { List get photoUrls { return (event.newNewPhotosExpanded ?? []) + .skip(1) .map( (item) => ImageUtils.generateUrl( file: item, diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_programs.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_programs.dart similarity index 98% rename from lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_programs.dart rename to lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_programs.dart index 990526c49..13304731e 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_programs.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_programs.dart @@ -19,9 +19,9 @@ import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -class PostGuestEventDetailPrograms extends StatelessWidget { +class GuestEventDetailPrograms extends StatelessWidget { final Event event; - const PostGuestEventDetailPrograms({ + const GuestEventDetailPrograms({ super.key, required this.event, }); diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_rsvp_status/guest_event_detail_rsvp_status_button.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_rsvp_status/guest_event_detail_rsvp_status_button.dart index a885a15dd..2214f315d 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_rsvp_status/guest_event_detail_rsvp_status_button.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_rsvp_status/guest_event_detail_rsvp_status_button.dart @@ -14,6 +14,7 @@ import 'package:app/theme/spacing.dart'; import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; class GuestEventDetailRSVPStatusButton extends StatelessWidget { final Event event; @@ -106,7 +107,15 @@ class GuestEventDetailRSVPStatusButton extends StatelessWidget { return SafeArea( child: Container( - color: colorScheme.primary, + decoration: BoxDecoration( + color: colorScheme.primary, + border: Border( + top: BorderSide( + color: colorScheme.outline, + width: 1.w, + ), + ), + ), padding: EdgeInsets.symmetric( vertical: Spacing.smMedium, horizontal: Spacing.smMedium, diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_subevents.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_subevents.dart similarity index 97% rename from lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_subevents.dart rename to lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_subevents.dart index ef19710bf..1e05a5f84 100644 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_subevents.dart +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_detail_subevents.dart @@ -12,10 +12,10 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -class PostGuestEventDetailSubEvents extends StatelessWidget { +class GuestEventDetailSubEvents extends StatelessWidget { final Event event; final List subEvents; - const PostGuestEventDetailSubEvents({ + const GuestEventDetailSubEvents({ super.key, required this.event, required this.subEvents, diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_hosts_avatars.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_hosts_avatars.dart new file mode 100644 index 000000000..b5ba62a3f --- /dev/null +++ b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/guest_event_hosts_avatars.dart @@ -0,0 +1,50 @@ +import 'package:app/core/domain/event/entities/event.dart'; +import 'package:app/core/presentation/widgets/image_placeholder_widget.dart'; +import 'package:app/core/presentation/widgets/lemon_network_image/lemon_network_image.dart'; +import 'package:app/theme/sizing.dart'; +import 'package:flutter/material.dart'; + +class GuestEventHostsAvatars extends StatelessWidget { + final Event event; + const GuestEventHostsAvatars({ + super.key, + required this.event, + }); + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final hosts = [ + ...event.cohostsExpanded ?? [], + event.hostExpanded, + ]; + return SizedBox( + width: (1 + 1 / 2 * (hosts.length - 1)) * Sizing.small, + height: Sizing.small, + child: Stack( + children: hosts.asMap().entries.map((entry) { + final url = entry.value?.imageAvatar; + return Positioned( + right: entry.key * 12, + child: Container( + width: Sizing.small, + height: Sizing.small, + decoration: BoxDecoration( + color: colorScheme.primary, + border: Border.all(color: colorScheme.outline), + borderRadius: BorderRadius.circular(Sizing.small), + ), + child: LemonNetworkImage( + width: Sizing.small, + height: Sizing.small, + borderRadius: BorderRadius.circular(Sizing.small), + imageUrl: url ?? '', + placeholder: ImagePlaceholder.avatarPlaceholder(), + ), + ), + ); + }).toList(), + ), + ); + } +} diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_hosts.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_hosts.dart deleted file mode 100644 index b066a740e..000000000 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_hosts.dart +++ /dev/null @@ -1,312 +0,0 @@ -import 'package:app/core/application/auth/auth_bloc.dart'; -import 'package:app/core/application/profile/user_follows_bloc/user_follows_bloc.dart'; -import 'package:app/core/domain/event/entities/event.dart'; -import 'package:app/core/domain/user/entities/user.dart'; -import 'package:app/core/domain/user/user_repository.dart'; -import 'package:app/core/presentation/widgets/future_loading_dialog.dart'; -import 'package:app/core/presentation/widgets/image_placeholder_widget.dart'; -import 'package:app/core/presentation/widgets/lemon_network_image/lemon_network_image.dart'; -import 'package:app/core/presentation/widgets/loading_widget.dart'; -import 'package:app/core/presentation/widgets/theme_svg_icon_widget.dart'; -import 'package:app/core/service/matrix/matrix_service.dart'; -import 'package:app/core/utils/event_utils.dart'; -import 'package:app/core/utils/image_utils.dart'; -import 'package:app/core/utils/matrix_utils.dart'; -import 'package:app/core/utils/string_utils.dart'; -import 'package:app/gen/assets.gen.dart'; -import 'package:app/i18n/i18n.g.dart'; -import 'package:app/injection/register_module.dart'; -import 'package:app/router/app_router.gr.dart'; -import 'package:app/theme/color.dart'; -import 'package:app/theme/sizing.dart'; -import 'package:app/theme/spacing.dart'; -import 'package:app/theme/typo.dart'; -import 'package:auto_route/auto_route.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; - -class PostGuestEventDetailHosts extends StatelessWidget { - const PostGuestEventDetailHosts({ - super.key, - required this.event, - }); - - final Event event; - - List get hosts { - final coHosts = event.cohostsExpanded ?? []; - return [event.hostExpanded, ...coHosts] - .where((item) => item != null) - .toList(); - } - - @override - Widget build(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - final t = Translations.of(context); - final userId = context.read().state.maybeWhen( - orElse: () => '', - authenticated: (session) => session.userId, - ); - final isAttending = EventUtils.isAttending(event: event, userId: userId); - - if (hosts.isEmpty) { - return const SizedBox.shrink(); - } - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: Spacing.smMedium), - child: Text( - StringUtils.capitalize(t.common.host(n: 2)), - style: Typo.extraMedium.copyWith( - fontWeight: FontWeight.w600, - color: colorScheme.onPrimary, - ), - ), - ), - SizedBox( - height: Spacing.xSmall, - ), - ListView.separated( - physics: const NeverScrollableScrollPhysics(), - padding: EdgeInsets.symmetric(horizontal: Spacing.smMedium), - shrinkWrap: true, - separatorBuilder: (context, index) => SizedBox( - height: Spacing.xSmall, - ), - itemCount: hosts.length, - itemBuilder: (context, index) { - final host = hosts[index]; - return _EventHostItem( - host: host, - colorScheme: colorScheme, - isAttending: isAttending, - ); - }, - ), - ], - ); - } -} - -class _EventHostItem extends StatelessWidget { - const _EventHostItem({ - required this.host, - required this.colorScheme, - this.isAttending = false, - }); - - final User? host; - final ColorScheme colorScheme; - final bool isAttending; - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (context) => UserFollowsBloc( - getIt(), - )..add( - UserFollowsEvent.fetch(followee: host?.userId ?? ''), - ), - child: InkWell( - onTap: () { - AutoRouter.of(context) - .navigate(ProfileRoute(userId: host?.userId ?? '')); - }, - child: Container( - padding: EdgeInsets.all(Spacing.small), - decoration: BoxDecoration( - color: LemonColor.atomicBlack, - borderRadius: BorderRadius.circular(LemonRadius.medium), - border: Border.all( - color: colorScheme.outline, - width: 0.5.w, - ), - ), - child: Row( - children: [ - LemonNetworkImage( - width: Sizing.medium, - height: Sizing.medium, - borderRadius: BorderRadius.circular(Sizing.medium), - border: Border.all( - color: colorScheme.outline, - width: 0.5.w, - ), - fit: BoxFit.cover, - placeholder: ImagePlaceholder.avatarPlaceholder(), - imageUrl: ImageUtils.generateUrl( - file: host?.newPhotosExpanded?.isNotEmpty == true - ? host?.newPhotosExpanded?.firstOrNull - : null, - imageConfig: ImageConfig.eventPhoto, - ), - ), - SizedBox(width: Spacing.small), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - host?.displayName ?? host?.name ?? '', - style: Typo.medium.copyWith( - color: colorScheme.onPrimary, - fontWeight: FontWeight.w600, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - SizedBox(height: 3.w), - if (host?.username?.isNotEmpty == true) - Text( - '@${host?.username}', - style: Typo.small.copyWith( - color: colorScheme.onSecondary, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ), - ), - if (isAttending) ...[ - SizedBox(height: Spacing.xSmall), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _FollowButton(host: host), - SizedBox(width: Spacing.superExtraSmall), - InkWell( - onTap: () async { - final response = await showFutureLoadingDialog( - context: context, - future: () async { - return getIt() - .client - .startDirectChat( - LemonadeMatrixUtils.generateMatrixUserId( - lemonadeMatrixLocalpart: - host?.matrixLocalpart ?? '', - ), - ); - }, - ); - if (response.result?.isNotEmpty == true) { - AutoRouter.of(context).push( - ChatRoute( - roomId: response.result!, - ), - ); - } - }, - child: Container( - width: Sizing.medium, - height: Sizing.medium, - padding: EdgeInsets.symmetric( - horizontal: Spacing.superExtraSmall, - ), - decoration: BoxDecoration( - color: LemonColor.chineseBlack, - borderRadius: BorderRadius.circular( - Sizing.medium, - ), - border: Border.all( - color: colorScheme.outline, - width: 0.5.w, - ), - ), - child: Center( - child: ThemeSvgIcon( - color: colorScheme.onSecondary, - builder: (filter) => Assets.icons.icChatBubble.svg( - colorFilter: filter, - width: Sizing.xSmall, - height: Sizing.xSmall, - ), - ), - ), - ), - ), - ], - ), - ], - ], - ), - ), - ), - ); - } -} - -class _FollowButton extends StatelessWidget { - final User? host; - const _FollowButton({ - this.host, - }); - - @override - Widget build(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - return Container( - height: Sizing.medium, - padding: EdgeInsets.symmetric( - horizontal: Spacing.xSmall, - ), - decoration: BoxDecoration( - color: LemonColor.chineseBlack, - borderRadius: BorderRadius.circular( - LemonRadius.normal, - ), - border: Border.all( - color: colorScheme.outline, - width: 0.5.w, - ), - ), - child: BlocBuilder( - builder: (context, state) { - final following = state.maybeWhen( - orElse: () => false, - fetched: (userFollows) => userFollows.isNotEmpty, - ); - final isLoading = state.maybeWhen( - orElse: () => false, - loading: () => true, - ); - - return InkWell( - onTap: () { - if (isLoading) { - return; - } - if (following) { - context.read().add( - UserFollowsEvent.unfollow(followee: host?.userId ?? ''), - ); - } else { - context.read().add( - UserFollowsEvent.follow(followee: host?.userId ?? ''), - ); - } - }, - child: Center( - child: isLoading - ? Loading.defaultLoading(context) - : Text( - following ? t.common.followed : t.common.actions.follow, - style: Typo.small.copyWith( - color: colorScheme.onSecondary, - fontWeight: FontWeight.w600, - ), - ), - ), - ); - }, - ), - ); - } -} diff --git a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_photos.dart b/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_photos.dart deleted file mode 100644 index fd5ebc583..000000000 --- a/lib/core/presentation/pages/event/event_detail_page/guest_event_detail_page/widgets/post_guest_event_detail_photos.dart +++ /dev/null @@ -1,122 +0,0 @@ -import 'package:app/core/domain/event/entities/event.dart'; -import 'package:app/core/presentation/widgets/image_placeholder_widget.dart'; -import 'package:app/core/utils/image_utils.dart'; -import 'package:app/core/utils/string_utils.dart'; -import 'package:app/i18n/i18n.g.dart'; -import 'package:app/router/app_router.gr.dart'; -import 'package:app/theme/spacing.dart'; -import 'package:app/theme/typo.dart'; -import 'package:auto_route/auto_route.dart'; -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; - -class PostGuestEventDetailPhotos extends StatelessWidget { - const PostGuestEventDetailPhotos({ - super.key, - required this.event, - this.showTitle = true, - }); - - final Event event; - final bool? showTitle; - - List get photoUrls { - return (event.newNewPhotosExpanded ?? []) - .skip(1) - .map( - (item) => ImageUtils.generateUrl( - file: item, - imageConfig: ImageConfig.eventPoster, - ), - ) - .toList(); - } - - @override - Widget build(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - final t = Translations.of(context); - - if (photoUrls.isEmpty) { - return const SizedBox.shrink(); - } - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - if (showTitle!) ...[ - Padding( - padding: EdgeInsets.symmetric(horizontal: Spacing.smMedium), - child: Text( - StringUtils.capitalize(t.common.photo(n: 2)), - style: Typo.mediumPlus.copyWith( - fontWeight: FontWeight.w600, - color: colorScheme.onPrimary, - ), - ), - ), - SizedBox( - height: Spacing.xSmall, - ), - ], - SizedBox( - height: 144.w, - child: ListView.separated( - padding: EdgeInsets.symmetric(horizontal: Spacing.smMedium), - scrollDirection: Axis.horizontal, - separatorBuilder: (context, index) => SizedBox( - width: Spacing.extraSmall, - ), - itemCount: photoUrls.length, - itemBuilder: (context, index) { - final photo = photoUrls[index]; - return Hero( - tag: photo, - child: GestureDetector( - onTap: () { - AutoRouter.of(context).push( - PhotosGalleryRoute( - initialIndex: index, - photos: photoUrls, - title: Text( - event.title ?? '', - style: Typo.extraMedium.copyWith( - fontWeight: FontWeight.w500, - color: colorScheme.onPrimary, - ), - ), - ), - ); - }, - child: Container( - width: 144.w, - decoration: ShapeDecoration( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15.r), - side: BorderSide(color: colorScheme.outline), - ), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(15.r), - child: CachedNetworkImage( - width: double.infinity, - fit: BoxFit.cover, - placeholder: (_, __) => - ImagePlaceholder.defaultPlaceholder(), - errorWidget: (_, __, ___) => - ImagePlaceholder.defaultPlaceholder(), - imageUrl: photo, - ), - ), - ), - ), - ); - }, - ), - ), - ], - ); - } -}