From 0649e202ed887971ec1cb6e8250a637eae1cfbb0 Mon Sep 17 00:00:00 2001 From: sembauke Date: Tue, 18 Jul 2023 16:58:07 +0200 Subject: [PATCH] feat: checkpoint (done for today) --- .../lib/ui/views/learn/block/block_view.dart | 7 ++++- .../ui/views/learn/block/block_viewmodel.dart | 5 ++++ .../ui/views/learn/landing/landing_view.dart | 11 +++++-- .../learn/landing/landing_viewmodel.dart | 29 +++++++++++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/mobile-app/lib/ui/views/learn/block/block_view.dart b/mobile-app/lib/ui/views/learn/block/block_view.dart index 9c5b2282d..48862d6ca 100644 --- a/mobile-app/lib/ui/views/learn/block/block_view.dart +++ b/mobile-app/lib/ui/views/learn/block/block_view.dart @@ -305,8 +305,13 @@ class ChallengeTile extends StatelessWidget { String url = LearnService.baseUrl; + String fullUrl = + '$url/challenges/${block.superBlock.dashedName}/${block.dashedName}/$challengeId.json'; + + model.setLastVisitedChallenge(fullUrl); + model.routeToChallengeView( - '$url/challenges/${block.superBlock.dashedName}/${block.dashedName}/$challengeId.json', + fullUrl, block, challengeId, ); diff --git a/mobile-app/lib/ui/views/learn/block/block_viewmodel.dart b/mobile-app/lib/ui/views/learn/block/block_viewmodel.dart index 1488fe846..028c1044b 100644 --- a/mobile-app/lib/ui/views/learn/block/block_viewmodel.dart +++ b/mobile-app/lib/ui/views/learn/block/block_viewmodel.dart @@ -82,6 +82,11 @@ class BlockViewModel extends BaseViewModel { notifyListeners(); } + void setLastVisitedChallenge(String url) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString('lastVisitedChallenge', url); + } + void routeToChallengeView(String url, Block block, String challengeId) { _navigationService.navigateTo( Routes.challengeView, diff --git a/mobile-app/lib/ui/views/learn/landing/landing_view.dart b/mobile-app/lib/ui/views/learn/landing/landing_view.dart index a8e9196a2..f26ec85e4 100644 --- a/mobile-app/lib/ui/views/learn/landing/landing_view.dart +++ b/mobile-app/lib/ui/views/learn/landing/landing_view.dart @@ -69,7 +69,9 @@ class LearnLandingView extends StatelessWidget { ); }, ), - const ContinueLearningButton(), + ContinueLearningButton( + model: model, + ), const SizedBox(height: 16), FutureBuilder>( future: model.superBlockButtons, @@ -195,8 +197,11 @@ class LearnLandingView extends StatelessWidget { class ContinueLearningButton extends StatelessWidget { const ContinueLearningButton({ Key? key, + required this.model, }) : super(key: key); + final LearnLandingViewModel model; + @override Widget build(BuildContext context) { return Container( @@ -206,7 +211,9 @@ class ContinueLearningButton extends StatelessWidget { ), height: 80, child: ElevatedButton( - onPressed: () {}, + onPressed: () { + model.fastRouteToChallenge(); + }, style: ElevatedButton.styleFrom( backgroundColor: const Color.fromRGBO(0x3b, 0x3b, 0x4f, 1), side: const BorderSide( diff --git a/mobile-app/lib/ui/views/learn/landing/landing_viewmodel.dart b/mobile-app/lib/ui/views/learn/landing/landing_viewmodel.dart index db3c52db1..721e32b66 100644 --- a/mobile-app/lib/ui/views/learn/landing/landing_viewmodel.dart +++ b/mobile-app/lib/ui/views/learn/landing/landing_viewmodel.dart @@ -14,6 +14,7 @@ import 'package:freecodecamp/service/learn/learn_offline_service.dart'; import 'package:freecodecamp/service/learn/learn_service.dart'; import 'package:freecodecamp/ui/widgets/setup_dialog_ui.dart'; import 'package:http/http.dart' as http; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; @@ -34,6 +35,12 @@ class LearnLandingViewModel extends BaseViewModel { Future>? superBlockButtons; + String _challengeUrl = ''; + String get challengeUrl => _challengeUrl; + + bool _hasLastVisitedChallenge = false; + bool get hasLastVisitedChallenge => _hasLastVisitedChallenge; + bool _isLoggedIn = false; bool get isLoggedIn => _isLoggedIn; @@ -42,14 +49,36 @@ class LearnLandingViewModel extends BaseViewModel { notifyListeners(); } + set setHasLastVisitedChallenge(value) { + _hasLastVisitedChallenge = value; + notifyListeners(); + } + + set setChallengeUrl(value) { + _challengeUrl = value; + notifyListeners(); + } + void init(BuildContext context) async { setupDialogUi(); retrieveNewQuote(); initLoggedInListener(); setSuperBlockButtons = getSuperBlocks(); + + retrieveLastVisitedChallenge(); + } + + void retrieveLastVisitedChallenge() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + setHasLastVisitedChallenge = + prefs.getString('lastVisitedChallenge')?.isNotEmpty ?? false; + setChallengeUrl = prefs.getString('lastVisitedChallenge') ?? ''; + notifyListeners(); } + void fastRouteToChallenge() async {} + Future> getSuperBlocks() async { return await _learnOfflineService.hasInternet() ? requestSuperBlocks()