feat: mobile no date optimization (#4038)

* feat: mobile no date optimization

* fix: code review
This commit is contained in:
Mathias Mogensen 2023-11-29 01:19:40 +02:00 committed by GitHub
parent 20b485bcfe
commit a5ed145aa3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 116 additions and 36 deletions

View File

@ -1,5 +1,8 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/mobile/presentation/database/card/card.dart';
import 'package:appflowy/mobile/presentation/presentation.dart';
import 'package:appflowy/mobile/presentation/widgets/flowy_paginated_bottom_sheet.dart';
import 'package:appflowy/mobile/presentation/widgets/show_flowy_mobile_bottom_sheet.dart'; import 'package:appflowy/mobile/presentation/widgets/show_flowy_mobile_bottom_sheet.dart';
import 'package:appflowy/plugins/database_view/application/database_controller.dart'; import 'package:appflowy/plugins/database_view/application/database_controller.dart';
import 'package:appflowy/plugins/database_view/application/field/field_controller.dart'; import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
@ -367,10 +370,10 @@ void showEventDetails({
} }
class UnscheduledEventsButton extends StatefulWidget { class UnscheduledEventsButton extends StatefulWidget {
final DatabaseController databaseController;
const UnscheduledEventsButton({super.key, required this.databaseController}); const UnscheduledEventsButton({super.key, required this.databaseController});
final DatabaseController databaseController;
@override @override
State<UnscheduledEventsButton> createState() => State<UnscheduledEventsButton> createState() =>
_UnscheduledEventsButtonState(); _UnscheduledEventsButtonState();
@ -402,21 +405,21 @@ class _UnscheduledEventsButtonState extends State<UnscheduledEventsButton> {
child: OutlinedButton( child: OutlinedButton(
style: OutlinedButton.styleFrom( style: OutlinedButton.styleFrom(
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
side: BorderSide( side: BorderSide(color: Theme.of(context).dividerColor),
color: Theme.of(context).dividerColor,
width: 1,
),
borderRadius: Corners.s6Border, borderRadius: Corners.s6Border,
), ),
side: side: BorderSide(color: Theme.of(context).dividerColor),
BorderSide(color: Theme.of(context).dividerColor, width: 1),
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
), ),
onPressed: () { onPressed: () {
if (state.unscheduleEvents.isNotEmpty) { if (state.unscheduleEvents.isNotEmpty) {
if (PlatformExtension.isMobile) {
_showUnscheduledEventsMobile(state.unscheduleEvents);
} else {
_popoverController.show(); _popoverController.show();
} }
}
}, },
child: FlowyTooltip( child: FlowyTooltip(
message: LocaleKeys.calendar_settings_noDateHint message: LocaleKeys.calendar_settings_noDateHint
@ -438,20 +441,34 @@ class _UnscheduledEventsButtonState extends State<UnscheduledEventsButton> {
), ),
); );
} }
void _showUnscheduledEventsMobile(List<CalendarEventPB> events) =>
showPaginatedBottomSheet(
context,
page: SheetPage(
title: LocaleKeys.calendar_settings_unscheduledEventsTitle.tr(),
body: UnscheduleEventsList(
databaseController: widget.databaseController,
unscheduleEvents: events,
),
),
);
} }
class UnscheduleEventsList extends StatelessWidget { class UnscheduleEventsList extends StatelessWidget {
final DatabaseController databaseController;
final List<CalendarEventPB> unscheduleEvents;
const UnscheduleEventsList({ const UnscheduleEventsList({
super.key, super.key,
required this.unscheduleEvents, required this.unscheduleEvents,
required this.databaseController, required this.databaseController,
}); });
final List<CalendarEventPB> unscheduleEvents;
final DatabaseController databaseController;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final cells = <Widget>[ final cells = [
if (!PlatformExtension.isMobile)
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),
child: FlowyText.medium( child: FlowyText.medium(
@ -462,40 +479,81 @@ class UnscheduleEventsList extends StatelessWidget {
), ),
), ),
...unscheduleEvents.map( ...unscheduleEvents.map(
(e) => UnscheduledEventCell( (event) => UnscheduledEventCell(
event: e, event: event,
onPressed: () { onPressed: () {
if (PlatformExtension.isMobile) {
context.push(
MobileCardDetailScreen.routeName,
extra: {
MobileCardDetailScreen.argRowController: RowController(
rowMeta: event.rowMeta,
viewId: databaseController.viewId,
rowCache: databaseController.rowCache,
),
MobileCardDetailScreen.argFieldController:
databaseController.fieldController,
},
);
context.pop();
} else {
showEventDetails( showEventDetails(
context: context, context: context,
event: e, event: event,
viewId: databaseController.viewId, viewId: databaseController.viewId,
rowCache: databaseController.rowCache, rowCache: databaseController.rowCache,
fieldController: databaseController.fieldController, fieldController: databaseController.fieldController,
); );
PopoverContainer.of(context).close(); PopoverContainer.of(context).close();
}
}, },
), ),
), ),
]; ];
return ListView.separated( final child = ListView.separated(
itemBuilder: (context, index) => cells[index], itemBuilder: (context, index) => cells[index],
itemCount: cells.length, itemCount: cells.length,
separatorBuilder: (context, index) => separatorBuilder: (context, index) =>
VSpace(GridSize.typeOptionSeparatorHeight), VSpace(GridSize.typeOptionSeparatorHeight),
shrinkWrap: true, shrinkWrap: true,
); );
if (PlatformExtension.isMobile) {
return Flexible(child: child);
}
return child;
} }
} }
class UnscheduledEventCell extends StatelessWidget { class UnscheduledEventCell extends StatelessWidget {
final CalendarEventPB event;
final VoidCallback onPressed;
const UnscheduledEventCell({ const UnscheduledEventCell({
super.key,
required this.event, required this.event,
required this.onPressed, required this.onPressed,
Key? key, });
}) : super(key: key);
final CalendarEventPB event;
final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
return PlatformExtension.isMobile
? MobileUnscheduledEventTile(event: event, onPressed: onPressed)
: DesktopUnscheduledEventTile(event: event, onPressed: onPressed);
}
}
class DesktopUnscheduledEventTile extends StatelessWidget {
const DesktopUnscheduledEventTile({
super.key,
required this.event,
required this.onPressed,
});
final CalendarEventPB event;
final VoidCallback onPressed;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -514,3 +572,24 @@ class UnscheduledEventCell extends StatelessWidget {
); );
} }
} }
class MobileUnscheduledEventTile extends StatelessWidget {
const MobileUnscheduledEventTile({
super.key,
required this.event,
required this.onPressed,
});
final CalendarEventPB event;
final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
return MobileSettingItem(
name: event.title.isEmpty
? LocaleKeys.calendar_defaultNewCalendarTitle.tr()
: event.title,
onTap: onPressed,
);
}
}

View File

@ -857,6 +857,7 @@
"one": "{} unscheduled event", "one": "{} unscheduled event",
"other": "{} unscheduled events" "other": "{} unscheduled events"
}, },
"unscheduledEventsTitle": "Unscheduled events",
"clickToAdd": "Click to add to the calendar", "clickToAdd": "Click to add to the calendar",
"name": "Calendar settings" "name": "Calendar settings"
}, },