From f0f5672965452993be5f32f4274f434b28ab292b Mon Sep 17 00:00:00 2001 From: Gabriel Rohden Date: Wed, 5 Aug 2020 00:10:43 -0300 Subject: [PATCH] refactor(frontend): Use TaggerPage to fix GetView issues * This assures we don't end up without a controller instance (get loses it somehow) * Also added theme persistence --- frontend/lib/main.dart | 15 ++++--- frontend/lib/tagger_preferences.dart | 45 +++++++++++++++++++ frontend/lib/ui/pages/home/home_bindings.dart | 11 ----- frontend/lib/ui/pages/home/home_page.dart | 9 ++-- .../lib/ui/pages/home/widgets/sidebar.dart | 5 ++- .../repository_details_bindings.dart | 12 ----- .../repository_details_page.dart | 8 ++-- .../widgets/readme_container.dart | 4 +- .../widgets/tags_container.dart | 7 ++- .../ui/pages/starred/starred_bindings.dart | 9 ---- .../lib/ui/pages/starred/starred_page.dart | 8 ++-- .../tag_repositories_bindings.dart | 9 ---- .../tag_repositories_page.dart | 8 ++-- frontend/lib/ui/pages/tags/tags_bindings.dart | 9 ---- frontend/lib/ui/pages/tags/tags_page.dart | 8 ++-- frontend/lib/ui/utils/tagger_page.dart | 12 +++++ 16 files changed, 104 insertions(+), 75 deletions(-) create mode 100644 frontend/lib/tagger_preferences.dart delete mode 100644 frontend/lib/ui/pages/home/home_bindings.dart delete mode 100644 frontend/lib/ui/pages/repository_details/repository_details_bindings.dart delete mode 100644 frontend/lib/ui/pages/starred/starred_bindings.dart delete mode 100644 frontend/lib/ui/pages/tag_repositories/tag_repositories_bindings.dart delete mode 100644 frontend/lib/ui/pages/tags/tags_bindings.dart create mode 100644 frontend/lib/ui/utils/tagger_page.dart diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index 44d10a9..67b7903 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:repo_tagger/tagger_preferences.dart'; import 'api/tagger/repository_tagger_client.dart'; import 'router.dart'; @@ -83,11 +84,19 @@ class TaggerApp extends StatelessWidget { final Dio dio; final RepositoryTaggerClient taggerClient; + void _initSetup() async { + await taggerPreferences.init(); + final mode = taggerPreferences.themeMode(); + + Get.changeThemeMode(mode); + } + @override Widget build(BuildContext context) { + _initSetup(); + return GetMaterialApp( title: 'Repo Tagger', - themeMode: ThemeMode.dark, theme: ThemeData.light().copyWith( primaryColor: Colors.blue, ), @@ -96,7 +105,6 @@ class TaggerApp extends StatelessWidget { accentColor: Colors.lightBlueAccent, ), initialRoute: Routes.splash, - navigatorKey: Get.key, getPages: [ GetPage( name: Routes.splash, @@ -105,17 +113,14 @@ class TaggerApp extends StatelessWidget { GetPage( name: Routes.home, page: () => HomePage(), - binding: HomeBinding(), ), GetPage( name: Routes.repoDetails, page: () => RepositoryDetailsPage(), - binding: RepositoryDetailsBinding(), ), GetPage( name: Routes.tagRepositories, page: () => TagRepositoriesPage(), - binding: TagRepositoriesBinding(), ), GetPage( name: Routes.login, diff --git a/frontend/lib/tagger_preferences.dart b/frontend/lib/tagger_preferences.dart new file mode 100644 index 0000000..7c8e677 --- /dev/null +++ b/frontend/lib/tagger_preferences.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +const _themeModePref = 'THEME_MODE'; + +final taggerPreferences = _TaggerPreferences(); + +class _TaggerPreferences { + SharedPreferences _sharedInstance; + + Future init() async { + _sharedInstance = await SharedPreferences.getInstance(); + } + + ThemeMode themeMode() { + final mode = _sharedInstance.getString(_themeModePref); + + if (mode == 'dark') { + return ThemeMode.dark; + } + + if (mode == 'light') { + return ThemeMode.light; + } + + return ThemeMode.system; + } + + Future setThemeMode(ThemeMode mode) async { + String modeString; + switch (mode) { + case ThemeMode.system: + modeString = 'system'; + break; + case ThemeMode.light: + modeString = 'light'; + break; + case ThemeMode.dark: + modeString = 'dark'; + break; + } + + await _sharedInstance.setString(_themeModePref, modeString); + } +} diff --git a/frontend/lib/ui/pages/home/home_bindings.dart b/frontend/lib/ui/pages/home/home_bindings.dart deleted file mode 100644 index 62f5e59..0000000 --- a/frontend/lib/ui/pages/home/home_bindings.dart +++ /dev/null @@ -1,11 +0,0 @@ -part of 'home_page.dart'; - -class HomeBinding extends Bindings { - @override - void dependencies() { - TagsBinding().dependencies(); - StarredBinding().dependencies(); - - Get.lazyPut(() => HomeController()); - } -} diff --git a/frontend/lib/ui/pages/home/home_page.dart b/frontend/lib/ui/pages/home/home_page.dart index b6617c8..798316d 100644 --- a/frontend/lib/ui/pages/home/home_page.dart +++ b/frontend/lib/ui/pages/home/home_page.dart @@ -2,16 +2,19 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../templates/three_slot_container.dart'; +import '../../utils/tagger_page.dart'; import '../starred/starred_page.dart'; import '../tags/tags_page.dart'; import 'widgets/sidebar.dart'; import 'widgets/sidebar_button.dart'; -part 'home_bindings.dart'; - part 'home_controller.dart'; -class HomePage extends GetView { +class HomePage extends TaggerPage { + + @override + HomeController provider() => HomeController(); + @override Widget build(BuildContext context) { return GetX( diff --git a/frontend/lib/ui/pages/home/widgets/sidebar.dart b/frontend/lib/ui/pages/home/widgets/sidebar.dart index 6d0982d..d8265f0 100644 --- a/frontend/lib/ui/pages/home/widgets/sidebar.dart +++ b/frontend/lib/ui/pages/home/widgets/sidebar.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:repo_tagger/tagger_preferences.dart'; /// Side bar showed on home route /// it shows the given [content] and a logout button @@ -38,10 +39,12 @@ class Sidebar extends StatelessWidget { title: const Text('Dark theme'), value: Get.isDarkMode, onChanged: (active) { + final mode = active ? ThemeMode.dark : ThemeMode.light; // Theme changing is good, but this is what makes us // see that flutter is not really ready for web, as changing // theme modes causes the page to hang a little - Get.changeThemeMode(active ? ThemeMode.dark : ThemeMode.light); + Get.changeThemeMode(mode); + taggerPreferences.setThemeMode(mode); }, ); } diff --git a/frontend/lib/ui/pages/repository_details/repository_details_bindings.dart b/frontend/lib/ui/pages/repository_details/repository_details_bindings.dart deleted file mode 100644 index 09d7f62..0000000 --- a/frontend/lib/ui/pages/repository_details/repository_details_bindings.dart +++ /dev/null @@ -1,12 +0,0 @@ -part of 'repository_details_page.dart'; - -class RepositoryDetailsBinding extends Bindings { - RepositoryDetailsBinding(); - - @override - void dependencies() { - Get.lazyPut( - () => RepositoryDetailsController(), - ); - } -} diff --git a/frontend/lib/ui/pages/repository_details/repository_details_page.dart b/frontend/lib/ui/pages/repository_details/repository_details_page.dart index 2bcae37..b357934 100644 --- a/frontend/lib/ui/pages/repository_details/repository_details_page.dart +++ b/frontend/lib/ui/pages/repository_details/repository_details_page.dart @@ -10,14 +10,16 @@ import '../../../router.dart'; import '../../molecules/detail_chip.dart'; import '../../molecules/load_page_error.dart'; import '../../utils/browser.dart'; +import '../../utils/tagger_page.dart'; import 'widgets/readme_container.dart'; import 'widgets/tags_container.dart'; -part 'repository_details_bindings.dart'; - part 'repository_details_controller.dart'; -class RepositoryDetailsPage extends GetView { +class RepositoryDetailsPage extends TaggerPage { + @override + RepositoryDetailsController provider() => RepositoryDetailsController(); + @override Widget build(BuildContext context) { return GetX( diff --git a/frontend/lib/ui/pages/repository_details/widgets/readme_container.dart b/frontend/lib/ui/pages/repository_details/widgets/readme_container.dart index 54aca4b..a6403db 100644 --- a/frontend/lib/ui/pages/repository_details/widgets/readme_container.dart +++ b/frontend/lib/ui/pages/repository_details/widgets/readme_container.dart @@ -6,10 +6,10 @@ import 'package:markdown/markdown.dart' as md; import '../repository_details_page.dart'; /// Controls exhibition of the repository readme -/// [RepositoryDetailsController] is required to be injected. -class ReadmeContainer extends GetView { +class ReadmeContainer extends StatelessWidget { @override Widget build(BuildContext context) { + final controller = Get.find(); final repo = controller.repository.value; final readmeContents = repo.readmeContents; diff --git a/frontend/lib/ui/pages/repository_details/widgets/tags_container.dart b/frontend/lib/ui/pages/repository_details/widgets/tags_container.dart index 4d6afb8..4175f09 100644 --- a/frontend/lib/ui/pages/repository_details/widgets/tags_container.dart +++ b/frontend/lib/ui/pages/repository_details/widgets/tags_container.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:repo_tagger/ui/utils/tagger_page.dart'; import '../../../../api/tagger/repository_tagger_client.dart'; import '../../../../external/taggable/taggable.dart'; @@ -7,7 +7,10 @@ import '../repository_details_page.dart'; /// Controls exhibition and creation UI for user tags /// [RepositoryDetailsController] is required to be injected. -class TagsContainer extends GetView { +class TagsContainer extends TaggerPage { + @override + RepositoryDetailsController provider() => RepositoryDetailsController(); + @override Widget build(BuildContext context) { // FIXME: underlying third party lib is applying a really diff --git a/frontend/lib/ui/pages/starred/starred_bindings.dart b/frontend/lib/ui/pages/starred/starred_bindings.dart deleted file mode 100644 index b7807ef..0000000 --- a/frontend/lib/ui/pages/starred/starred_bindings.dart +++ /dev/null @@ -1,9 +0,0 @@ -part of 'starred_page.dart'; - -class StarredBinding extends Bindings { - - @override - void dependencies() { - Get.lazyPut(() => StarredController()); - } -} \ No newline at end of file diff --git a/frontend/lib/ui/pages/starred/starred_page.dart b/frontend/lib/ui/pages/starred/starred_page.dart index 764fd01..188a6b7 100644 --- a/frontend/lib/ui/pages/starred/starred_page.dart +++ b/frontend/lib/ui/pages/starred/starred_page.dart @@ -6,12 +6,14 @@ import '../../../router.dart'; import '../../molecules/load_page_error.dart'; import '../../molecules/page_title.dart'; import '../../templates/repository_list.dart'; - -part 'starred_bindings.dart'; +import '../../utils/tagger_page.dart'; part 'starred_controller.dart'; -class StarredPage extends GetView { +class StarredPage extends TaggerPage { + @override + StarredController provider() => StarredController(); + @override Widget build(BuildContext context) { return GetX( diff --git a/frontend/lib/ui/pages/tag_repositories/tag_repositories_bindings.dart b/frontend/lib/ui/pages/tag_repositories/tag_repositories_bindings.dart deleted file mode 100644 index b5de8e9..0000000 --- a/frontend/lib/ui/pages/tag_repositories/tag_repositories_bindings.dart +++ /dev/null @@ -1,9 +0,0 @@ -part of 'tag_repositories_page.dart'; - -class TagRepositoriesBinding extends Bindings { - - @override - void dependencies() { - Get.lazyPut(() => TagRepositoriesController()); - } -} \ No newline at end of file diff --git a/frontend/lib/ui/pages/tag_repositories/tag_repositories_page.dart b/frontend/lib/ui/pages/tag_repositories/tag_repositories_page.dart index 5d142fb..66afa2f 100644 --- a/frontend/lib/ui/pages/tag_repositories/tag_repositories_page.dart +++ b/frontend/lib/ui/pages/tag_repositories/tag_repositories_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:repo_tagger/ui/utils/tagger_page.dart'; import '../../../api/tagger/repository_tagger_client.dart'; import '../../../router.dart'; @@ -7,11 +8,12 @@ import '../../molecules/load_page_error.dart'; import '../../molecules/page_title.dart'; import '../../templates/repository_list.dart'; -part 'tag_repositories_bindings.dart'; - part 'tag_repositories_controller.dart'; -class TagRepositoriesPage extends GetView { +class TagRepositoriesPage extends TaggerPage { + @override + TagRepositoriesController provider() => TagRepositoriesController(); + @override Widget build(BuildContext context) { return GetX( diff --git a/frontend/lib/ui/pages/tags/tags_bindings.dart b/frontend/lib/ui/pages/tags/tags_bindings.dart deleted file mode 100644 index e50f684..0000000 --- a/frontend/lib/ui/pages/tags/tags_bindings.dart +++ /dev/null @@ -1,9 +0,0 @@ -part of 'tags_page.dart'; - -class TagsBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut( - () => TagsController()); - } -} diff --git a/frontend/lib/ui/pages/tags/tags_page.dart b/frontend/lib/ui/pages/tags/tags_page.dart index 03e04ec..5bf61ab 100644 --- a/frontend/lib/ui/pages/tags/tags_page.dart +++ b/frontend/lib/ui/pages/tags/tags_page.dart @@ -5,12 +5,14 @@ import '../../../api/tagger/repository_tagger_client.dart'; import '../../../router.dart'; import '../../molecules/load_page_error.dart'; import '../../molecules/page_title.dart'; - -part 'tags_bindings.dart'; +import '../../utils/tagger_page.dart'; part 'tags_controller.dart'; -class TagsPage extends GetView { +class TagsPage extends TaggerPage { + @override + TagsController provider() => TagsController(); + @override Widget build(BuildContext context) { return GetX( diff --git a/frontend/lib/ui/utils/tagger_page.dart b/frontend/lib/ui/utils/tagger_page.dart new file mode 100644 index 0000000..9453b13 --- /dev/null +++ b/frontend/lib/ui/utils/tagger_page.dart @@ -0,0 +1,12 @@ +import 'package:flutter/widgets.dart'; +import 'package:get/get.dart'; + +/// Similar to GetView but this one forces a controller instance to be present +/// (get loses itself sometimes) +abstract class TaggerPage extends StatelessWidget { + const TaggerPage({Key key}) : super(key: key); + + T provider(); + + T get controller => Get.put(provider()); +}