You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.7 KiB
Dart
160 lines
5.7 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:material_symbols_icons/symbols.dart';
|
|
import 'package:matrix/matrix.dart';
|
|
|
|
import 'package:fluffychat/config/app_config.dart';
|
|
import 'package:fluffychat/l10n/l10n.dart';
|
|
import 'package:fluffychat/pangea/activity_planner/activity_planner_page_appbar.dart';
|
|
import 'package:fluffychat/pangea/activity_planner/bookmarked_activity_list.dart';
|
|
import 'package:fluffychat/pangea/activity_suggestions/activity_suggestions_area.dart';
|
|
import 'package:fluffychat/pangea/activity_suggestions/activity_suggestions_constants.dart';
|
|
import 'package:fluffychat/pangea/common/widgets/customized_svg.dart';
|
|
import 'package:fluffychat/pangea/common/widgets/error_indicator.dart';
|
|
import 'package:fluffychat/widgets/matrix.dart';
|
|
|
|
enum PageMode {
|
|
featuredActivities,
|
|
savedActivities,
|
|
}
|
|
|
|
class ActivityPlannerPage extends StatefulWidget {
|
|
final String roomID;
|
|
const ActivityPlannerPage({super.key, required this.roomID});
|
|
|
|
@override
|
|
ActivityPlannerPageState createState() => ActivityPlannerPageState();
|
|
}
|
|
|
|
class ActivityPlannerPageState extends State<ActivityPlannerPage> {
|
|
PageMode pageMode = PageMode.featuredActivities;
|
|
Room? get room => Matrix.of(context).client.getRoomById(widget.roomID);
|
|
|
|
void _setPageMode(PageMode? mode) {
|
|
if (mode == null) return;
|
|
setState(() => pageMode = mode);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
Widget? body;
|
|
switch (pageMode) {
|
|
case PageMode.savedActivities:
|
|
if (room != null) {
|
|
body = BookmarkedActivitiesList(
|
|
room: room!,
|
|
controller: this,
|
|
);
|
|
}
|
|
break;
|
|
case PageMode.featuredActivities:
|
|
if (room != null) {
|
|
body = Expanded(
|
|
child: SingleChildScrollView(
|
|
child: ActivitySuggestionsArea(
|
|
scrollDirection: Axis.vertical,
|
|
room: room!,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return Scaffold(
|
|
appBar: ActivityPlannerPageAppBar(
|
|
pageMode: pageMode,
|
|
roomID: widget.roomID,
|
|
),
|
|
body: Center(
|
|
child: ConstrainedBox(
|
|
constraints: const BoxConstraints(maxWidth: 800.0),
|
|
child: Column(
|
|
children: [
|
|
if ([PageMode.featuredActivities, PageMode.savedActivities]
|
|
.contains(pageMode))
|
|
Padding(
|
|
padding: const EdgeInsets.all(16.0),
|
|
child: Wrap(
|
|
spacing: 12.0,
|
|
runSpacing: 12.0,
|
|
alignment: WrapAlignment.center,
|
|
children: [
|
|
FilterChip(
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(32),
|
|
),
|
|
label: Row(
|
|
spacing: 8.0,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
const Icon(Symbols.star_shine, size: 24.0),
|
|
Text(L10n.of(context).featuredActivities),
|
|
],
|
|
),
|
|
selected: pageMode == PageMode.featuredActivities,
|
|
onSelected: (_) => _setPageMode(
|
|
PageMode.featuredActivities,
|
|
),
|
|
),
|
|
FilterChip(
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(32),
|
|
),
|
|
label: Row(
|
|
spacing: 8.0,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
const Icon(Icons.save_outlined, size: 24.0),
|
|
Text(L10n.of(context).saved),
|
|
],
|
|
),
|
|
selected: pageMode == PageMode.savedActivities,
|
|
onSelected: (_) => _setPageMode(
|
|
PageMode.savedActivities,
|
|
),
|
|
),
|
|
FilterChip(
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(32),
|
|
),
|
|
label: Row(
|
|
spacing: 8.0,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
CustomizedSvg(
|
|
svgUrl:
|
|
"${AppConfig.assetsBaseURL}/${ActivitySuggestionsConstants.crayonIconPath}",
|
|
colorReplacements: {
|
|
"#CDBEF9": colorToHex(
|
|
theme.colorScheme.secondary,
|
|
),
|
|
},
|
|
height: 24.0,
|
|
width: 24.0,
|
|
),
|
|
Text(L10n.of(context).createActivityPlan),
|
|
],
|
|
),
|
|
selected: false,
|
|
onSelected: (_) => context.go(
|
|
'/rooms/${widget.roomID}/details/planner/generator',
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
body ??
|
|
ErrorIndicator(
|
|
message: L10n.of(context).oopsSomethingWentWrong,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|