Compare commits

..

No commits in common. "dfaa4de44b89fc1f3ebef7da51a06130ef71320b" and "96c7eece9b0951c30b34d4592772c1cecb091d65" have entirely different histories.

35 changed files with 598 additions and 673 deletions

View File

@ -183,10 +183,13 @@
"welcome_abroad": "እንኳን ደህና መጣህ",
"ready_to_explore": "የግል ትምህርቶችህን ለማሰስ ዝግጁ ነህ።",
"finish": "አጠናቅቅ",
"finish_all_practice_lesson": "ይህን ልምምድ ለመውሰድ የቀድሞውን የትምህርት ልምምድ ያጠናቅቁ",
"finish_all_practice_module": "የሞጁሉን ልምምድ ለመውሰድ የትምህርት ልምምዶችን ያጠናቅቁ",
"finish_all_practice_course": "የኮርሱን ልምምድ ለመውሰድ የሞጁል ልምምዶችን ያጠናቅቁ",
"finish_all_practice_previouse_module": "ይህን ልምምድ ለመውሰድ የቀድሞውን የሞጁል ልምምድ ያጠናቅቁ",
"finish_all_practice_previouse_course": "ይህን ለመውሰድ የቀድሞውን የኮርስ ልምምድ ያጠናቅቁ"
"finish_all_practice": "ልምምዱን ለመውሰድ በትምህርቶቹ ውስጥ ያሉትን ሁሉንም ልምምዶች ያጠናቅቁ።"
}

View File

@ -183,10 +183,5 @@
"welcome_abroad": "Welcome aboard",
"ready_to_explore": "Youre ready to explore your personalized lessons.",
"finish": "Finish",
"finish_all_practice_lesson": "Finish the previous lesson practice to take this practice",
"finish_all_practice_module": "Finish the lesson practices to take the Module Practice",
"finish_all_practice_course": "Finish the Module practices to take the Course practice",
"finish_all_practice_previouse_module": "Finish the previous Module practice to take this practice",
"finish_all_practice_previouse_course": "Finish the previous course practice to take this"
"finish_all_practice": "Finish all the practices in the lessons to take this practice"
}

View File

@ -25,11 +25,6 @@ enum ProgressStatuses { pending, started, completed }
// Duolingo types
enum DuolingoAssessments { speaking, reading, writing, listening }
// Practice reason
enum PracticeReason { course, module, lesson, previousModule, previousCourse }
// State object
enum StateObjects {
none,

View File

@ -38,7 +38,8 @@ class CodegenLoader extends AssetLoader{
"confirm_password": "የይለፍ ቃል ያረጋግጡ",
"eight_character_minimum": "ቢያንስ 8 ፊደላት",
"password_match": "የይለፍ ቃሉ ተመሳስሏል",
"sign_up_agreement": "‘ይመዝገቡ’ የሚለውን ሲጫኑ በ‘አገልግሎት ውሎች’ እና ‘በግላዊነት ፖሊሲ’ ይስማማሉ።",
"sign_up_agreement":
"‘ይመዝገቡ’ የሚለውን ሲጫኑ በ‘አገልግሎት ውሎች’ እና ‘በግላዊነት ፖሊሲ’ ይስማማሉ።",
"terms_of_services": "የአገልግሎት ውሎች",
"and": "እና",
"privacy_policy": "የግላዊነት ፖሊሲ",
@ -137,7 +138,8 @@ class CodegenLoader extends AssetLoader{
"call_our_support": "ከ3 ጠዋት እስከ 12 ማታ ድረስ የድጋፍ ቡድናችንን ይደውሉ",
"tap_to_call": "ለመደወል ይንኩ",
"join_telegram": "በቴሌግራም የይማሩ አካዳሚን ይቀላቀሉ",
"connect_with_support_team": "ለፈጣን እርዳታ እና የማህበረሰብ ዝማኔዎች፣ በቴሌግራም ከድጋፍ ቡድናችን ጋር ወዲያውኑ ይገናኙ።",
"connect_with_support_team":
"ለፈጣን እርዳታ እና የማህበረሰብ ዝማኔዎች፣ በቴሌግራም ከድጋፍ ቡድናችን ጋር ወዲያውኑ ይገናኙ።",
"open_in_telegram": "በቴሌግራም ይክፈቱ",
"search_for": "ፈልጉት",
"current_level": "የአሁኑ ደረጃ",
@ -187,7 +189,8 @@ class CodegenLoader extends AssetLoader{
"evey_one_has_strugle": "ሁሉም ሰው ችግሮች አሉት፣ የአንተን እንጀምር እንፍታ",
"write_your_challenge": "ችግርህን ጻፍ…",
"topic_interest": "በጣም የሚስቡህ ርዕሶች የትኞቹ ናቸው?",
"favourite_topic": "የምትወዳቸው ርዕሶች አስደሳች እና ከሕይወትህ ጋር የተዛመዱ ትምህርቶችን ለመፍጠር ይረዱናል።",
"favourite_topic":
"የምትወዳቸው ርዕሶች አስደሳች እና ከሕይወትህ ጋር የተዛመዱ ትምህርቶችን ለመፍጠር ይረዱናል።",
"your_interest": "ፍላጎትህን ጻፍ…",
"want_quick_assessment": "የእንግሊዝኛ ደረጃህን ለማወቅ ፈጣን ግምገማ ትፈልጋለህ?",
"answer_quick_questions": "የእንግሊዝኛ ችሎታህን ለመረዳት ጥቂት ፈጣን ጥያቄዎችን መልስ።",
@ -199,11 +202,7 @@ class CodegenLoader extends AssetLoader{
"welcome_abroad": "እንኳን ደህና መጣህ",
"ready_to_explore": "የግል ትምህርቶችህን ለማሰስ ዝግጁ ነህ።",
"finish": "አጠናቅቅ",
"finish_all_practice_lesson": "ይህን ልምምድ ለመውሰድ የቀድሞውን የትምህርት ልምምድ ያጠናቅቁ",
"finish_all_practice_module": "የሞጁሉን ልምምድ ለመውሰድ የትምህርት ልምምዶችን ያጠናቅቁ",
"finish_all_practice_course": "የኮርሱን ልምምድ ለመውሰድ የሞጁል ልምምዶችን ያጠናቅቁ",
"finish_all_practice_previouse_module": "ይህን ልምምድ ለመውሰድ የቀድሞውን የሞጁል ልምምድ ያጠናቅቁ",
"finish_all_practice_previouse_course": "ይህን ለመውሰድ የቀድሞውን የኮርስ ልምምድ ያጠናቅቁ"
"finish_all_practice": "ልምምዱን ለመውሰድ በትምህርቶቹ ውስጥ ያሉትን ሁሉንም ልምምዶች ያጠናቅቁ።"
};
static const Map<String, dynamic> _en = {
"loading": "Loading",
@ -223,13 +222,15 @@ static const Map<String,dynamic> _en = {
"login": "Login",
"register_with_google": "Register with Google",
"register_with_phone": "Register with phone number",
"enter_phone_number": "Enter your phone number. We will send you a confirmation code there.",
"enter_phone_number":
"Enter your phone number. We will send you a confirmation code there.",
"login_with_email": "Login with email",
"create_password": "Create password",
"confirm_password": "Confirm password",
"eight_character_minimum": "8 characters minimum",
"password_match": "password match",
"sign_up_agreement": "By clicking Sign Up, you agree to our Terms of Service and Privacy Policy",
"sign_up_agreement":
"By clicking Sign Up, you agree to our Terms of Service and Privacy Policy",
"terms_of_services": "Terms of Service",
"and": "and",
"privacy_policy": "Privacy Policy",
@ -240,7 +241,8 @@ static const Map<String,dynamic> _en = {
"code_sent_to_email": "Code sent to your email",
"resend_code_in": "Resend code in",
"reset_password": "Reset Password",
"enter_email_reset_code": "Enter your email. We will send you a reset code.",
"enter_email_reset_code":
"Enter your email. We will send you a reset code.",
"please_wait": "Please wait",
"reset_code_sent": "Reset code sent successfully",
"reset_code": "Reset code",
@ -281,7 +283,8 @@ static const Map<String,dynamic> _en = {
"cancel": "Cancel",
"you_are_speaking": "You're speaking",
"practice_completed": "Practice completed!",
"great_improvement": "You sound more confident this time, great improvement",
"great_improvement":
"You sound more confident this time, great improvement",
"practice_again": "Practice again",
"conversation_review": "Conversation review",
"result": "Result",
@ -328,7 +331,8 @@ static const Map<String,dynamic> _en = {
"call_our_support": "Call our support team between 9 AM - 6 PM",
"tap_to_call": "Tap to call",
"join_telegram": "Join Yimaru Academy on Telegram",
"connect_with_support_team": "Connect with our support team instantly on Telegram for quick assistance and community updates",
"connect_with_support_team":
"Connect with our support team instantly on Telegram for quick assistance and community updates",
"open_in_telegram": "Open in Telegram",
"search_for": "Search for",
"current_level": "Current Level",
@ -336,18 +340,22 @@ static const Map<String,dynamic> _en = {
"no_practice_available": "No practice available!",
"begin_module_practice": "Begin Module Practice",
"lets_practice_lesson": "Lets Practice",
"lets_quickly_review": "Lets quickly review what youve learned in this module!",
"lets_quickly_review":
"Lets quickly review what youve learned in this module!",
"lets_practice_module": "Let's practice what you just learnt!",
"ask_you_few_actions": "Ill ask you a few questions, and you can respond naturally.",
"ask_you_few_actions":
"Ill ask you a few questions, and you can respond naturally.",
"begin_level_practice": "Begin Level Practice",
"lets_practice_course": "Lets Practice Course",
"lets_quick_review": "Lets quickly review what youve learned in this level!",
"lets_quick_review":
"Lets quickly review what youve learned in this level!",
"speaking": "is speaking...",
"you_have_finished_practice": "You have finished your practice",
"view_results": "View My Results",
"sample_answer": "Sample Answer",
"your_answer": "Your Answer",
"sound_confident": "You sound more confident this time - great improvement!",
"sound_confident":
"You sound more confident this time - great improvement!",
"you_have_completed": "Yay, youve completed",
"yes": "Yes",
"no": "No",
@ -358,15 +366,20 @@ static const Map<String,dynamic> _en = {
"phone_must_start_with": "Phone number must start with 251",
"phone_must_be": "Phone number must be 12 digits",
"what_should_we_call_you": "What should we call you?",
"name_for_personalization": "Well use your name to personalize your learning journey.",
"name_for_personalization":
"Well use your name to personalize your learning journey.",
"choose_your_gender": "Choose your gender?",
"gender_for_personalization": "Well personalize your learning experience based on your gender.",
"gender_for_personalization":
"Well personalize your learning experience based on your gender.",
"age_range": "Which age range are you in?",
"age_for_personalization": "Well personalize your learning experience based on your age.",
"age_for_personalization":
"Well personalize your learning experience based on your age.",
"educational_background": "Whats your current educational level?",
"education_for_personalization": "This helps us tailor your lessons to your experience.",
"education_for_personalization":
"This helps us tailor your lessons to your experience.",
"your_occupation": "Whats your occupation?",
"occupation_for_personalization": "Well personalize your learning experience based on your occupation.",
"occupation_for_personalization":
"Well personalize your learning experience based on your occupation.",
"location": "Where are you from?",
"select_country_region": "Select your country and region from the dropdown",
"select_country": "Select country",
@ -378,10 +391,13 @@ static const Map<String,dynamic> _en = {
"evey_one_has_strugle": "Everyone has struggles, lets start fixing yours",
"write_your_challenge": "Write your challenge…",
"topic_interest": "Which topics interest you most?",
"favourite_topic": "Your favorite topics help us create fun, relatable lessons.",
"favourite_topic":
"Your favorite topics help us create fun, relatable lessons.",
"your_interest": "Write your interest…",
"want_quick_assessment": "Want a quick assessment to know your English level?",
"answer_quick_questions": "Answer a few quick questions to help us understand your English proficiency.",
"want_quick_assessment":
"Want a quick assessment to know your English level?",
"answer_quick_questions":
"Answer a few quick questions to help us understand your English proficiency.",
"skip": "Skip",
"finish_level": "Finish Level",
"likely_speaker": "Youre likely speaker of",
@ -390,11 +406,11 @@ static const Map<String,dynamic> _en = {
"welcome_abroad": "Welcome aboard",
"ready_to_explore": "Youre ready to explore your personalized lessons.",
"finish": "Finish",
"finish_all_practice_lesson": "Finish the previous lesson practice to take this practice",
"finish_all_practice_module": "Finish the lesson practices to take the Module Practice",
"finish_all_practice_course": "Finish the Module practices to take the Course practice",
"finish_all_practice_previouse_module": "Finish the previous Module practice to take this practice",
"finish_all_practice_previouse_course": "Finish the previous course practice to take this"
"finish_all_practice":
"Finish all the practices in the lessons to take this practice"
};
static const Map<String, Map<String, dynamic>> mapLocales = {
"am": _am,
"en": _en
};
static const Map<String, Map<String,dynamic>> mapLocales = {"am": _am, "en": _en};
}

View File

@ -161,7 +161,8 @@ abstract class LocaleKeys {
static const educational_background = 'educational_background';
static const education_for_personalization = 'education_for_personalization';
static const your_occupation = 'your_occupation';
static const occupation_for_personalization = 'occupation_for_personalization';
static const occupation_for_personalization =
'occupation_for_personalization';
static const location = 'location';
static const select_country_region = 'select_country_region';
static const select_country = 'select_country';
@ -185,10 +186,5 @@ abstract class LocaleKeys {
static const welcome_abroad = 'welcome_abroad';
static const ready_to_explore = 'ready_to_explore';
static const finish = 'finish';
static const finish_all_practice_lesson = 'finish_all_practice_lesson';
static const finish_all_practice_module = 'finish_all_practice_module';
static const finish_all_practice_course = 'finish_all_practice_course';
static const finish_all_practice_previouse_module = 'finish_all_practice_previouse_module';
static const finish_all_practice_previouse_course = 'finish_all_practice_previouse_course';
static const finish_all_practice = 'finish_all_practice';
}

View File

@ -53,8 +53,8 @@ class ArifPayViewModel extends ReactiveViewModel {
if (await _statusChecker.checkConnection()) {
Map<String, dynamic> data = {
'plan_id': 1,
'provider': 'CHAPA',
'phone': '251$phone',
'provider': 'ARIFPAY',
'email': 'test@gmail.com',
};

View File

@ -52,9 +52,9 @@ class AssessmentView extends StackedView<AssessmentViewModel> {
];
Widget _buildAssessmentIntroWrapper(AssessmentViewModel viewModel) =>
viewModel.busy(StateObjects.assessments)
viewModel.busy(StateObjects.assessments) || viewModel.assessments.isEmpty
? _buildPageLoadingIndicator(viewModel)
: _buildAssessmentIntro(viewModel);
: _buildAssessmentIntro();
Widget _buildPageLoadingIndicator(AssessmentViewModel viewModel) =>
AssessmentLoadingScreen(
@ -64,10 +64,7 @@ class AssessmentView extends StackedView<AssessmentViewModel> {
onPop: viewModel.assessments.isEmpty ? viewModel.pop : null,
);
Widget _buildAssessmentIntro(AssessmentViewModel viewModel) =>
AssessmentIntroScreen(
hasAssessments: viewModel.assessments.isNotEmpty,
);
Widget _buildAssessmentIntro() => const AssessmentIntroScreen();
Widget _buildAssessment() => const AssessmentQuestionsScreen();

View File

@ -10,9 +10,7 @@ import 'package:yimaru_app/ui/widgets/large_app_bar.dart';
import '../assessment_viewmodel.dart';
class AssessmentIntroScreen extends ViewModelWidget<AssessmentViewModel> {
final bool hasAssessments;
const AssessmentIntroScreen({super.key, required this.hasAssessments});
const AssessmentIntroScreen({super.key});
Future<void> _next(AssessmentViewModel viewModel) async =>
viewModel.setFirstAssessment();
@ -31,8 +29,11 @@ class AssessmentIntroScreen extends ViewModelWidget<AssessmentViewModel> {
children: _buildScaffoldChildren(viewModel),
);
List<Widget> _buildScaffoldChildren(AssessmentViewModel viewModel) =>
[_buildAppBar(viewModel), _buildExpandedBody(viewModel)];
List<Widget> _buildScaffoldChildren(AssessmentViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
Widget _buildExpandedBody(AssessmentViewModel viewModel) =>
Expanded(child: _buildBodyWrapper(viewModel));
@ -58,7 +59,7 @@ class AssessmentIntroScreen extends ViewModelWidget<AssessmentViewModel> {
);
List<Widget> _buildUpperColumnChildren(AssessmentViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),
@ -90,7 +91,7 @@ class AssessmentIntroScreen extends ViewModelWidget<AssessmentViewModel> {
);
List<Widget> _buildLowerColumnChildren(AssessmentViewModel viewModel) => [
if (hasAssessments) _buildContinueButton(viewModel),
_buildContinueButton(viewModel),
verticalSpaceSmall,
_buildSkipButtonWrapper(viewModel)
];

View File

@ -29,6 +29,7 @@ class AssessmentResultScreen extends ViewModelWidget<AssessmentViewModel> {
List<Widget> _buildScaffoldChildren(AssessmentViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];

View File

@ -46,6 +46,7 @@ class StartLessonScreen extends ViewModelWidget<AssessmentViewModel> {
List<Widget> _buildScaffoldChildren(AssessmentViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];

View File

@ -88,6 +88,7 @@ class RequestCodeScreen extends ViewModelWidget<ForgetPasswordViewModel> {
required ForgetPasswordViewModel viewModel}) =>
[
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(context: context, viewModel: viewModel)
];

View File

@ -88,6 +88,7 @@ class ResetPasswordScreen extends ViewModelWidget<ForgetPasswordViewModel> {
List<Widget> _buildScaffoldChildren(ForgetPasswordViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];

View File

@ -24,28 +24,17 @@ class LearnCourseView extends StackedView<LearnCourseViewModel> {
await viewModel.navigateToLearnPractice(
id: course.id ?? 0, level: course.name ?? '');
} else {
if (course.access?.isAccessible ?? false) {
await _showSheet(
context: context,
viewModel: viewModel,
practice: PracticeReason.course);
} else {
await _showSheet(
context: context,
viewModel: viewModel,
practice: PracticeReason.previousCourse);
}
await _showSheet(context: context, viewModel: viewModel);
}
}
Future<void> _showSheet(
{required BuildContext context,
required PracticeReason practice,
required LearnCourseViewModel viewModel}) async =>
await showModalBottomSheet(
context: context,
backgroundColor: kcTransparent,
builder: (_) => _buildSheet(viewModel: viewModel, practice: practice),
builder: (_) => _buildSheet(viewModel),
);
@override
@ -167,11 +156,6 @@ class LearnCourseView extends StackedView<LearnCourseViewModel> {
onPracticeTap: onPracticeTap,
);
Widget _buildSheet(
{required PracticeReason practice,
required LearnCourseViewModel viewModel}) =>
FinishPracticeSheet(
practice: practice,
onTap: viewModel.pop,
);
Widget _buildSheet(LearnCourseViewModel viewModel) =>
FinishPracticeSheet(onTap: viewModel.pop);
}

View File

@ -31,23 +31,15 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
} else {
await _showSheet(context: context, viewModel: viewModel);
}
/*
if (index > 1) {
/* if (index > 1) {
if (viewModel.user?.subscriptionStatus?.toLowerCase() == 'subscribed') {
if (lesson.access?.isAccessible ?? false) {
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
} else {
await _showSheet(context: context, viewModel: viewModel);
}
} else {
await viewModel.navigateToLearnSubscription();
}
} else {
if (lesson.access?.isAccessible ?? false) {
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
} else {
await _showSheet(context: context, viewModel: viewModel);
}
}*/
}
@ -205,8 +197,7 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
style: style18DG700,
);
Widget _buildListViewBuilder(
{required BuildContext context,
Widget _buildListViewBuilder( {required BuildContext context,
required LearnLessonViewModel viewModel}) =>
viewModel.busy(StateObjects.learnLessons)
? _buildProgressIndicator()
@ -216,17 +207,14 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
child: CustomCircularProgressIndicator(color: kcPrimaryColor),
);
Widget _buildListView(
{required BuildContext context,
required LearnLessonViewModel viewModel}) =>
ListView.builder(
Widget _buildListView( {required BuildContext context,
required LearnLessonViewModel viewModel}) => ListView.builder(
shrinkWrap: true,
itemCount: viewModel.lessons.length,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildTile(
index: index,
lesson: viewModel.lessons[index],
last: index == viewModel.lessons.length - 1 ,
onPracticeTap: () async => await _onPractice(
index: index,
context: context,
@ -243,23 +231,18 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
);
Widget _buildTile({
required bool last,
required int index,
required LearnLesson lesson,
required GestureTapCallback? onLessonTap,
required GestureTapCallback? onPracticeTap,
}) =>
LearnLessonTile(
last: last,
index: index,
lesson: lesson,
onLessonTap: onLessonTap,
onPracticeTap: onPracticeTap,
);
Widget _buildSheet(LearnLessonViewModel viewModel) => FinishPracticeSheet(
onTap: viewModel.pop,
practice: PracticeReason.lesson,
);
Widget _buildSheet(LearnLessonViewModel viewModel) =>
FinishPracticeSheet(onTap: viewModel.pop);
}

View File

@ -33,18 +33,13 @@ class LearnLessonDetailView extends StackedView<LearnLessonDetailViewModel> {
required LearnLessonDetailViewModel viewModel}) async {
await viewModel.pause();
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
/*if (index > 1) {
if (viewModel.user?.subscriptionStatus?.toLowerCase() == 'subscribed') {
await viewModel.pause();
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
} else {
await viewModel.pause();
await viewModel.navigateToLearnSubscription();
}
} else {
await viewModel.pause();
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
}*/
}

View File

@ -17,7 +17,6 @@ import 'learn_module_viewmodel.dart';
class LearnModuleView extends StackedView<LearnModuleViewModel> {
final LearnCourse course;
const LearnModuleView({Key? key, required this.course}) : super(key: key);
Future<void> _onPractice(
@ -28,31 +27,17 @@ class LearnModuleView extends StackedView<LearnModuleViewModel> {
await viewModel.navigateToLearnPractice(
id: module.id ?? 0, module: module.name ?? '');
} else {
if (module.access?.isAccessible ?? false) {
print('Accessible');
await _showSheet(
context: context,
viewModel: viewModel,
practice: PracticeReason.module);
} else {
print('Inaccessible');
await _showSheet(
context: context,
viewModel: viewModel,
practice: PracticeReason.previousModule);
}
await _showSheet(context: context, viewModel: viewModel);
}
}
Future<void> _showSheet(
{required BuildContext context,
required PracticeReason practice,
required LearnModuleViewModel viewModel}) async =>
await showModalBottomSheet(
context: context,
backgroundColor: kcTransparent,
builder: (_) => _buildSheet(viewModel: viewModel, practice: practice),
builder: (_) => _buildSheet(viewModel),
);
@override
@ -216,11 +201,6 @@ class LearnModuleView extends StackedView<LearnModuleViewModel> {
onModuleTap: onModuleTap,
onPracticeTap: onPracticeTap);
Widget _buildSheet(
{required PracticeReason practice,
required LearnModuleViewModel viewModel}) =>
FinishPracticeSheet(
practice: practice,
onTap: viewModel.pop,
);
Widget _buildSheet(LearnModuleViewModel viewModel) =>
FinishPracticeSheet(onTap: viewModel.pop);
}

View File

@ -8,8 +8,8 @@ import 'package:yimaru_app/ui/views/onboarding/screens/country_region_form_scree
import 'package:yimaru_app/ui/views/onboarding/screens/educational_background_form_screen.dart';
import 'package:yimaru_app/ui/views/onboarding/screens/full_name_form_screen.dart';
import 'package:yimaru_app/ui/views/onboarding/screens/gender_form_screen.dart';
import 'package:yimaru_app/ui/views/onboarding/screens/learning_goal_form_screen.dart';
import 'package:yimaru_app/ui/views/onboarding/screens/language_goal_form_screen.dart';
import 'package:yimaru_app/ui/views/onboarding/screens/learning_goal_form_screen.dart';
import 'package:yimaru_app/ui/views/onboarding/screens/occupation_form_screen.dart';
import 'package:yimaru_app/ui/views/onboarding/screens/topic_form_screen.dart';
@ -129,9 +129,9 @@ class OnboardingView extends StackedView<OnboardingViewModel>
Widget _buildCountryRegionForm() =>
CountryRegionFormScreen(regionController: regionController);
Widget _buildLearningGoalForm() => const LanguageGoalFormScreens();
Widget _buildLearningGoalForm() => const LearningGoalFormScreen();
Widget _buildLanguageGoalForm() => const LearningGoalFormScreen();
Widget _buildLanguageGoalForm() => const LanguageGoalFormScreen();
Widget _buildChallengeForm() => const ChallengeFormScreen();

View File

@ -243,7 +243,8 @@ class OnboardingViewModel extends ReactiveViewModel
bool isSelectedLearningGoal(FieldOption value) =>
_selectedLearningGoal == value;
// Language goal
// Learning reason
void setSelectedLanguageGoal(FieldOption value) {
_selectedLanguageGoal = value;

View File

@ -43,6 +43,7 @@ class AgeGroupFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -75,7 +76,7 @@ class AgeGroupFormScreen extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),

View File

@ -44,6 +44,7 @@ class ChallengeFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -76,7 +77,7 @@ class ChallengeFormScreen extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),

View File

@ -60,6 +60,7 @@ class CountryRegionFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -92,7 +93,7 @@ class CountryRegionFormScreen extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),

View File

@ -45,6 +45,7 @@ class EducationalBackgroundFormScreen
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -77,7 +78,7 @@ class EducationalBackgroundFormScreen
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),

View File

@ -42,6 +42,7 @@ class FullNameFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -74,7 +75,7 @@ class FullNameFormScreen extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),

View File

@ -42,6 +42,7 @@ class GenderFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -69,7 +70,7 @@ class GenderFormScreen extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),

View File

@ -1,43 +1,16 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:iconsax/iconsax.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/app_colors.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/widgets/custom_elevated_button.dart';
import 'package:yimaru_app/ui/views/onboarding/onboarding_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/custom_large_radio_button.dart';
import 'package:yimaru_app/ui/widgets/custom_small_radio_button.dart';
import 'package:yimaru_app/ui/widgets/large_app_bar.dart';
class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
const LanguageGoalFormScreens({super.key});
IconData getIcon(int index) {
switch (index) {
case 0:
return Iconsax.book;
case 1:
return Iconsax.microphone;
case 2:
return Iconsax.bag;
}
return Icons.book;
}
String getSubtitle(int index) {
switch (index) {
case 0:
return 'I know some English, but i want to learn to speak it';
case 1:
return 'I already speak English, but I want more practice.';
case 2:
return 'I want courses for IELTS, TOEFL, Duolingo, or work';
}
return '';
}
class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
const LanguageGoalFormScreen({super.key});
void _pop(OnboardingViewModel viewModel) {
viewModel.resetLanguageGoalFormScreen();
@ -49,7 +22,6 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
Map<String, dynamic> data = {
'language_goal': viewModel.selectedLanguageGoal?.code,
};
viewModel.addUserData(data);
@ -72,6 +44,7 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -104,10 +77,13 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
_buildTitle(viewModel),
verticalSpaceMedium,
_buildLanguageGoals(viewModel)
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),
verticalSpaceMedium,
_buildReasons(viewModel),
verticalSpaceMedium,
];
Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar(
@ -120,26 +96,22 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
: viewModel.selectedLanguage['code'],
);
Widget _buildTitle(OnboardingViewModel viewModel) => Text.rich(
TextSpan(
text:
'${LocaleKeys.hello.tr()} ${viewModel.userData['first_name']},',
style: style18P600.copyWith(fontSize: 22),
children: [
TextSpan(
text: ' ${LocaleKeys.language_goal.tr()}',
style: style16DG600.copyWith(fontSize: 22),
)
]),
Widget _buildTitle() => Text(
LocaleKeys.language_goal.tr(),
style: style25DG600,
);
Widget _buildLanguageGoals(OnboardingViewModel viewModel) => ListView.builder(
Widget _buildSubtitle() => Text(
LocaleKeys.your_goal.tr(),
style: style14MG400,
);
Widget _buildReasons(OnboardingViewModel viewModel) => ListView.builder(
shrinkWrap: true,
padding: EdgeInsets.zero,
itemCount: viewModel.languageGoals.length,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildLanguageGoal(
icon: getIcon(index),
subtitle: getSubtitle(index),
title: viewModel.languageGoals[index].label ?? '',
selected:
viewModel.isSelectedLanguageGoal(viewModel.languageGoals[index]),
@ -151,14 +123,10 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
Widget _buildLanguageGoal(
{required String title,
required bool selected,
required IconData icon,
required String subtitle,
required GestureTapCallback onTap}) =>
CustomLargeRadioButton(
icon: icon,
CustomSmallRadioButton(
title: title,
onTap: onTap,
subtitle: subtitle,
selected: selected,
);
@ -178,6 +146,5 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
: null,
backgroundColor: viewModel.selectedLanguageGoal != null
? kcPrimaryColor
: kcPrimaryColor.withOpacity(0.1),
);
: kcPrimaryColor.withOpacity(0.1));
}

View File

@ -1,17 +1,54 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:iconsax/iconsax.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/app_colors.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/widgets/custom_elevated_button.dart';
import 'package:yimaru_app/ui/views/onboarding/onboarding_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/custom_small_radio_button.dart';
import 'package:yimaru_app/ui/widgets/custom_large_radio_button.dart';
import 'package:yimaru_app/ui/widgets/large_app_bar.dart';
class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
const LearningGoalFormScreen({super.key});
IconData getIcon(int index) {
switch (index) {
case 0:
return Iconsax.book;
case 1:
return Iconsax.microphone;
case 2:
return Iconsax.bag;
}
return Icons.book;
}
String getTitles(int index) {
switch (index) {
case 0:
return 'Learn to Speak English';
case 1:
return 'Practice Speaking English';
case 2:
return 'Skill-based Courses';
}
return '';
}
String getSubtitle(int index) {
switch (index) {
case 0:
return 'I know some English, but i want to learn to speak it';
case 1:
return 'I already speak English, but I want more practice.';
case 2:
return 'I want courses for IELTS, TOEFL, Duolingo, or work';
}
return '';
}
void _pop(OnboardingViewModel viewModel) {
viewModel.resetLearningGoalFormScreen();
viewModel.goBack();
@ -44,6 +81,7 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -76,13 +114,10 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),
verticalSpaceMedium,
_buildGoals(viewModel),
_buildTitle(viewModel),
verticalSpaceMedium,
_buildLearningGoals(viewModel)
];
Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar(
@ -95,23 +130,27 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
: viewModel.selectedLanguage['code'],
);
Widget _buildTitle() => Text(
LocaleKeys.learning_goal.tr(),
style: style25DG600,
Widget _buildTitle(OnboardingViewModel viewModel) => Text.rich(
TextSpan(
text:
'${LocaleKeys.hello.tr()} ${viewModel.userData['first_name']},',
style: style18P600.copyWith(fontSize: 22),
children: [
TextSpan(
text: ' ${LocaleKeys.learning_goal.tr()}',
style: style16DG600.copyWith(fontSize: 22),
)
]),
);
Widget _buildSubtitle() => Text(
LocaleKeys.your_goal.tr(),
style: style14MG400,
);
Widget _buildGoals(OnboardingViewModel viewModel) => ListView.builder(
Widget _buildLearningGoals(OnboardingViewModel viewModel) => ListView.builder(
shrinkWrap: true,
padding: EdgeInsets.zero,
itemCount: viewModel.learningGoals.length,
itemCount: 3, // viewModel.learningGoals.length,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildLearningGoal(
title: viewModel.learningGoals[index].label ?? '',
icon: getIcon(index),
title: getTitles(index),
subtitle: getSubtitle(index),
selected:
viewModel.isSelectedLearningGoal(viewModel.learningGoals[index]),
onTap: () =>
@ -122,10 +161,14 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
Widget _buildLearningGoal(
{required String title,
required bool selected,
required IconData icon,
required String subtitle,
required GestureTapCallback onTap}) =>
CustomSmallRadioButton(
CustomLargeRadioButton(
icon: icon,
title: title,
onTap: onTap,
subtitle: subtitle,
selected: selected,
);
@ -145,5 +188,6 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
: null,
backgroundColor: viewModel.selectedLearningGoal != null
? kcPrimaryColor
: kcPrimaryColor.withOpacity(0.1));
: kcPrimaryColor.withOpacity(0.1),
);
}

View File

@ -45,6 +45,7 @@ class OccupationFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -77,7 +78,7 @@ class OccupationFormScreen extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),

View File

@ -47,6 +47,7 @@ class TopicFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel)
];
@ -89,7 +90,7 @@ class TopicFormScreen extends ViewModelWidget<OnboardingViewModel> {
);
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
verticalSpaceMedium,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/models/course_lesson.dart';
import 'package:yimaru_app/models/course_module.dart';
import 'package:yimaru_app/ui/common/enmus.dart';
import 'package:yimaru_app/ui/views/course_module/course_module_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/course_lesson_tile.dart';
import 'package:yimaru_app/ui/widgets/custom_linear_progress_indicator.dart';
@ -183,7 +182,6 @@ class CourseModuleTileLarge extends ViewModelWidget<CourseModuleViewModel> {
Widget _buildSheet(CourseModuleViewModel viewModel) => FinishPracticeSheet(
onTap: viewModel.pop,
practice: PracticeReason.lesson,
);
Widget _buildCourseModules(CourseModuleViewModel viewModel) =>

View File

@ -8,7 +8,6 @@ import 'package:yimaru_app/ui/widgets/finish_practice_sheet.dart';
import '../../models/course_catalog.dart';
import '../common/app_colors.dart';
import '../common/enmus.dart';
import '../common/ui_helpers.dart';
import '../views/course_unit/course_unit_viewmodel.dart';
import 'custom_circular_progress_indicator.dart';
@ -229,7 +228,6 @@ class CourseUnitTile extends ViewModelWidget<CourseUnitViewModel> {
Widget _buildSheet(CourseUnitViewModel viewModel) => FinishPracticeSheet(
onTap: viewModel.pop,
practice: PracticeReason.course,
);
Widget _buildCourseModulesState(CourseUnitViewModel viewModel) =>
@ -242,7 +240,6 @@ class CourseUnitTile extends ViewModelWidget<CourseUnitViewModel> {
width: double.maxFinite,
child: _buildProgressIndicator(),
);
Widget _buildProgressIndicator() => const Center(
child: CustomCircularProgressIndicator(color: kcPrimaryColor),
);

View File

@ -2,7 +2,6 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:yimaru_app/ui/common/app_colors.dart';
import 'package:yimaru_app/ui/common/enmus.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/widgets/custom_bottom_sheet.dart';
@ -10,24 +9,9 @@ import 'package:yimaru_app/ui/widgets/custom_bottom_sheet.dart';
import 'custom_elevated_button.dart';
class FinishPracticeSheet extends StatelessWidget {
final PracticeReason practice;
final GestureTapCallback? onTap;
const FinishPracticeSheet({super.key, this.onTap, required this.practice});
String getWarning() {
if (practice == PracticeReason.lesson) {
return LocaleKeys.finish_all_practice_lesson.tr();
} else if (practice == PracticeReason.module) {
return LocaleKeys.finish_all_practice_module.tr();
} else if (practice == PracticeReason.previousModule) {
return LocaleKeys.finish_all_practice_previouse_module.tr();
} else if (practice == PracticeReason.previousCourse) {
return LocaleKeys.finish_all_practice_previouse_course.tr();
} else {
return LocaleKeys.finish_all_practice_course.tr();
}
}
const FinishPracticeSheet({super.key, this.onTap});
@override
Widget build(BuildContext context) => _buildSheetWrapper();
@ -60,7 +44,7 @@ class FinishPracticeSheet extends StatelessWidget {
);
Widget _buildMessage() => Text(
getWarning(),
LocaleKeys.finish_all_practice.tr(),
style: style16DG600,
textAlign: TextAlign.center,
);

View File

@ -24,13 +24,7 @@ class LearnCourseTile extends ViewModelWidget<LearnCourseViewModel> {
@override
Widget build(BuildContext context, LearnCourseViewModel viewModel) =>
_buildExpansionTileCardWrapper(viewModel);
Widget _buildExpansionTileCardWrapper(LearnCourseViewModel viewModel)=> GestureDetector(
onTap: !(course.access?.isAccessible ?? false) ? onPracticeTap:null,
child: _buildExpansionTileCard(viewModel),
);
_buildExpansionTileCard(viewModel);
Widget _buildExpansionTileCard(LearnCourseViewModel viewModel) => Container(
margin: const EdgeInsets.only(bottom: 15),

View File

@ -16,7 +16,6 @@ import 'custom_linear_progress_indicator.dart';
class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
final int index;
final bool last;
final LearnLesson lesson;
final GestureTapCallback? onLessonTap;
final GestureTapCallback? onPracticeTap;
@ -25,7 +24,6 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
{super.key,
this.onLessonTap,
this.onPracticeTap,
required this.last,
required this.index,
required this.lesson});
@ -33,12 +31,10 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
Widget build(BuildContext context, LearnLessonViewModel viewModel) =>
_buildContainerWrapper(viewModel);
Widget _buildContainerWrapper(LearnLessonViewModel viewModel) =>
GestureDetector(
Widget _buildContainerWrapper(LearnLessonViewModel viewModel)=> GestureDetector(
onTap: !(lesson.access?.isAccessible ?? false) ? onPracticeTap:null,
child: _buildContainer(viewModel),
);
Widget _buildContainer(LearnLessonViewModel viewModel) => Container(
width: double.maxFinite,
margin: const EdgeInsets.only(bottom: 15),
@ -74,14 +70,12 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
controlAffinity: ListTileControlAffinity.trailing,
expandedCrossAxisAlignment: CrossAxisAlignment.start,
tilePadding: const EdgeInsets.fromLTRB(15, 15, 15, 15),
backgroundColor: (lesson.access?.isCompleted ?? false)
? kcGreen.withOpacity(0.1)
: kcPrimaryColor.withOpacity(0.1),
childrenPadding: const EdgeInsets.fromLTRB(15, 0, 15, 15),
initiallyExpanded: (lesson.access?.isAccessible ?? false) &&
!(lesson.access?.isCompleted ?? false),
backgroundColor: last && (lesson.access?.isAccessible ?? false)
? kcGreen.withOpacity(0.1)
: (lesson.access?.isCompleted ?? false)
? kcGreen.withOpacity(0.1)
: kcPrimaryColor.withOpacity(0.1),
collapsedBackgroundColor: (lesson.access?.isCompleted ?? false)
? kcGreen.withOpacity(0.1)
: kcPrimaryColor.withOpacity(0.1),
@ -98,9 +92,7 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
style: style16DG600,
);
Widget _buildIconState() => last && (lesson.access?.isAccessible ?? false)
? _buildCompleteIcon()
: (lesson.access?.isCompleted ?? false)
Widget _buildIconState() => (lesson.access?.isCompleted ?? false)
? _buildCompleteIcon()
: _buildPendingIcon();
@ -136,15 +128,11 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
Widget _buildProgress() => CustomLinearProgressIndicator(
activeColor: kcPrimaryColor,
backgroundColor: kcVeryLightGrey,
progress: last && (lesson.access?.isAccessible ?? false)
? 1
: (lesson.access?.progressPercent ?? 0) / 100,
progress: (lesson.access?.progressPercent ?? 0) / 100,
);
Widget _buildProgressText() => Text(
last && (lesson.access?.isAccessible ?? false)
? LocaleKeys.completed.tr()
: (lesson.access?.isCompleted ?? false)
(lesson.access?.isCompleted ?? false)
? LocaleKeys.completed.tr()
: LocaleKeys.in_progress.tr(),
style: style14P600,

View File

@ -23,13 +23,8 @@ class LearnModuleTile extends ViewModelWidget<LearnModuleViewModel> {
@override
Widget build(BuildContext context, LearnModuleViewModel viewModel) =>
_buildExpansionTileCardWrapper(context: context, viewModel: viewModel);
_buildExpansionTileCard(context: context, viewModel: viewModel);
Widget _buildExpansionTileCardWrapper( {required BuildContext context,
required LearnModuleViewModel viewModel})=> GestureDetector(
onTap: !(module.access?.isAccessible ?? false) ? onPracticeTap:null,
child: _buildExpansionTileCard(context: context,viewModel: viewModel),
);
Widget _buildExpansionTileCard(
{required BuildContext context,
required LearnModuleViewModel viewModel}) =>

View File

@ -1,5 +1,5 @@
name: yimaru_app
version: 0.1.29+31
version: 0.1.28+30
publish_to: 'none'
description: A new Flutter project.