diff --git a/lib/app.dart b/lib/app.dart index 2d390e9e..d585dff4 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -7,6 +7,7 @@ import 'package:journal/state_container.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'screens/githostsetup_screens.dart'; +import 'screens/onboarding_screens.dart'; class JournalApp extends StatelessWidget { static FirebaseAnalytics analytics = FirebaseAnalytics(); @@ -24,9 +25,11 @@ class JournalApp extends StatelessWidget { @override Widget build(BuildContext context) { var stateContainer = StateContainer.of(context); - var onCompleted = () { - stateContainer.completeGitHostSetup(); - }; + + var initialRoute = '/'; + if (!stateContainer.appState.onBoardingCompleted) { + initialRoute = '/onBoarding'; + } return MaterialApp( title: 'GitJournal', @@ -38,11 +41,14 @@ class JournalApp extends StatelessWidget { accentColor: Color(0xff6d4c41), ), navigatorObservers: [JournalApp.observer], - initialRoute: '/', + initialRoute: initialRoute, routes: { '/': (context) => HomeScreen(), '/settings': (context) => SettingsScreen(), - '/setupRemoteGit': (context) => GitHostSetupScreen(onCompleted), + '/setupRemoteGit': (context) => + GitHostSetupScreen(stateContainer.completeGitHostSetup), + '/onBoarding': (context) => + OnBoardingScreen(stateContainer.completeOnBoarding), }, debugShowCheckedModeBanner: false, //debugShowMaterialGrid: true, diff --git a/lib/appstate.dart b/lib/appstate.dart index 2b4f7460..86431ed8 100644 --- a/lib/appstate.dart +++ b/lib/appstate.dart @@ -10,6 +10,7 @@ class AppState { bool remoteGitRepoConfigured = false; bool hasJournalEntries = false; + bool onBoardingCompleted = false; // FIXME: Make final String gitBaseDirectory = ""; diff --git a/lib/main.dart b/lib/main.dart index 413b9344..8d851825 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -38,6 +38,7 @@ Future runJournalApp() async { pref.getBool("remoteGitRepoConfigured") ?? false; var localGitRepoPath = pref.getString("localGitRepoPath") ?? ""; var remoteGitRepoPath = pref.getString("remoteGitRepoPath") ?? ""; + var onBoardingCompleted = pref.getBool("onBoardingCompleted") ?? false; if (JournalApp.isInDebugMode) { if (JournalApp.analytics.android != null) { @@ -66,6 +67,7 @@ Future runJournalApp() async { localGitRepoPath: localGitRepoPath, remoteGitRepoPath: remoteGitRepoPath, gitBaseDirectory: dir.path, + onBoardingCompleted: onBoardingCompleted, child: JournalApp(), )); } diff --git a/lib/screens/onboarding_screens.dart b/lib/screens/onboarding_screens.dart new file mode 100644 index 00000000..ebbf5653 --- /dev/null +++ b/lib/screens/onboarding_screens.dart @@ -0,0 +1,76 @@ +import 'package:dots_indicator/dots_indicator.dart'; +import 'package:flutter/material.dart'; + +import 'githostsetup_button.dart'; + +class OnBoardingScreen extends StatefulWidget { + final Function onCompletedFunction; + + OnBoardingScreen(this.onCompletedFunction); + + @override + OnBoardingScreenState createState() { + return OnBoardingScreenState(); + } +} + +class OnBoardingScreenState extends State { + var pageController = PageController(); + int _currentPageIndex = 0; + + Widget _buildPage(String text) { + return Column( + children: [ + Text(text), + GitHostSetupButton( + text: 'Take me to the App', + onPressed: () { + widget.onCompletedFunction(); + + Navigator.pop(context); + Navigator.pushNamed(context, "/"); + }, + ), + ], + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + ); + } + + @override + Widget build(BuildContext context) { + var pages = [ + _buildPage("Page 1"), + _buildPage("Page 2"), + _buildPage("Page 3"), + ]; + var pageView = PageView( + controller: pageController, + children: pages, + onPageChanged: (int pageNum) { + setState(() { + _currentPageIndex = pageNum; + }); + }, + ); + + return Scaffold( + body: Container( + width: double.infinity, + height: double.infinity, + child: Stack( + alignment: FractionalOffset.bottomCenter, + children: [ + pageView, + DotsIndicator( + numberOfDot: pages.length, + position: _currentPageIndex, + dotActiveColor: Theme.of(context).primaryColorDark, + ) + ], + ), + padding: EdgeInsets.all(16.0), + ), + ); + } +} diff --git a/lib/state_container.dart b/lib/state_container.dart index a05a416d..510f2c1c 100644 --- a/lib/state_container.dart +++ b/lib/state_container.dart @@ -19,6 +19,7 @@ class StateContainer extends StatefulWidget { final String localGitRepoPath; final String remoteGitRepoPath; final String gitBaseDirectory; + final bool onBoardingCompleted; StateContainer({ @required this.localGitRepoConfigured, @@ -26,6 +27,7 @@ class StateContainer extends StatefulWidget { @required this.localGitRepoPath, @required this.remoteGitRepoPath, @required this.gitBaseDirectory, + @required this.onBoardingCompleted, @required this.child, }); @@ -43,6 +45,7 @@ class StateContainer extends StatefulWidget { st.appState.localGitRepoPath = localGitRepoPath; st.appState.remoteGitRepoPath = remoteGitRepoPath; st.appState.gitBaseDirectory = gitBaseDirectory; + st.appState.onBoardingCompleted = onBoardingCompleted; return st; } @@ -207,11 +210,19 @@ class StateContainerState extends State { }); } + void completeOnBoarding() { + setState(() { + this.appState.onBoardingCompleted = true; + _persistConfig(); + }); + } + Future _persistConfig() async { var pref = await SharedPreferences.getInstance(); await pref.setBool( "remoteGitRepoConfigured", appState.remoteGitRepoConfigured); await pref.setString("remoteGitRepoPath", appState.remoteGitRepoPath); + await pref.setBool("onBoardingCompleted", appState.onBoardingCompleted); } @override