From 4c54b65b5cd8f2a0ad636c028177ede9787e53dd Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Mon, 10 Apr 2023 00:39:31 +0200 Subject: [PATCH] Some Improvements --- lib/src/app.dart | 10 - lib/src/components/date_time_editor.dart | 65 ++-- lib/src/dialogs/create_event_dialog.dart | 71 +++-- .../event/components/dialogs/add_fight.dart | 4 +- .../screens/event/components/fight_list.dart | 35 +-- .../event/components/loaded_event.dart | 297 ++++++++++-------- .../screens/event/components/team_list.dart | 56 ++++ .../screens/generator/bracket_generator.dart | 76 +++-- .../generator/generators/group_generator.dart | 4 +- .../screens/generator/loaded_generator.dart | 61 ---- lib/src/screens/home/lists/events_list.dart | 3 +- pubspec.lock | 128 ++++---- 12 files changed, 413 insertions(+), 397 deletions(-) create mode 100644 lib/src/screens/event/components/team_list.dart delete mode 100644 lib/src/screens/generator/loaded_generator.dart diff --git a/lib/src/app.dart b/lib/src/app.dart index a28b19e..079bd8f 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -46,16 +46,6 @@ final _routes = GoRouter( } return EditEventScreen(eventId); }), - GoRoute( - path: "/event/:eventId/generator", - builder: (context, state) { - final eventId = int.tryParse(state.params['eventId']!); - if (eventId == null) { - context.go("/"); - return const SizedBox(); - } - return BracketGeneratorScreen(eventId); - }), GoRoute( path: "/display/:eventId", builder: (context, state) { diff --git a/lib/src/components/date_time_editor.dart b/lib/src/components/date_time_editor.dart index 41f4c9b..a5f47f7 100644 --- a/lib/src/components/date_time_editor.dart +++ b/lib/src/components/date_time_editor.dart @@ -32,10 +32,9 @@ class DateTimeEditor extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - return Row( - mainAxisAlignment: mainAxisAlignment, + return Wrap( children: [ - TextButton( + FilledButton.tonalIcon( onPressed: enabled ? () async { final date = await showDatePicker( @@ -49,36 +48,40 @@ class DateTimeEditor extends HookConsumerWidget { } } : null, - child: Text(kDateFormat.format(initialDate)), + icon: const Icon(Icons.calendar_today), + label: Text(kOnlyDateFormat.format(initialDate)), ), - IconButton( - onPressed: enabled - ? () async { - final time = await showTimePicker( - builder: (context, child) { - return MediaQuery( - data: MediaQuery.of(context).copyWith( - alwaysUse24HourFormat: true, - ), - child: child!, - ); - }, - context: context, - initialTime: TimeOfDay( - hour: initialDate.hour, minute: initialDate.minute), - ); - if (time != null) { - final changed = DateTime( - initialDate.year, - initialDate.month, - initialDate.day, - time.hour, - time.minute); - onChanged(changed); - } + const SizedBox(width: 8), + FilledButton.tonalIcon( + onPressed: enabled + ? () async { + final time = await showTimePicker( + builder: (context, child) { + return MediaQuery( + data: MediaQuery.of(context).copyWith( + alwaysUse24HourFormat: true, + ), + child: child!, + ); + }, + context: context, + initialTime: TimeOfDay( + hour: initialDate.hour, minute: initialDate.minute), + ); + if (time != null) { + final changed = DateTime( + initialDate.year, + initialDate.month, + initialDate.day, + time.hour, + time.minute); + onChanged(changed); } - : null, - icon: const Icon(Icons.schedule)), + } + : null, + icon: const Icon(Icons.schedule), + label: Text(kTimeFormat.format(initialDate)), + ), ], ); } diff --git a/lib/src/dialogs/create_event_dialog.dart b/lib/src/dialogs/create_event_dialog.dart index 8a22a80..9cbc02f 100644 --- a/lib/src/dialogs/create_event_dialog.dart +++ b/lib/src/dialogs/create_event_dialog.dart @@ -36,15 +36,18 @@ class CreateEventDialog extends HookConsumerWidget { final startTime = useState(DateTime.now()); final endTime = useState(DateTime.now().add(const Duration(hours: 1))); - return AlertDialog( - title: const Text('Create Event'), - content: Column( + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( mainAxisSize: MainAxisSize.min, children: [ + SizedBox(height: 20), TextField( decoration: InputDecoration( labelText: "Event Name", errorText: eventExists.value ? "Event already exists" : null, + border: const OutlineInputBorder(), + constraints: const BoxConstraints(maxWidth: 300), ), controller: eventName, onChanged: (value) { @@ -54,44 +57,40 @@ class CreateEventDialog extends HookConsumerWidget { } }, ), + SizedBox(height: 10), + const Text("Start:"), + DateTimeEditor((p0) { + startTime.value = p0; + }, startTime.value, true), + SizedBox(height: 10), + const Text("End:"), + DateTimeEditor((p0) { + endTime.value = p0; + }, endTime.value, true), + Divider(), Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text("Start: "), - DateTimeEditor((p0) { - startTime.value = p0; - }, startTime.value, true), + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text("Cancel"), + ), + FilledButton( + onPressed: () async { + final event = await ref + .read(eventRepositoryProvider.future) + .then((value) => value.createEvent( + eventName.text, startTime.value, endTime.value)); + context.go('/event/${event.id}'); + }, + child: const Text("Create"), + ), ], - ), - Row( - children: [ - const Text("End: "), - DateTimeEditor((p0) { - endTime.value = p0; - }, endTime.value, true), - ], - ), + ) ], ), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text( - "Cancel", - style: TextStyle(color: Colors.red), - ), - ), - FilledButton( - onPressed: () async { - final event = await ref.read(eventRepositoryProvider.future).then( - (value) => value.createEvent( - eventName.text, startTime.value, endTime.value)); - context.go('/event/${event.id}'); - }, - child: const Text("Create"), - ), - ], ); } } diff --git a/lib/src/screens/event/components/dialogs/add_fight.dart b/lib/src/screens/event/components/dialogs/add_fight.dart index 4ccb08d..394c5ba 100644 --- a/lib/src/screens/event/components/dialogs/add_fight.dart +++ b/lib/src/screens/event/components/dialogs/add_fight.dart @@ -58,6 +58,7 @@ class AddFightDialog extends HookConsumerWidget { content: Column( mainAxisSize: MainAxisSize.min, children: [ + const Divider(), const Text("Gamemode"), const SizedBox(height: 8), ElevatedButton( @@ -133,10 +134,11 @@ class AddFightDialog extends HookConsumerWidget { } }, child: Text(group.value.isEmpty ? "None" : group.value)), + const Divider(), ], ), actions: [ - ElevatedButton( + TextButton( onPressed: () { Navigator.of(context).pop(); }, diff --git a/lib/src/screens/event/components/fight_list.dart b/lib/src/screens/event/components/fight_list.dart index 8890cdf..97d2db2 100644 --- a/lib/src/screens/event/components/fight_list.dart +++ b/lib/src/screens/event/components/fight_list.dart @@ -29,6 +29,8 @@ import 'package:steamwar_multitool/src/components/date_time_editor.dart'; import 'package:steamwar_multitool/src/provider/provider.dart'; import 'package:steamwar_multitool/src/delegates/delegates.dart'; import 'package:steamwar_multitool/src/screens/event/components/dialogs/dialogs.dart'; +import 'package:steamwar_multitool/src/screens/generator/bracket_generator.dart'; +import 'package:steamwar_multitool/src/screens/generator/generators/group_generator.dart'; import 'package:steamwar_multitool/src/types/types.dart'; import 'package:steamwar_multitool/src/util/constants.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -59,7 +61,7 @@ class EventFightList extends HookConsumerWidget { fights.value = await repo.listFights(event.id); } - return Column( + return ListView( children: [ const SizedBox(height: 8), Row( @@ -82,7 +84,9 @@ class EventFightList extends HookConsumerWidget { const SizedBox(width: 8), FilledButton.icon( onPressed: () { - context.go("/event/${event.id}/generator"); + showDialog( + context: context, + builder: (context) => BracketGeneratorDialog(eventData)); }, label: const Text("Generate Fight"), icon: const Icon(Icons.shuffle)), @@ -431,29 +435,10 @@ class EventFightList extends HookConsumerWidget { itemBuilder: (context, fight) => ListTile( title: Text( "${fight.blueTeam.name} vs ${fight.redTeam.name}", - style: TextStyle( - color: fight - .getTeamWithContextColor( - Theme.of(context).scaffoldBackgroundColor) - .color - .computeLuminance() > - 0.5 - ? Colors.black - : Colors.white), ), - subtitle: Text( - fight.score == 0 - ? kDateFormat.format(fight.start) - : "Winner: ${fight.winner.name}", - style: TextStyle( - color: fight - .getTeamWithContextColor( - Theme.of(context).scaffoldBackgroundColor) - .color - .computeLuminance() > - 0.5 - ? Colors.black - : Colors.white)), + subtitle: Text(fight.score == 0 + ? kDateFormat.format(fight.start) + : "Winner: ${fight.winner.name}"), onTap: () { showDialog( context: context, @@ -465,8 +450,6 @@ class EventFightList extends HookConsumerWidget { ); }); }, - tileColor: - fight.score != 0 ? fight.winner.color.withOpacity(0.5) : null, leading: Checkbox( value: selected.value.contains(fight.id), onChanged: (value) { diff --git a/lib/src/screens/event/components/loaded_event.dart b/lib/src/screens/event/components/loaded_event.dart index b9d0d1f..08ae2fb 100644 --- a/lib/src/screens/event/components/loaded_event.dart +++ b/lib/src/screens/event/components/loaded_event.dart @@ -27,6 +27,7 @@ import 'package:steamwar_multitool/src/components/components.dart'; import 'package:steamwar_multitool/src/components/date_time_editor.dart'; import 'package:steamwar_multitool/src/provider/provider.dart'; import 'package:steamwar_multitool/src/screens/event/components/fight_list.dart'; +import 'package:steamwar_multitool/src/screens/event/components/team_list.dart'; import 'package:steamwar_multitool/src/screens/event/event.dart'; import 'package:steamwar_multitool/src/delegates/delegates.dart'; import 'package:steamwar_multitool/src/types/types.dart'; @@ -52,6 +53,7 @@ class LoadedEventScreen extends HookConsumerWidget { final schematicTypeState = useState(null); final publicOnlyState = useState(event.publicSchemsOnly); final spectateSystemState = useState(event.spectateSystem); + final tabController = useTabController(initialLength: 3); useMemoized(() { ref.read(schematicTypesProvider.future).then((value) { @@ -152,141 +154,170 @@ class LoadedEventScreen extends HookConsumerWidget { ), body: Padding( padding: const EdgeInsets.all(8.0), - child: ListView( + child: Column( children: [ - const SizedBox(height: 8), - TextField( - controller: nameController, - decoration: const InputDecoration( - labelText: "Name", - border: OutlineInputBorder(), + TabBar( + tabs: const [ + Tab(child: Text("General")), + Tab(child: Text("Teams")), + Tab(child: Text("Fights")) + ], + controller: tabController, + ), + Expanded( + child: TabBarView( + controller: tabController, + children: [ + ListView( + shrinkWrap: true, + children: [ + const SizedBox(height: 8), + TextField( + controller: nameController, + decoration: const InputDecoration( + labelText: "Name", + border: OutlineInputBorder(), + ), + onChanged: (value) { + changed.value = true; + }, + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text("Deadline: "), + DateTimeEditor((p0) { + deadlineState.value = p0; + changed.value = true; + }, deadlineState.value, true), + ], + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text("Start: "), + DateTimeEditor((p0) { + startDateState.value = p0; + changed.value = true; + }, startDateState.value, true), + ], + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text("End: "), + DateTimeEditor((p0) { + endDateState.value = p0; + changed.value = true; + }, endDateState.value, true), + ], + ), + const SizedBox(height: 8), + Row( + children: [ + SizedBox( + width: 150, + child: TextField( + controller: maxTeamMembersController, + decoration: InputDecoration( + labelText: "Max Team Members", + border: const OutlineInputBorder(), + errorText: invalidMaxTeamMembers.value + ? "Must be a number above 0" + : null), + keyboardType: TextInputType.number, + onChanged: (value) { + if (value.isEmpty || + int.tryParse(value) == null || + int.parse(value) <= 0) { + invalidMaxTeamMembers.value = true; + } else { + invalidMaxTeamMembers.value = false; + maxTeamMembersState.value = int.parse(value); + changed.value = true; + } + }, + ), + ), + Expanded( + child: Slider( + value: maxTeamMembersState.value.toDouble(), + onChanged: (p0) { + maxTeamMembersState.value = p0.toInt(); + maxTeamMembersController.text = + p0.toInt().toString(); + changed.value = true; + }, + min: min(1, maxTeamMembersState.value.toDouble()), + max: + max(30, maxTeamMembersState.value.toDouble()), + divisions: + max(30, maxTeamMembersState.value.toDouble()) + .toInt() - + 1, + label: maxTeamMembersState.value.toString(), + ), + ), + ], + ), + const SizedBox(height: 8), + ref.watch(schematicTypesProvider).when( + data: (data) { + return DropdownMenu( + dropdownMenuEntries: [ + for (final type in data) + DropdownMenuEntry( + value: type, + label: type.name, + ) + ], + initialSelection: schematicTypeState.value, + enableSearch: true, + width: 300, + menuHeight: 300, + label: const Text("Schematic Type"), + onSelected: (value) { + schematicTypeState.value = value; + changed.value = true; + }, + enableFilter: true, + ); + }, + error: (err, stk) { + return ErrorComponent(err, stk); + }, + loading: () { + return LinearProgressIndicator(); + }, + ), + const SizedBox(height: 8), + SwitchListTile( + value: publicOnlyState.value, + onChanged: (value) { + publicOnlyState.value = value; + changed.value = true; + }, + title: const Text("Public Only"), + ), + SwitchListTile( + value: spectateSystemState.value, + onChanged: (value) { + spectateSystemState.value = value; + changed.value = true; + }, + title: const Text("Use Spectate System"), + ), + ], + ), + TeamList(eventData.teams), + EventFightList( + eventData: eventData, + ), + ], ), - onChanged: (value) { - changed.value = true; - }, - ), - const SizedBox(height: 8), - Row( - children: [ - const Text("Deadline: "), - DateTimeEditor((p0) { - deadlineState.value = p0; - changed.value = true; - }, deadlineState.value, true), - ], - ), - const SizedBox(height: 8), - Row( - children: [ - const Text("Start: "), - DateTimeEditor((p0) { - startDateState.value = p0; - changed.value = true; - }, startDateState.value, true), - ], - ), - const SizedBox(height: 8), - Row( - children: [ - const Text("End: "), - DateTimeEditor((p0) { - endDateState.value = p0; - changed.value = true; - }, endDateState.value, true), - ], - ), - const SizedBox(height: 8), - TextField( - controller: maxTeamMembersController, - decoration: InputDecoration( - labelText: "Max Team Members", - border: const OutlineInputBorder(), - errorText: invalidMaxTeamMembers.value - ? "Must be a number above 0" - : null), - keyboardType: TextInputType.number, - onChanged: (value) { - if (value.isEmpty || - int.tryParse(value) == null || - int.parse(value) <= 0) { - invalidMaxTeamMembers.value = true; - } else { - invalidMaxTeamMembers.value = false; - maxTeamMembersState.value = int.parse(value); - changed.value = true; - } - }, - ), - Slider( - value: maxTeamMembersState.value.toDouble(), - onChanged: (p0) { - maxTeamMembersState.value = p0.toInt(); - maxTeamMembersController.text = p0.toInt().toString(); - changed.value = true; - }, - min: min(1, maxTeamMembersState.value.toDouble()), - max: max(30, maxTeamMembersState.value.toDouble()), - divisions: - max(30, maxTeamMembersState.value.toDouble()).toInt() - 1, - label: maxTeamMembersState.value.toString(), - ), - const SizedBox(height: 8), - Row( - children: [ - const Text("Schematic Type: "), - TextButton( - onPressed: () async { - final types = - await ref.read(schematicTypesProvider.future); - final out = await showSearch( - context: context, - delegate: SchematicTypeSearchDelegate(types)); - if (out == RESET_TYPE) { - schematicTypeState.value = null; - changed.value = true; - } else { - schematicTypeState.value = - out ?? schematicTypeState.value; - changed.value = true; - } - }, - child: Text(schematicTypeState.value?.name ?? "Select")), - ], - ), - const SizedBox(height: 8), - CheckboxListTile( - value: publicOnlyState.value, - onChanged: (value) { - publicOnlyState.value = value ?? publicOnlyState.value; - changed.value = true; - }, - title: const Text("Public Only"), - ), - const SizedBox(height: 8), - CheckboxListTile( - value: spectateSystemState.value, - onChanged: (value) { - spectateSystemState.value = value ?? spectateSystemState.value; - changed.value = true; - }, - title: const Text("Use Spectate System"), - ), - const SizedBox(height: 8), - Text("Teams (${eventData.teams.length})", - style: Theme.of(context).textTheme.headline6), - Wrap( - children: [ - for (final team in eventData.teams) - Padding( - padding: const EdgeInsets.all(8.0), - child: TeamChip(team), - ) - ], - ), - const SizedBox(height: 8), - Text("Fights", style: Theme.of(context).textTheme.headline6), - EventFightList( - eventData: eventData, ), ], ), diff --git a/lib/src/screens/event/components/team_list.dart b/lib/src/screens/event/components/team_list.dart new file mode 100644 index 0000000..3e46a38 --- /dev/null +++ b/lib/src/screens/event/components/team_list.dart @@ -0,0 +1,56 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:steamwar_multitool/src/types/types.dart'; + +class TeamList extends HookConsumerWidget { + final List teams; + + const TeamList( + this.teams, { + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return ListView.builder( + itemBuilder: (context, index) { + final team = teams[index]; + return ListTile( + title: Text(team.name), + leading: CircleAvatar( + backgroundColor: team.color, + child: Text( + team.kuerzel, + style: TextStyle( + color: team.color.computeLuminance() > 0.4 + ? Colors.black + : Colors.white, + fontSize: 12, + ), + ), + ), + ); + }, + itemCount: teams.length, + ); + } +} diff --git a/lib/src/screens/generator/bracket_generator.dart b/lib/src/screens/generator/bracket_generator.dart index e48d263..f54af0f 100644 --- a/lib/src/screens/generator/bracket_generator.dart +++ b/lib/src/screens/generator/bracket_generator.dart @@ -20,43 +20,57 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:steamwar_multitool/src/components/components.dart'; -import 'package:steamwar_multitool/src/provider/events.dart'; -import 'package:steamwar_multitool/src/screens/generator/loaded_generator.dart'; +import 'package:steamwar_multitool/src/screens/generator/generators/group_generator.dart'; import 'package:steamwar_multitool/src/types/types.dart'; -class BracketGeneratorScreen extends HookConsumerWidget { - final int eventId; - const BracketGeneratorScreen(this.eventId, {Key? key}) : super(key: key); +class BracketGeneratorDialog extends HookConsumerWidget { + final EventExtended event; + const BracketGeneratorDialog(this.event, {Key? key}) : super(key: key); @override Widget build(BuildContext context, WidgetRef ref) { - final event = useMemoized(() => ref - .watch(eventRepositoryProvider.future) - .then((value) => value.getEvent(eventId))); + final selection = useState(0); - return FutureBuilder( - builder: (context, data) { - if (data.hasError) { - return Scaffold( - appBar: AppBar( - title: const Text('Error'), - ), - body: ErrorComponent(data.error!, data.stackTrace)); - } - - if (!data.hasData) { - return Scaffold( - appBar: AppBar( - title: const Text('Loading'), - ), - body: const LinearProgressIndicator()); - } - - final event = data.data as EventExtended; - return LoadedBracketGenerator(event); - }, - future: event, + return AlertDialog( + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Divider(), + ListTile( + title: const Text('Group Bracket'), + leading: Radio( + value: 0, + groupValue: selection.value, + onChanged: (value) { + selection.value = value as int; + }, + ), + ), + Divider(), + ], + ), + title: const Text('Select Bracket Generator'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Cancel'), + ), + FilledButton( + onPressed: () { + Navigator.pushReplacement(context, + MaterialPageRoute(builder: (context) { + switch (selection.value) { + case 0: + return GroupBracketGenerator(event); + } + return const Scaffold(); + })); + }, + child: const Text('Next'), + ), + ], ); } } diff --git a/lib/src/screens/generator/generators/group_generator.dart b/lib/src/screens/generator/generators/group_generator.dart index dd72220..019ad36 100644 --- a/lib/src/screens/generator/generators/group_generator.dart +++ b/lib/src/screens/generator/generators/group_generator.dart @@ -158,9 +158,7 @@ class GroupBracketGenerator extends HookConsumerWidget { }, ), ], - leading: BackButton( - onPressed: () => context.go('/event/${event.event.id}'), - ), + leading: BackButton(), ), floatingActionButton: FloatingActionButton.extended( icon: const Icon(Icons.check), diff --git a/lib/src/screens/generator/loaded_generator.dart b/lib/src/screens/generator/loaded_generator.dart deleted file mode 100644 index 23c57ea..0000000 --- a/lib/src/screens/generator/loaded_generator.dart +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2023 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:steamwar_multitool/src/screens/generator/generators/group_generator.dart'; -import 'package:steamwar_multitool/src/types/event.dart'; - -class BracketGenerators { - String name; - Widget Function(EventExtended event) builder; - - BracketGenerators(this.name, this.builder); -} - -final List bracketGenerators = [ - BracketGenerators('Group Bracket', (event) => GroupBracketGenerator(event)), -]; - -class LoadedBracketGenerator extends HookConsumerWidget { - final EventExtended event; - const LoadedBracketGenerator(this.event, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Scaffold( - appBar: AppBar( - title: Text('Bracket Generator'), - leading: - BackButton(onPressed: () => context.go('/event/${event.event.id}')), - ), - body: ListView( - children: [ - for (final generator in bracketGenerators) - ListTile( - title: Text(generator.name), - onTap: () => Navigator.of(context).push( - MaterialPageRoute(builder: (_) => generator.builder(event))), - ), - ], - ), - ); - } -} diff --git a/lib/src/screens/home/lists/events_list.dart b/lib/src/screens/home/lists/events_list.dart index 348a44c..58c8570 100644 --- a/lib/src/screens/home/lists/events_list.dart +++ b/lib/src/screens/home/lists/events_list.dart @@ -44,7 +44,8 @@ class EventListComponent extends HookConsumerWidget { children: [ FilledButton.icon( onPressed: () { - showDialog( + showModalBottomSheet( + constraints: BoxConstraints(maxWidth: 500), context: context, builder: (context) => const CreateEventDialog()); }, diff --git a/pubspec.lock b/pubspec.lock index 5bfe42f..a6af84b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201" + sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214 url: "https://pub.dev" source: hosted - version: "52.0.0" + version: "58.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4 + sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27 url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.10.0" args: dependency: transitive description: @@ -61,18 +61,18 @@ packages: dependency: transitive description: name: build_daemon - sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf" + sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "7c35a3a7868626257d8aee47b51c26b9dba11eaddf3431117ed2744951416aab" + sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" build_runner: dependency: "direct dev" description: @@ -101,10 +101,10 @@ packages: dependency: transitive description: name: built_value - sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" url: "https://pub.dev" source: hosted - version: "8.4.3" + version: "8.4.4" characters: dependency: transitive description: @@ -173,10 +173,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + sha256: "6d691edde054969f0e0f26abb1b30834b5138b963793e56f69d3a9a4435e6352" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.3.0" dio: dependency: "direct main" description: @@ -226,10 +226,10 @@ packages: dependency: "direct main" description: name: flutter_hooks - sha256: "2b202559a4ed3656bbb7aae9d8b335fb0037b23acc7ae3f377d1ba0b95c21aec" + sha256: "6a126f703b89499818d73305e4ce1e3de33b4ae1c5512e3b8eab4b986f46774c" url: "https://pub.dev" source: hosted - version: "0.18.5+1" + version: "0.18.6" flutter_lints: dependency: "direct dev" description: @@ -242,10 +242,10 @@ packages: dependency: transitive description: name: flutter_riverpod - sha256: "0c997763ce06359ee4686553b74def84062e9d6929ac63f61fa02465c1f8e32c" + sha256: "812dfbb87af51e73e68ea038bcfd1c732078d6838d3388d03283db7dec0d1e5f" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.3.4" flutter_test: dependency: "direct dev" description: flutter @@ -292,10 +292,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "5a0b2e0bc88a006c09d2b419004ffabecf83a74520b8852ea148f22e82634c27" + sha256: feab99a20fd248c658c923ba98f4449ca6e575c3dee9fdf07146f4f33482c6bc url: "https://pub.dev" source: hosted - version: "6.0.6" + version: "6.5.5" graphs: dependency: transitive description: @@ -316,10 +316,10 @@ packages: dependency: "direct main" description: name: hooks_riverpod - sha256: "71695b2e1dfc22a39f1f9c67b798f8f8f1521f2d0349817d13ccdd5c4cd7acba" + sha256: eceb62b7e3a18e6c2831498c3f2ea5b42c0a938c95d0c1eb1b8a7ccdd022accc url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.3.4" http_multi_server: dependency: transitive description: @@ -444,26 +444,26 @@ packages: dependency: transitive description: name: path_provider_linux - sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.1.10" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.6" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.5" platform: dependency: transitive description: @@ -476,10 +476,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" pool: dependency: transitive description: @@ -508,74 +508,74 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + sha256: ec85d7d55339d85f44ec2b682a82fea340071e8978257e5a43e69f79e98ef50c url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" riverpod: dependency: transitive description: name: riverpod - sha256: "0f43c64f1f79c2112c843305a879a746587fb7c1e388f1d4717737796756e2c4" + sha256: "77ab3bcd084bb19fa8717a526217787c725d7f5be938404c7839cd760fdf6ae5" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.3.4" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "5949029e70abe87f75cfe59d17bf5c397619c4b74a099b10116baeb34786fad9" + sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.1.0" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "955e9736a12ba776bdd261cf030232b30eadfcd9c79b32a3250dd4a494e8c8f7" + sha256: "8304d8a1f7d21a429f91dee552792249362b68a331ac5c3c1caf370f658873f6" url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.1.0" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "2b55c18636a4edc529fa5cd44c03d3f3100c00513f518c5127c951978efcccd0" + sha256: cf2a42fb20148502022861f71698db12d937c7459345a1bdaa88fc91a91b3603 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: f8ea038aa6da37090093974ebdcf4397010605fd2ff65c37a66f9d28394cb874 + sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: da9431745ede5ece47bc26d5d73a9d3c6936ef6945c101a5aca46f62e52c1cf3 + sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: a4b5bc37fe1b368bbc81f953197d55e12f49d0296e7e412dfe2d2d77d6929958 + sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5" url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.1.0" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "5eaf05ae77658d3521d0e993ede1af962d4b326cd2153d312df716dc250f00c9" + sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" shelf: dependency: transitive description: @@ -697,66 +697,66 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: e8f2efc804810c0f2f5b485f49e7942179f56eabcfe81dce3387fec4bb55876b + sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" url: "https://pub.dev" source: hosted - version: "6.1.9" + version: "6.1.10" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "3e2f6dfd2c7d9cd123296cab8ef66cfc2c1a13f5845f42c7a0f365690a8a7dd1" + sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8 url: "https://pub.dev" source: hosted - version: "6.0.23" + version: "6.0.26" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "0a5af0aefdd8cf820dd739886efb1637f1f24489900204f50984634c07a54815" + sha256: "3dedc66ca3c0bef9e6a93c0999aee102556a450afcc1b7bcfeace7a424927d92" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.1.3" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "318c42cba924e18180c029be69caf0a1a710191b9ec49bb42b5998fdcccee3cc" + sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.4" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "41988b55570df53b3dd2a7fc90c76756a963de6a8c5f8e113330cb35992e2094" + sha256: "0ef2b4f97942a16523e51256b799e9aa1843da6c60c55eefbfa9dbc2dcb8331a" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.4" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" + sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "44d79408ce9f07052095ef1f9a693c258d6373dc3944249374e30eff7219ccb0" + sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: b6217370f8eb1fd85c8890c539f5a639a01ab209a36db82c921ebeacefc7a615 + sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" vector_math: dependency: transitive description: @@ -793,10 +793,10 @@ packages: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 url: "https://pub.dev" source: hosted - version: "0.2.0+3" + version: "1.0.0" yaml: dependency: transitive description: