Compare commits

..

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

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

View File

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

View File

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

View File

@ -29,6 +29,7 @@ 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,6 +46,7 @@ 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,6 +88,7 @@ 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,6 +88,7 @@ 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,28 +24,17 @@ 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 {
if (course.access?.isAccessible ?? false) { await _showSheet(context: context, viewModel: viewModel);
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: viewModel, practice: practice), builder: (_) => _buildSheet(viewModel),
); );
@override @override
@ -167,11 +156,6 @@ class LearnCourseView extends StackedView<LearnCourseViewModel> {
onPracticeTap: onPracticeTap, onPracticeTap: onPracticeTap,
); );
Widget _buildSheet( Widget _buildSheet(LearnCourseViewModel viewModel) =>
{required PracticeReason practice, FinishPracticeSheet(onTap: viewModel.pop);
required LearnCourseViewModel viewModel}) =>
FinishPracticeSheet(
practice: practice,
onTap: viewModel.pop,
);
} }

View File

@ -31,23 +31,15 @@ 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') {
if (lesson.access?.isAccessible ?? false) { await viewModel.navigateToLearnPractice(lesson.id ?? 0);
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
} else {
await _showSheet(context: context, viewModel: viewModel);
}
} else { } else {
await viewModel.navigateToLearnSubscription(); await viewModel.navigateToLearnSubscription();
} }
} else { } else {
if (lesson.access?.isAccessible ?? false) { await viewModel.navigateToLearnPractice(lesson.id ?? 0);
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
} else {
await _showSheet(context: context, viewModel: viewModel);
}
}*/ }*/
} }
@ -170,7 +162,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(
@ -205,28 +197,24 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
style: style18DG700, style: style18DG700,
); );
Widget _buildListViewBuilder( Widget _buildListViewBuilder( {required BuildContext context,
{required BuildContext context, required LearnLessonViewModel viewModel}) =>
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( Widget _buildListView( {required BuildContext context,
{required BuildContext context, required LearnLessonViewModel viewModel}) => ListView.builder(
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,
@ -243,23 +231,18 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
); );
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) => FinishPracticeSheet( Widget _buildSheet(LearnLessonViewModel viewModel) =>
onTap: viewModel.pop, FinishPracticeSheet(onTap: viewModel.pop);
practice: PracticeReason.lesson,
);
} }

View File

@ -33,18 +33,13 @@ 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,42 +17,27 @@ 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 {
if (module.access?.isAccessible ?? false) { await _showSheet(context: context, viewModel: viewModel);
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: viewModel, practice: practice), builder: (_) => _buildSheet(viewModel),
); );
@override @override
@ -216,11 +201,6 @@ class LearnModuleView extends StackedView<LearnModuleViewModel> {
onModuleTap: onModuleTap, onModuleTap: onModuleTap,
onPracticeTap: onPracticeTap); onPracticeTap: onPracticeTap);
Widget _buildSheet( Widget _buildSheet(LearnModuleViewModel viewModel) =>
{required PracticeReason practice, FinishPracticeSheet(onTap: viewModel.pop);
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/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/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/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 LanguageGoalFormScreens(); Widget _buildLearningGoalForm() => const LearningGoalFormScreen();
Widget _buildLanguageGoalForm() => const LearningGoalFormScreen(); Widget _buildLanguageGoalForm() => const LanguageGoalFormScreen();
Widget _buildChallengeForm() => const ChallengeFormScreen(); Widget _buildChallengeForm() => const ChallengeFormScreen();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,43 +1,16 @@
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 LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> { class LanguageGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
const LanguageGoalFormScreens({super.key}); const LanguageGoalFormScreen({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();
@ -49,7 +22,6 @@ class LanguageGoalFormScreens 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);
@ -72,6 +44,7 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel), _buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel) _buildExpandedBody(viewModel)
]; ];
@ -104,10 +77,13 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
); );
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
_buildTitle(viewModel),
verticalSpaceMedium, verticalSpaceMedium,
_buildLanguageGoals(viewModel) _buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),
verticalSpaceMedium,
_buildReasons(viewModel),
verticalSpaceMedium,
]; ];
Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar( Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar(
@ -120,27 +96,23 @@ class LanguageGoalFormScreens extends ViewModelWidget<OnboardingViewModel> {
: viewModel.selectedLanguage['code'], : viewModel.selectedLanguage['code'],
); );
Widget _buildTitle(OnboardingViewModel viewModel) => Text.rich( Widget _buildTitle() => Text(
TextSpan( LocaleKeys.language_goal.tr(),
text: style: style25DG600,
'${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 _buildLanguageGoals(OnboardingViewModel viewModel) => ListView.builder( Widget _buildSubtitle() => Text(
LocaleKeys.your_goal.tr(),
style: style14MG400,
);
Widget _buildReasons(OnboardingViewModel viewModel) => ListView.builder(
shrinkWrap: true, shrinkWrap: true,
itemCount: viewModel.languageGoals.length, padding: EdgeInsets.zero,
itemCount: viewModel.languageGoals.length,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildLanguageGoal( itemBuilder: (context, index) => _buildLanguageGoal(
icon: getIcon(index), title: viewModel.languageGoals[index].label ?? '',
subtitle: getSubtitle(index),
title:viewModel.languageGoals[index].label ?? '',
selected: selected:
viewModel.isSelectedLanguageGoal(viewModel.languageGoals[index]), viewModel.isSelectedLanguageGoal(viewModel.languageGoals[index]),
onTap: () => onTap: () =>
@ -151,14 +123,10 @@ class LanguageGoalFormScreens 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}) =>
CustomLargeRadioButton( CustomSmallRadioButton(
icon: icon,
title: title, title: title,
onTap: onTap, onTap: onTap,
subtitle: subtitle,
selected: selected, selected: selected,
); );
@ -169,15 +137,14 @@ class LanguageGoalFormScreens 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,17 +1,54 @@
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 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();
@ -44,6 +81,7 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel), _buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel) _buildExpandedBody(viewModel)
]; ];
@ -76,13 +114,10 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
); );
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge,
_buildTitle(),
verticalSpaceSmall,
_buildSubtitle(),
verticalSpaceMedium, verticalSpaceMedium,
_buildGoals(viewModel), _buildTitle(viewModel),
verticalSpaceMedium, verticalSpaceMedium,
_buildLearningGoals(viewModel)
]; ];
Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar( Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar(
@ -95,23 +130,27 @@ class LearningGoalFormScreen extends ViewModelWidget<OnboardingViewModel> {
: viewModel.selectedLanguage['code'], : viewModel.selectedLanguage['code'],
); );
Widget _buildTitle() => Text( Widget _buildTitle(OnboardingViewModel viewModel) => Text.rich(
LocaleKeys.learning_goal.tr(), TextSpan(
style: style25DG600, 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( Widget _buildLearningGoals(OnboardingViewModel viewModel) => ListView.builder(
LocaleKeys.your_goal.tr(),
style: style14MG400,
);
Widget _buildGoals(OnboardingViewModel viewModel) => ListView.builder(
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.zero, itemCount: 3, // viewModel.learningGoals.length,
itemCount: viewModel.learningGoals.length,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildLearningGoal( itemBuilder: (context, index) => _buildLearningGoal(
title: viewModel.learningGoals[index].label ?? '', icon: getIcon(index),
title: getTitles(index),
subtitle: getSubtitle(index),
selected: selected:
viewModel.isSelectedLearningGoal(viewModel.learningGoals[index]), viewModel.isSelectedLearningGoal(viewModel.learningGoals[index]),
onTap: () => onTap: () =>
@ -122,10 +161,14 @@ 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}) =>
CustomSmallRadioButton( CustomLargeRadioButton(
icon: icon,
title: title, title: title,
onTap: onTap, onTap: onTap,
subtitle: subtitle,
selected: selected, selected: selected,
); );
@ -136,14 +179,15 @@ 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,6 +45,7 @@ class OccupationFormScreen extends ViewModelWidget<OnboardingViewModel> {
List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildScaffoldChildren(OnboardingViewModel viewModel) => [
_buildAppBar(viewModel), _buildAppBar(viewModel),
verticalSpaceMedium,
_buildExpandedBody(viewModel) _buildExpandedBody(viewModel)
]; ];
@ -77,7 +78,7 @@ class OccupationFormScreen extends ViewModelWidget<OnboardingViewModel> {
); );
List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [ List<Widget> _buildUpperColumnChildren(OnboardingViewModel viewModel) => [
verticalSpaceLarge, verticalSpaceMedium,
_buildTitle(), _buildTitle(),
verticalSpaceSmall, verticalSpaceSmall,
_buildSubtitle(), _buildSubtitle(),

View File

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

View File

@ -2,7 +2,6 @@ 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';
@ -183,7 +182,6 @@ 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,7 +8,6 @@ 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';
@ -229,7 +228,6 @@ 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) =>
@ -242,7 +240,6 @@ 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,7 +2,6 @@ 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';
@ -10,24 +9,9 @@ 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, required this.practice}); const FinishPracticeSheet({super.key, this.onTap});
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();
@ -60,7 +44,7 @@ class FinishPracticeSheet extends StatelessWidget {
); );
Widget _buildMessage() => Text( Widget _buildMessage() => Text(
getWarning(), LocaleKeys.finish_all_practice.tr(),
style: style16DG600, style: style16DG600,
textAlign: TextAlign.center, textAlign: TextAlign.center,
); );

View File

@ -24,13 +24,7 @@ class LearnCourseTile extends ViewModelWidget<LearnCourseViewModel> {
@override @override
Widget build(BuildContext context, LearnCourseViewModel viewModel) => Widget build(BuildContext context, LearnCourseViewModel viewModel) =>
_buildExpansionTileCardWrapper(viewModel); _buildExpansionTileCard(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,7 +16,6 @@ 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;
@ -25,7 +24,6 @@ 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});
@ -33,12 +31,10 @@ 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) => Widget _buildContainerWrapper(LearnLessonViewModel viewModel)=> GestureDetector(
GestureDetector( onTap: !(lesson.access?.isAccessible ?? false) ? onPracticeTap:null,
onTap: !(lesson.access?.isAccessible ?? false) ? onPracticeTap : null, child: _buildContainer(viewModel),
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),
@ -74,14 +70,12 @@ 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),
@ -98,11 +92,9 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
style: style16DG600, style: style16DG600,
); );
Widget _buildIconState() => last && (lesson.access?.isAccessible ?? false) Widget _buildIconState() => (lesson.access?.isCompleted ?? false)
? _buildCompleteIcon() ? _buildCompleteIcon()
: (lesson.access?.isCompleted ?? false) : _buildPendingIcon();
? _buildCompleteIcon()
: _buildPendingIcon();
Widget _buildCompleteIcon() => const Icon( Widget _buildCompleteIcon() => const Icon(
Icons.check, Icons.check,
@ -136,17 +128,13 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
Widget _buildProgress() => CustomLinearProgressIndicator( Widget _buildProgress() => CustomLinearProgressIndicator(
activeColor: kcPrimaryColor, activeColor: kcPrimaryColor,
backgroundColor: kcVeryLightGrey, backgroundColor: kcVeryLightGrey,
progress: last && (lesson.access?.isAccessible ?? false) progress: (lesson.access?.progressPercent ?? 0) / 100,
? 1
: (lesson.access?.progressPercent ?? 0) / 100,
); );
Widget _buildProgressText() => Text( Widget _buildProgressText() => Text(
last && (lesson.access?.isAccessible ?? false) (lesson.access?.isCompleted ?? false)
? LocaleKeys.completed.tr() ? LocaleKeys.completed.tr()
: (lesson.access?.isCompleted ?? false) : LocaleKeys.in_progress.tr(),
? LocaleKeys.completed.tr()
: LocaleKeys.in_progress.tr(),
style: style14P600, style: style14P600,
); );

View File

@ -23,13 +23,8 @@ class LearnModuleTile extends ViewModelWidget<LearnModuleViewModel> {
@override @override
Widget build(BuildContext context, LearnModuleViewModel viewModel) => 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( 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.29+31 version: 0.1.28+30
publish_to: 'none' publish_to: 'none'
description: A new Flutter project. description: A new Flutter project.