Compare commits

...

3 Commits

Author SHA1 Message Date
5581d00b15 Merge branch 'release/0.1.29'
-fix(learn): Fix progress tracking issue without payment implementation
2026-05-29 23:14:36 +03:00
d4e46d5ddb fix(learn): Fix progress tracking issue without payment implementation 2026-05-29 23:13:12 +03:00
96c7eece9b Merge tag '0.1.28' into develop
-fix(learn): Fix lesson lock logic issue
2026-05-29 16:17:14 +03:00
35 changed files with 673 additions and 598 deletions

View File

@ -22,7 +22,7 @@
"confirm_password": "የይለፍ ቃል ያረጋግጡ", "confirm_password": "የይለፍ ቃል ያረጋግጡ",
"eight_character_minimum": "ቢያንስ 8 ፊደላት", "eight_character_minimum": "ቢያንስ 8 ፊደላት",
"password_match": "የይለፍ ቃሉ ተመሳስሏል", "password_match": "የይለፍ ቃሉ ተመሳስሏል",
"sign_up_agreement": "‘ይመዝገቡ’ የሚለውን ሲጫኑ በ‘አገልግሎት ውሎች’ እና ‘በግላዊነት ፖሊሲ’ ይስማማሉ።" , "sign_up_agreement": "‘ይመዝገቡ’ የሚለውን ሲጫኑ በ‘አገልግሎት ውሎች’ እና ‘በግላዊነት ፖሊሲ’ ይስማማሉ።",
"terms_of_services": "የአገልግሎት ውሎች", "terms_of_services": "የአገልግሎት ውሎች",
"and": "እና", "and": "እና",
"privacy_policy": "የግላዊነት ፖሊሲ", "privacy_policy": "የግላዊነት ፖሊሲ",
@ -33,9 +33,9 @@
"code_sent_to_email": "ኮዱ ወደ ኢሜል ተልኳል", "code_sent_to_email": "ኮዱ ወደ ኢሜል ተልኳል",
"resend_code_in": "ኮዱን እንደገና ለመላክ የቀረው ጊዜ", "resend_code_in": "ኮዱን እንደገና ለመላክ የቀረው ጊዜ",
"reset_password": " የይለፍ ቃልን ይቀይሩ", "reset_password": " የይለፍ ቃልን ይቀይሩ",
"enter_email_reset_code": "ኢሜይልዎን ያስገቡ። የይለፍ ቃል መለወጫ ኮድ እንልክልዎታለን።" , "enter_email_reset_code": "ኢሜይልዎን ያስገቡ። የይለፍ ቃል መለወጫ ኮድ እንልክልዎታለን።",
"please_wait": "እባክዎ ይጠብቁ", "please_wait": "እባክዎ ይጠብቁ",
"reset_code_sent": "የመቀየሪያ ኮድ በተሳካ ሁኔታ ተልኳል" , "reset_code_sent": "የመቀየሪያ ኮድ በተሳካ ሁኔታ ተልኳል",
"reset_code": " የመቀየሪያ ኮድ ", "reset_code": " የመቀየሪያ ኮድ ",
"new_password": "አዲስ የይለፍ ቃል", "new_password": "አዲስ የይለፍ ቃል",
"logged_in_successfully": "በተሳካ ሁኔታ ገብተዋል", "logged_in_successfully": "በተሳካ ሁኔታ ገብተዋል",
@ -183,13 +183,10 @@
"welcome_abroad": "እንኳን ደህና መጣህ", "welcome_abroad": "እንኳን ደህና መጣህ",
"ready_to_explore": "የግል ትምህርቶችህን ለማሰስ ዝግጁ ነህ።", "ready_to_explore": "የግል ትምህርቶችህን ለማሰስ ዝግጁ ነህ።",
"finish": "አጠናቅቅ", "finish": "አጠናቅቅ",
"finish_all_practice_lesson": "ይህን ልምምድ ለመውሰድ የቀድሞውን የትምህርት ልምምድ ያጠናቅቁ",
"finish_all_practice": "ልምምዱን ለመውሰድ በትምህርቶቹ ውስጥ ያሉትን ሁሉንም ልምምዶች ያጠናቅቁ።" "finish_all_practice_module": "የሞጁሉን ልምምድ ለመውሰድ የትምህርት ልምምዶችን ያጠናቅቁ",
"finish_all_practice_course": "የኮርሱን ልምምድ ለመውሰድ የሞጁል ልምምዶችን ያጠናቅቁ",
"finish_all_practice_previouse_module": "ይህን ልምምድ ለመውሰድ የቀድሞውን የሞጁል ልምምድ ያጠናቅቁ",
"finish_all_practice_previouse_course": "ይህን ለመውሰድ የቀድሞውን የኮርስ ልምምድ ያጠናቅቁ"
} }

View File

@ -183,5 +183,10 @@
"welcome_abroad": "Welcome aboard", "welcome_abroad": "Welcome aboard",
"ready_to_explore": "Youre ready to explore your personalized lessons.", "ready_to_explore": "Youre ready to explore your personalized lessons.",
"finish": "Finish", "finish": "Finish",
"finish_all_practice": "Finish all the practices in the lessons to take this practice" "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"
} }

View File

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

View File

@ -6,7 +6,7 @@ import 'dart:ui';
import 'package:easy_localization/easy_localization.dart' show AssetLoader; import 'package:easy_localization/easy_localization.dart' show AssetLoader;
class CodegenLoader extends AssetLoader { class CodegenLoader extends AssetLoader{
const CodegenLoader(); const CodegenLoader();
@override @override
@ -14,403 +14,387 @@ class CodegenLoader extends AssetLoader {
return Future.value(mapLocales[locale.toString()]); return Future.value(mapLocales[locale.toString()]);
} }
static const Map<String, dynamic> _am = { static const Map<String,dynamic> _am = {
"loading": "በመጫን ላይ", "loading": "በመጫን ላይ",
"welcome_back": "እንኳን በደህና ተመለሱ", "welcome_back": "እንኳን በደህና ተመለሱ",
"checking_user_info": "የተጠቃሚ መረጃን በማረጋገጥ ላይ", "checking_user_info": "የተጠቃሚ መረጃን በማረጋገጥ ላይ",
"dont_have_account": "መለያ የለዎትም?", "dont_have_account": "መለያ የለዎትም?",
"email": "ኢሜይል", "email": "ኢሜይል",
"password": "የይለፍ ቃል", "password": "የይለፍ ቃል",
"forgot_password": "የይለፍ ቃል ረሱ?", "forgot_password": "የይለፍ ቃል ረሱ?",
"cont": "ቀጥል", "cont": "ቀጥል",
"register": "ይመዝገቡ", "register": "ይመዝገቡ",
"login_with_google": "በጉግል ይግቡ", "login_with_google": "በጉግል ይግቡ",
"or": "ወይም", "or": "ወይም",
"login_with_phone": "በስልክ ቁጥር ይግቡ", "login_with_phone": "በስልክ ቁጥር ይግቡ",
"create_account": "አዲስ መለያ ይፍጠሩ", "create_account": "አዲስ መለያ ይፍጠሩ",
"already_have_account": "መለያ አለዎት?", "already_have_account": "መለያ አለዎት?",
"login": " ይግቡ ", "login": " ይግቡ ",
"register_with_google": "በጉግል ይመዝገቡ", "register_with_google": "በጉግል ይመዝገቡ",
"register_with_phone": "በስልክ ቁጥር ይመዝገቡ", "register_with_phone": "በስልክ ቁጥር ይመዝገቡ",
"enter_phone_number": "የስልክ ቁጥርዎን ያስገቡ። የማረጋገጫ ኮድ እንልክልዎታለን።", "enter_phone_number": "የስልክ ቁጥርዎን ያስገቡ። የማረጋገጫ ኮድ እንልክልዎታለን።",
"login_with_email": "በኢሜይል ይግቡ", "login_with_email": "በኢሜይል ይግቡ",
"create_password": "የይለፍ ቃል ይፍጠሩ", "create_password": "የይለፍ ቃል ይፍጠሩ",
"confirm_password": "የይለፍ ቃል ያረጋግጡ", "confirm_password": "የይለፍ ቃል ያረጋግጡ",
"eight_character_minimum": "ቢያንስ 8 ፊደላት", "eight_character_minimum": "ቢያንስ 8 ፊደላት",
"password_match": "የይለፍ ቃሉ ተመሳስሏል", "password_match": "የይለፍ ቃሉ ተመሳስሏል",
"sign_up_agreement": "sign_up_agreement": "‘ይመዝገቡ’ የሚለውን ሲጫኑ በ‘አገልግሎት ውሎች’ እና ‘በግላዊነት ፖሊሲ’ ይስማማሉ።",
"‘ይመዝገቡ’ የሚለውን ሲጫኑ በ‘አገልግሎት ውሎች’ እና ‘በግላዊነት ፖሊሲ’ ይስማማሉ።", "terms_of_services": "የአገልግሎት ውሎች",
"terms_of_services": "የአገልግሎት ውሎች", "and": "እና",
"and": "እና", "privacy_policy": "የግላዊነት ፖሊሲ",
"privacy_policy": "የግላዊነት ፖሊሲ", "register_with_email": "በኢሜል ይመዝገቡ",
"register_with_email": "በኢሜል ይመዝገቡ", "verification_code": "የማረጋገጫ ኮድ",
"verification_code": "የማረጋገጫ ኮድ", "resend_code": "ኮዱን እንደገና ላክ",
"resend_code": "ኮዱን እንደገና ላክ", "code_sent_to_phone": "ኮዱ ወደ ስልክ ቁጥርዎ ተልኳል",
"code_sent_to_phone": "ኮዱ ወደ ስልክ ቁጥርዎ ተልኳል", "code_sent_to_email": "ኮዱ ወደ ኢሜል ተልኳል",
"code_sent_to_email": "ኮዱ ወደ ኢሜል ተልኳል", "resend_code_in": "ኮዱን እንደገና ለመላክ የቀረው ጊዜ",
"resend_code_in": "ኮዱን እንደገና ለመላክ የቀረው ጊዜ", "reset_password": " የይለፍ ቃልን ይቀይሩ",
"reset_password": " የይለፍ ቃልን ይቀይሩ", "enter_email_reset_code": "ኢሜይልዎን ያስገቡ። የይለፍ ቃል መለወጫ ኮድ እንልክልዎታለን።",
"enter_email_reset_code": "ኢሜይልዎን ያስገቡ። የይለፍ ቃል መለወጫ ኮድ እንልክልዎታለን።", "please_wait": "እባክዎ ይጠብቁ",
"please_wait": "እባክዎ ይጠብቁ", "reset_code_sent": "የመቀየሪያ ኮድ በተሳካ ሁኔታ ተልኳል",
"reset_code_sent": "የመቀየሪያ ኮድ በተሳካ ሁኔታ ተልኳል", "reset_code": " የመቀየሪያ ኮድ ",
"reset_code": " የመቀየሪያ ኮድ ", "new_password": "አዲስ የይለፍ ቃል",
"new_password": "አዲስ የይለፍ ቃል", "logged_in_successfully": "በተሳካ ሁኔታ ገብተዋል",
"logged_in_successfully": "በተሳካ ሁኔታ ገብተዋል", "view_course": " ኮርሱን ይመልከቱ",
"view_course": " ኮርሱን ይመልከቱ", "continue_learning": "መማርን ይቀጥሉ",
"continue_learning": "መማርን ይቀጥሉ", "start_learning": "ትምህርትን ይጀምሩ",
"start_learning": "ትምህርትን ይጀምሩ", "completed": "ተጠናቋል",
"completed": "ተጠናቋል", "take_practice": "ልምምድ ያድርጉ",
"take_practice": "ልምምድ ያድርጉ", "your_current_level": "የአሁኑ ደረጃዎ",
"your_current_level": "የአሁኑ ደረጃዎ", "overall_progress": "አጠቃላይ እድገት",
"overall_progress": "አጠቃላይ እድገት", "great_work": "በርቱ! በጣም ጥሩ እየሰሩ ነው",
"great_work": "በርቱ! በጣም ጥሩ እየሰሩ ነው", "view_module": "ሞጁሉን ይመልከቱ",
"view_module": "ሞጁሉን ይመልከቱ", "progress": "እድገት",
"progress": "እድገት", "keep_going": "ይቀጥሉ - ከግማሽ በላይ ጨርሰዋል ",
"keep_going": "ይቀጥሉ - ከግማሽ በላይ ጨርሰዋል ", "lessons_in_module": "በዚህ ሞጁል ውስጥ ያሉ ትምህርቶች ",
"lessons_in_module": "በዚህ ሞጁል ውስጥ ያሉ ትምህርቶች ", "practice": "ልምምድ",
"practice": "ልምምድ", "start": "ጀምር",
"start": "ጀምር", "in_progress": "በሂደት ላይ",
"in_progress": "በሂደት ላይ", "hello": "ሰላም",
"hello": "ሰላም", "ready_to_learn": " ዛሬ እንግሊዝኛ ለመማር ተዘጋጅተዋል? ",
"ready_to_learn": " ዛሬ እንግሊዝኛ ለመማር ተዘጋጅተዋል? ", "learn": "ይማሩ ",
"learn": "ይማሩ ", "course": "ኮርስ",
"course": "ኮርስ", "profile": " ፕሮፋይል ",
"profile": " ፕሮፋይል ", "speaking_partner": "የንግግር ጓደኛ",
"speaking_partner": "የንግግር ጓደኛ", "practice_what_you_learned": "አሁን የተማሩትን እንለማመድ",
"practice_what_you_learned": "አሁን የተማሩትን እንለማመድ", "practice_questions": "ጥቂት ጥያቄዎችን እጠይቃለሁ እና መልስ መስጠት ይችላሉ",
"practice_questions": "ጥቂት ጥያቄዎችን እጠይቃለሁ እና መልስ መስጠት ይችላሉ", "start_practice": "ልምምድ ጀምር",
"start_practice": "ልምምድ ጀምር", "almost_there": "ሊጨርሱ ተቃርበዋል",
"almost_there": "ሊጨርሱ ተቃርበዋል", "finish_session": "እድገትዎን ለማየት ክፍለ ጊዜውን ያጠናቅቁ",
"finish_session": "እድገትዎን ለማየት ክፍለ ጊዜውን ያጠናቅቁ", "continue_practice": "ልምምዱን ይቀጥሉ",
"continue_practice": "ልምምዱን ይቀጥሉ", "end_session": "ክፍለ ጊዜውን ያብቁ ",
"end_session": "ክፍለ ጊዜውን ያብቁ ", "tap_start_to_listen": "ለማዳመጥ የጀምር ቁልፉን ይጫኑ",
"tap_start_to_listen": "ለማዳመጥ የጀምር ቁልፉን ይጫኑ", "practice_speaking": "ንግግርን ይለማመዱ",
"practice_speaking": "ንግግርን ይለማመዱ", "tap_microphone": "ለመናገር ማይክሮፎኑን ይጫኑ",
"tap_microphone": "ለመናገር ማይክሮፎኑን ይጫኑ", "reply": "እንደገና አዳምጥ",
"reply": "እንደገና አዳምጥ", "cancel": "ይቅር",
"cancel": "ይቅር", "you_are_speaking": "እየተናገሩ ነው",
"you_are_speaking": "እየተናገሩ ነው", "practice_completed": "ልምምዱ ተጠናቅቋል",
"practice_completed": "ልምምዱ ተጠናቅቋል", "great_improvement": "በዚህኛው በራስ መተማመንዎ ጨምሯል፤ ትልቅ መሻሻል ነው",
"great_improvement": "በዚህኛው በራስ መተማመንዎ ጨምሯል፤ ትልቅ መሻሻል ነው", "practice_again": "እንደገና ይለማመዱ",
"practice_again": "እንደገና ይለማመዱ", "conversation_review": "የንግግር ግምገማ",
"conversation_review": "የንግግር ግምገማ", "result": "ውጤት",
"result": "ውጤት", "quick_tip": "ጠቃሚ ምክር",
"quick_tip": "ጠቃሚ ምክር", "retry": "እንደገና ይሞክሩ",
"retry": "እንደገና ይሞክሩ", "completed_a1": "እንኳን ደስ አለዎት! A1 ደረጃን አጠናቅቀዋል",
"completed_a1": "እንኳን ደስ አለዎት! A1 ደረጃን አጠናቅቀዋል", "analyzing_speaking": "የንግግር ችሎታዎን እየገመገምን ነው",
"analyzing_speaking": "የንግግር ችሎታዎን እየገመገምን ነው", "view_profile": "ፕሮፋይሎን ይመልከቱ ",
"view_profile": "ፕሮፋይሎን ይመልከቱ ", "hi": "ሰላም",
"hi": "ሰላም", "edit_profile": "መገለጫ ያስተካክሉ",
"edit_profile": "መገለጫ ያስተካክሉ", "first_name": "የመጀመሪያ ስም",
"first_name": "የመጀመሪያ ስም", "last_name": "የአባት ስም",
"last_name": "የአባት ስም", "gender": "ፆታ",
"gender": "ፆታ", "male": "ወንድ",
"male": "ወንድ", "female": "ሴት",
"female": "ሴት", "phone_number": "የስልክ ቁጥር",
"phone_number": "የስልክ ቁጥር", "country": "ሀገር",
"country": "ሀገር", "region": "ክልል",
"region": "ክልል", "select_region": "ክልል ይምረጡ",
"select_region": "ክልል ይምረጡ", "enter_your_city": "ከተማዎን ያስገቡ",
"enter_your_city": "ከተማዎን ያስገቡ", "occupation": "የስራ መስክ",
"occupation": "የስራ መስክ", "select_occupation": "ሙያዎን ይምረጡ",
"select_occupation": "ሙያዎን ይምረጡ", "save_changes": "ለውጦችን ያስቀምጡ",
"save_changes": "ለውጦችን ያስቀምጡ", "my_progress": "የእኔ እድገት",
"my_progress": "የእኔ እድገት", "track_your_achievement": "ስኬቶችዎን እና ተከታታይ የትምህርት ጉዞዎን ይከታተሉ",
"track_your_achievement": "ስኬቶችዎን እና ተከታታይ የትምህርት ጉዞዎን ይከታተሉ", "account_and_privacy": "መለያ እና ግላዊነት",
"account_and_privacy": "መለያ እና ግላዊነት", "manage_settings": "ቅንብሮችን እና የመተግበሪያ ምርጫዎችን ያስተዳድሩ",
"manage_settings": "ቅንብሮችን እና የመተግበሪያ ምርጫዎችን ያስተዳድሩ", "support": "ድጋፍ",
"support": "ድጋፍ", "get_help": "በስልክ ወይም በቴሌግራም እገዛ ያግኙ",
"get_help": "በስልክ ወይም በቴሌግራም እገዛ ያግኙ", "logout": "ውጣ",
"logout": "ውጣ", "app_settings": "የመተግበሪያ ቅንብሮች",
"app_settings": "የመተግበሪያ ቅንብሮች", "legal_and_information": "ሕጋዊ እና መረጃ",
"legal_and_information": "ሕጋዊ እና መረጃ", "change_language": "ቋንቋ ቀይር",
"change_language": "ቋንቋ ቀይር", "terms_and_conditions": "ውሎች እና ሁኔታዎች",
"terms_and_conditions": "ውሎች እና ሁኔታዎች", "delete_account": "መለያ ሰርዝ",
"delete_account": "መለያ ሰርዝ", "language_preference": "የቋንቋ ምርጫ",
"language_preference": "የቋንቋ ምርጫ", "choose_your_language": "ለውጦችን አስቀምጥ",
"choose_your_language": "ለውጦችን አስቀምጥ", "switch_language_anytime": "ቋንቋዎችን በማንኛውም ጊዜ መቀየር ይችላሉ",
"switch_language_anytime": "ቋንቋዎችን በማንኛውም ጊዜ መቀየር ይችላሉ", "need_help": "እገዛ ይፈልጋሉ?",
"need_help": "እገዛ ይፈልጋሉ?", "call_support": "የስልክ ድጋፍ",
"call_support": "የስልክ ድጋፍ", "talk_with_support": "በቀጥታ ከድጋፍ ቡድናችን ጋር ይነጋገሩ",
"talk_with_support": "በቀጥታ ከድጋፍ ቡድናችን ጋር ይነጋገሩ", "telegram_support": "የቴሌግራም ድጋፍ",
"telegram_support": "የቴሌግራም ድጋፍ", "chat_via_telegram": "በቴሌግራም በፍጥነት ይወያዩ",
"chat_via_telegram": "በቴሌግራም በፍጥነት ይወያዩ", "call_our_support": "ከ3 ጠዋት እስከ 12 ማታ ድረስ የድጋፍ ቡድናችንን ይደውሉ",
"call_our_support": "ከ3 ጠዋት እስከ 12 ማታ ድረስ የድጋፍ ቡድናችንን ይደውሉ", "tap_to_call": "ለመደወል ይንኩ",
"tap_to_call": "ለመደወል ይንኩ", "join_telegram": "በቴሌግራም የይማሩ አካዳሚን ይቀላቀሉ",
"join_telegram": "በቴሌግራም የይማሩ አካዳሚን ይቀላቀሉ", "connect_with_support_team": "ለፈጣን እርዳታ እና የማህበረሰብ ዝማኔዎች፣ በቴሌግራም ከድጋፍ ቡድናችን ጋር ወዲያውኑ ይገናኙ።",
"connect_with_support_team": "open_in_telegram": "በቴሌግራም ይክፈቱ",
"ለፈጣን እርዳታ እና የማህበረሰብ ዝማኔዎች፣ በቴሌግራም ከድጋፍ ቡድናችን ጋር ወዲያውኑ ይገናኙ።", "search_for": "ፈልጉት",
"open_in_telegram": "በቴሌግራም ይክፈቱ", "current_level": "የአሁኑ ደረጃ",
"search_for": "ፈልጉት", "keep_up_the_great_work": "በጣም ጥሩ እየሰራህ ነው! ቀጥልበት፣ አስደናቂ ነህ።",
"current_level": "የአሁኑ ደረጃ", "no_practice_available": "ምንም ልምምድ አልተገኘም!",
"keep_up_the_great_work": "በጣም ጥሩ እየሰራህ ነው! ቀጥልበት፣ አስደናቂ ነህ።", "begin_module_practice": "የሞጁሉን ልምምድ ጀምር",
"no_practice_available": "ምንም ልምምድ አልተገኘም!", "lets_practice_lesson": "እንለማመድ",
"begin_module_practice": "የሞጁሉን ልምምድ ጀምር", "lets_quickly_review": "በዚህ ሞጁል ውስጥ የተማርከውን በፍጥነት እንከልስ!",
"lets_practice_lesson": "እንለማመድ", "lets_practice_module": "አሁን የተማርከውን እንለማመድ!",
"lets_quickly_review": "በዚህ ሞጁል ውስጥ የተማርከውን በፍጥነት እንከልስ!", "ask_you_few_actions": "ጥቂት ጥያቄዎችን እጠይቅሃለሁ፣ አንተም በተፈጥሮ መልስ ልትሰጥ ትችላለህ።",
"lets_practice_module": "አሁን የተማርከውን እንለማመድ!", "begin_level_practice": "የደረጃ ልምምድን ጀምር",
"ask_you_few_actions": "ጥቂት ጥያቄዎችን እጠይቅሃለሁ፣ አንተም በተፈጥሮ መልስ ልትሰጥ ትችላለህ።", "lets_practice_course": "የኮርሱን ልምምድ እንለማመድ",
"begin_level_practice": "የደረጃ ልምምድን ጀምር", "lets_quick_review": "በዚህ ደረጃ የተማርከውን በፍጥነት እንከልስ!",
"lets_practice_course": "የኮርሱን ልምምድ እንለማመድ", "speaking": "እየተናገረ ነው",
"lets_quick_review": "በዚህ ደረጃ የተማርከውን በፍጥነት እንከልስ!", "you_have_finished_practice": "ልምምድህን አጠናቀቅህ",
"speaking": "እየተናገረ ነው", "view_results": "ውጤቶቼን እይ",
"you_have_finished_practice": "ልምምድህን አጠናቀቅህ", "sample_answer": "ናሙና መልስ",
"view_results": "ውጤቶቼን እይ", "your_answer": "መልስህ",
"sample_answer": "ናሙና መልስ", "sound_confident": "በዚህ ጊዜ የበለጠ እምነት ያለህ ይመስላል — በጣም ጥሩ መሻሻል ነው!",
"your_answer": "መልስህ", "you_have_completed": "አያይ! አጠናቀቅህ",
"sound_confident": "በዚህ ጊዜ የበለጠ እምነት ያለህ ይመስላል — በጣም ጥሩ መሻሻል ነው!", "yes": "አዎ",
"you_have_completed": "አያይ! አጠናቀቅህ", "no": "አይ",
"yes": "አዎ", "want_to_quit": "ለመውጣት እርግጠኛ ነህ?",
"no": "አይ", "required_field": "ይህ መስክ ያስፈልጋል",
"want_to_quit": "ለመውጣት እርግጠኛ ነህ?", "enter_full_name": "ሙሉ ስምህን አስገባ",
"required_field": "ይህ መስክ ያስፈልጋል", "invalid_email": "የማይሰራ የኢሜይል ቅርጸት",
"enter_full_name": "ሙሉ ስምህን አስገባ", "phone_must_start_with": "የስልክ ቁጥር በ251 መጀመር አለበት",
"invalid_email": "የማይሰራ የኢሜይል ቅርጸት", "phone_must_be": "የስልክ ቁጥር 12 አሃዞች መሆን አለበት",
"phone_must_start_with": "የስልክ ቁጥር በ251 መጀመር አለበት", "what_should_we_call_you": "ምን ብለን እንጠራህ?",
"phone_must_be": "የስልክ ቁጥር 12 አሃዞች መሆን አለበት", "name_for_personalization": "በመማር ጉዞህ ውስጥ ለግል ለማድረግ ስምህን እንጠቀማለን።",
"what_should_we_call_you": "ምን ብለን እንጠራህ?", "choose_your_gender": "ጾታህን ምረጥ",
"name_for_personalization": "በመማር ጉዞህ ውስጥ ለግል ለማድረግ ስምህን እንጠቀማለን።", "gender_for_personalization": "በጾታህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።",
"choose_your_gender": "ጾታህን ምረጥ", "age_range": "በየትኛው የእድሜ ክልል ውስጥ ነህ?",
"gender_for_personalization": "በጾታህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", "age_for_personalization": "በእድሜህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።",
"age_range": "በየትኛው የእድሜ ክልል ውስጥ ነህ?", "educational_background": "አሁን ያለህ የትምህርት ደረጃ ምንድን ነው?",
"age_for_personalization": "በእድሜህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", "education_for_personalization": "ይህ ትምህርቶችን ከልምድህ ጋር እንዲስማሙ ለማድረግ ይረዳናል።",
"educational_background": "አሁን ያለህ የትምህርት ደረጃ ምንድን ነው?", "your_occupation": "ስራህ ምንድን ነው?",
"education_for_personalization": "ይህ ትምህርቶችን ከልምድህ ጋር እንዲስማሙ ለማድረግ ይረዳናል።", "occupation_for_personalization": "በስራህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።",
"your_occupation": "ስራህ ምንድን ነው?", "location": "ከየት ነህ?",
"occupation_for_personalization": "በስራህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", "select_country_region": "አገርህን እና ክልልህን ከተቆልቋይ ዝርዝሩ ምረጥ",
"location": "ከየት ነህ?", "select_country": "አገር ምረጥ",
"select_country_region": "አገርህን እና ክልልህን ከተቆልቋይ ዝርዝሩ ምረጥ", "learning_goal": "የመማር ዓላማህን ምረጥ",
"select_country": "አገር ምረጥ", "language_goal": "እንግሊዝኛህን ለማሻሻል ዋና ዓላማህ ምንድን ነው?",
"learning_goal": "የመማር ዓላማህን ምረጥ", "your_goal": "ዓላማህ የመማር ጉዞህን እንዲስማማ ለማድረግ ይረዳናል።",
"language_goal": "እንግሊዝኛህን ለማሻሻል ዋና ዓላማህ ምንድን ነው?", "write_your_goal": "ዓላማህን ጻፍ…",
"your_goal": "ዓላማህ የመማር ጉዞህን እንዲስማማ ለማድረግ ይረዳናል።", "challenge_you_face": "What challenge do you face most with English?",
"write_your_goal": "ዓላማህን ጻፍ…", "evey_one_has_strugle": "ሁሉም ሰው ችግሮች አሉት፣ የአንተን እንጀምር እንፍታ",
"challenge_you_face": "What challenge do you face most with English?", "write_your_challenge": "ችግርህን ጻፍ…",
"evey_one_has_strugle": "ሁሉም ሰው ችግሮች አሉት፣ የአንተን እንጀምር እንፍታ", "topic_interest": "በጣም የሚስቡህ ርዕሶች የትኞቹ ናቸው?",
"write_your_challenge": "ችግርህን ጻፍ…", "favourite_topic": "የምትወዳቸው ርዕሶች አስደሳች እና ከሕይወትህ ጋር የተዛመዱ ትምህርቶችን ለመፍጠር ይረዱናል።",
"topic_interest": "በጣም የሚስቡህ ርዕሶች የትኞቹ ናቸው?", "your_interest": "ፍላጎትህን ጻፍ…",
"favourite_topic": "want_quick_assessment": "የእንግሊዝኛ ደረጃህን ለማወቅ ፈጣን ግምገማ ትፈልጋለህ?",
"የምትወዳቸው ርዕሶች አስደሳች እና ከሕይወትህ ጋር የተዛመዱ ትምህርቶችን ለመፍጠር ይረዱናል።", "answer_quick_questions": "የእንግሊዝኛ ችሎታህን ለመረዳት ጥቂት ፈጣን ጥያቄዎችን መልስ።",
"your_interest": "ፍላጎትህን ጻፍ…", "skip": "ዝለል",
"want_quick_assessment": "የእንግሊዝኛ ደረጃህን ለማወቅ ፈጣን ግምገማ ትፈልጋለህ?", "finish_level": "ደረጃውን አጠናቅቅ",
"answer_quick_questions": "የእንግሊዝኛ ችሎታህን ለመረዳት ጥቂት ፈጣን ጥያቄዎችን መልስ።", "likely_speaker": "አንተ ምናልባት ተናጋሪ ነህ",
"skip": "ዝለል", "great_job": "በጣም ጥሩ ስራ! ለመሻሻል ቀጣዩ ደረጃህ ይኸው ነው።",
"finish_level": "ደረጃውን አጠናቅቅ", "lets_start_practice": "ልምምድህን እንጀምር",
"likely_speaker": "አንተ ምናልባት ተናጋሪ ነህ", "welcome_abroad": "እንኳን ደህና መጣህ",
"great_job": "በጣም ጥሩ ስራ! ለመሻሻል ቀጣዩ ደረጃህ ይኸው ነው።", "ready_to_explore": "የግል ትምህርቶችህን ለማሰስ ዝግጁ ነህ።",
"lets_start_practice": "ልምምድህን እንጀምር", "finish": "አጠናቅቅ",
"welcome_abroad": "እንኳን ደህና መጣህ", "finish_all_practice_lesson": "ይህን ልምምድ ለመውሰድ የቀድሞውን የትምህርት ልምምድ ያጠናቅቁ",
"ready_to_explore": "የግል ትምህርቶችህን ለማሰስ ዝግጁ ነህ።", "finish_all_practice_module": "የሞጁሉን ልምምድ ለመውሰድ የትምህርት ልምምዶችን ያጠናቅቁ",
"finish": "አጠናቅቅ", "finish_all_practice_course": "የኮርሱን ልምምድ ለመውሰድ የሞጁል ልምምዶችን ያጠናቅቁ",
"finish_all_practice": "ልምምዱን ለመውሰድ በትምህርቶቹ ውስጥ ያሉትን ሁሉንም ልምምዶች ያጠናቅቁ።" "finish_all_practice_previouse_module": "ይህን ልምምድ ለመውሰድ የቀድሞውን የሞጁል ልምምድ ያጠናቅቁ",
}; "finish_all_practice_previouse_course": "ይህን ለመውሰድ የቀድሞውን የኮርስ ልምምድ ያጠናቅቁ"
static const Map<String, dynamic> _en = { };
"loading": "Loading", static const Map<String,dynamic> _en = {
"welcome_back": "Welcome back", "loading": "Loading",
"checking_user_info": "Checking user info", "welcome_back": "Welcome back",
"dont_have_account": "Don't have an account?", "checking_user_info": "Checking user info",
"email": "Email", "dont_have_account": "Don't have an account?",
"password": "Password", "email": "Email",
"forgot_password": "Forgot password?", "password": "Password",
"cont": "Continue", "forgot_password": "Forgot password?",
"register": "Register", "cont": "Continue",
"login_with_google": "Login with Google", "register": "Register",
"or": "Or", "login_with_google": "Login with Google",
"login_with_phone": "Login with phone number", "or": "Or",
"create_account": "Create an account", "login_with_phone": "Login with phone number",
"already_have_account": "Already have an account?", "create_account": "Create an account",
"login": "Login", "already_have_account": "Already have an account?",
"register_with_google": "Register with Google", "login": "Login",
"register_with_phone": "Register with phone number", "register_with_google": "Register with Google",
"enter_phone_number": "register_with_phone": "Register with 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", "login_with_email": "Login with email",
"create_password": "Create password", "create_password": "Create password",
"confirm_password": "Confirm password", "confirm_password": "Confirm password",
"eight_character_minimum": "8 characters minimum", "eight_character_minimum": "8 characters minimum",
"password_match": "password match", "password_match": "password match",
"sign_up_agreement": "sign_up_agreement": "By clicking Sign Up, you agree to our Terms of Service and Privacy Policy",
"By clicking Sign Up, you agree to our Terms of Service and Privacy Policy", "terms_of_services": "Terms of Service",
"terms_of_services": "Terms of Service", "and": "and",
"and": "and", "privacy_policy": "Privacy Policy",
"privacy_policy": "Privacy Policy", "register_with_email": "Register with email",
"register_with_email": "Register with email", "verification_code": "Verification Code",
"verification_code": "Verification Code", "resend_code": "Resend Code",
"resend_code": "Resend Code", "code_sent_to_phone": "Code sent to your number",
"code_sent_to_phone": "Code sent to your number", "code_sent_to_email": "Code sent to your email",
"code_sent_to_email": "Code sent to your email", "resend_code_in": "Resend code in",
"resend_code_in": "Resend code in", "reset_password": "Reset Password",
"reset_password": "Reset Password", "enter_email_reset_code": "Enter your email. We will send you a reset code.",
"enter_email_reset_code": "please_wait": "Please wait",
"Enter your email. We will send you a reset code.", "reset_code_sent": "Reset code sent successfully",
"please_wait": "Please wait", "reset_code": "Reset code",
"reset_code_sent": "Reset code sent successfully", "new_password": "New password",
"reset_code": "Reset code", "logged_in_successfully": "Logged in successfully",
"new_password": "New password", "continue_learning": "Continue Learning",
"logged_in_successfully": "Logged in successfully", "start_learning": "Start Learning",
"continue_learning": "Continue Learning", "completed": "Completed",
"start_learning": "Start Learning", "view_course": "View course",
"completed": "Completed", "take_practice": "Take practice",
"view_course": "View course", "your_current_level": "Your current level",
"take_practice": "Take practice", "overall_progress": "Overall progress",
"your_current_level": "Your current level", "great_work": "Keep up the great work! You're doing amazing",
"overall_progress": "Overall progress", "view_module": "View module",
"great_work": "Keep up the great work! You're doing amazing", "progress": "Progress",
"view_module": "View module", "keep_going": "Let's keep going - you're more than half there",
"progress": "Progress", "lessons_in_module": "Lessons in this module",
"keep_going": "Let's keep going - you're more than half there", "practice": "Practice",
"lessons_in_module": "Lessons in this module", "start": "Start",
"practice": "Practice", "in_progress": "In Progress",
"start": "Start", "hello": "Hello",
"in_progress": "In Progress", "ready_to_learn": "Ready to keep learning English today",
"hello": "Hello", "learn": "Learn",
"ready_to_learn": "Ready to keep learning English today", "course": "Course",
"learn": "Learn", "profile": "Profile",
"course": "Course", "speaking_partner": "Speaking partner",
"profile": "Profile", "practice_what_you_learned": "Let's practice what you just learnt",
"speaking_partner": "Speaking partner", "practice_questions": "I will ask you a few questions and you can respond",
"practice_what_you_learned": "Let's practice what you just learnt", "start_practice": "Start practice",
"practice_questions": "I will ask you a few questions and you can respond", "almost_there": "You're almost there",
"start_practice": "Start practice", "finish_session": "Finish the session to see your progress",
"almost_there": "You're almost there", "continue_practice": "Continue practice",
"finish_session": "Finish the session to see your progress", "end_session": "End session",
"continue_practice": "Continue practice", "tap_start_to_listen": "Tap the start button to listen",
"end_session": "End session", "practice_speaking": "Practice speaking",
"tap_start_to_listen": "Tap the start button to listen", "tap_microphone": "Tap the microphone to speak",
"practice_speaking": "Practice speaking", "reply": "Reply",
"tap_microphone": "Tap the microphone to speak", "cancel": "Cancel",
"reply": "Reply", "you_are_speaking": "You're speaking",
"cancel": "Cancel", "practice_completed": "Practice completed!",
"you_are_speaking": "You're speaking", "great_improvement": "You sound more confident this time, great improvement",
"practice_completed": "Practice completed!", "practice_again": "Practice again",
"great_improvement": "conversation_review": "Conversation review",
"You sound more confident this time, great improvement", "result": "Result",
"practice_again": "Practice again", "quick_tip": "Quick tip",
"conversation_review": "Conversation review", "retry": "Retry",
"result": "Result", "completed_a1": "Yay, you've completed A1",
"quick_tip": "Quick tip", "analyzing_speaking": "We're now analyzing your speaking skill",
"retry": "Retry", "view_profile": "View profile",
"completed_a1": "Yay, you've completed A1", "hi": "Hi",
"analyzing_speaking": "We're now analyzing your speaking skill", "edit_profile": "Edit profile",
"view_profile": "View profile", "first_name": "First name",
"hi": "Hi", "last_name": "Last name",
"edit_profile": "Edit profile", "gender": "Gender",
"first_name": "First name", "male": "Male",
"last_name": "Last name", "female": "Female",
"gender": "Gender", "phone_number": "Phone number",
"male": "Male", "country": "Country",
"female": "Female", "region": "Region",
"phone_number": "Phone number", "select_region": "Select region",
"country": "Country", "enter_your_city": "Enter your city",
"region": "Region", "occupation": "Occupation",
"select_region": "Select region", "select_occupation": "Select occupation",
"enter_your_city": "Enter your city", "save_changes": "Save changes",
"occupation": "Occupation", "my_progress": "My progress",
"select_occupation": "Select occupation", "track_your_achievement": "Track your achievements and learning streak",
"save_changes": "Save changes", "account_and_privacy": "Account & Privacy",
"my_progress": "My progress", "manage_settings": "Manage settings and app preference",
"track_your_achievement": "Track your achievements and learning streak", "support": "Support",
"account_and_privacy": "Account & Privacy", "get_help": "Get help through phone or Telegram",
"manage_settings": "Manage settings and app preference", "logout": "Logout",
"support": "Support", "app_settings": "App settings",
"get_help": "Get help through phone or Telegram", "legal_and_information": "Legal & Information",
"logout": "Logout", "change_language": "Change language",
"app_settings": "App settings", "terms_and_conditions": "Terms & Conditions",
"legal_and_information": "Legal & Information", "delete_account": "Delete account",
"change_language": "Change language", "language_preference": "Language preference",
"terms_and_conditions": "Terms & Conditions", "choose_your_language": "Choose your language",
"delete_account": "Delete account", "switch_language_anytime": "You can switch languages anytime",
"language_preference": "Language preference", "need_help": "Need help?",
"choose_your_language": "Choose your language", "call_support": "Call support",
"switch_language_anytime": "You can switch languages anytime", "talk_with_support": "Talk with our support team directly",
"need_help": "Need help?", "telegram_support": "Telegram support",
"call_support": "Call support", "chat_via_telegram": "Chat instantly via Telegram",
"talk_with_support": "Talk with our support team directly", "call_our_support": "Call our support team between 9 AM - 6 PM",
"telegram_support": "Telegram support", "tap_to_call": "Tap to call",
"chat_via_telegram": "Chat instantly via Telegram", "join_telegram": "Join Yimaru Academy on Telegram",
"call_our_support": "Call our support team between 9 AM - 6 PM", "connect_with_support_team": "Connect with our support team instantly on Telegram for quick assistance and community updates",
"tap_to_call": "Tap to call", "open_in_telegram": "Open in Telegram",
"join_telegram": "Join Yimaru Academy on Telegram", "search_for": "Search for",
"connect_with_support_team": "current_level": "Current Level",
"Connect with our support team instantly on Telegram for quick assistance and community updates", "keep_up_the_great_work": "Keep up the great work! You're doing amazing.",
"open_in_telegram": "Open in Telegram", "no_practice_available": "No practice available!",
"search_for": "Search for", "begin_module_practice": "Begin Module Practice",
"current_level": "Current Level", "lets_practice_lesson": "Lets Practice",
"keep_up_the_great_work": "Keep up the great work! You're doing amazing.", "lets_quickly_review": "Lets quickly review what youve learned in this module!",
"no_practice_available": "No practice available!", "lets_practice_module": "Let's practice what you just learnt!",
"begin_module_practice": "Begin Module Practice", "ask_you_few_actions": "Ill ask you a few questions, and you can respond naturally.",
"lets_practice_lesson": "Lets Practice", "begin_level_practice": "Begin Level Practice",
"lets_quickly_review": "lets_practice_course": "Lets Practice Course",
"Lets quickly review what youve learned in this module!", "lets_quick_review": "Lets quickly review what youve learned in this level!",
"lets_practice_module": "Let's practice what you just learnt!", "speaking": "is speaking...",
"ask_you_few_actions": "you_have_finished_practice": "You have finished your practice",
"Ill ask you a few questions, and you can respond naturally.", "view_results": "View My Results",
"begin_level_practice": "Begin Level Practice", "sample_answer": "Sample Answer",
"lets_practice_course": "Lets Practice Course", "your_answer": "Your Answer",
"lets_quick_review": "sound_confident": "You sound more confident this time - great improvement!",
"Lets quickly review what youve learned in this level!", "you_have_completed": "Yay, youve completed",
"speaking": "is speaking...", "yes": "Yes",
"you_have_finished_practice": "You have finished your practice", "no": "No",
"view_results": "View My Results", "want_to_quit": "Are you sure you want to quit?",
"sample_answer": "Sample Answer", "required_field": "The field is required",
"your_answer": "Your Answer", "enter_full_name": "Enter your full name",
"sound_confident": "invalid_email": "Invalid email format",
"You sound more confident this time - great improvement!", "phone_must_start_with": "Phone number must start with 251",
"you_have_completed": "Yay, youve completed", "phone_must_be": "Phone number must be 12 digits",
"yes": "Yes", "what_should_we_call_you": "What should we call you?",
"no": "No", "name_for_personalization": "Well use your name to personalize your learning journey.",
"want_to_quit": "Are you sure you want to quit?", "choose_your_gender": "Choose your gender?",
"required_field": "The field is required", "gender_for_personalization": "Well personalize your learning experience based on your gender.",
"enter_full_name": "Enter your full name", "age_range": "Which age range are you in?",
"invalid_email": "Invalid email format", "age_for_personalization": "Well personalize your learning experience based on your age.",
"phone_must_start_with": "Phone number must start with 251", "educational_background": "Whats your current educational level?",
"phone_must_be": "Phone number must be 12 digits", "education_for_personalization": "This helps us tailor your lessons to your experience.",
"what_should_we_call_you": "What should we call you?", "your_occupation": "Whats your occupation?",
"name_for_personalization": "occupation_for_personalization": "Well personalize your learning experience based on your occupation.",
"Well use your name to personalize your learning journey.", "location": "Where are you from?",
"choose_your_gender": "Choose your gender?", "select_country_region": "Select your country and region from the dropdown",
"gender_for_personalization": "select_country": "Select country",
"Well personalize your learning experience based on your gender.", "learning_goal": "Choose your learning goal.",
"age_range": "Which age range are you in?", "language_goal": "Whats your main goal for improving your English?",
"age_for_personalization": "your_goal": "Your goal helps us tailor your learning journey.",
"Well personalize your learning experience based on your age.", "write_your_goal": "Write your goal…",
"educational_background": "Whats your current educational level?", "challenge_you_face": "What challenge do you face most with English?",
"education_for_personalization": "evey_one_has_strugle": "Everyone has struggles, lets start fixing yours",
"This helps us tailor your lessons to your experience.", "write_your_challenge": "Write your challenge…",
"your_occupation": "Whats your occupation?", "topic_interest": "Which topics interest you most?",
"occupation_for_personalization": "favourite_topic": "Your favorite topics help us create fun, relatable lessons.",
"Well personalize your learning experience based on your occupation.", "your_interest": "Write your interest…",
"location": "Where are you from?", "want_quick_assessment": "Want a quick assessment to know your English level?",
"select_country_region": "Select your country and region from the dropdown", "answer_quick_questions": "Answer a few quick questions to help us understand your English proficiency.",
"select_country": "Select country", "skip": "Skip",
"learning_goal": "Choose your learning goal.", "finish_level": "Finish Level",
"language_goal": "Whats your main goal for improving your English?", "likely_speaker": "Youre likely speaker of",
"your_goal": "Your goal helps us tailor your learning journey.", "great_job": "Great Job! Heres your next step to keep improving.",
"write_your_goal": "Write your goal…", "lets_start_practice": "Let's start your practice",
"challenge_you_face": "What challenge do you face most with English?", "welcome_abroad": "Welcome aboard",
"evey_one_has_strugle": "Everyone has struggles, lets start fixing yours", "ready_to_explore": "Youre ready to explore your personalized lessons.",
"write_your_challenge": "Write your challenge…", "finish": "Finish",
"topic_interest": "Which topics interest you most?", "finish_all_practice_lesson": "Finish the previous lesson practice to take this practice",
"favourite_topic": "finish_all_practice_module": "Finish the lesson practices to take the Module Practice",
"Your favorite topics help us create fun, relatable lessons.", "finish_all_practice_course": "Finish the Module practices to take the Course practice",
"your_interest": "Write your interest…", "finish_all_practice_previouse_module": "Finish the previous Module practice to take this practice",
"want_quick_assessment": "finish_all_practice_previouse_course": "Finish the previous course practice to take this"
"Want a quick assessment to know your English level?", };
"answer_quick_questions": static const Map<String, Map<String,dynamic>> mapLocales = {"am": _am, "en": _en};
"Answer a few quick questions to help us understand your English proficiency.",
"skip": "Skip",
"finish_level": "Finish Level",
"likely_speaker": "Youre likely speaker of",
"great_job": "Great Job! Heres your next step to keep improving.",
"lets_start_practice": "Let's start your practice",
"welcome_abroad": "Welcome aboard",
"ready_to_explore": "Youre ready to explore your personalized lessons.",
"finish": "Finish",
"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
};
} }

View File

@ -2,7 +2,7 @@
// ignore_for_file: constant_identifier_names // ignore_for_file: constant_identifier_names
abstract class LocaleKeys { abstract class LocaleKeys {
static const loading = 'loading'; static const loading = 'loading';
static const welcome_back = 'welcome_back'; static const welcome_back = 'welcome_back';
static const checking_user_info = 'checking_user_info'; static const checking_user_info = 'checking_user_info';
@ -161,8 +161,7 @@ abstract class LocaleKeys {
static const educational_background = 'educational_background'; static const educational_background = 'educational_background';
static const education_for_personalization = 'education_for_personalization'; static const education_for_personalization = 'education_for_personalization';
static const your_occupation = 'your_occupation'; static const your_occupation = 'your_occupation';
static const occupation_for_personalization = static const occupation_for_personalization = 'occupation_for_personalization';
'occupation_for_personalization';
static const location = 'location'; static const location = 'location';
static const select_country_region = 'select_country_region'; static const select_country_region = 'select_country_region';
static const select_country = 'select_country'; static const select_country = 'select_country';
@ -186,5 +185,10 @@ abstract class LocaleKeys {
static const welcome_abroad = 'welcome_abroad'; static const welcome_abroad = 'welcome_abroad';
static const ready_to_explore = 'ready_to_explore'; static const ready_to_explore = 'ready_to_explore';
static const finish = 'finish'; static const finish = 'finish';
static const finish_all_practice = 'finish_all_practice'; 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';
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -17,27 +17,42 @@ import 'learn_module_viewmodel.dart';
class LearnModuleView extends StackedView<LearnModuleViewModel> { class LearnModuleView extends StackedView<LearnModuleViewModel> {
final LearnCourse course; final LearnCourse course;
const LearnModuleView({Key? key, required this.course}) : super(key: key); const LearnModuleView({Key? key, required this.course}) : super(key: key);
Future<void> _onPractice( Future<void> _onPractice(
{required BuildContext context, {required BuildContext context,
required LearnModule module, required LearnModule module,
required LearnModuleViewModel viewModel}) async { required LearnModuleViewModel viewModel}) async {
if (module.access?.completedCount == module.access?.totalCount) { if (module.access?.completedCount == module.access?.totalCount ) {
await viewModel.navigateToLearnPractice( await viewModel.navigateToLearnPractice(
id: module.id ?? 0, module: module.name ?? ''); id: module.id ?? 0, module: module.name ?? '');
} else { } else {
await _showSheet(context: context, viewModel: viewModel); 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);
}
} }
} }
Future<void> _showSheet( Future<void> _showSheet(
{required BuildContext context, {required BuildContext context,
required PracticeReason practice,
required LearnModuleViewModel viewModel}) async => required LearnModuleViewModel viewModel}) async =>
await showModalBottomSheet( await showModalBottomSheet(
context: context, context: context,
backgroundColor: kcTransparent, backgroundColor: kcTransparent,
builder: (_) => _buildSheet(viewModel), builder: (_) => _buildSheet(viewModel: viewModel, practice: practice),
); );
@override @override
@ -201,6 +216,11 @@ class LearnModuleView extends StackedView<LearnModuleViewModel> {
onModuleTap: onModuleTap, onModuleTap: onModuleTap,
onPracticeTap: onPracticeTap); onPracticeTap: onPracticeTap);
Widget _buildSheet(LearnModuleViewModel viewModel) => Widget _buildSheet(
FinishPracticeSheet(onTap: viewModel.pop); {required PracticeReason practice,
required LearnModuleViewModel viewModel}) =>
FinishPracticeSheet(
practice: practice,
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/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/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/gender_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/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/occupation_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'; import 'package:yimaru_app/ui/views/onboarding/screens/topic_form_screen.dart';
@ -129,9 +129,9 @@ class OnboardingView extends StackedView<OnboardingViewModel>
Widget _buildCountryRegionForm() => Widget _buildCountryRegionForm() =>
CountryRegionFormScreen(regionController: regionController); CountryRegionFormScreen(regionController: regionController);
Widget _buildLearningGoalForm() => const LearningGoalFormScreen(); Widget _buildLearningGoalForm() => const LanguageGoalFormScreens();
Widget _buildLanguageGoalForm() => const LanguageGoalFormScreen(); Widget _buildLanguageGoalForm() => const LearningGoalFormScreen();
Widget _buildChallengeForm() => const ChallengeFormScreen(); Widget _buildChallengeForm() => const ChallengeFormScreen();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,16 +1,43 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:iconsax/iconsax.dart';
import 'package:stacked/stacked.dart'; import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/app_colors.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/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.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/widgets/custom_elevated_button.dart';
import 'package:yimaru_app/ui/views/onboarding/onboarding_viewmodel.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'; import 'package:yimaru_app/ui/widgets/large_app_bar.dart';
class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> { class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
const LanguageGoalFormScreen({super.key}); 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 '';
}
void _pop(OnboardingViewModel viewModel) { void _pop(OnboardingViewModel viewModel) {
viewModel.resetLanguageGoalFormScreen(); viewModel.resetLanguageGoalFormScreen();
@ -22,6 +49,7 @@ class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
Map<String, dynamic> data = { Map<String, dynamic> data = {
'language_goal': viewModel.selectedLanguageGoal?.code, 'language_goal': viewModel.selectedLanguageGoal?.code,
}; };
viewModel.addUserData(data); viewModel.addUserData(data);
@ -44,7 +72,6 @@ class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel), _buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel) _buildExpandedBody(viewModel)
]; ];
@ -77,13 +104,10 @@ class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
); );
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
_buildTitle(viewModel),
verticalSpaceMedium, verticalSpaceMedium,
_buildTitle(), _buildLanguageGoals(viewModel)
verticalSpaceSmall,
_buildSubtitle(),
verticalSpaceMedium,
_buildReasons(viewModel),
verticalSpaceMedium,
]; ];
Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar( Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar(
@ -96,23 +120,27 @@ class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
: viewModel.selectedLanguage['code'], : viewModel.selectedLanguage['code'],
); );
Widget _buildTitle() => Text( Widget _buildTitle(OnboardingViewModel viewModel) => Text.rich(
LocaleKeys.language_goal.tr(), TextSpan(
style: style25DG600, 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 _buildSubtitle() => Text( Widget _buildLanguageGoals(OnboardingViewModel viewModel) => ListView.builder(
LocaleKeys.your_goal.tr(),
style: style14MG400,
);
Widget _buildReasons(OnboardingViewModel viewModel) => ListView.builder(
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.zero, itemCount: viewModel.languageGoals.length,
itemCount: viewModel.languageGoals.length,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildLanguageGoal( itemBuilder: (context, index) => _buildLanguageGoal(
title: viewModel.languageGoals[index].label ?? '', icon: getIcon(index),
subtitle: getSubtitle(index),
title:viewModel.languageGoals[index].label ?? '',
selected: selected:
viewModel.isSelectedLanguageGoal(viewModel.languageGoals[index]), viewModel.isSelectedLanguageGoal(viewModel.languageGoals[index]),
onTap: () => onTap: () =>
@ -123,10 +151,14 @@ class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
Widget _buildLanguageGoal( Widget _buildLanguageGoal(
{required String title, {required String title,
required bool selected, required bool selected,
required IconData icon,
required String subtitle,
required GestureTapCallback onTap}) => required GestureTapCallback onTap}) =>
CustomSmallRadioButton( CustomLargeRadioButton(
icon: icon,
title: title, title: title,
onTap: onTap, onTap: onTap,
subtitle: subtitle,
selected: selected, selected: selected,
); );
@ -137,14 +169,15 @@ class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
Widget _buildContinueButton(OnboardingViewModel viewModel) => Widget _buildContinueButton(OnboardingViewModel viewModel) =>
CustomElevatedButton( CustomElevatedButton(
height: 55, height: 55,
borderRadius: 12, borderRadius: 12,
foregroundColor: kcWhite, foregroundColor: kcWhite,
text: LocaleKeys.cont.tr(), text: LocaleKeys.cont.tr(),
onTap: viewModel.selectedLanguageGoal != null onTap: viewModel.selectedLanguageGoal != null
? () => _next(viewModel) ? () => _next(viewModel)
: null, : null,
backgroundColor: viewModel.selectedLanguageGoal != null backgroundColor: viewModel.selectedLanguageGoal != null
? kcPrimaryColor ? kcPrimaryColor
: kcPrimaryColor.withOpacity(0.1)); : kcPrimaryColor.withOpacity(0.1),
);
} }

View File

@ -1,54 +1,17 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:iconsax/iconsax.dart';
import 'package:stacked/stacked.dart'; import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/app_colors.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/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.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/widgets/custom_elevated_button.dart';
import 'package:yimaru_app/ui/views/onboarding/onboarding_viewmodel.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'; import 'package:yimaru_app/ui/widgets/large_app_bar.dart';
class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> { class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
const LearningGoalFormScreen({super.key}); 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) { void _pop(OnboardingViewModel viewModel) {
viewModel.resetLearningGoalFormScreen(); viewModel.resetLearningGoalFormScreen();
viewModel.goBack(); viewModel.goBack();
@ -81,7 +44,6 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel), _buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel) _buildExpandedBody(viewModel)
]; ];
@ -114,10 +76,13 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
); );
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),
verticalSpaceMedium, verticalSpaceMedium,
_buildTitle(viewModel), _buildGoals(viewModel),
verticalSpaceMedium, verticalSpaceMedium,
_buildLearningGoals(viewModel)
]; ];
Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar( Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar(
@ -130,27 +95,23 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
: viewModel.selectedLanguage['code'], : viewModel.selectedLanguage['code'],
); );
Widget _buildTitle(OnboardingViewModel viewModel) => Text.rich( Widget _buildTitle() => Text(
TextSpan( LocaleKeys.learning_goal.tr(),
text: style: style25DG600,
'${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 _buildLearningGoals(OnboardingViewModel viewModel) => ListView.builder( Widget _buildSubtitle() => Text(
LocaleKeys.your_goal.tr(),
style: style14MG400,
);
Widget _buildGoals(OnboardingViewModel viewModel) => ListView.builder(
shrinkWrap: true, shrinkWrap: true,
itemCount: 3, // viewModel.learningGoals.length, padding: EdgeInsets.zero,
itemCount: viewModel.learningGoals.length,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildLearningGoal( itemBuilder: (context, index) => _buildLearningGoal(
icon: getIcon(index), title: viewModel.learningGoals[index].label ?? '',
title: getTitles(index),
subtitle: getSubtitle(index),
selected: selected:
viewModel.isSelectedLearningGoal(viewModel.learningGoals[index]), viewModel.isSelectedLearningGoal(viewModel.learningGoals[index]),
onTap: () => onTap: () =>
@ -161,14 +122,10 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
Widget _buildLearningGoal( Widget _buildLearningGoal(
{required String title, {required String title,
required bool selected, required bool selected,
required IconData icon,
required String subtitle,
required GestureTapCallback onTap}) => required GestureTapCallback onTap}) =>
CustomLargeRadioButton( CustomSmallRadioButton(
icon: icon,
title: title, title: title,
onTap: onTap, onTap: onTap,
subtitle: subtitle,
selected: selected, selected: selected,
); );
@ -179,15 +136,14 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
Widget _buildContinueButton(OnboardingViewModel viewModel) => Widget _buildContinueButton(OnboardingViewModel viewModel) =>
CustomElevatedButton( CustomElevatedButton(
height: 55, height: 55,
borderRadius: 12, borderRadius: 12,
foregroundColor: kcWhite, foregroundColor: kcWhite,
text: LocaleKeys.cont.tr(), text: LocaleKeys.cont.tr(),
onTap: viewModel.selectedLearningGoal != null onTap: viewModel.selectedLearningGoal != null
? () => _next(viewModel) ? () => _next(viewModel)
: null, : null,
backgroundColor: viewModel.selectedLearningGoal != null backgroundColor: viewModel.selectedLearningGoal != null
? kcPrimaryColor ? kcPrimaryColor
: kcPrimaryColor.withOpacity(0.1), : kcPrimaryColor.withOpacity(0.1));
);
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:yimaru_app/ui/common/app_colors.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/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart'; import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/widgets/custom_bottom_sheet.dart'; import 'package:yimaru_app/ui/widgets/custom_bottom_sheet.dart';
@ -9,9 +10,24 @@ import 'package:yimaru_app/ui/widgets/custom_bottom_sheet.dart';
import 'custom_elevated_button.dart'; import 'custom_elevated_button.dart';
class FinishPracticeSheet extends StatelessWidget { class FinishPracticeSheet extends StatelessWidget {
final PracticeReason practice;
final GestureTapCallback? onTap; final GestureTapCallback? onTap;
const FinishPracticeSheet({super.key, this.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();
}
}
@override @override
Widget build(BuildContext context) => _buildSheetWrapper(); Widget build(BuildContext context) => _buildSheetWrapper();
@ -44,7 +60,7 @@ class FinishPracticeSheet extends StatelessWidget {
); );
Widget _buildMessage() => Text( Widget _buildMessage() => Text(
LocaleKeys.finish_all_practice.tr(), getWarning(),
style: style16DG600, style: style16DG600,
textAlign: TextAlign.center, textAlign: TextAlign.center,
); );

View File

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

View File

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

View File

@ -23,8 +23,13 @@ class LearnModuleTile extends ViewModelWidget<LearnModuleViewModel> {
@override @override
Widget build(BuildContext context, LearnModuleViewModel viewModel) => Widget build(BuildContext context, LearnModuleViewModel viewModel) =>
_buildExpansionTileCard(context: context, viewModel: viewModel); _buildExpansionTileCardWrapper(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( Widget _buildExpansionTileCard(
{required BuildContext context, {required BuildContext context,
required LearnModuleViewModel viewModel}) => required LearnModuleViewModel viewModel}) =>

View File

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