From 862c6bf665c14f71bd09fca99a925568e6629c54 Mon Sep 17 00:00:00 2001 From: Luis Burgos Date: Sat, 24 Sep 2022 02:19:23 -0500 Subject: [PATCH] feat: improve join module --- example/lib/get/modules/join_module.dart | 6 +- example/lib/get/modules/trivia_module.dart | 28 ++---- .../lib/shared/modules/join/join_view.dart | 61 +++++++++++++ example/lib/shared/modules/join/page.dart | 31 ++++--- .../components/copy_join_link_view.dart | 10 ++- .../trivia/initial/trivia_initial_view.dart | 10 +-- example/lib/shared/modules/trivia/page.dart | 68 ++++----------- .../shared/modules/trivia/trivia_view.dart | 85 +++++++++++++++++++ example/pubspec.lock | 28 ++++++ example/pubspec.yaml | 1 + 10 files changed, 227 insertions(+), 101 deletions(-) create mode 100644 example/lib/shared/modules/join/join_view.dart create mode 100644 example/lib/shared/modules/trivia/trivia_view.dart diff --git a/example/lib/get/modules/join_module.dart b/example/lib/get/modules/join_module.dart index 284d67e..bf7325a 100644 --- a/example/lib/get/modules/join_module.dart +++ b/example/lib/get/modules/join_module.dart @@ -16,10 +16,6 @@ class JoinRoute extends GetRoute { @override GetPage get asGetPage => GetPage( name: JoinPage.routeName, - page: () => JoinPage( - onNewTriviaGameTap: () { - throw UnimplementedError('Must go to JoinPage'); - }, - ), + page: () => const JoinPage(), ); } diff --git a/example/lib/get/modules/trivia_module.dart b/example/lib/get/modules/trivia_module.dart index ab7b249..62d362c 100644 --- a/example/lib/get/modules/trivia_module.dart +++ b/example/lib/get/modules/trivia_module.dart @@ -1,6 +1,5 @@ import 'package:buzz/buzz.dart'; import 'package:example/shared/app_routes.dart'; -import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import '../../shared/modules/trivia/page.dart'; @@ -23,29 +22,16 @@ class TriviaRoute extends GetRoute { @override GetPage get asGetPage => GetPage( name: AppRoutes.trivia, - page: () => TriviaPage( - onStartPlayTap: (triviaId) { - Buzz.fire(NavigateToTriviaPlay(triviaId: triviaId)); - }, - onSeeScoreboardTap: (triviaId) { - Buzz.fire(NavigateToTriviaScoreboard(triviaId: triviaId)); - }, - onCopyJoinLinkTap: (joinLink) { - //TODO: Implement - debugPrint(joinLink); - }, - onGoToStatusTap: (triviaId, status) { - Buzz.fire( - NavigateToTrivia( - triviaId: triviaId, - status: status, - ), - ); - }, - ), + page: () => const TriviaPage(), ); } +class CopyToClipBoardCommand extends Command { + CopyToClipBoardCommand(this.content); + + final String content; +} + class TriviaPlayRoute extends GetRoute { TriviaPlayRoute(); diff --git a/example/lib/shared/modules/join/join_view.dart b/example/lib/shared/modules/join/join_view.dart new file mode 100644 index 0000000..43b5458 --- /dev/null +++ b/example/lib/shared/modules/join/join_view.dart @@ -0,0 +1,61 @@ +import 'package:buzz/buzz.dart'; +import 'package:core/core.dart'; +import 'package:example/shared/components/labeled_section.dart'; +import 'package:example/shared/modules/trivia/components/trivia_data_view.dart'; +import 'package:example/shared/modules/trivia/page.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class JoinView extends StatelessWidget { + const JoinView({ + Key? key, + required this.joinCode, + }) : super(key: key); + + final String joinCode; + + @override + Widget build(BuildContext context) { + final controller = Get.put( + JoinViewController(joinCode), + tag: joinCode, + ); + + return Obx(() { + final joinCode = controller.joinCode(); + + return LabeledSection( + label: 'joinCode: $joinCode', + child: Column( + children: [ + const TriviaDataView( + hostName: 'hostName', + triviaName: 'hostName', + triviaDescription: 'hostName', + triviaMainQuestion: 'hostName', + ), + MainActionWidget( + action: MainAction( + label: 'Join to $joinCode', + onPressed: () { + debugPrint('$runtimeType onJoinConfirmTap'); + controller.onJoinConfirmTap('someId'); + }, + ), + ), + ], + ), + ); + }); + } +} + +class JoinViewController extends GetxController { + late Rx joinCode; + + JoinViewController(String code) : joinCode = code.obs; + + void onJoinConfirmTap(String triviaId) { + Buzz.fire(NavigateToTrivia(triviaId: triviaId)); + } +} diff --git a/example/lib/shared/modules/join/page.dart b/example/lib/shared/modules/join/page.dart index 2869514..77e5ad2 100644 --- a/example/lib/shared/modules/join/page.dart +++ b/example/lib/shared/modules/join/page.dart @@ -1,30 +1,29 @@ -import 'package:core/core.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'join_view.dart'; class JoinPage extends StatelessWidget { - static const String routeName = '/join/join_code'; + static const String routeName = '/join/:join_code'; static const String pageName = 'JoinPage'; const JoinPage({ Key? key, - required this.onNewTriviaGameTap, }) : super(key: key); - final Function() onNewTriviaGameTap; - @override Widget build(BuildContext context) { - return BasePage( - name: '$runtimeType', - actions: [ - MainAction( - label: 'New trivia game', - onPressed: () { - debugPrint('$runtimeType onNewTriviaGameTap'); - onNewTriviaGameTap(); - }, - ), - ], + final joinCode = Get.parameters['join_code']; + if (joinCode == null) { + throw UnimplementedError( + 'join_code must not be null', + ); + } + + return Scaffold( + body: JoinView( + joinCode: joinCode, + ), ); } } diff --git a/example/lib/shared/modules/trivia/components/copy_join_link_view.dart b/example/lib/shared/modules/trivia/components/copy_join_link_view.dart index 1d98ed6..6a82daa 100644 --- a/example/lib/shared/modules/trivia/components/copy_join_link_view.dart +++ b/example/lib/shared/modules/trivia/components/copy_join_link_view.dart @@ -1,17 +1,23 @@ import 'package:core/core.dart'; import 'package:example/shared/components/labeled_section.dart'; import 'package:flutter/material.dart'; +import 'package:universal_html/html.dart' show window; class CopyJoinLinkView extends StatelessWidget { const CopyJoinLinkView({ Key? key, - required this.joinLink, + required this.joinCode, required this.onCopyJoinLinkTap, }) : super(key: key); - final String joinLink; + final String joinCode; final Function(String) onCopyJoinLinkTap; + String get joinLink { + var url = window.location.host; + return '$url/#/join/$joinCode'; + } + @override Widget build(BuildContext context) { return LabeledSection( diff --git a/example/lib/shared/modules/trivia/initial/trivia_initial_view.dart b/example/lib/shared/modules/trivia/initial/trivia_initial_view.dart index 4a18640..a37e6aa 100644 --- a/example/lib/shared/modules/trivia/initial/trivia_initial_view.dart +++ b/example/lib/shared/modules/trivia/initial/trivia_initial_view.dart @@ -8,16 +8,16 @@ class TriviaInitialStatusView extends StatelessWidget { const TriviaInitialStatusView({ Key? key, required this.triviaId, + required this.joinCode, required this.onCopyJoinLinkTap, }) : super(key: key); final String triviaId; + final String joinCode; final Function(String) onCopyJoinLinkTap; @override Widget build(BuildContext context) { - const joinLink = 'TODO: improve joinLink'; - return LabeledSection( label: 'Initial', child: Column( @@ -31,10 +31,8 @@ class TriviaInitialStatusView extends StatelessWidget { ), const SizedBox(height: 12), CopyJoinLinkView( - joinLink: joinLink, - onCopyJoinLinkTap: (joinLink) { - //TODO: Implement. - }, + joinCode: joinCode, + onCopyJoinLinkTap: onCopyJoinLinkTap, ), ], ), diff --git a/example/lib/shared/modules/trivia/page.dart b/example/lib/shared/modules/trivia/page.dart index 58ff1be..5fddd7c 100644 --- a/example/lib/shared/modules/trivia/page.dart +++ b/example/lib/shared/modules/trivia/page.dart @@ -1,13 +1,8 @@ import 'package:buzz/buzz.dart'; -import 'package:core/core.dart'; -import 'package:example/shared/components/labeled_section.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; -import 'finished/trivia_finished_status_view.dart'; -import 'initial/trivia_initial_view.dart'; -import 'started/trivia_started_view.dart'; +import 'trivia_view.dart'; class NavigateToTrivia extends NavigateToCommand { NavigateToTrivia({ @@ -36,54 +31,18 @@ class TriviaPage extends StatelessWidget { const TriviaPage({ Key? key, - required this.onStartPlayTap, - required this.onSeeScoreboardTap, - required this.onCopyJoinLinkTap, - required this.onGoToStatusTap, }) : super(key: key); - final Function(String) onStartPlayTap; - final Function(String) onSeeScoreboardTap; - final Function(String) onCopyJoinLinkTap; - final Function(String, String) onGoToStatusTap; - @override Widget build(BuildContext context) { final triviaId = Get.parameters['trivia_id'] ?? ''; - String? status = Get.parameters['status']; - - late Widget triviaView; - if (status == null) { - triviaView = _TriviaCompleteView( - triviaId: triviaId, - onStartPlayTap: onStartPlayTap, - onSeeScoreboardTap: onSeeScoreboardTap, - onCopyJoinLinkTap: onCopyJoinLinkTap, - onGoToStatusTap: onGoToStatusTap, + //String? status = Get.parameters['status']; + /*TriviaStatus triviaStatus = TriviaStatus.initial; + if (status != null) { + triviaStatus = TriviaStatus.values.firstWhere( + (e) => e.toString() == 'TriviaStatus.$status', ); - } else { - if (status == 'initial') { - triviaView = TriviaInitialStatusView( - triviaId: triviaId, - onCopyJoinLinkTap: onCopyJoinLinkTap, - ); - } - - if (status == 'started') { - triviaView = TriviaStartedStatusView( - triviaId: triviaId, - onStartPlayTap: onStartPlayTap, - onSeeScoreboardTap: onSeeScoreboardTap, - ); - } - - if (status == 'finished') { - triviaView = TriviaFinishedStatusView( - triviaId: triviaId, - onSeeScoreboardTap: onSeeScoreboardTap, - ); - } - } + }*/ return Scaffold( appBar: AppBar( @@ -91,25 +50,30 @@ class TriviaPage extends StatelessWidget { ), body: Column( children: [ - Expanded(child: triviaView), + Expanded( + child: TriviaView( + triviaId: triviaId, + ), + ), ], ), ); } } +/* class _TriviaCompleteView extends StatelessWidget { const _TriviaCompleteView({ Key? key, required this.triviaId, - required this.onCopyJoinLinkTap, required this.onSeeScoreboardTap, required this.onStartPlayTap, required this.onGoToStatusTap, + required this.joinCode, }) : super(key: key); final String triviaId; - final Function(String) onCopyJoinLinkTap; + final String joinCode; final Function(String) onStartPlayTap; final Function(String) onSeeScoreboardTap; final Function(String, String) onGoToStatusTap; @@ -122,6 +86,7 @@ class _TriviaCompleteView extends StatelessWidget { if (index == 0) { return TriviaInitialStatusView( triviaId: triviaId, + joinCode: joinCode, onCopyJoinLinkTap: onCopyJoinLinkTap, ); } @@ -180,3 +145,4 @@ class _TriviaCompleteView extends StatelessWidget { ); } } +*/ diff --git a/example/lib/shared/modules/trivia/trivia_view.dart b/example/lib/shared/modules/trivia/trivia_view.dart new file mode 100644 index 0000000..3992e72 --- /dev/null +++ b/example/lib/shared/modules/trivia/trivia_view.dart @@ -0,0 +1,85 @@ +import 'package:buzz/buzz.dart'; +import 'package:example/shared/modules/trivia/finished/trivia_finished_status_view.dart'; +import 'package:example/shared/modules/trivia/initial/trivia_initial_view.dart'; +import 'package:example/shared/modules/trivia/started/trivia_started_view.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import 'page.dart'; +import 'play/page.dart'; +import 'scoreboard/page.dart'; + +class TriviaView extends StatelessWidget { + const TriviaView({ + Key? key, + required this.triviaId, + }) : super(key: key); + + final String triviaId; + + @override + Widget build(BuildContext context) { + final controller = Get.put(TriviaViewController()); + return Obx(() { + final status = controller.status(); + final joinCode = controller.joinCode(); + + if (status == TriviaStatus.finished) { + return TriviaFinishedStatusView( + triviaId: triviaId, + onSeeScoreboardTap: controller.onSeeScoreboardTap, + ); + } + + if (status == TriviaStatus.started) { + return TriviaStartedStatusView( + triviaId: triviaId, + onStartPlayTap: controller.onStartPlayTap, + onSeeScoreboardTap: controller.onSeeScoreboardTap, + ); + } + + return TriviaInitialStatusView( + triviaId: triviaId, + joinCode: joinCode, + onCopyJoinLinkTap: controller.onCopyJoinLinkTap, + ); + }); + } +} + +class TriviaViewController extends GetxController { + Rx status = TriviaStatus.initial.obs; + Rx joinCode = 'asd-asd1-asd'.obs; + + void copy(String joinLink) async {} + + onStartPlayTap(String triviaId) { + Buzz.fire(NavigateToTriviaPlay(triviaId: triviaId)); + } + + onSeeScoreboardTap(String triviaId) { + Buzz.fire(NavigateToTriviaScoreboard(triviaId: triviaId)); + } + + onCopyJoinLinkTap(String joinLink) async { + await Clipboard.setData(ClipboardData(text: joinLink)); + Get.dialog(const Text('Copied to clipboard')); + } + + onGoToStatusTap(triviaId, status) { + Buzz.fire( + NavigateToTrivia( + triviaId: triviaId, + status: status, + ), + ); + } +} + +enum TriviaStatus { + initial, + started, + finished, +} diff --git a/example/pubspec.lock b/example/pubspec.lock index 061c0b3..180d13f 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -64,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.2" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.2" event_bus: dependency: transitive description: @@ -144,6 +151,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.0" http: dependency: transitive description: @@ -352,6 +366,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + universal_html: + dependency: "direct main" + description: + name: universal_html + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + universal_io: + dependency: transitive + description: + name: universal_io + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" vector_math: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 24b5f26..5c115e4 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_modular: 5.0.2 get_storage: 2.0.3 scrollable_positioned_list: 0.3.4 + universal_html: 2.0.8 core: path: 'packages/core' buzz: