diff --git a/lib/app/app.router.dart b/lib/app/app.router.dart index 0f868d9..90e8e84 100644 --- a/lib/app/app.router.dart +++ b/lib/app/app.router.dart @@ -501,6 +501,7 @@ class StackedRouter extends _i1.RouterBase { return _i37.MaterialPageRoute( builder: (context) => _i21.LearnLessonDetailView( key: args.key, + index: args.index, lesson: args.lesson, module: args.module, hasPractice: args.hasPractice), @@ -1083,6 +1084,7 @@ class ForgetPasswordViewArguments { class LearnLessonDetailViewArguments { const LearnLessonDetailViewArguments({ this.key, + required this.index, required this.lesson, required this.module, required this.hasPractice, @@ -1090,6 +1092,8 @@ class LearnLessonDetailViewArguments { final _i37.Key? key; + final int index; + final _i40.LearnLesson lesson; final _i39.LearnModule module; @@ -1098,13 +1102,14 @@ class LearnLessonDetailViewArguments { @override String toString() { - return '{"key": "$key", "lesson": "$lesson", "module": "$module", "hasPractice": "$hasPractice"}'; + return '{"key": "$key", "index": "$index", "lesson": "$lesson", "module": "$module", "hasPractice": "$hasPractice"}'; } @override bool operator ==(covariant LearnLessonDetailViewArguments other) { if (identical(this, other)) return true; return other.key == key && + other.index == index && other.lesson == lesson && other.module == module && other.hasPractice == hasPractice; @@ -1113,6 +1118,7 @@ class LearnLessonDetailViewArguments { @override int get hashCode { return key.hashCode ^ + index.hashCode ^ lesson.hashCode ^ module.hashCode ^ hasPractice.hashCode; @@ -1839,6 +1845,7 @@ extension NavigatorStateExtension on _i46.NavigationService { Future navigateToLearnLessonDetailView({ _i37.Key? key, + required int index, required _i40.LearnLesson lesson, required _i39.LearnModule module, required bool hasPractice, @@ -1850,7 +1857,11 @@ extension NavigatorStateExtension on _i46.NavigationService { }) async { return navigateTo(Routes.learnLessonDetailView, arguments: LearnLessonDetailViewArguments( - key: key, lesson: lesson, module: module, hasPractice: hasPractice), + key: key, + index: index, + lesson: lesson, + module: module, + hasPractice: hasPractice), id: routerId, preventDuplicates: preventDuplicates, parameters: parameters, @@ -2430,6 +2441,7 @@ extension NavigatorStateExtension on _i46.NavigationService { Future replaceWithLearnLessonDetailView({ _i37.Key? key, + required int index, required _i40.LearnLesson lesson, required _i39.LearnModule module, required bool hasPractice, @@ -2441,7 +2453,11 @@ extension NavigatorStateExtension on _i46.NavigationService { }) async { return replaceWith(Routes.learnLessonDetailView, arguments: LearnLessonDetailViewArguments( - key: key, lesson: lesson, module: module, hasPractice: hasPractice), + key: key, + index: index, + lesson: lesson, + module: module, + hasPractice: hasPractice), id: routerId, preventDuplicates: preventDuplicates, parameters: parameters, diff --git a/lib/models/access.dart b/lib/models/access.dart index 0644dbc..e1b676c 100644 --- a/lib/models/access.dart +++ b/lib/models/access.dart @@ -1,6 +1,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'access.g.dart'; + @JsonSerializable() class Access { final String? reason; @@ -48,15 +49,13 @@ class Access { isCompleted: isCompleted ?? this.isCompleted, isAccessible: isAccessible ?? this.isAccessible, progressPercentPrecise: - progressPercentPrecise ?? this.progressPercentPrecise, + progressPercentPrecise ?? this.progressPercentPrecise, completedCount: completedCount ?? this.completedCount, progressPercent: progressPercent ?? this.progressPercent, - ); } - factory Access.fromJson(Map json) => - _$AccessFromJson(json); + factory Access.fromJson(Map json) => _$AccessFromJson(json); Map toJson() => _$AccessToJson(this); -} \ No newline at end of file +} diff --git a/lib/models/course_progress.dart b/lib/models/course_progress.dart index ed7a565..37aa062 100644 --- a/lib/models/course_progress.dart +++ b/lib/models/course_progress.dart @@ -15,16 +15,14 @@ class CourseProgress { final List? modules; - @JsonKey(name: 'program_id') final int? programId; - - const CourseProgress( - {this.id,this.name,this.access,this.modules,this.programId}); + {this.id, this.name, this.access, this.modules, this.programId}); - factory CourseProgress.fromJson(Map json) => _$CourseProgressFromJson(json); + factory CourseProgress.fromJson(Map json) => + _$CourseProgressFromJson(json); Map toJson() => _$CourseProgressToJson(this); } diff --git a/lib/models/learn_course.dart b/lib/models/learn_course.dart index 2a30db9..044067c 100644 --- a/lib/models/learn_course.dart +++ b/lib/models/learn_course.dart @@ -35,7 +35,6 @@ class LearnCourse { int? sortOrder, int? programId, String? description, - }) { return LearnCourse( id: id ?? this.id, @@ -51,4 +50,4 @@ class LearnCourse { _$LearnCourseFromJson(json); Map toJson() => _$LearnCourseToJson(this); -} \ No newline at end of file +} diff --git a/lib/models/learn_lesson.dart b/lib/models/learn_lesson.dart index c611006..b9e38cf 100644 --- a/lib/models/learn_lesson.dart +++ b/lib/models/learn_lesson.dart @@ -3,6 +3,7 @@ import 'package:json_annotation/json_annotation.dart'; import 'access.dart'; part 'learn_lesson.g.dart'; + @JsonSerializable() class LearnLesson { final int? id; @@ -44,7 +45,6 @@ class LearnLesson { String? videoUrl, String? thumbnail, String? description, - }) { return LearnLesson( id: id ?? this.id, @@ -62,4 +62,4 @@ class LearnLesson { _$LearnLessonFromJson(json); Map toJson() => _$LearnLessonToJson(this); -} \ No newline at end of file +} diff --git a/lib/models/learn_module.dart b/lib/models/learn_module.dart index 1487aac..d3feb74 100644 --- a/lib/models/learn_module.dart +++ b/lib/models/learn_module.dart @@ -2,6 +2,7 @@ import 'package:json_annotation/json_annotation.dart'; import 'package:yimaru_app/models/access.dart'; part 'learn_module.g.dart'; + @JsonSerializable() class LearnModule { final int? id; @@ -43,7 +44,6 @@ class LearnModule { int? programId, int? sortOrder, String? description, - }) { return LearnModule( id: id ?? this.id, @@ -54,7 +54,6 @@ class LearnModule { sortOrder: sortOrder ?? this.sortOrder, programId: programId ?? this.programId, description: description ?? this.description, - ); } @@ -62,4 +61,4 @@ class LearnModule { _$LearnModuleFromJson(json); Map toJson() => _$LearnModuleToJson(this); -} \ No newline at end of file +} diff --git a/lib/models/learn_program.dart b/lib/models/learn_program.dart index 191fd93..fe57e52 100644 --- a/lib/models/learn_program.dart +++ b/lib/models/learn_program.dart @@ -2,6 +2,7 @@ import 'package:json_annotation/json_annotation.dart'; import 'package:yimaru_app/models/access.dart'; part 'learn_program.g.dart'; + @JsonSerializable() class LearnProgram { final int? id; @@ -43,4 +44,4 @@ class LearnProgram { _$LearnProgramFromJson(json); Map toJson() => _$LearnProgramToJson(this); -} \ No newline at end of file +} diff --git a/lib/models/lesson_progress.dart b/lib/models/lesson_progress.dart index c661938..3758054 100644 --- a/lib/models/lesson_progress.dart +++ b/lib/models/lesson_progress.dart @@ -15,11 +15,10 @@ class LessonProgress { @JsonKey(name: 'module_id') final int? moduleId; + const LessonProgress({this.id, this.title, this.access, this.moduleId}); - const LessonProgress( - {this.id,this.title,this.access,this.moduleId}); - - factory LessonProgress.fromJson(Map json) => _$LessonProgressFromJson(json); + factory LessonProgress.fromJson(Map json) => + _$LessonProgressFromJson(json); Map toJson() => _$LessonProgressToJson(this); } diff --git a/lib/models/progress_summary.dart b/lib/models/progress_summary.dart index 350eec6..3a4e1f9 100644 --- a/lib/models/progress_summary.dart +++ b/lib/models/progress_summary.dart @@ -15,10 +15,10 @@ class ProgressSummary { final List? courses; - const ProgressSummary( - {this.id,this.name,this.access,this.courses}); + const ProgressSummary({this.id, this.name, this.access, this.courses}); - factory ProgressSummary.fromJson(Map json) => _$ProgressSummaryFromJson(json); + factory ProgressSummary.fromJson(Map json) => + _$ProgressSummaryFromJson(json); Map toJson() => _$ProgressSummaryToJson(this); } diff --git a/lib/services/authentication_service.dart b/lib/services/authentication_service.dart index 2ba0637..dd22536 100644 --- a/lib/services/authentication_service.dart +++ b/lib/services/authentication_service.dart @@ -101,7 +101,6 @@ class AuthenticationService with ListenableServiceMixin { await _secureService.setString('firstName', data.firstName ?? ''); await _secureService.setString('occupation', data.occupation ?? ''); - _user = User( email: data.email, gender: data.gender, diff --git a/lib/services/learn_service.dart b/lib/services/learn_service.dart index a10a7cf..557ab77 100644 --- a/lib/services/learn_service.dart +++ b/lib/services/learn_service.dart @@ -17,7 +17,7 @@ class LearnService with ListenableServiceMixin { // Initialization learnService() { - listenToReactiveValues([_programs,_courses, _lessons, _modules]); + listenToReactiveValues([_programs, _courses, _lessons, _modules]); } // Learn program @@ -148,11 +148,10 @@ class LearnService with ListenableServiceMixin { ); }).toList(); - print('MY SUMMARIES - COMPLETED COUNT: ${_modules.first.access?.completedCount}'); + print( + 'MY SUMMARIES - COMPLETED COUNT: ${_modules.first.access?.completedCount}'); print('PROGRESS PERCENT: ${_modules.first.access?.progressPercent}'); - - /// UPDATE LESSONS _lessons = _lessons.map((lesson) { return lesson.copyWith( @@ -169,8 +168,6 @@ class LearnService with ListenableServiceMixin { } catch (_) { return null; } - - } LearnCourse? getLearnCourseById(int id) { @@ -179,7 +176,5 @@ class LearnService with ListenableServiceMixin { } catch (_) { return null; } - - } } diff --git a/lib/services/notification_service.dart b/lib/services/notification_service.dart index 24cb8ea..0ca0960 100644 --- a/lib/services/notification_service.dart +++ b/lib/services/notification_service.dart @@ -130,7 +130,7 @@ class NotificationService { } Future updateFCMToken() async { - // print('DEVICE TOKEN: ${await _messaging.getToken()}'); + // print('DEVICE TOKEN: ${await _messaging.getToken()}'); _messaging.onTokenRefresh.listen((newToken) { // updateTokenOnServer(newToken); }); diff --git a/lib/services/onboarding_service.dart b/lib/services/onboarding_service.dart index a6c6ada..050d00f 100644 --- a/lib/services/onboarding_service.dart +++ b/lib/services/onboarding_service.dart @@ -111,6 +111,5 @@ class OnboardingService with ListenableServiceMixin { _regions = await _apiService.getEthiopiaRegions(); notifyListeners(); - } } diff --git a/lib/ui/common/translations/codegen_loader.g.dart b/lib/ui/common/translations/codegen_loader.g.dart index 6ef5b32..1c12ca5 100644 --- a/lib/ui/common/translations/codegen_loader.g.dart +++ b/lib/ui/common/translations/codegen_loader.g.dart @@ -6,7 +6,7 @@ import 'dart:ui'; import 'package:easy_localization/easy_localization.dart' show AssetLoader; -class CodegenLoader extends AssetLoader{ +class CodegenLoader extends AssetLoader { const CodegenLoader(); @override @@ -14,379 +14,403 @@ class CodegenLoader extends AssetLoader{ return Future.value(mapLocales[locale.toString()]); } - static const Map _am = { - "loading": "በመጫን ላይ", - "welcome_back": "እንኳን በደህና ተመለሱ", - "checking_user_info": "የተጠቃሚ መረጃን በማረጋገጥ ላይ", - "dont_have_account": "መለያ የለዎትም?", - "email": "ኢሜይል", - "password": "የይለፍ ቃል", - "forgot_password": "የይለፍ ቃል ረሱ?", - "cont": "ቀጥል", - "register": "ይመዝገቡ", - "login_with_google": "በጉግል ይግቡ", - "or": "ወይም", - "login_with_phone": "በስልክ ቁጥር ይግቡ", - "create_account": "አዲስ መለያ ይፍጠሩ", - "already_have_account": "መለያ አለዎት?", - "login": " ይግቡ ", - "register_with_google": "በጉግል ይመዝገቡ", - "register_with_phone": "በስልክ ቁጥር ይመዝገቡ", - "enter_phone_number": "የስልክ ቁጥርዎን ያስገቡ። የማረጋገጫ ኮድ እንልክልዎታለን።", - "login_with_email": "በኢሜይል ይግቡ", - "create_password": "የይለፍ ቃል ይፍጠሩ", - "confirm_password": "የይለፍ ቃል ያረጋግጡ", - "eight_character_minimum": "ቢያንስ 8 ፊደላት", - "password_match": "የይለፍ ቃሉ ተመሳስሏል", - "sign_up_agreement": "‘ይመዝገቡ’ የሚለውን ሲጫኑ በ‘አገልግሎት ውሎች’ እና ‘በግላዊነት ፖሊሲ’ ይስማማሉ።", - "terms_of_services": "የአገልግሎት ውሎች", - "and": "እና", - "privacy_policy": "የግላዊነት ፖሊሲ", - "register_with_email": "በኢሜል ይመዝገቡ", - "verification_code": "የማረጋገጫ ኮድ", - "resend_code": "ኮዱን እንደገና ላክ", - "code_sent_to_phone": "ኮዱ ወደ ስልክ ቁጥርዎ ተልኳል", - "code_sent_to_email": "ኮዱ ወደ ኢሜል ተልኳል", - "resend_code_in": "ኮዱን እንደገና ለመላክ የቀረው ጊዜ", - "reset_password": " የይለፍ ቃልን ይቀይሩ", - "enter_email_reset_code": "ኢሜይልዎን ያስገቡ። የይለፍ ቃል መለወጫ ኮድ እንልክልዎታለን።", - "please_wait": "እባክዎ ይጠብቁ", - "reset_code_sent": "የመቀየሪያ ኮድ በተሳካ ሁኔታ ተልኳል", - "reset_code": " የመቀየሪያ ኮድ ", - "new_password": "አዲስ የይለፍ ቃል", - "logged_in_successfully": "በተሳካ ሁኔታ ገብተዋል", - "view_course": " ኮርሱን ይመልከቱ", - "continue_learning": "መማርን ይቀጥሉ", - "start_learning": "ትምህርትን ይጀምሩ", - "completed": "ተጠናቋል", - "take_practice": "ልምምድ ያድርጉ", - "your_current_level": "የአሁኑ ደረጃዎ", - "overall_progress": "አጠቃላይ እድገት", - "great_work": "በርቱ! በጣም ጥሩ እየሰሩ ነው", - "view_module": "ሞጁሉን ይመልከቱ", - "progress": "እድገት", - "keep_going": "ይቀጥሉ - ከግማሽ በላይ ጨርሰዋል ", - "lessons_in_module": "በዚህ ሞጁል ውስጥ ያሉ ትምህርቶች ", - "practice": "ልምምድ", - "start": "ጀምር", - "in_progress": "በሂደት ላይ", - "hello": "ሰላም", - "ready_to_learn": " ዛሬ እንግሊዝኛ ለመማር ተዘጋጅተዋል? ", - "learn": "ይማሩ ", - "course": "ኮርስ", - "profile": " ፕሮፋይል ", - "speaking_partner": "የንግግር ጓደኛ", - "practice_what_you_learned": "አሁን የተማሩትን እንለማመድ", - "practice_questions": "ጥቂት ጥያቄዎችን እጠይቃለሁ እና መልስ መስጠት ይችላሉ", - "start_practice": "ልምምድ ጀምር", - "almost_there": "ሊጨርሱ ተቃርበዋል", - "finish_session": "እድገትዎን ለማየት ክፍለ ጊዜውን ያጠናቅቁ", - "continue_practice": "ልምምዱን ይቀጥሉ", - "end_session": "ክፍለ ጊዜውን ያብቁ ", - "tap_start_to_listen": "ለማዳመጥ የጀምር ቁልፉን ይጫኑ", - "practice_speaking": "ንግግርን ይለማመዱ", - "tap_microphone": "ለመናገር ማይክሮፎኑን ይጫኑ", - "reply": "እንደገና አዳምጥ", - "cancel": "ይቅር", - "you_are_speaking": "እየተናገሩ ነው", - "practice_completed": "ልምምዱ ተጠናቅቋል", - "great_improvement": "በዚህኛው በራስ መተማመንዎ ጨምሯል፤ ትልቅ መሻሻል ነው", - "practice_again": "እንደገና ይለማመዱ", - "conversation_review": "የንግግር ግምገማ", - "result": "ውጤት", - "quick_tip": "ጠቃሚ ምክር", - "retry": "እንደገና ይሞክሩ", - "completed_a1": "እንኳን ደስ አለዎት! A1 ደረጃን አጠናቅቀዋል", - "analyzing_speaking": "የንግግር ችሎታዎን እየገመገምን ነው", - "view_profile": "ፕሮፋይሎን ይመልከቱ ", - "hi": "ሰላም", - "edit_profile": "መገለጫ ያስተካክሉ", - "first_name": "የመጀመሪያ ስም", - "last_name": "የአባት ስም", - "gender": "ፆታ", - "male": "ወንድ", - "female": "ሴት", - "phone_number": "የስልክ ቁጥር", - "country": "ሀገር", - "region": "ክልል", - "select_region": "ክልል ይምረጡ", - "enter_your_city": "ከተማዎን ያስገቡ", - "occupation": "የስራ መስክ", - "select_occupation": "ሙያዎን ይምረጡ", - "save_changes": "ለውጦችን ያስቀምጡ", - "my_progress": "የእኔ እድገት", - "track_your_achievement": "ስኬቶችዎን እና ተከታታይ የትምህርት ጉዞዎን ይከታተሉ", - "account_and_privacy": "መለያ እና ግላዊነት", - "manage_settings": "ቅንብሮችን እና የመተግበሪያ ምርጫዎችን ያስተዳድሩ", - "support": "ድጋፍ", - "get_help": "በስልክ ወይም በቴሌግራም እገዛ ያግኙ", - "logout": "ውጣ", - "app_settings": "የመተግበሪያ ቅንብሮች", - "legal_and_information": "ሕጋዊ እና መረጃ", - "change_language": "ቋንቋ ቀይር", - "terms_and_conditions": "ውሎች እና ሁኔታዎች", - "delete_account": "መለያ ሰርዝ", - "language_preference": "የቋንቋ ምርጫ", - "choose_your_language": "ለውጦችን አስቀምጥ", - "switch_language_anytime": "ቋንቋዎችን በማንኛውም ጊዜ መቀየር ይችላሉ", - "need_help": "እገዛ ይፈልጋሉ?", - "call_support": "የስልክ ድጋፍ", - "talk_with_support": "በቀጥታ ከድጋፍ ቡድናችን ጋር ይነጋገሩ", - "telegram_support": "የቴሌግራም ድጋፍ", - "chat_via_telegram": "በቴሌግራም በፍጥነት ይወያዩ", - "call_our_support": "ከ3 ጠዋት እስከ 12 ማታ ድረስ የድጋፍ ቡድናችንን ይደውሉ", - "tap_to_call": "ለመደወል ይንኩ", - "join_telegram": "በቴሌግራም የይማሩ አካዳሚን ይቀላቀሉ", - "connect_with_support_team": "ለፈጣን እርዳታ እና የማህበረሰብ ዝማኔዎች፣ በቴሌግራም ከድጋፍ ቡድናችን ጋር ወዲያውኑ ይገናኙ።", - "open_in_telegram": "በቴሌግራም ይክፈቱ", - "search_for": "ፈልጉት", - "current_level": "የአሁኑ ደረጃ", - "keep_up_the_great_work": "በጣም ጥሩ እየሰራህ ነው! ቀጥልበት፣ አስደናቂ ነህ።", - "no_practice_available": "ምንም ልምምድ አልተገኘም!", - "begin_module_practice": "የሞጁሉን ልምምድ ጀምር", - "lets_practice_lesson": "እንለማመድ", - "lets_quickly_review": "በዚህ ሞጁል ውስጥ የተማርከውን በፍጥነት እንከልስ!", - "lets_practice_module": "አሁን የተማርከውን እንለማመድ!", - "ask_you_few_actions": "ጥቂት ጥያቄዎችን እጠይቅሃለሁ፣ አንተም በተፈጥሮ መልስ ልትሰጥ ትችላለህ።", - "begin_level_practice": "የደረጃ ልምምድን ጀምር", - "lets_practice_course": "የኮርሱን ልምምድ እንለማመድ", - "lets_quick_review": "በዚህ ደረጃ የተማርከውን በፍጥነት እንከልስ!", - "speaking": "እየተናገረ ነው", - "you_have_finished_practice": "ልምምድህን አጠናቀቅህ", - "view_results": "ውጤቶቼን እይ", - "sample_answer": "ናሙና መልስ", - "your_answer": "መልስህ", - "sound_confident": "በዚህ ጊዜ የበለጠ እምነት ያለህ ይመስላል — በጣም ጥሩ መሻሻል ነው!", - "you_have_completed": "አያይ! አጠናቀቅህ", - "yes": "አዎ", - "no": "አይ", - "want_to_quit": "ለመውጣት እርግጠኛ ነህ?", - "required_field": "ይህ መስክ ያስፈልጋል", - "enter_full_name": "ሙሉ ስምህን አስገባ", - "invalid_email": "የማይሰራ የኢሜይል ቅርጸት", - "phone_must_start_with": "የስልክ ቁጥር በ251 መጀመር አለበት", - "phone_must_be": "የስልክ ቁጥር 12 አሃዞች መሆን አለበት", - "what_should_we_call_you": "ምን ብለን እንጠራህ?", - "name_for_personalization": "በመማር ጉዞህ ውስጥ ለግል ለማድረግ ስምህን እንጠቀማለን።", - "choose_your_gender": "ጾታህን ምረጥ", - "gender_for_personalization": "በጾታህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", - "age_range": "በየትኛው የእድሜ ክልል ውስጥ ነህ?", - "age_for_personalization": "በእድሜህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", - "educational_background": "አሁን ያለህ የትምህርት ደረጃ ምንድን ነው?", - "education_for_personalization": "ይህ ትምህርቶችን ከልምድህ ጋር እንዲስማሙ ለማድረግ ይረዳናል።", - "your_occupation": "ስራህ ምንድን ነው?", - "occupation_for_personalization": "በስራህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", - "location": "ከየት ነህ?", - "select_country_region": "አገርህን እና ክልልህን ከተቆልቋይ ዝርዝሩ ምረጥ", - "select_country": "አገር ምረጥ", - "learning_goal": "የመማር ዓላማህን ምረጥ", - "language_goal": "እንግሊዝኛህን ለማሻሻል ዋና ዓላማህ ምንድን ነው?", - "your_goal": "ዓላማህ የመማር ጉዞህን እንዲስማማ ለማድረግ ይረዳናል።", - "write_your_goal": "ዓላማህን ጻፍ…", - "challenge_you_face": "What challenge do you face most with English?", - "evey_one_has_strugle": "ሁሉም ሰው ችግሮች አሉት፣ የአንተን እንጀምር እንፍታ", - "write_your_challenge": "ችግርህን ጻፍ…", - "topic_interest": "በጣም የሚስቡህ ርዕሶች የትኞቹ ናቸው?", - "favourite_topic": "የምትወዳቸው ርዕሶች አስደሳች እና ከሕይወትህ ጋር የተዛመዱ ትምህርቶችን ለመፍጠር ይረዱናል።", - "your_interest": "ፍላጎትህን ጻፍ…", - "want_quick_assessment": "የእንግሊዝኛ ደረጃህን ለማወቅ ፈጣን ግምገማ ትፈልጋለህ?", - "answer_quick_questions": "የእንግሊዝኛ ችሎታህን ለመረዳት ጥቂት ፈጣን ጥያቄዎችን መልስ።", - "skip": "ዝለል", - "finish_level": "ደረጃውን አጠናቅቅ", - "likely_speaker": "አንተ ምናልባት ተናጋሪ ነህ", - "great_job": "በጣም ጥሩ ስራ! ለመሻሻል ቀጣዩ ደረጃህ ይኸው ነው።", - "lets_start_practice": "ልምምድህን እንጀምር", - "welcome_abroad": "እንኳን ደህና መጣህ", - "ready_to_explore": "የግል ትምህርቶችህን ለማሰስ ዝግጁ ነህ።", - "finish": "አጠናቅቅ", - "finish_all_practice": "ልምምዱን ለመውሰድ በትምህርቶቹ ውስጥ ያሉትን ሁሉንም ልምምዶች ያጠናቅቁ።" -}; -static const Map _en = { - "loading": "Loading", - "welcome_back": "Welcome back", - "checking_user_info": "Checking user info", - "dont_have_account": "Don't have an account?", - "email": "Email", - "password": "Password", - "forgot_password": "Forgot password?", - "cont": "Continue", - "register": "Register", - "login_with_google": "Login with Google", - "or": "Or", - "login_with_phone": "Login with phone number", - "create_account": "Create an account", - "already_have_account": "Already have an account?", - "login": "Login", - "register_with_google": "Register with Google", - "register_with_phone": "Register with phone number", - "enter_phone_number": "Enter your phone number. We will send you a confirmation code there.", - "login_with_email": "Login with email", - "create_password": "Create password", - "confirm_password": "Confirm password", - "eight_character_minimum": "8 characters minimum", - "password_match": "password match", - "sign_up_agreement": "By clicking ‘Sign Up’, you agree to our ‘Terms of Service’ and ‘Privacy Policy’", - "terms_of_services": "Terms of Service", - "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 your number", - "code_sent_to_email": "Code sent to your email", - "resend_code_in": "Resend code in", - "reset_password": "Reset Password", - "enter_email_reset_code": "Enter your email. We will send you a reset code.", - "please_wait": "Please wait", - "reset_code_sent": "Reset code sent successfully", - "reset_code": "Reset code", - "new_password": "New password", - "logged_in_successfully": "Logged in successfully", - "continue_learning": "Continue Learning", - "start_learning": "Start Learning", - "completed": "Completed", - "view_course": "View course", - "take_practice": "Take practice", - "your_current_level": "Your current level", - "overall_progress": "Overall progress", - "great_work": "Keep up the great work! You're doing amazing", - "view_module": "View module", - "progress": "Progress", - "keep_going": "Let's keep going - you're more than half there", - "lessons_in_module": "Lessons in this module", - "practice": "Practice", - "start": "Start", - "in_progress": "In Progress", - "hello": "Hello", - "ready_to_learn": "Ready to keep learning English today", - "learn": "Learn", - "course": "Course", - "profile": "Profile", - "speaking_partner": "Speaking partner", - "practice_what_you_learned": "Let's practice what you just learnt", - "practice_questions": "I will ask you a few questions and you can respond", - "start_practice": "Start practice", - "almost_there": "You're almost there", - "finish_session": "Finish the session to see your progress", - "continue_practice": "Continue practice", - "end_session": "End session", - "tap_start_to_listen": "Tap the start button to listen", - "practice_speaking": "Practice speaking", - "tap_microphone": "Tap the microphone to speak", - "reply": "Reply", - "cancel": "Cancel", - "you_are_speaking": "You're speaking", - "practice_completed": "Practice completed!", - "great_improvement": "You sound more confident this time, great improvement", - "practice_again": "Practice again", - "conversation_review": "Conversation review", - "result": "Result", - "quick_tip": "Quick tip", - "retry": "Retry", - "completed_a1": "Yay, you've completed A1", - "analyzing_speaking": "We're now analyzing your speaking skill", - "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 achievements and learning streak", - "account_and_privacy": "Account & Privacy", - "manage_settings": "Manage settings and app preference", - "support": "Support", - "get_help": "Get help through phone or Telegram", - "logout": "Logout", - "app_settings": "App settings", - "legal_and_information": "Legal & Information", - "change_language": "Change language", - "terms_and_conditions": "Terms & Conditions", - "delete_account": "Delete account", - "language_preference": "Language preference", - "choose_your_language": "Choose your language", - "switch_language_anytime": "You can switch languages anytime", - "need_help": "Need help?", - "call_support": "Call support", - "talk_with_support": "Talk with our support team directly", - "telegram_support": "Telegram support", - "chat_via_telegram": "Chat instantly via Telegram", - "call_our_support": "Call our support team between 9 AM - 6 PM", - "tap_to_call": "Tap to call", - "join_telegram": "Join Yimaru Academy on Telegram", - "connect_with_support_team": "Connect with our support team instantly on Telegram for quick assistance and community updates", - "open_in_telegram": "Open in Telegram", - "search_for": "Search for", - "current_level": "Current Level", - "keep_up_the_great_work": "Keep up the great work! You're doing amazing.", - "no_practice_available": "No practice available!", - "begin_module_practice": "Begin Module Practice", - "lets_practice_lesson": "Let’s Practice", - "lets_quickly_review": "Let’s quickly review what you’ve learned in this module!", - "lets_practice_module": "Let's practice what you just learnt!", - "ask_you_few_actions": "I’ll ask you a few questions, and you can respond naturally.", - "begin_level_practice": "Begin Level Practice", - "lets_practice_course": "Let’s Practice Course", - "lets_quick_review": "Let’s quickly review what you’ve learned in this level!", - "speaking": "is speaking...", - "you_have_finished_practice": "You have finished your practice", - "view_results": "View My Results", - "sample_answer": "Sample Answer", - "your_answer": "Your Answer", - "sound_confident": "You sound more confident this time - great improvement!", - "you_have_completed": "Yay, you’ve completed", - "yes": "Yes", - "no": "No", - "want_to_quit": "Are you sure you want to quit?", - "required_field": "The field is required", - "enter_full_name": "Enter your full name", - "invalid_email": "Invalid email format", - "phone_must_start_with": "Phone number must start with 251", - "phone_must_be": "Phone number must be 12 digits", - "what_should_we_call_you": "What should we call you?", - "name_for_personalization": "We’ll use your name to personalize your learning journey.", - "choose_your_gender": "Choose your gender?", - "gender_for_personalization": "We’ll personalize your learning experience based on your gender.", - "age_range": "Which age range are you in?", - "age_for_personalization": "We’ll personalize your learning experience based on your age.", - "educational_background": "What’s your current educational level?", - "education_for_personalization": "This helps us tailor your lessons to your experience.", - "your_occupation": "What’s your occupation?", - "occupation_for_personalization": "We’ll personalize your learning experience based on your occupation.", - "location": "Where are you from?", - "select_country_region": "Select your country and region from the dropdown", - "select_country": "Select country", - "learning_goal": "Choose your learning goal.", - "language_goal": "What’s your main goal for improving your English?", - "your_goal": "Your goal helps us tailor your learning journey.", - "write_your_goal": "Write your goal…", - "challenge_you_face": "What challenge do you face most with English?", - "evey_one_has_strugle": "Everyone has struggles, let’s start fixing yours", - "write_your_challenge": "Write your challenge…", - "topic_interest": "Which topics interest you most?", - "favourite_topic": "Your favorite topics help us create fun, relatable lessons.", - "your_interest": "Write your interest…", - "want_quick_assessment": "Want a quick assessment to know your English level?", - "answer_quick_questions": "Answer a few quick questions to help us understand your English proficiency.", - "skip": "Skip", - "finish_level": "Finish Level", - "likely_speaker": "You’re likely speaker of", - "great_job": "Great Job! Here’s your next step to keep improving.", - "lets_start_practice": "Let's start your practice", - "welcome_abroad": "Welcome aboard", - "ready_to_explore": "You’re 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> mapLocales = {"am": _am, "en": _en}; + static const Map _am = { + "loading": "በመጫን ላይ", + "welcome_back": "እንኳን በደህና ተመለሱ", + "checking_user_info": "የተጠቃሚ መረጃን በማረጋገጥ ላይ", + "dont_have_account": "መለያ የለዎትም?", + "email": "ኢሜይል", + "password": "የይለፍ ቃል", + "forgot_password": "የይለፍ ቃል ረሱ?", + "cont": "ቀጥል", + "register": "ይመዝገቡ", + "login_with_google": "በጉግል ይግቡ", + "or": "ወይም", + "login_with_phone": "በስልክ ቁጥር ይግቡ", + "create_account": "አዲስ መለያ ይፍጠሩ", + "already_have_account": "መለያ አለዎት?", + "login": " ይግቡ ", + "register_with_google": "በጉግል ይመዝገቡ", + "register_with_phone": "በስልክ ቁጥር ይመዝገቡ", + "enter_phone_number": "የስልክ ቁጥርዎን ያስገቡ። የማረጋገጫ ኮድ እንልክልዎታለን።", + "login_with_email": "በኢሜይል ይግቡ", + "create_password": "የይለፍ ቃል ይፍጠሩ", + "confirm_password": "የይለፍ ቃል ያረጋግጡ", + "eight_character_minimum": "ቢያንስ 8 ፊደላት", + "password_match": "የይለፍ ቃሉ ተመሳስሏል", + "sign_up_agreement": + "‘ይመዝገቡ’ የሚለውን ሲጫኑ በ‘አገልግሎት ውሎች’ እና ‘በግላዊነት ፖሊሲ’ ይስማማሉ።", + "terms_of_services": "የአገልግሎት ውሎች", + "and": "እና", + "privacy_policy": "የግላዊነት ፖሊሲ", + "register_with_email": "በኢሜል ይመዝገቡ", + "verification_code": "የማረጋገጫ ኮድ", + "resend_code": "ኮዱን እንደገና ላክ", + "code_sent_to_phone": "ኮዱ ወደ ስልክ ቁጥርዎ ተልኳል", + "code_sent_to_email": "ኮዱ ወደ ኢሜል ተልኳል", + "resend_code_in": "ኮዱን እንደገና ለመላክ የቀረው ጊዜ", + "reset_password": " የይለፍ ቃልን ይቀይሩ", + "enter_email_reset_code": "ኢሜይልዎን ያስገቡ። የይለፍ ቃል መለወጫ ኮድ እንልክልዎታለን።", + "please_wait": "እባክዎ ይጠብቁ", + "reset_code_sent": "የመቀየሪያ ኮድ በተሳካ ሁኔታ ተልኳል", + "reset_code": " የመቀየሪያ ኮድ ", + "new_password": "አዲስ የይለፍ ቃል", + "logged_in_successfully": "በተሳካ ሁኔታ ገብተዋል", + "view_course": " ኮርሱን ይመልከቱ", + "continue_learning": "መማርን ይቀጥሉ", + "start_learning": "ትምህርትን ይጀምሩ", + "completed": "ተጠናቋል", + "take_practice": "ልምምድ ያድርጉ", + "your_current_level": "የአሁኑ ደረጃዎ", + "overall_progress": "አጠቃላይ እድገት", + "great_work": "በርቱ! በጣም ጥሩ እየሰሩ ነው", + "view_module": "ሞጁሉን ይመልከቱ", + "progress": "እድገት", + "keep_going": "ይቀጥሉ - ከግማሽ በላይ ጨርሰዋል ", + "lessons_in_module": "በዚህ ሞጁል ውስጥ ያሉ ትምህርቶች ", + "practice": "ልምምድ", + "start": "ጀምር", + "in_progress": "በሂደት ላይ", + "hello": "ሰላም", + "ready_to_learn": " ዛሬ እንግሊዝኛ ለመማር ተዘጋጅተዋል? ", + "learn": "ይማሩ ", + "course": "ኮርስ", + "profile": " ፕሮፋይል ", + "speaking_partner": "የንግግር ጓደኛ", + "practice_what_you_learned": "አሁን የተማሩትን እንለማመድ", + "practice_questions": "ጥቂት ጥያቄዎችን እጠይቃለሁ እና መልስ መስጠት ይችላሉ", + "start_practice": "ልምምድ ጀምር", + "almost_there": "ሊጨርሱ ተቃርበዋል", + "finish_session": "እድገትዎን ለማየት ክፍለ ጊዜውን ያጠናቅቁ", + "continue_practice": "ልምምዱን ይቀጥሉ", + "end_session": "ክፍለ ጊዜውን ያብቁ ", + "tap_start_to_listen": "ለማዳመጥ የጀምር ቁልፉን ይጫኑ", + "practice_speaking": "ንግግርን ይለማመዱ", + "tap_microphone": "ለመናገር ማይክሮፎኑን ይጫኑ", + "reply": "እንደገና አዳምጥ", + "cancel": "ይቅር", + "you_are_speaking": "እየተናገሩ ነው", + "practice_completed": "ልምምዱ ተጠናቅቋል", + "great_improvement": "በዚህኛው በራስ መተማመንዎ ጨምሯል፤ ትልቅ መሻሻል ነው", + "practice_again": "እንደገና ይለማመዱ", + "conversation_review": "የንግግር ግምገማ", + "result": "ውጤት", + "quick_tip": "ጠቃሚ ምክር", + "retry": "እንደገና ይሞክሩ", + "completed_a1": "እንኳን ደስ አለዎት! A1 ደረጃን አጠናቅቀዋል", + "analyzing_speaking": "የንግግር ችሎታዎን እየገመገምን ነው", + "view_profile": "ፕሮፋይሎን ይመልከቱ ", + "hi": "ሰላም", + "edit_profile": "መገለጫ ያስተካክሉ", + "first_name": "የመጀመሪያ ስም", + "last_name": "የአባት ስም", + "gender": "ፆታ", + "male": "ወንድ", + "female": "ሴት", + "phone_number": "የስልክ ቁጥር", + "country": "ሀገር", + "region": "ክልል", + "select_region": "ክልል ይምረጡ", + "enter_your_city": "ከተማዎን ያስገቡ", + "occupation": "የስራ መስክ", + "select_occupation": "ሙያዎን ይምረጡ", + "save_changes": "ለውጦችን ያስቀምጡ", + "my_progress": "የእኔ እድገት", + "track_your_achievement": "ስኬቶችዎን እና ተከታታይ የትምህርት ጉዞዎን ይከታተሉ", + "account_and_privacy": "መለያ እና ግላዊነት", + "manage_settings": "ቅንብሮችን እና የመተግበሪያ ምርጫዎችን ያስተዳድሩ", + "support": "ድጋፍ", + "get_help": "በስልክ ወይም በቴሌግራም እገዛ ያግኙ", + "logout": "ውጣ", + "app_settings": "የመተግበሪያ ቅንብሮች", + "legal_and_information": "ሕጋዊ እና መረጃ", + "change_language": "ቋንቋ ቀይር", + "terms_and_conditions": "ውሎች እና ሁኔታዎች", + "delete_account": "መለያ ሰርዝ", + "language_preference": "የቋንቋ ምርጫ", + "choose_your_language": "ለውጦችን አስቀምጥ", + "switch_language_anytime": "ቋንቋዎችን በማንኛውም ጊዜ መቀየር ይችላሉ", + "need_help": "እገዛ ይፈልጋሉ?", + "call_support": "የስልክ ድጋፍ", + "talk_with_support": "በቀጥታ ከድጋፍ ቡድናችን ጋር ይነጋገሩ", + "telegram_support": "የቴሌግራም ድጋፍ", + "chat_via_telegram": "በቴሌግራም በፍጥነት ይወያዩ", + "call_our_support": "ከ3 ጠዋት እስከ 12 ማታ ድረስ የድጋፍ ቡድናችንን ይደውሉ", + "tap_to_call": "ለመደወል ይንኩ", + "join_telegram": "በቴሌግራም የይማሩ አካዳሚን ይቀላቀሉ", + "connect_with_support_team": + "ለፈጣን እርዳታ እና የማህበረሰብ ዝማኔዎች፣ በቴሌግራም ከድጋፍ ቡድናችን ጋር ወዲያውኑ ይገናኙ።", + "open_in_telegram": "በቴሌግራም ይክፈቱ", + "search_for": "ፈልጉት", + "current_level": "የአሁኑ ደረጃ", + "keep_up_the_great_work": "በጣም ጥሩ እየሰራህ ነው! ቀጥልበት፣ አስደናቂ ነህ።", + "no_practice_available": "ምንም ልምምድ አልተገኘም!", + "begin_module_practice": "የሞጁሉን ልምምድ ጀምር", + "lets_practice_lesson": "እንለማመድ", + "lets_quickly_review": "በዚህ ሞጁል ውስጥ የተማርከውን በፍጥነት እንከልስ!", + "lets_practice_module": "አሁን የተማርከውን እንለማመድ!", + "ask_you_few_actions": "ጥቂት ጥያቄዎችን እጠይቅሃለሁ፣ አንተም በተፈጥሮ መልስ ልትሰጥ ትችላለህ።", + "begin_level_practice": "የደረጃ ልምምድን ጀምር", + "lets_practice_course": "የኮርሱን ልምምድ እንለማመድ", + "lets_quick_review": "በዚህ ደረጃ የተማርከውን በፍጥነት እንከልስ!", + "speaking": "እየተናገረ ነው", + "you_have_finished_practice": "ልምምድህን አጠናቀቅህ", + "view_results": "ውጤቶቼን እይ", + "sample_answer": "ናሙና መልስ", + "your_answer": "መልስህ", + "sound_confident": "በዚህ ጊዜ የበለጠ እምነት ያለህ ይመስላል — በጣም ጥሩ መሻሻል ነው!", + "you_have_completed": "አያይ! አጠናቀቅህ", + "yes": "አዎ", + "no": "አይ", + "want_to_quit": "ለመውጣት እርግጠኛ ነህ?", + "required_field": "ይህ መስክ ያስፈልጋል", + "enter_full_name": "ሙሉ ስምህን አስገባ", + "invalid_email": "የማይሰራ የኢሜይል ቅርጸት", + "phone_must_start_with": "የስልክ ቁጥር በ251 መጀመር አለበት", + "phone_must_be": "የስልክ ቁጥር 12 አሃዞች መሆን አለበት", + "what_should_we_call_you": "ምን ብለን እንጠራህ?", + "name_for_personalization": "በመማር ጉዞህ ውስጥ ለግል ለማድረግ ስምህን እንጠቀማለን።", + "choose_your_gender": "ጾታህን ምረጥ", + "gender_for_personalization": "በጾታህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", + "age_range": "በየትኛው የእድሜ ክልል ውስጥ ነህ?", + "age_for_personalization": "በእድሜህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", + "educational_background": "አሁን ያለህ የትምህርት ደረጃ ምንድን ነው?", + "education_for_personalization": "ይህ ትምህርቶችን ከልምድህ ጋር እንዲስማሙ ለማድረግ ይረዳናል።", + "your_occupation": "ስራህ ምንድን ነው?", + "occupation_for_personalization": "በስራህ መሰረት የመማር ተሞክሮህን እናበጅለታለን።", + "location": "ከየት ነህ?", + "select_country_region": "አገርህን እና ክልልህን ከተቆልቋይ ዝርዝሩ ምረጥ", + "select_country": "አገር ምረጥ", + "learning_goal": "የመማር ዓላማህን ምረጥ", + "language_goal": "እንግሊዝኛህን ለማሻሻል ዋና ዓላማህ ምንድን ነው?", + "your_goal": "ዓላማህ የመማር ጉዞህን እንዲስማማ ለማድረግ ይረዳናል።", + "write_your_goal": "ዓላማህን ጻፍ…", + "challenge_you_face": "What challenge do you face most with English?", + "evey_one_has_strugle": "ሁሉም ሰው ችግሮች አሉት፣ የአንተን እንጀምር እንፍታ", + "write_your_challenge": "ችግርህን ጻፍ…", + "topic_interest": "በጣም የሚስቡህ ርዕሶች የትኞቹ ናቸው?", + "favourite_topic": + "የምትወዳቸው ርዕሶች አስደሳች እና ከሕይወትህ ጋር የተዛመዱ ትምህርቶችን ለመፍጠር ይረዱናል።", + "your_interest": "ፍላጎትህን ጻፍ…", + "want_quick_assessment": "የእንግሊዝኛ ደረጃህን ለማወቅ ፈጣን ግምገማ ትፈልጋለህ?", + "answer_quick_questions": "የእንግሊዝኛ ችሎታህን ለመረዳት ጥቂት ፈጣን ጥያቄዎችን መልስ።", + "skip": "ዝለል", + "finish_level": "ደረጃውን አጠናቅቅ", + "likely_speaker": "አንተ ምናልባት ተናጋሪ ነህ", + "great_job": "በጣም ጥሩ ስራ! ለመሻሻል ቀጣዩ ደረጃህ ይኸው ነው።", + "lets_start_practice": "ልምምድህን እንጀምር", + "welcome_abroad": "እንኳን ደህና መጣህ", + "ready_to_explore": "የግል ትምህርቶችህን ለማሰስ ዝግጁ ነህ።", + "finish": "አጠናቅቅ", + "finish_all_practice": "ልምምዱን ለመውሰድ በትምህርቶቹ ውስጥ ያሉትን ሁሉንም ልምምዶች ያጠናቅቁ።" + }; + static const Map _en = { + "loading": "Loading", + "welcome_back": "Welcome back", + "checking_user_info": "Checking user info", + "dont_have_account": "Don't have an account?", + "email": "Email", + "password": "Password", + "forgot_password": "Forgot password?", + "cont": "Continue", + "register": "Register", + "login_with_google": "Login with Google", + "or": "Or", + "login_with_phone": "Login with phone number", + "create_account": "Create an account", + "already_have_account": "Already have an account?", + "login": "Login", + "register_with_google": "Register with Google", + "register_with_phone": "Register with phone number", + "enter_phone_number": + "Enter your phone number. We will send you a confirmation code there.", + "login_with_email": "Login with email", + "create_password": "Create password", + "confirm_password": "Confirm password", + "eight_character_minimum": "8 characters minimum", + "password_match": "password match", + "sign_up_agreement": + "By clicking ‘Sign Up’, you agree to our ‘Terms of Service’ and ‘Privacy Policy’", + "terms_of_services": "Terms of Service", + "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 your number", + "code_sent_to_email": "Code sent to your email", + "resend_code_in": "Resend code in", + "reset_password": "Reset Password", + "enter_email_reset_code": + "Enter your email. We will send you a reset code.", + "please_wait": "Please wait", + "reset_code_sent": "Reset code sent successfully", + "reset_code": "Reset code", + "new_password": "New password", + "logged_in_successfully": "Logged in successfully", + "continue_learning": "Continue Learning", + "start_learning": "Start Learning", + "completed": "Completed", + "view_course": "View course", + "take_practice": "Take practice", + "your_current_level": "Your current level", + "overall_progress": "Overall progress", + "great_work": "Keep up the great work! You're doing amazing", + "view_module": "View module", + "progress": "Progress", + "keep_going": "Let's keep going - you're more than half there", + "lessons_in_module": "Lessons in this module", + "practice": "Practice", + "start": "Start", + "in_progress": "In Progress", + "hello": "Hello", + "ready_to_learn": "Ready to keep learning English today", + "learn": "Learn", + "course": "Course", + "profile": "Profile", + "speaking_partner": "Speaking partner", + "practice_what_you_learned": "Let's practice what you just learnt", + "practice_questions": "I will ask you a few questions and you can respond", + "start_practice": "Start practice", + "almost_there": "You're almost there", + "finish_session": "Finish the session to see your progress", + "continue_practice": "Continue practice", + "end_session": "End session", + "tap_start_to_listen": "Tap the start button to listen", + "practice_speaking": "Practice speaking", + "tap_microphone": "Tap the microphone to speak", + "reply": "Reply", + "cancel": "Cancel", + "you_are_speaking": "You're speaking", + "practice_completed": "Practice completed!", + "great_improvement": + "You sound more confident this time, great improvement", + "practice_again": "Practice again", + "conversation_review": "Conversation review", + "result": "Result", + "quick_tip": "Quick tip", + "retry": "Retry", + "completed_a1": "Yay, you've completed A1", + "analyzing_speaking": "We're now analyzing your speaking skill", + "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 achievements and learning streak", + "account_and_privacy": "Account & Privacy", + "manage_settings": "Manage settings and app preference", + "support": "Support", + "get_help": "Get help through phone or Telegram", + "logout": "Logout", + "app_settings": "App settings", + "legal_and_information": "Legal & Information", + "change_language": "Change language", + "terms_and_conditions": "Terms & Conditions", + "delete_account": "Delete account", + "language_preference": "Language preference", + "choose_your_language": "Choose your language", + "switch_language_anytime": "You can switch languages anytime", + "need_help": "Need help?", + "call_support": "Call support", + "talk_with_support": "Talk with our support team directly", + "telegram_support": "Telegram support", + "chat_via_telegram": "Chat instantly via Telegram", + "call_our_support": "Call our support team between 9 AM - 6 PM", + "tap_to_call": "Tap to call", + "join_telegram": "Join Yimaru Academy on Telegram", + "connect_with_support_team": + "Connect with our support team instantly on Telegram for quick assistance and community updates", + "open_in_telegram": "Open in Telegram", + "search_for": "Search for", + "current_level": "Current Level", + "keep_up_the_great_work": "Keep up the great work! You're doing amazing.", + "no_practice_available": "No practice available!", + "begin_module_practice": "Begin Module Practice", + "lets_practice_lesson": "Let’s Practice", + "lets_quickly_review": + "Let’s quickly review what you’ve learned in this module!", + "lets_practice_module": "Let's practice what you just learnt!", + "ask_you_few_actions": + "I’ll ask you a few questions, and you can respond naturally.", + "begin_level_practice": "Begin Level Practice", + "lets_practice_course": "Let’s Practice Course", + "lets_quick_review": + "Let’s quickly review what you’ve learned in this level!", + "speaking": "is speaking...", + "you_have_finished_practice": "You have finished your practice", + "view_results": "View My Results", + "sample_answer": "Sample Answer", + "your_answer": "Your Answer", + "sound_confident": + "You sound more confident this time - great improvement!", + "you_have_completed": "Yay, you’ve completed", + "yes": "Yes", + "no": "No", + "want_to_quit": "Are you sure you want to quit?", + "required_field": "The field is required", + "enter_full_name": "Enter your full name", + "invalid_email": "Invalid email format", + "phone_must_start_with": "Phone number must start with 251", + "phone_must_be": "Phone number must be 12 digits", + "what_should_we_call_you": "What should we call you?", + "name_for_personalization": + "We’ll use your name to personalize your learning journey.", + "choose_your_gender": "Choose your gender?", + "gender_for_personalization": + "We’ll personalize your learning experience based on your gender.", + "age_range": "Which age range are you in?", + "age_for_personalization": + "We’ll personalize your learning experience based on your age.", + "educational_background": "What’s your current educational level?", + "education_for_personalization": + "This helps us tailor your lessons to your experience.", + "your_occupation": "What’s your occupation?", + "occupation_for_personalization": + "We’ll personalize your learning experience based on your occupation.", + "location": "Where are you from?", + "select_country_region": "Select your country and region from the dropdown", + "select_country": "Select country", + "learning_goal": "Choose your learning goal.", + "language_goal": "What’s your main goal for improving your English?", + "your_goal": "Your goal helps us tailor your learning journey.", + "write_your_goal": "Write your goal…", + "challenge_you_face": "What challenge do you face most with English?", + "evey_one_has_strugle": "Everyone has struggles, let’s start fixing yours", + "write_your_challenge": "Write your challenge…", + "topic_interest": "Which topics interest you most?", + "favourite_topic": + "Your favorite topics help us create fun, relatable lessons.", + "your_interest": "Write your interest…", + "want_quick_assessment": + "Want a quick assessment to know your English level?", + "answer_quick_questions": + "Answer a few quick questions to help us understand your English proficiency.", + "skip": "Skip", + "finish_level": "Finish Level", + "likely_speaker": "You’re likely speaker of", + "great_job": "Great Job! Here’s your next step to keep improving.", + "lets_start_practice": "Let's start your practice", + "welcome_abroad": "Welcome aboard", + "ready_to_explore": "You’re 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> mapLocales = { + "am": _am, + "en": _en + }; } diff --git a/lib/ui/common/translations/locale_keys.g.dart b/lib/ui/common/translations/locale_keys.g.dart index b2be009..a3c563d 100644 --- a/lib/ui/common/translations/locale_keys.g.dart +++ b/lib/ui/common/translations/locale_keys.g.dart @@ -2,7 +2,7 @@ // ignore_for_file: constant_identifier_names -abstract class LocaleKeys { +abstract class LocaleKeys { static const loading = 'loading'; static const welcome_back = 'welcome_back'; static const checking_user_info = 'checking_user_info'; @@ -161,7 +161,8 @@ abstract class LocaleKeys { static const educational_background = 'educational_background'; static const education_for_personalization = 'education_for_personalization'; static const your_occupation = 'your_occupation'; - static const occupation_for_personalization = 'occupation_for_personalization'; + static const occupation_for_personalization = + 'occupation_for_personalization'; static const location = 'location'; static const select_country_region = 'select_country_region'; static const select_country = 'select_country'; @@ -186,5 +187,4 @@ abstract class LocaleKeys { static const ready_to_explore = 'ready_to_explore'; static const finish = 'finish'; static const finish_all_practice = 'finish_all_practice'; - } diff --git a/lib/ui/views/account_privacy/account_privacy_view.dart b/lib/ui/views/account_privacy/account_privacy_view.dart index bc23adb..bcbf2fc 100644 --- a/lib/ui/views/account_privacy/account_privacy_view.dart +++ b/lib/ui/views/account_privacy/account_privacy_view.dart @@ -30,12 +30,11 @@ class AccountPrivacyView extends StackedView { body: _buildScaffoldContainer(viewModel), ); - - Widget _buildScaffoldContainer( AccountPrivacyViewModel viewModel) => Container( - decoration: bgDecoration, - child: _buildScaffold( viewModel), - ); - + Widget _buildScaffoldContainer(AccountPrivacyViewModel viewModel) => + Container( + decoration: bgDecoration, + child: _buildScaffold(viewModel), + ); Widget _buildScaffold(AccountPrivacyViewModel viewModel) => SafeArea(child: _buildBodyWrapper(viewModel)); diff --git a/lib/ui/views/arif_pay/arif_pay_view.dart b/lib/ui/views/arif_pay/arif_pay_view.dart index f4f224a..baaa5d5 100644 --- a/lib/ui/views/arif_pay/arif_pay_view.dart +++ b/lib/ui/views/arif_pay/arif_pay_view.dart @@ -13,12 +13,9 @@ class ArifPayView extends StackedView { const ArifPayView({Key? key, required this.phone}) : super(key: key); - void _error(ArifPayViewModel viewModel) => viewModel.pop(); - Future _success(ArifPayViewModel viewModel) async { - await viewModel.updatePaymentStatus(); await viewModel.replaceWithHome(); @@ -49,8 +46,6 @@ class ArifPayView extends StackedView { ? const PageLoadingIndicator() : _buildScaffold(viewModel); - - Widget _buildScaffold(ArifPayViewModel viewModel) => SafeArea(child: _buildBody(viewModel)); @@ -59,7 +54,8 @@ class ArifPayView extends StackedView { URLRequest(url: WebUri(viewModel.request?.paymentUrl ?? '')), onUpdateVisitedHistory: (controller, url, androidIsReload) async { if (url.toString().contains(kSuccessUrl)) { - showSuccessToast('Subscription successful, activation in progress!'); + showSuccessToast( + 'Subscription successful, activation in progress!'); _success(viewModel); } else if (url.toString().contains(kErrorUrl)) { _error(viewModel); diff --git a/lib/ui/views/arif_pay/arif_pay_viewmodel.dart b/lib/ui/views/arif_pay/arif_pay_viewmodel.dart index 2f7e7d7..e616ddf 100644 --- a/lib/ui/views/arif_pay/arif_pay_viewmodel.dart +++ b/lib/ui/views/arif_pay/arif_pay_viewmodel.dart @@ -68,22 +68,18 @@ class ArifPayViewModel extends ReactiveViewModel { } // Update payment status - Future updatePaymentStatus() async => await runBusyFuture(_updatePaymentStatus(), - busyObject: StateObjects.learnSubscription); + Future updatePaymentStatus() async => + await runBusyFuture(_updatePaymentStatus(), + busyObject: StateObjects.learnSubscription); Future _updatePaymentStatus() async { + Map response = {}; - Map response = {}; - - response = await _apiService.getProfileData(_user?.userId); - - if (response['status'] == ResponseStatus.success) { - User user = response['data'] as User; - await _authenticationService.saveUserData(user); - - } - + response = await _apiService.getProfileData(_user?.userId); + if (response['status'] == ResponseStatus.success) { + User user = response['data'] as User; + await _authenticationService.saveUserData(user); + } } - } diff --git a/lib/ui/views/call_support/call_support_view.dart b/lib/ui/views/call_support/call_support_view.dart index 1b60927..d83d2b4 100644 --- a/lib/ui/views/call_support/call_support_view.dart +++ b/lib/ui/views/call_support/call_support_view.dart @@ -31,8 +31,7 @@ class CallSupportView extends StackedView { body: _buildScaffoldContainer(viewModel), ); - Widget _buildScaffoldContainer(CallSupportViewModel viewModel) => - Container( + Widget _buildScaffoldContainer(CallSupportViewModel viewModel) => Container( decoration: bgDecoration, child: _buildScaffold(viewModel), ); diff --git a/lib/ui/views/learn_course/learn_course_view.dart b/lib/ui/views/learn_course/learn_course_view.dart index 91dbc5f..4d97831 100644 --- a/lib/ui/views/learn_course/learn_course_view.dart +++ b/lib/ui/views/learn_course/learn_course_view.dart @@ -16,28 +16,27 @@ class LearnCourseView extends StackedView { const LearnCourseView({Key? key, required this.id}) : super(key: key); - - Future _onPractice({required BuildContext context, - required LearnCourse course, - required LearnCourseViewModel viewModel}) async { + Future _onPractice( + {required BuildContext context, + required LearnCourse course, + required LearnCourseViewModel viewModel}) async { if (course.access?.completedCount == course.access?.totalCount) { await viewModel.navigateToLearnPractice( - id: course.id ?? 0, - level: course.name ?? ''); + id: course.id ?? 0, level: course.name ?? ''); } else { await _showSheet(context: context, viewModel: viewModel); } } - Future _showSheet({required BuildContext context, - required LearnCourseViewModel viewModel}) async => + Future _showSheet( + {required BuildContext context, + required LearnCourseViewModel viewModel}) async => await showModalBottomSheet( context: context, backgroundColor: kcTransparent, builder: (_) => _buildSheet(viewModel), ); - @override void onViewModelReady(LearnCourseViewModel viewModel) async { await viewModel.getLearnCourses(id); @@ -49,93 +48,100 @@ class LearnCourseView extends StackedView { LearnCourseViewModel(); @override - Widget builder(BuildContext context, - LearnCourseViewModel viewModel, - Widget? child,) => - _buildScaffoldWrapper(context: context,viewModel: viewModel); + Widget builder( + BuildContext context, + LearnCourseViewModel viewModel, + Widget? child, + ) => + _buildScaffoldWrapper(context: context, viewModel: viewModel); - Widget _buildScaffoldWrapper({required BuildContext context, - required LearnCourseViewModel viewModel}) => + Widget _buildScaffoldWrapper( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => Scaffold( backgroundColor: kcBackgroundColor, - body: _buildScaffoldContainer(context: context,viewModel: viewModel), + body: _buildScaffoldContainer(context: context, viewModel: viewModel), ); - Widget _buildScaffoldContainer({required BuildContext context, - required LearnCourseViewModel viewModel}) => + Widget _buildScaffoldContainer( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => Container( decoration: bgDecoration, - child: _buildScaffold(context: context,viewModel: viewModel), + child: _buildScaffold(context: context, viewModel: viewModel), ); - Widget _buildScaffold({required BuildContext context, - required LearnCourseViewModel viewModel}) => - SafeArea(child: _buildBody(context: context,viewModel: viewModel)); + Widget _buildScaffold( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => + SafeArea(child: _buildBody(context: context, viewModel: viewModel)); - Widget _buildBody({required BuildContext context, - required LearnCourseViewModel viewModel}) => + Widget _buildBody( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => Padding( padding: const EdgeInsets.symmetric(horizontal: 15), - child: _buildColumn(context: context,viewModel: viewModel), + child: _buildColumn(context: context, viewModel: viewModel), ); - Widget _buildColumn({required BuildContext context, - required LearnCourseViewModel viewModel}) => + Widget _buildColumn( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => Column( children: [ verticalSpaceMedium, _buildAppBar(viewModel), verticalSpaceMedium, - _buildCoursesColumnWrapper(context: context,viewModel: viewModel) + _buildCoursesColumnWrapper(context: context, viewModel: viewModel) ], ); - Widget _buildAppBar(LearnCourseViewModel viewModel) => - SmallAppBar( + Widget _buildAppBar(LearnCourseViewModel viewModel) => SmallAppBar( onPop: viewModel.pop, showBackButton: true, ); - Widget _buildCoursesColumnWrapper({required BuildContext context, - required LearnCourseViewModel viewModel}) => - Expanded(child: _buildLevelsColumnScrollView(context: context,viewModel: viewModel)); + Widget _buildCoursesColumnWrapper( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => + Expanded( + child: _buildLevelsColumnScrollView( + context: context, viewModel: viewModel)); - Widget _buildLevelsColumnScrollView({required BuildContext context, - required LearnCourseViewModel viewModel}) => + Widget _buildLevelsColumnScrollView( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => SingleChildScrollView( - child: _buildListViewBuilder(context: context,viewModel: viewModel), + child: _buildListViewBuilder(context: context, viewModel: viewModel), ); - Widget _buildListViewBuilder({required BuildContext context, - required LearnCourseViewModel viewModel}) => + Widget _buildListViewBuilder( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => viewModel.busy(StateObjects.learnCourses) ? _buildProgressIndicator() - : _buildListView(context: context,viewModel: viewModel); + : _buildListView(context: context, viewModel: viewModel); - Widget _buildProgressIndicator() => - const Center( + Widget _buildProgressIndicator() => const Center( child: CustomCircularProgressIndicator(color: kcPrimaryColor), ); - Widget _buildListView({required BuildContext context, - required LearnCourseViewModel viewModel}) => + Widget _buildListView( + {required BuildContext context, + required LearnCourseViewModel viewModel}) => ListView.separated( shrinkWrap: true, itemCount: viewModel.courses.length, physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) => - _buildTile( - course: viewModel.courses[index], - - onPracticeTap: () async => - await _onPractice( - context: context, - viewModel: viewModel, - course: viewModel.courses[index] - ), - onViewTap: () async => + itemBuilder: (context, index) => _buildTile( + course: viewModel.courses[index], + onPracticeTap: () async => await _onPractice( + context: context, + viewModel: viewModel, + course: viewModel.courses[index]), + onViewTap: () async => await viewModel.navigateToLearnModule(viewModel.courses[index]), - ), + ), separatorBuilder: (context, index) => verticalSpaceSmall, ); @@ -150,7 +156,6 @@ class LearnCourseView extends StackedView { onPracticeTap: onPracticeTap, ); - Widget _buildSheet(LearnCourseViewModel viewModel) => FinishPracticeSheet(onTap: viewModel.pop); } diff --git a/lib/ui/views/learn_lesson/learn_lesson_view.dart b/lib/ui/views/learn_lesson/learn_lesson_view.dart index a04ff2f..7307f3e 100644 --- a/lib/ui/views/learn_lesson/learn_lesson_view.dart +++ b/lib/ui/views/learn_lesson/learn_lesson_view.dart @@ -12,6 +12,7 @@ import 'package:yimaru_app/ui/widgets/motivation_card.dart'; import '../../common/app_colors.dart'; import '../../common/ui_helpers.dart'; import '../../widgets/custom_circular_progress_indicator.dart'; +import '../../widgets/finish_practice_sheet.dart'; import '../../widgets/small_app_bar.dart'; import 'learn_lesson_viewmodel.dart'; @@ -23,11 +24,15 @@ class LearnLessonView extends StackedView { Future _onPractice( {required int index, required LearnLesson lesson, + required BuildContext context, required LearnLessonViewModel viewModel}) async { - if (index > 1) { + if (lesson.access?.isAccessible ?? false) { + await viewModel.navigateToLearnPractice(lesson.id ?? 0); + } else { + await _showSheet(context: context, viewModel: viewModel); + } - print(index); - print(viewModel.user?.subscriptionStatus); + /* if (index > 1) { if (viewModel.user?.subscriptionStatus?.toLowerCase() == 'subscribed') { await viewModel.navigateToLearnPractice(lesson.id ?? 0); } else { @@ -35,9 +40,18 @@ class LearnLessonView extends StackedView { } } else { await viewModel.navigateToLearnPractice(lesson.id ?? 0); - } + }*/ } + Future _showSheet( + {required BuildContext context, + required LearnLessonViewModel viewModel}) async => + await showModalBottomSheet( + context: context, + backgroundColor: kcTransparent, + builder: (_) => _buildSheet(viewModel), + ); + @override void onViewModelReady(LearnLessonViewModel viewModel) async { await viewModel.getLessons(module.id ?? 0); @@ -148,7 +162,7 @@ class LearnLessonView extends StackedView { verticalSpaceLarge, _buildHeader(), verticalSpaceMedium, - _buildListViewBuilder(viewModel), + _buildListViewBuilder(context: context,viewModel: viewModel), ]; Widget _buildTitle() => Text( @@ -183,16 +197,18 @@ class LearnLessonView extends StackedView { style: style18DG700, ); - Widget _buildListViewBuilder(LearnLessonViewModel viewModel) => + Widget _buildListViewBuilder( {required BuildContext context, + required LearnLessonViewModel viewModel}) => viewModel.busy(StateObjects.learnLessons) ? _buildProgressIndicator() - : _buildListView(viewModel); + : _buildListView(context: context,viewModel: viewModel); Widget _buildProgressIndicator() => const Center( child: CustomCircularProgressIndicator(color: kcPrimaryColor), ); - Widget _buildListView(LearnLessonViewModel viewModel) => ListView.builder( + Widget _buildListView( {required BuildContext context, +required LearnLessonViewModel viewModel}) => ListView.builder( shrinkWrap: true, itemCount: viewModel.lessons.length, physics: const NeverScrollableScrollPhysics(), @@ -201,10 +217,12 @@ class LearnLessonView extends StackedView { lesson: viewModel.lessons[index], onPracticeTap: () async => await _onPractice( index: index, + context: context, viewModel: viewModel, lesson: viewModel.lessons[index], ), onLessonTap: () async => await viewModel.navigateToLearnLessonDetail( + index: index, module: module, lesson: viewModel.lessons[index], hasPractice: @@ -224,4 +242,7 @@ class LearnLessonView extends StackedView { onLessonTap: onLessonTap, onPracticeTap: onPracticeTap, ); + + Widget _buildSheet(LearnLessonViewModel viewModel) => + FinishPracticeSheet(onTap: viewModel.pop); } diff --git a/lib/ui/views/learn_lesson/learn_lesson_viewmodel.dart b/lib/ui/views/learn_lesson/learn_lesson_viewmodel.dart index 3d19424..326a1e4 100644 --- a/lib/ui/views/learn_lesson/learn_lesson_viewmodel.dart +++ b/lib/ui/views/learn_lesson/learn_lesson_viewmodel.dart @@ -24,12 +24,9 @@ class LearnLessonViewModel extends ReactiveViewModel { final _authenticationService = locator(); - - - @override - List get listenableServices => [_learnService,_authenticationService]; - + List get listenableServices => + [_learnService, _authenticationService]; // Current user User? get _user => _authenticationService.user; @@ -49,8 +46,6 @@ class LearnLessonViewModel extends ReactiveViewModel { // Navigation void pop() => _navigationService.back(); - - Future navigateToLearnPractice(int id) async => await _navigationService.navigateToLearnPracticeView( id: id, @@ -60,15 +55,17 @@ class LearnLessonViewModel extends ReactiveViewModel { subtitle: LocaleKeys.ask_you_few_actions.tr(), ); - Future navigateToLearnSubscription() async => await _navigationService.navigateToLearnSubscriptionView(); Future navigateToLearnLessonDetail( - {required bool hasPractice, + { + required int index, + required bool hasPractice, required LearnLesson lesson, required LearnModule module}) async => await _navigationService.navigateToLearnLessonDetailView( + index: index, lesson: lesson, module: module, hasPractice: hasPractice); // Remote api call @@ -88,6 +85,7 @@ class LearnLessonViewModel extends ReactiveViewModel { LearnModule? getUpdatedLearnModule(int id) { return _learnService.getLearnModuleById(id); } + //Refresh image Future refreshLessonImages(List lessons) async { for (final lesson in lessons) { diff --git a/lib/ui/views/learn_lesson_detail/learn_lesson_detail_view.dart b/lib/ui/views/learn_lesson_detail/learn_lesson_detail_view.dart index 2c58ac7..5f502de 100644 --- a/lib/ui/views/learn_lesson_detail/learn_lesson_detail_view.dart +++ b/lib/ui/views/learn_lesson_detail/learn_lesson_detail_view.dart @@ -15,20 +15,33 @@ import '../../widgets/small_app_bar.dart'; import 'learn_lesson_detail_viewmodel.dart'; class LearnLessonDetailView extends StackedView { + final int index; final bool hasPractice; final LearnModule module; final LearnLesson lesson; const LearnLessonDetailView( {Key? key, + required this.index, required this.lesson, required this.module, required this.hasPractice}) : super(key: key); - Future _navigate(LearnLessonDetailViewModel viewModel) async { + Future _onPractice( + {required LearnLesson lesson, + required LearnLessonDetailViewModel viewModel}) async { await viewModel.pause(); await viewModel.navigateToLearnPractice(lesson.id ?? 0); + /*if (index > 1) { + if (viewModel.user?.subscriptionStatus?.toLowerCase() == 'subscribed') { + await viewModel.navigateToLearnPractice(lesson.id ?? 0); + } else { + await viewModel.navigateToLearnSubscription(); + } + } else { + await viewModel.navigateToLearnPractice(lesson.id ?? 0); + }*/ } @override @@ -193,6 +206,7 @@ class LearnLessonDetailView extends StackedView { foregroundColor: kcWhite, backgroundColor: kcPrimaryColor, text: LocaleKeys.take_practice.tr(), - onTap: () async => await _navigate(viewModel), + onTap: () async => + await _onPractice(lesson: lesson, viewModel: viewModel), ); } diff --git a/lib/ui/views/learn_lesson_detail/learn_lesson_detail_viewmodel.dart b/lib/ui/views/learn_lesson_detail/learn_lesson_detail_viewmodel.dart index 2f9e3d2..5942c0d 100644 --- a/lib/ui/views/learn_lesson_detail/learn_lesson_detail_viewmodel.dart +++ b/lib/ui/views/learn_lesson_detail/learn_lesson_detail_viewmodel.dart @@ -7,7 +7,9 @@ import 'package:yimaru_app/ui/common/enmus.dart'; import '../../../app/app.locator.dart'; import '../../../app/app.router.dart'; import '../../../models/learn_lesson.dart'; +import '../../../models/user.dart'; import '../../../services/api_service.dart'; +import '../../../services/authentication_service.dart'; import '../../../services/learn_service.dart'; import '../../../services/status_checker_service.dart'; import '../../../services/vimeo_service.dart'; @@ -26,8 +28,16 @@ class LearnLessonDetailViewModel extends ReactiveViewModel { final _navigationService = locator(); + final _authenticationService = locator(); + @override - List get listenableServices => [_learnService]; + List get listenableServices => + [_learnService, _authenticationService]; + + // Current user + User? get _user => _authenticationService.user; + + User? get user => _user; // Learn lessons List get _lessons => _learnService.lessons; @@ -121,6 +131,9 @@ class LearnLessonDetailViewModel extends ReactiveViewModel { // Navigation void pop() => _navigationService.back(); + Future navigateToLearnSubscription() async => + await _navigationService.navigateToLearnSubscriptionView(); + Future navigateToLearnPractice(int id) async => await _navigationService.navigateToLearnPracticeView( id: id, diff --git a/lib/ui/views/learn_module/learn_module_view.dart b/lib/ui/views/learn_module/learn_module_view.dart index 22d700b..e9a4e18 100644 --- a/lib/ui/views/learn_module/learn_module_view.dart +++ b/lib/ui/views/learn_module/learn_module_view.dart @@ -151,11 +151,14 @@ class LearnModuleView extends StackedView { style: style14P400, ); - Widget _buildOverallProgress(LearnModuleViewModel viewModel) => OverallProgress( + Widget _buildOverallProgress(LearnModuleViewModel viewModel) => + OverallProgress( indicatorBackgroundColor: kcWhite, - backgroundColor: kcPrimaryColor.withOpacity(0.1), - progress: - (viewModel.getUpdatedLearnCourse(course.id ?? 0) ?? course).access?.progressPercent ?? 0, + backgroundColor: kcPrimaryColor.withOpacity(0.1), + progress: (viewModel.getUpdatedLearnCourse(course.id ?? 0) ?? course) + .access + ?.progressPercent ?? + 0, ); Widget _buildListViewBuilder( diff --git a/lib/ui/views/learn_module/learn_module_viewmodel.dart b/lib/ui/views/learn_module/learn_module_viewmodel.dart index babf34c..955cd38 100644 --- a/lib/ui/views/learn_module/learn_module_viewmodel.dart +++ b/lib/ui/views/learn_module/learn_module_viewmodel.dart @@ -85,6 +85,5 @@ class LearnModuleViewModel extends ReactiveViewModel { } String getModuleImage(LearnModule module) => - getReadableUrl(_refreshedIcons[module.id] ?? '') ?? ''; - + getReadableUrl(_refreshedIcons[module.id] ?? '') ?? ''; } diff --git a/lib/ui/views/learn_practice/screens/interact_learn_practice_screen.dart b/lib/ui/views/learn_practice/screens/interact_learn_practice_screen.dart index 27f8ea6..f0e18d4 100644 --- a/lib/ui/views/learn_practice/screens/interact_learn_practice_screen.dart +++ b/lib/ui/views/learn_practice/screens/interact_learn_practice_screen.dart @@ -169,7 +169,6 @@ class InteractLearnPracticeScreen Widget _buildSpeakingIndicator(LearnPracticeViewModel viewModel) => WaveWrapper(height: 200, child: _buildSpinnerState(viewModel)); - Widget _buildSpinnerState(LearnPracticeViewModel viewModel) => viewModel.busy(StateObjects.recordLearnPracticeAnswer) || viewModel.busy(StateObjects.finishLearnPracticeQuestion) diff --git a/lib/ui/views/learn_practice/screens/learn_practice_appreciation_screen.dart b/lib/ui/views/learn_practice/screens/learn_practice_appreciation_screen.dart index 55eb813..a430930 100644 --- a/lib/ui/views/learn_practice/screens/learn_practice_appreciation_screen.dart +++ b/lib/ui/views/learn_practice/screens/learn_practice_appreciation_screen.dart @@ -15,7 +15,6 @@ class LearnPracticeAppreciationScreen extends ViewModelWidget { const LearnPracticeAppreciationScreen({super.key}); - Future _cancel(LearnPracticeViewModel viewModel) async { await viewModel.stopRecording(); viewModel.pop(); diff --git a/lib/ui/views/learn_practice/screens/learn_practice_description_screen.dart b/lib/ui/views/learn_practice/screens/learn_practice_description_screen.dart index cf43223..6928e7e 100644 --- a/lib/ui/views/learn_practice/screens/learn_practice_description_screen.dart +++ b/lib/ui/views/learn_practice/screens/learn_practice_description_screen.dart @@ -163,13 +163,10 @@ class LearnPracticeDescriptionScreen Widget _buildImage(LearnPracticeViewModel viewModel) => CachedNetworkImage( fit: BoxFit.cover, width: double.maxFinite, - imageUrl: - getReadableUrl( viewModel.practices.first.storyImage ?? '') ?? '', + getReadableUrl(viewModel.practices.first.storyImage ?? '') ?? '', ); - - Widget _buildContinueButtonWrapper(LearnPracticeViewModel viewModel) => Padding( padding: const EdgeInsets.only(bottom: 50), diff --git a/lib/ui/views/onboarding/onboarding_view.dart b/lib/ui/views/onboarding/onboarding_view.dart index e2f7884..4226d4c 100644 --- a/lib/ui/views/onboarding/onboarding_view.dart +++ b/lib/ui/views/onboarding/onboarding_view.dart @@ -126,7 +126,8 @@ class OnboardingView extends StackedView Widget _buildOccupationForm() => const OccupationFormScreen(); - Widget _buildCountryRegionForm() => CountryRegionFormScreen(regionController: regionController); + Widget _buildCountryRegionForm() => + CountryRegionFormScreen(regionController: regionController); Widget _buildLearningGoalForm() => const LearningGoalFormScreen(); diff --git a/lib/ui/views/onboarding/screens/learning_goal_form_screen.dart b/lib/ui/views/onboarding/screens/learning_goal_form_screen.dart index d61efdc..6bbd51a 100644 --- a/lib/ui/views/onboarding/screens/learning_goal_form_screen.dart +++ b/lib/ui/views/onboarding/screens/learning_goal_form_screen.dart @@ -49,7 +49,6 @@ class LearningGoalFormScreen extends ViewModelWidget { return ''; } - void _pop(OnboardingViewModel viewModel) { viewModel.resetLearningGoalFormScreen(); viewModel.goBack(); @@ -70,20 +69,17 @@ class LearningGoalFormScreen extends ViewModelWidget { Widget build(BuildContext context, OnboardingViewModel viewModel) => _buildScaffoldWrapper(viewModel); - Widget _buildScaffoldWrapper(OnboardingViewModel viewModel) => - Scaffold( + Widget _buildScaffoldWrapper(OnboardingViewModel viewModel) => Scaffold( backgroundColor: kcBackgroundColor, body: _buildScaffold(viewModel), ); - Widget _buildScaffold(OnboardingViewModel viewModel) => - Column( + Widget _buildScaffold(OnboardingViewModel viewModel) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: _buildScaffoldChildren(viewModel), ); - List _buildScaffoldChildren(OnboardingViewModel viewModel) => - [ + List _buildScaffoldChildren(OnboardingViewModel viewModel) => [ _buildAppBar(viewModel), verticalSpaceMedium, _buildExpandedBody(viewModel) @@ -97,14 +93,12 @@ class LearningGoalFormScreen extends ViewModelWidget { child: _buildBodyWrapper(viewModel), ); - Widget _buildBodyWrapper(OnboardingViewModel viewModel) => - Padding( + Widget _buildBodyWrapper(OnboardingViewModel viewModel) => Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: _buildBody(viewModel), ); - Widget _buildBody(OnboardingViewModel viewModel) => - Column( + Widget _buildBody(OnboardingViewModel viewModel) => Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: _buildBodyChildren(viewModel), @@ -113,23 +107,20 @@ class LearningGoalFormScreen extends ViewModelWidget { List _buildBodyChildren(OnboardingViewModel viewModel) => [_buildUpperColumn(viewModel), _buildContinueButtonWrapper(viewModel)]; - Widget _buildUpperColumn(OnboardingViewModel viewModel) => - Column( + Widget _buildUpperColumn(OnboardingViewModel viewModel) => Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: _buildUpperColumnChildren(viewModel), ); - List _buildUpperColumnChildren(OnboardingViewModel viewModel) => - [ + List _buildUpperColumnChildren(OnboardingViewModel viewModel) => [ verticalSpaceMedium, _buildTitle(viewModel), verticalSpaceMedium, _buildLearningGoals(viewModel) ]; - Widget _buildAppBar(OnboardingViewModel viewModel) => - LargeAppBar( + Widget _buildAppBar(OnboardingViewModel viewModel) => LargeAppBar( showBackButton: true, showLanguageSelection: true, onPop: () => _pop(viewModel), @@ -139,11 +130,10 @@ class LearningGoalFormScreen extends ViewModelWidget { : viewModel.selectedLanguage['code'], ); - Widget _buildTitle(OnboardingViewModel viewModel) => - Text.rich( + Widget _buildTitle(OnboardingViewModel viewModel) => Text.rich( TextSpan( text: - '${LocaleKeys.hello.tr()} ${viewModel.userData['first_name']},', + '${LocaleKeys.hello.tr()} ${viewModel.userData['first_name']},', style: style18P600.copyWith(fontSize: 22), children: [ TextSpan( @@ -153,39 +143,36 @@ class LearningGoalFormScreen extends ViewModelWidget { ]), ); - Widget _buildLearningGoals(OnboardingViewModel viewModel) => - ListView.builder( + Widget _buildLearningGoals(OnboardingViewModel viewModel) => ListView.builder( shrinkWrap: true, - itemCount: 3,// viewModel.learningGoals.length, + itemCount: 3, // viewModel.learningGoals.length, physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) => - _buildLearningGoal( - icon: getIcon(index), - title: getTitles(index), - subtitle: getSubtitle(index), - selected: + itemBuilder: (context, index) => _buildLearningGoal( + icon: getIcon(index), + title: getTitles(index), + subtitle: getSubtitle(index), + selected: viewModel.isSelectedLearningGoal(viewModel.learningGoals[index]), - onTap: () => - viewModel.setSelectedLearningGoal( - viewModel.learningGoals[index]), - ), + onTap: () => + viewModel.setSelectedLearningGoal(viewModel.learningGoals[index]), + ), ); - Widget _buildLearningGoal({required String title, - required bool selected, - required IconData icon, - required String subtitle, - required GestureTapCallback onTap}) => + Widget _buildLearningGoal( + {required String title, + required bool selected, + required IconData icon, + required String subtitle, + required GestureTapCallback onTap}) => CustomLargeRadioButton( - icon:icon, + icon: icon, title: title, onTap: onTap, subtitle: subtitle, selected: selected, ); - Widget _buildContinueButtonWrapper(OnboardingViewModel viewModel) => - Padding( + Widget _buildContinueButtonWrapper(OnboardingViewModel viewModel) => Padding( padding: const EdgeInsets.only(bottom: 50), child: _buildContinueButton(viewModel), ); diff --git a/lib/ui/views/privacy_policy/privacy_policy_view.dart b/lib/ui/views/privacy_policy/privacy_policy_view.dart index a52dbcb..96cdabf 100644 --- a/lib/ui/views/privacy_policy/privacy_policy_view.dart +++ b/lib/ui/views/privacy_policy/privacy_policy_view.dart @@ -101,8 +101,7 @@ class PrivacyPolicyView extends StackedView { body: _buildScaffoldContainer(viewModel), ); - Widget _buildScaffoldContainer(PrivacyPolicyViewModel viewModel) => - Container( + Widget _buildScaffoldContainer(PrivacyPolicyViewModel viewModel) => Container( decoration: bgDecoration, child: _buildScaffold(viewModel), ); diff --git a/lib/ui/views/profile/profile_view.dart b/lib/ui/views/profile/profile_view.dart index 9349bee..3a01f65 100644 --- a/lib/ui/views/profile/profile_view.dart +++ b/lib/ui/views/profile/profile_view.dart @@ -55,11 +55,13 @@ class ProfileView extends StackedView { body: _buildScaffoldContainer(context: context, viewModel: viewModel), ); - Widget _buildScaffoldContainer( {required BuildContext context, - required ProfileViewModel viewModel}) => Container( - decoration: bgDecoration, - child: _buildScaffold(context: context, viewModel: viewModel), - ); + Widget _buildScaffoldContainer( + {required BuildContext context, + required ProfileViewModel viewModel}) => + Container( + decoration: bgDecoration, + child: _buildScaffold(context: context, viewModel: viewModel), + ); Widget _buildScaffold( {required BuildContext context, diff --git a/lib/ui/views/profile_detail/profile_detail_view.dart b/lib/ui/views/profile_detail/profile_detail_view.dart index 4ffbcdf..b2548b4 100644 --- a/lib/ui/views/profile_detail/profile_detail_view.dart +++ b/lib/ui/views/profile_detail/profile_detail_view.dart @@ -56,7 +56,6 @@ class ProfileDetailView extends StackedView 'birth_day': DateFormat('yyyy-MM-dd').format(DateTime.now()), }; - viewModel.addUserData(data); await viewModel.updateProfile(); @@ -110,7 +109,7 @@ class ProfileDetailView extends StackedView } @override - void onViewModelReady(ProfileDetailViewModel viewModel) async{ + void onViewModelReady(ProfileDetailViewModel viewModel) async { await viewModel.getProfileDetailFields(); _onModelReady(viewModel); syncFormWithViewModel(viewModel); @@ -138,19 +137,19 @@ class ProfileDetailView extends StackedView ); Widget _buildScaffoldState( - {required BuildContext context, - required ProfileDetailViewModel viewModel}) => + {required BuildContext context, + required ProfileDetailViewModel viewModel}) => viewModel.busy(StateObjects.profileDetail) ? const PageLoadingIndicator() : _buildScaffoldContainer(context: context, viewModel: viewModel); - - Widget _buildScaffoldContainer( {required BuildContext context, - required ProfileDetailViewModel viewModel}) => Container( - decoration: bgDecoration, - child: _buildScaffoldStack(context: context, viewModel: viewModel), - ); - + Widget _buildScaffoldContainer( + {required BuildContext context, + required ProfileDetailViewModel viewModel}) => + Container( + decoration: bgDecoration, + child: _buildScaffoldStack(context: context, viewModel: viewModel), + ); Widget _buildScaffoldStack( {required BuildContext context, diff --git a/lib/ui/views/profile_detail/profile_detail_viewmodel.dart b/lib/ui/views/profile_detail/profile_detail_viewmodel.dart index 5eeaf79..164e8d6 100644 --- a/lib/ui/views/profile_detail/profile_detail_viewmodel.dart +++ b/lib/ui/views/profile_detail/profile_detail_viewmodel.dart @@ -164,7 +164,6 @@ class ProfileDetailViewModel extends ReactiveViewModel return false; } - void setRegionFocus() { _focusRegion = true; rebuildUi(); @@ -258,7 +257,8 @@ class ProfileDetailViewModel extends ReactiveViewModel // Profile detail fields Future getProfileDetailFields() async => - await runBusyFuture(_getProfileDetailFields(),busyObject: StateObjects.profileDetail); + await runBusyFuture(_getProfileDetailFields(), + busyObject: StateObjects.profileDetail); Future _getProfileDetailFields() async { await _onboardingService.getProfileDetailFields(); diff --git a/lib/ui/views/support/support_view.dart b/lib/ui/views/support/support_view.dart index 189a856..b9b228d 100644 --- a/lib/ui/views/support/support_view.dart +++ b/lib/ui/views/support/support_view.dart @@ -28,8 +28,7 @@ class SupportView extends StackedView { body: _buildScaffoldContainer(viewModel), ); - Widget _buildScaffoldContainer(SupportViewModel viewModel) => - Container( + Widget _buildScaffoldContainer(SupportViewModel viewModel) => Container( decoration: bgDecoration, child: _buildScaffold(viewModel), ); diff --git a/lib/ui/views/telegram_support/telegram_support_view.dart b/lib/ui/views/telegram_support/telegram_support_view.dart index 96144d2..de365a4 100644 --- a/lib/ui/views/telegram_support/telegram_support_view.dart +++ b/lib/ui/views/telegram_support/telegram_support_view.dart @@ -32,7 +32,6 @@ class TelegramSupportView extends StackedView { body: _buildScaffoldContainer(viewModel), ); - Widget _buildScaffoldContainer(TelegramSupportViewModel viewModel) => Container( decoration: bgDecoration, diff --git a/lib/ui/widgets/custom_large_radio_button.dart b/lib/ui/widgets/custom_large_radio_button.dart index 7f625f4..f22d9f3 100644 --- a/lib/ui/widgets/custom_large_radio_button.dart +++ b/lib/ui/widgets/custom_large_radio_button.dart @@ -11,70 +11,70 @@ class CustomLargeRadioButton extends StatelessWidget { const CustomLargeRadioButton( {super.key, - this.onTap, - required this.title, - required this.icon, - required this.selected, - required this.subtitle}); + this.onTap, + required this.title, + required this.icon, + required this.selected, + required this.subtitle}); @override Widget build(BuildContext context) => _buildButtonWrapper(); Widget _buildButtonWrapper() => Container( - height: 125, - width: double.maxFinite, - margin: const EdgeInsets.only(bottom: 15), - child: _buildContainerWrapper(), - ); + height: 125, + width: double.maxFinite, + margin: const EdgeInsets.only(bottom: 15), + child: _buildContainerWrapper(), + ); Widget _buildContainerWrapper() => GestureDetector( - onTap: onTap, - child: _buildContainer(), - ); + onTap: onTap, + child: _buildContainer(), + ); Widget _buildContainer() => Container( - padding: const EdgeInsets.symmetric(horizontal: 15), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), - color: selected ? kcPrimaryColor.withOpacity(0.1) : kcWhite, - border: Border.all( - color: selected ? kcPrimaryColor : kcPrimaryColor.withOpacity(0.75), - ), - ), - child: _buildButtonColumnWrapper(), - ); + padding: const EdgeInsets.symmetric(horizontal: 15), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + color: selected ? kcPrimaryColor.withOpacity(0.1) : kcWhite, + border: Border.all( + color: selected ? kcPrimaryColor : kcPrimaryColor.withOpacity(0.75), + ), + ), + child: _buildButtonColumnWrapper(), + ); Widget _buildButtonColumnWrapper() => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: _buildButtonRowChildren(), - ); + crossAxisAlignment: CrossAxisAlignment.start, + children: _buildButtonRowChildren(), + ); List _buildButtonRowChildren() => [_buildIconSectionWrapper(), _buildTitle(), _buildSubtitle()]; Widget _buildIconSectionWrapper() => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: _buildIconSectionChildren(), - ); + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: _buildIconSectionChildren(), + ); List _buildIconSectionChildren() => [_buildLeadingIcon(), _buildSelectedCheckBox()]; Widget _buildLeadingIcon() => Icon( - icon, - size: 25, - color: kcPrimaryColor, - ); + icon, + size: 25, + color: kcPrimaryColor, + ); Widget _buildTitle() => Text( - title, - style: style18DG700, - ); + title, + style: style18DG700, + ); Widget _buildSubtitle() => Text( - subtitle, - style: const TextStyle(color: kcMediumGrey), - ); + subtitle, + style: const TextStyle(color: kcMediumGrey), + ); Widget _buildSelectedCheckBox() => Checkbox( value: selected, diff --git a/lib/ui/widgets/learn_course_tile.dart b/lib/ui/widgets/learn_course_tile.dart index 5d3ec1d..39f8397 100644 --- a/lib/ui/widgets/learn_course_tile.dart +++ b/lib/ui/widgets/learn_course_tile.dart @@ -26,8 +26,6 @@ class LearnCourseTile extends ViewModelWidget { Widget build(BuildContext context, LearnCourseViewModel viewModel) => _buildExpansionTileCard(viewModel); - - Widget _buildExpansionTileCard(LearnCourseViewModel viewModel) => Container( margin: const EdgeInsets.only(bottom: 15), decoration: BoxDecoration( diff --git a/lib/ui/widgets/learn_lesson_tile.dart b/lib/ui/widgets/learn_lesson_tile.dart index 68680cc..92f21bc 100644 --- a/lib/ui/widgets/learn_lesson_tile.dart +++ b/lib/ui/widgets/learn_lesson_tile.dart @@ -27,12 +27,14 @@ class LearnLessonTile extends ViewModelWidget { required this.index, required this.lesson}); - - @override Widget build(BuildContext context, LearnLessonViewModel viewModel) => - _buildContainer(viewModel); + _buildContainerWrapper(viewModel); + Widget _buildContainerWrapper(LearnLessonViewModel viewModel)=> GestureDetector( + onTap: !(lesson.access?.isAccessible ?? false) ? onPracticeTap:null, + child: _buildContainer(viewModel), + ); Widget _buildContainer(LearnLessonViewModel viewModel) => Container( width: double.maxFinite, margin: const EdgeInsets.only(bottom: 15), @@ -72,7 +74,7 @@ class LearnLessonTile extends ViewModelWidget { ? kcGreen.withOpacity(0.1) : kcPrimaryColor.withOpacity(0.1), childrenPadding: const EdgeInsets.fromLTRB(15, 0, 15, 15), - initiallyExpanded: (lesson.access?.isAccessible ?? false) && + initiallyExpanded: (lesson.access?.isAccessible ?? false) && !(lesson.access?.isCompleted ?? false), collapsedBackgroundColor: (lesson.access?.isCompleted ?? false) ? kcGreen.withOpacity(0.1) @@ -80,8 +82,8 @@ class LearnLessonTile extends ViewModelWidget { children: _buildExpansionTileChildren(viewModel), ); - Widget _buildLeadingWrapper(LearnLessonViewModel viewModel) => MiniThumbnail( - thumbnail: getReadableUrl(lesson.thumbnail ?? '') ?? ''); + Widget _buildLeadingWrapper(LearnLessonViewModel viewModel) => + MiniThumbnail(thumbnail: getReadableUrl(lesson.thumbnail ?? '') ?? ''); Widget _buildTitle() => Text( lesson.title ?? '', diff --git a/lib/ui/widgets/learn_module_tile.dart b/lib/ui/widgets/learn_module_tile.dart index f19e12b..f7f9f3a 100644 --- a/lib/ui/widgets/learn_module_tile.dart +++ b/lib/ui/widgets/learn_module_tile.dart @@ -21,8 +21,6 @@ class LearnModuleTile extends ViewModelWidget { const LearnModuleTile( {super.key, this.onModuleTap, this.onPracticeTap, required this.module}); - - @override Widget build(BuildContext context, LearnModuleViewModel viewModel) => _buildExpansionTileCard(context: context, viewModel: viewModel); @@ -86,20 +84,17 @@ class LearnModuleTile extends ViewModelWidget { child: _buildIconClipper(viewModel), ); - Widget _buildIconClipper(LearnModuleViewModel viewModel)=> ClipRRect( - child: _buildIcon(viewModel), - ); + Widget _buildIconClipper(LearnModuleViewModel viewModel) => ClipRRect( + child: _buildIcon(viewModel), + ); - Widget _buildIcon(LearnModuleViewModel viewModel) => - CachedNetworkImage( + Widget _buildIcon(LearnModuleViewModel viewModel) => CachedNetworkImage( width: 25, height: 25, cacheKey: viewModel.getModuleImage(module), imageUrl: viewModel.getModuleImage(module), ); - - Widget _buildTitleWrapper() => Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: _buildTitle(), @@ -214,8 +209,6 @@ class LearnModuleTile extends ViewModelWidget { text: LocaleKeys.take_practice.tr(), ); - - Widget _buildContainerShaderState() => !(module.access?.isAccessible ?? false) ? _buildContainerShader() : Container(); diff --git a/lib/ui/widgets/overall_progress_wrapper.dart b/lib/ui/widgets/overall_progress_wrapper.dart index 480f7f5..966cae3 100644 --- a/lib/ui/widgets/overall_progress_wrapper.dart +++ b/lib/ui/widgets/overall_progress_wrapper.dart @@ -50,8 +50,8 @@ class OverallProgressWrapper extends StatelessWidget { backgroundColor: kcVeryLightGrey, ); - Widget _buildSubtitle() => Text( - LocaleKeys.keep_up_the_great_work.tr(), - style:style14DG400 , + Widget _buildSubtitle() => Text( + LocaleKeys.keep_up_the_great_work.tr(), + style: style14DG400, ); } diff --git a/pubspec.yaml b/pubspec.yaml index 8147a4e..6703bc3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: yimaru_app -version: 0.1.27+29 +version: 0.1.28+30 publish_to: 'none' description: A new Flutter project.