diff --git a/app/lib/app.dart b/app/lib/app.dart index 33deeab..393b0df 100644 --- a/app/lib/app.dart +++ b/app/lib/app.dart @@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:google_fonts/google_fonts.dart'; import 'features/authentication/register/bloc/user_register_bloc.dart'; +import 'features/main/presentation/bloc/main_cubit.dart'; import 'features/onboarding/presentation/bloc/user_initialization_bloc.dart'; import 'features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart'; import 'features/quiz_registration/presentation/bloc/quiz_registration_cubit.dart'; @@ -29,6 +30,7 @@ class App extends StatelessWidget { OnboardingAuthEvent(), ), ), + BlocProvider(create: (context) => MainCubit()), BlocProvider(create: (context) => QuizExerciseCubit()), BlocProvider(create: (context) => QuizResultCubit()), BlocProvider(create: (context) => QuizStartCubit()), diff --git a/app/lib/features/authentication/register/presentation/pages/_pages.dart b/app/lib/features/authentication/register/presentation/pages/_pages.dart index 6b89244..5f93dc1 100644 --- a/app/lib/features/authentication/register/presentation/pages/_pages.dart +++ b/app/lib/features/authentication/register/presentation/pages/_pages.dart @@ -6,6 +6,7 @@ import '../../../../../core/bases/widgets/layout/bebras_scaffold.dart'; import '../../../../../core/constants/assets.dart'; import '../../../../../core/theme/font_theme.dart'; import '../../../../../services/di.dart'; +import '../../../../main/presentation/bloc/main_cubit.dart'; import '../../bloc/user_register_bloc.dart'; import '../../model/form_item.dart'; import '../widgets/biro_bebras_dropdown.dart'; diff --git a/app/lib/features/authentication/register/presentation/pages/register_page.dart b/app/lib/features/authentication/register/presentation/pages/register_page.dart index 3ea4bcd..ee06603 100644 --- a/app/lib/features/authentication/register/presentation/pages/register_page.dart +++ b/app/lib/features/authentication/register/presentation/pages/register_page.dart @@ -45,6 +45,8 @@ class _RegisterPageState extends State { ), ); + context.read().fetchUser(); + // add notification ScaffoldMessenger.of(context).showSnackBar( const SnackBar( diff --git a/app/lib/features/main/presentation/bloc/main_cubit.dart b/app/lib/features/main/presentation/bloc/main_cubit.dart new file mode 100644 index 0000000..75872b0 --- /dev/null +++ b/app/lib/features/main/presentation/bloc/main_cubit.dart @@ -0,0 +1,28 @@ +import 'package:bloc/bloc.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:meta/meta.dart'; + +import '../../../../services/firebase_service.dart'; + +part 'main_state.dart'; + +class MainCubit extends Cubit { + MainCubit() : super(MainInitial()); + + Future fetchUser() async { + try { + final userSnapshot = await FirebaseFirestore.instance + .collection('registered_user') + .doc(FirebaseService.auth().currentUser?.uid) + .get(); + final userData = userSnapshot.data(); + if (userData != null) { + emit(MainSuccess(userData)); + } else { + throw Exception('User Data cannot be extracted'); + } + } catch (e) { + emit(MainFailed(e.toString())); + } + } +} diff --git a/app/lib/features/main/presentation/bloc/main_state.dart b/app/lib/features/main/presentation/bloc/main_state.dart new file mode 100644 index 0000000..70b89f1 --- /dev/null +++ b/app/lib/features/main/presentation/bloc/main_state.dart @@ -0,0 +1,25 @@ +part of 'main_cubit.dart'; + +@immutable +abstract class MainState {} + +class MainInitial extends MainState {} + +class MainSuccess extends MainState { + final Map userData; + + MainSuccess( + this.userData, + ); + + @override + List get props => [userData]; +} + +class MainFailed extends MainState { + final String error; + + MainFailed(this.error); + @override + List get props => [error]; +} diff --git a/app/lib/features/main/presentation/pages/_pages.dart b/app/lib/features/main/presentation/pages/_pages.dart index 45224cf..6e7af77 100644 --- a/app/lib/features/main/presentation/pages/_pages.dart +++ b/app/lib/features/main/presentation/pages/_pages.dart @@ -1,6 +1,6 @@ -import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:intl/intl.dart'; @@ -11,7 +11,7 @@ import '../../../../core/bases/widgets/atoms/button.dart'; import '../../../../core/bases/widgets/layout/bebras_scaffold.dart'; import '../../../../core/constants/assets.dart'; import '../../../../core/theme/font_theme.dart'; -import '../../../../services/firebase_service.dart'; +import '../bloc/main_cubit.dart'; part 'main_page.dart'; part 'setting_page.dart'; diff --git a/app/lib/features/main/presentation/pages/main_page.dart b/app/lib/features/main/presentation/pages/main_page.dart index 502b0cc..6d3dd3b 100644 --- a/app/lib/features/main/presentation/pages/main_page.dart +++ b/app/lib/features/main/presentation/pages/main_page.dart @@ -15,10 +15,11 @@ class Course { } class _MainPageState extends State { - final registeredUserSnapshot = FirebaseFirestore.instance - .collection('registered_user') - .doc(FirebaseService.auth().currentUser?.uid) - .get(); + @override + void initState() { + context.read().fetchUser(); + super.initState(); + } @override Widget build(BuildContext context) { @@ -37,10 +38,8 @@ class _MainPageState extends State { const SizedBox( height: 40, ), - FutureBuilder( - future: registeredUserSnapshot, - builder: (context, AsyncSnapshot snapshot) { - final useData = snapshot.data?.data(); + BlocBuilder(builder: (context, state) { + if (state is MainSuccess) { return RichText( text: TextSpan( text: 'Selamat Datang\n', @@ -48,15 +47,16 @@ class _MainPageState extends State { children: [ TextSpan( text: toBeginningOfSentenceCase( - '${useData?['name']}!', + '${state.userData['name']}!', ), style: FontTheme.blackTitleBold(), ), ], ), ); - }, - ), + } + return Container(); + }), const SizedBox( height: 30, ), diff --git a/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart b/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart index c88e777..1bf39a3 100644 --- a/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart +++ b/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart @@ -62,6 +62,9 @@ class QuizExerciseCubit extends Cubit { 'Task set for `${participation.challenge_group}` is empty'); } + // Shuffle Problem List + problemIdList.shuffle(); + // TODO(someone): fix the check logic later // if (weeklyQuizParticipant.attempts.isEmpty) { attempt = QuizExerciseAttempt( diff --git a/app/lib/features/quiz_exercise/presentation/pages/quiz_exercise_page.dart b/app/lib/features/quiz_exercise/presentation/pages/quiz_exercise_page.dart index bf29c3e..3e7030f 100644 --- a/app/lib/features/quiz_exercise/presentation/pages/quiz_exercise_page.dart +++ b/app/lib/features/quiz_exercise/presentation/pages/quiz_exercise_page.dart @@ -168,6 +168,8 @@ class _QuizExercisePageState extends State { return state is QuizExerciseShow; }, builder: (context, state) { if (state is QuizExerciseShow) { + // Shuffle Quiz Options + state.quizExercise.question.options?.shuffle(); return Scaffold( backgroundColor: Colors.transparent, body: AlertDialog(