Skip to content

Commit

Permalink
Started new onboarding2 flow [#4826].
Browse files Browse the repository at this point in the history
  • Loading branch information
Mihail Varbanov committed Feb 28, 2025
1 parent 071c51f commit cabfa91
Show file tree
Hide file tree
Showing 5 changed files with 135 additions and 9 deletions.
10 changes: 9 additions & 1 deletion assets/flexUI.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,9 @@
"roles": ["student", "employee", "parent", "fan", "alumni", "visitor"],

"onboarding":["get_started", "video_tutorials", "privacy_statement", "privacy", "notifications_auth", "location_auth", "roles", "login_netid", "login_phone", "verify_phone", "confirm_phone", "profile_info", "sport_prefs", "research_questionnaire"],


"onboarding2":["get_started", "video_tutorial", "roles", "privacy_statement", "privacy_location_services", "privacy_store_activity", "privacy_share_activity", "privacy_level" ],

"campus_guide.features":["athletics", "bus_pass", "dining", "events", "groups", "illini_cash", "illini_id", "laundry", "meal_plan", "my_illini", "quick_polls", "saved"],

"features": ["analytics", "location_services", "personalization", "authentication", "notifications", "payment_information", "sharing",
Expand Down Expand Up @@ -221,6 +223,12 @@
"twitter" : false,
"public_surveys" : false,
"messages" : ["NOT", "${app.storage.debugMessagesDisabled}"],
"onboarding2.video_tutorial" : ["NOT", "${app.storage.onBoarding2PrivacyReturningUser}"],
"onboarding2.privacy_statement" : ["NOT", "${app.storage.onBoarding2PrivacyReturningUser}"],
"onboarding2.privacy_location_services" : ["NOT", "${app.storage.onBoarding2PrivacyReturningUser}"],
"onboarding2.privacy_store_activity" : ["NOT", "${app.storage.onBoarding2PrivacyReturningUser}"],
"onboarding2.privacy_share_activity" : ["NOT", "${app.storage.onBoarding2PrivacyReturningUser}"],
"onboarding2.privacy_level" : ["NOT", "${app.storage.onBoarding2PrivacyReturningUser}"],
"student_courses" : "${config.settings.studentCoursesEnabled}",
"illini_cash" : "${config.settings.wallet.illiniCashEnabled}",
"illini_cash_card" : "${config.settings.wallet.illiniCashEnabled}",
Expand Down
4 changes: 2 additions & 2 deletions lib/mainImpl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ import 'package:illinois/ui/onboarding/OnboardingErrorPanel.dart';
import 'package:illinois/ui/onboarding/OnboardingUpgradePanel.dart';

import 'package:illinois/ui/RootPanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2GetStartedPanel.dart';
import 'package:illinois/ui/settings/SettingsPrivacyPanel.dart';
import 'package:illinois/ui/widgets/FlexContent.dart';

Expand Down Expand Up @@ -162,6 +161,7 @@ void mainImpl({ rokwire.ConfigEnvironment? configEnvironment }) async {
Gateway(),
Places(),
Safety(),
Onboarding2(),
]);

ServiceError? serviceError = await illinois.Services().init();
Expand Down Expand Up @@ -303,7 +303,7 @@ class _AppState extends State<App> with TickerProviderStateMixin implements Noti
return OnboardingUpgradePanel(availableVersion:_upgradeAvailableVersion);
}
else if (Storage().onBoardingPassed != true) {
return Onboarding2GetStartedPanel();
return Onboarding2().first ?? Container();
}
else if ((Storage().privacyUpdateVersion == null) || (AppVersion.compareVersions(Storage().privacyUpdateVersion, Config().appPrivacyVersion) < 0)) {
return SettingsPrivacyPanel(mode: SettingsPrivacyPanelMode.update,);
Expand Down
78 changes: 77 additions & 1 deletion lib/service/Onboarding2.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,20 @@ import 'package:illinois/service/Auth2.dart';
import 'package:illinois/service/FlexUI.dart';
import 'package:illinois/service/Questionnaire.dart';
import 'package:illinois/service/Storage.dart';
import 'package:illinois/ui/onboarding2/Onboarding2GetStartedPanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2ProfileInfoPanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2ResearchQuestionnaireAcknowledgementPanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2ResearchQuestionnairePromptPanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2ResearchQuestionnairePanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2VideoTutorialPanel.dart';
import 'package:rokwire_plugin/service/notification_service.dart';
import 'package:rokwire_plugin/service/service.dart';
import 'package:illinois/ui/onboarding/OnboardingAuthNotificationsPanel.dart';
import 'package:illinois/ui/onboarding/OnboardingLoginNetIdPanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2LoginPhoneOrEmailStatementPanel.dart';


class Onboarding2 with Service {
class Onboarding2 with Service implements NotificationsListener {

static const String notifyFinished = "edu.illinois.rokwire.onboarding.finished";

Expand All @@ -27,6 +29,53 @@ class Onboarding2 with Service {
static final Onboarding2 _instance = Onboarding2._internal();
factory Onboarding2() => _instance;

// Service

@override
void createService() {
NotificationService().subscribe(this,[
FlexUI.notifyChanged,
]);
super.createService();
}

@override
void destroyService() {
NotificationService().unsubscribe(this);
super.destroyService();
}

@override
Future<void> initService() async {
_contentCodes = List<String>.from(_contentSource);
await super.initService();
}

@override
Set<Service> get serviceDependsOn => <Service>{ FlexUI() };

// Notification Listener

@override
void onNotification(String name, dynamic param) {
if (name == FlexUI.notifyChanged) {
_contentCodes = List<String>.from(_contentSource);
}
}

// Content

late List<String> _contentCodes;

@protected
String get flexUIEntry => 'onboarding2';

List<String> get _contentSource => FlexUI()[flexUIEntry]?.cast<String>() ?? <String>[];

// Flow

Widget? get first => _contentCodes.isNotEmpty ? Onboarding2Panel._fromCode(_contentCodes.first) : null;

// Privacy Selection

bool get privacyReturningUser => Storage().onBoarding2PrivacyReturningUser == true;
Expand Down Expand Up @@ -237,6 +286,33 @@ class Onboarding2 with Service {
}
}

class Onboarding2Context {
Onboarding2Context();
}

class Onboarding2Panel {
String get onboardingCode => '';
Onboarding2Context? get onboardingContext => null;

set onboardingProgress(bool value) {}
Future<bool> isOnboardingEnabled() async => true;

static Widget? _fromCode(String code, { Onboarding2Context? context }) {
if (code == "get_started") {
return Onboarding2GetStartedPanel(onboardingCode: code, onboardingContext: context,);
}
else if (code == "video_tutorial") {
return Onboarding2VideoTutorialPanel(onboardingCode: code, onboardingContext: context,);
}
// "", "", "roles", "privacy_statement", "privacy_location_services", "privacy_store_activity", "privacy_share_activity", "privacy_level"
else {
return null;
}
}

}


abstract class Onboarding2ProgressableState {
bool get onboarding2Progress;
set onboarding2Progress(bool progress);
Expand Down
31 changes: 27 additions & 4 deletions lib/ui/onboarding2/Onboarding2GetStartedPanel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,37 @@ import 'package:flutter/material.dart';
import 'package:illinois/service/Analytics.dart';
import 'package:illinois/service/Onboarding2.dart';
import 'package:illinois/ui/onboarding2/Onboarding2VideoTutorialPanel.dart';
import 'package:illinois/utils/AppUtils.dart';
import 'package:rokwire_plugin/service/localization.dart';
import 'package:illinois/ui/onboarding2/Onboadring2RolesPanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2Widgets.dart';
import 'package:rokwire_plugin/ui/widgets/rounded_button.dart';
import 'package:rokwire_plugin/service/styles.dart';
import 'package:rokwire_plugin/ui/widgets/swipe_detector.dart';

class Onboarding2GetStartedPanel extends StatelessWidget {
Onboarding2GetStartedPanel();
class Onboarding2GetStartedPanel extends StatefulWidget with Onboarding2Panel {
final String onboardingCode;
final Onboarding2Context? onboardingContext;
Onboarding2GetStartedPanel({ this.onboardingCode = '', this.onboardingContext }) :
super(key: GlobalKey<_Onboarding2GetStartedPanelState>());

GlobalKey<_Onboarding2GetStartedPanelState>? get globalKey => (super.key is GlobalKey<_Onboarding2GetStartedPanelState>) ?
(super.key as GlobalKey<_Onboarding2GetStartedPanelState>) : null;

@override
set onboardingProgress(bool value) => globalKey?.currentState?.onboardingProgress = value;

@override
Widget build(BuildContext context) {
State<StatefulWidget> createState() => _Onboarding2GetStartedPanelState();
}

return Scaffold(backgroundColor: Styles().colors.background, body:
class _Onboarding2GetStartedPanelState extends State<Onboarding2GetStartedPanel> {

bool _onboardingProgress = false;

@override
Widget build(BuildContext context) =>
Scaffold(backgroundColor: Styles().colors.background, body:
SwipeDetector(onSwipeLeft: () => _onTapContinue(context), child:
Column(children: [
Expanded(child:
Expand All @@ -58,6 +75,7 @@ class Onboarding2GetStartedPanel extends StatelessWidget {
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
borderColor: Styles().colors.fillColorSecondary,
backgroundColor: Styles().colors.white,
progress: _onboardingProgress,
onTap: () => _onTapContinue(context),
),
Onboarding2UnderlinedButton(
Expand All @@ -70,6 +88,11 @@ class Onboarding2GetStartedPanel extends StatelessWidget {
]),
),
);

set onboardingProgress(bool value) {
setStateIfMounted(() {
_onboardingProgress = value;
});
}

void _onReturningUser(BuildContext context){
Expand Down
21 changes: 20 additions & 1 deletion lib/ui/onboarding2/Onboarding2VideoTutorialPanel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import 'package:illinois/model/Video.dart';
import 'package:illinois/service/Analytics.dart';
import 'package:illinois/service/Content.dart';
import 'package:illinois/service/NativeCommunicator.dart';
import 'package:illinois/service/Onboarding2.dart';
import 'package:illinois/ui/onboarding2/Onboadring2RolesPanel.dart';
import 'package:illinois/ui/onboarding2/Onboarding2Widgets.dart';
import 'package:illinois/ui/widgets/LinkButton.dart';
Expand All @@ -39,7 +40,18 @@ import 'package:rokwire_plugin/ui/widgets/swipe_detector.dart';
import 'package:rokwire_plugin/utils/utils.dart';
import 'package:video_player/video_player.dart';

class Onboarding2VideoTutorialPanel extends StatefulWidget {
class Onboarding2VideoTutorialPanel extends StatefulWidget with Onboarding2Panel {
final String onboardingCode;
final Onboarding2Context? onboardingContext;
Onboarding2VideoTutorialPanel({ this.onboardingCode = '', this.onboardingContext }) :
super(key: GlobalKey<_Onboarding2VideoTutorialPanelState>());

GlobalKey<_Onboarding2VideoTutorialPanelState>? get globalKey => (super.key is GlobalKey<_Onboarding2VideoTutorialPanelState>) ?
(super.key as GlobalKey<_Onboarding2VideoTutorialPanelState>) : null;

@override
set onboardingProgress(bool value) => globalKey?.currentState?.onboardingProgress = value;

@override
State<Onboarding2VideoTutorialPanel> createState() => _Onboarding2VideoTutorialPanelState();
}
Expand All @@ -53,6 +65,7 @@ class _Onboarding2VideoTutorialPanelState extends State<Onboarding2VideoTutorial
String? _currentCaptionText;
bool _ccEnabled = false;
bool _ccVisible = false;
bool _onboardingProgress = false;

@override
void initState() {
Expand Down Expand Up @@ -322,6 +335,12 @@ class _Onboarding2VideoTutorialPanelState extends State<Onboarding2VideoTutorial

bool get _isPortrait => (MediaQuery.of(context).orientation == Orientation.portrait);

set onboardingProgress(bool value) {
setStateIfMounted(() {
_onboardingProgress = value;
});
}

// NotificationsListener

@override
Expand Down

0 comments on commit cabfa91

Please sign in to comment.