Compare commits

..

No commits in common. "2554b80359a746380cd42421eb488aa71c5c818c" and "4b281aae771774da1bf948f2381f587d4281ff7e" have entirely different histories.

28 changed files with 498 additions and 558 deletions

View File

@ -475,16 +475,16 @@ class StackedRouter extends _i1.RouterBase {
_i18.LearnModuleView: (data) { _i18.LearnModuleView: (data) {
final args = data.getArgs<LearnModuleViewArguments>(nullOk: false); final args = data.getArgs<LearnModuleViewArguments>(nullOk: false);
return _i37.MaterialPageRoute<dynamic>( return _i37.MaterialPageRoute<dynamic>(
builder: (context) => _i18.LearnModuleView( builder: (context) =>
key: args.key, first: args.first, course: args.course), _i18.LearnModuleView(key: args.key, course: args.course),
settings: data, settings: data,
); );
}, },
_i19.LearnLessonView: (data) { _i19.LearnLessonView: (data) {
final args = data.getArgs<LearnLessonViewArguments>(nullOk: false); final args = data.getArgs<LearnLessonViewArguments>(nullOk: false);
return _i37.MaterialPageRoute<dynamic>( return _i37.MaterialPageRoute<dynamic>(
builder: (context) => _i19.LearnLessonView( builder: (context) =>
key: args.key, first: args.first, module: args.module), _i19.LearnLessonView(key: args.key, module: args.module),
settings: data, settings: data,
); );
}, },
@ -628,8 +628,7 @@ class StackedRouter extends _i1.RouterBase {
_i35.LearnCourseView: (data) { _i35.LearnCourseView: (data) {
final args = data.getArgs<LearnCourseViewArguments>(nullOk: false); final args = data.getArgs<LearnCourseViewArguments>(nullOk: false);
return _i37.MaterialPageRoute<dynamic>( return _i37.MaterialPageRoute<dynamic>(
builder: (context) => builder: (context) => _i35.LearnCourseView(key: args.key, id: args.id),
_i35.LearnCourseView(key: args.key, id: args.id, first: args.first),
settings: data, settings: data,
); );
}, },
@ -1010,60 +1009,54 @@ class LoginViewArguments {
class LearnModuleViewArguments { class LearnModuleViewArguments {
const LearnModuleViewArguments({ const LearnModuleViewArguments({
this.key, this.key,
required this.first,
required this.course, required this.course,
}); });
final _i37.Key? key; final _i37.Key? key;
final bool first;
final _i38.LearnCourse course; final _i38.LearnCourse course;
@override @override
String toString() { String toString() {
return '{"key": "$key", "first": "$first", "course": "$course"}'; return '{"key": "$key", "course": "$course"}';
} }
@override @override
bool operator ==(covariant LearnModuleViewArguments other) { bool operator ==(covariant LearnModuleViewArguments other) {
if (identical(this, other)) return true; if (identical(this, other)) return true;
return other.key == key && other.first == first && other.course == course; return other.key == key && other.course == course;
} }
@override @override
int get hashCode { int get hashCode {
return key.hashCode ^ first.hashCode ^ course.hashCode; return key.hashCode ^ course.hashCode;
} }
} }
class LearnLessonViewArguments { class LearnLessonViewArguments {
const LearnLessonViewArguments({ const LearnLessonViewArguments({
this.key, this.key,
required this.first,
required this.module, required this.module,
}); });
final _i37.Key? key; final _i37.Key? key;
final bool first;
final _i39.LearnModule module; final _i39.LearnModule module;
@override @override
String toString() { String toString() {
return '{"key": "$key", "first": "$first", "module": "$module"}'; return '{"key": "$key", "module": "$module"}';
} }
@override @override
bool operator ==(covariant LearnLessonViewArguments other) { bool operator ==(covariant LearnLessonViewArguments other) {
if (identical(this, other)) return true; if (identical(this, other)) return true;
return other.key == key && other.first == first && other.module == module; return other.key == key && other.module == module;
} }
@override @override
int get hashCode { int get hashCode {
return key.hashCode ^ first.hashCode ^ module.hashCode; return key.hashCode ^ module.hashCode;
} }
} }
@ -1493,29 +1486,26 @@ class LearnCourseViewArguments {
const LearnCourseViewArguments({ const LearnCourseViewArguments({
this.key, this.key,
required this.id, required this.id,
required this.first,
}); });
final _i37.Key? key; final _i37.Key? key;
final int id; final int id;
final bool first;
@override @override
String toString() { String toString() {
return '{"key": "$key", "id": "$id", "first": "$first"}'; return '{"key": "$key", "id": "$id"}';
} }
@override @override
bool operator ==(covariant LearnCourseViewArguments other) { bool operator ==(covariant LearnCourseViewArguments other) {
if (identical(this, other)) return true; if (identical(this, other)) return true;
return other.key == key && other.id == id && other.first == first; return other.key == key && other.id == id;
} }
@override @override
int get hashCode { int get hashCode {
return key.hashCode ^ id.hashCode ^ first.hashCode; return key.hashCode ^ id.hashCode;
} }
} }
@ -1811,7 +1801,6 @@ extension NavigatorStateExtension on _i47.NavigationService {
Future<dynamic> navigateToLearnModuleView({ Future<dynamic> navigateToLearnModuleView({
_i37.Key? key, _i37.Key? key,
required bool first,
required _i38.LearnCourse course, required _i38.LearnCourse course,
int? routerId, int? routerId,
bool preventDuplicates = true, bool preventDuplicates = true,
@ -1820,8 +1809,7 @@ extension NavigatorStateExtension on _i47.NavigationService {
transition, transition,
}) async { }) async {
return navigateTo<dynamic>(Routes.learnModuleView, return navigateTo<dynamic>(Routes.learnModuleView,
arguments: arguments: LearnModuleViewArguments(key: key, course: course),
LearnModuleViewArguments(key: key, first: first, course: course),
id: routerId, id: routerId,
preventDuplicates: preventDuplicates, preventDuplicates: preventDuplicates,
parameters: parameters, parameters: parameters,
@ -1830,7 +1818,6 @@ extension NavigatorStateExtension on _i47.NavigationService {
Future<dynamic> navigateToLearnLessonView({ Future<dynamic> navigateToLearnLessonView({
_i37.Key? key, _i37.Key? key,
required bool first,
required _i39.LearnModule module, required _i39.LearnModule module,
int? routerId, int? routerId,
bool preventDuplicates = true, bool preventDuplicates = true,
@ -1839,8 +1826,7 @@ extension NavigatorStateExtension on _i47.NavigationService {
transition, transition,
}) async { }) async {
return navigateTo<dynamic>(Routes.learnLessonView, return navigateTo<dynamic>(Routes.learnLessonView,
arguments: arguments: LearnLessonViewArguments(key: key, module: module),
LearnLessonViewArguments(key: key, first: first, module: module),
id: routerId, id: routerId,
preventDuplicates: preventDuplicates, preventDuplicates: preventDuplicates,
parameters: parameters, parameters: parameters,
@ -2121,7 +2107,6 @@ extension NavigatorStateExtension on _i47.NavigationService {
Future<dynamic> navigateToLearnCourseView({ Future<dynamic> navigateToLearnCourseView({
_i37.Key? key, _i37.Key? key,
required int id, required int id,
required bool first,
int? routerId, int? routerId,
bool preventDuplicates = true, bool preventDuplicates = true,
Map<String, String>? parameters, Map<String, String>? parameters,
@ -2129,7 +2114,7 @@ extension NavigatorStateExtension on _i47.NavigationService {
transition, transition,
}) async { }) async {
return navigateTo<dynamic>(Routes.learnCourseView, return navigateTo<dynamic>(Routes.learnCourseView,
arguments: LearnCourseViewArguments(key: key, id: id, first: first), arguments: LearnCourseViewArguments(key: key, id: id),
id: routerId, id: routerId,
preventDuplicates: preventDuplicates, preventDuplicates: preventDuplicates,
parameters: parameters, parameters: parameters,
@ -2414,7 +2399,6 @@ extension NavigatorStateExtension on _i47.NavigationService {
Future<dynamic> replaceWithLearnModuleView({ Future<dynamic> replaceWithLearnModuleView({
_i37.Key? key, _i37.Key? key,
required bool first,
required _i38.LearnCourse course, required _i38.LearnCourse course,
int? routerId, int? routerId,
bool preventDuplicates = true, bool preventDuplicates = true,
@ -2423,8 +2407,7 @@ extension NavigatorStateExtension on _i47.NavigationService {
transition, transition,
}) async { }) async {
return replaceWith<dynamic>(Routes.learnModuleView, return replaceWith<dynamic>(Routes.learnModuleView,
arguments: arguments: LearnModuleViewArguments(key: key, course: course),
LearnModuleViewArguments(key: key, first: first, course: course),
id: routerId, id: routerId,
preventDuplicates: preventDuplicates, preventDuplicates: preventDuplicates,
parameters: parameters, parameters: parameters,
@ -2433,7 +2416,6 @@ extension NavigatorStateExtension on _i47.NavigationService {
Future<dynamic> replaceWithLearnLessonView({ Future<dynamic> replaceWithLearnLessonView({
_i37.Key? key, _i37.Key? key,
required bool first,
required _i39.LearnModule module, required _i39.LearnModule module,
int? routerId, int? routerId,
bool preventDuplicates = true, bool preventDuplicates = true,
@ -2442,8 +2424,7 @@ extension NavigatorStateExtension on _i47.NavigationService {
transition, transition,
}) async { }) async {
return replaceWith<dynamic>(Routes.learnLessonView, return replaceWith<dynamic>(Routes.learnLessonView,
arguments: arguments: LearnLessonViewArguments(key: key, module: module),
LearnLessonViewArguments(key: key, first: first, module: module),
id: routerId, id: routerId,
preventDuplicates: preventDuplicates, preventDuplicates: preventDuplicates,
parameters: parameters, parameters: parameters,
@ -2724,7 +2705,6 @@ extension NavigatorStateExtension on _i47.NavigationService {
Future<dynamic> replaceWithLearnCourseView({ Future<dynamic> replaceWithLearnCourseView({
_i37.Key? key, _i37.Key? key,
required int id, required int id,
required bool first,
int? routerId, int? routerId,
bool preventDuplicates = true, bool preventDuplicates = true,
Map<String, String>? parameters, Map<String, String>? parameters,
@ -2732,7 +2712,7 @@ extension NavigatorStateExtension on _i47.NavigationService {
transition, transition,
}) async { }) async {
return replaceWith<dynamic>(Routes.learnCourseView, return replaceWith<dynamic>(Routes.learnCourseView,
arguments: LearnCourseViewArguments(key: key, id: id, first: first), arguments: LearnCourseViewArguments(key: key, id: id),
id: routerId, id: routerId,
preventDuplicates: preventDuplicates, preventDuplicates: preventDuplicates,
parameters: parameters, parameters: parameters,

View File

@ -23,7 +23,7 @@ class AuthenticationService with ListenableServiceMixin {
// Initialization // Initialization
AuthenticationService() { AuthenticationService() {
listenToReactiveValues([_user, _state, _localizationService]); listenToReactiveValues([_user,_state, _localizationService]);
} }
// Logout state // Logout state
@ -31,6 +31,7 @@ class AuthenticationService with ListenableServiceMixin {
StateObjects get state => _state; StateObjects get state => _state;
// Check user logged in // Check user logged in
Future<bool> userLoggedIn() async { Future<bool> userLoggedIn() async {
if (await _secureService.getString('userId') != null) { if (await _secureService.getString('userId') != null) {
@ -201,6 +202,7 @@ class AuthenticationService with ListenableServiceMixin {
await setFirstTimeInstall(firstTimeInstall); await setFirstTimeInstall(firstTimeInstall);
await _secureService.setString('language', language); await _secureService.setString('language', language);
_state = StateObjects.none; _state = StateObjects.none;
notifyListeners(); notifyListeners();
} }

View File

@ -29,6 +29,7 @@ class GoogleAuthService with ListenableServiceMixin {
_googleUser ??= _googleUser ??=
await _signIn.authenticate(scopeHint: ['email', 'profile']); await _signIn.authenticate(scopeHint: ['email', 'profile']);
}); });
notifyListeners(); notifyListeners();
} catch (e) { } catch (e) {

View File

@ -58,6 +58,8 @@ class LearnService with ListenableServiceMixin {
List<LearnLesson> get lessons => _lessons; List<LearnLesson> get lessons => _lessons;
// Learn programs // Learn programs
Future<String?> refreshObject(String url) async { Future<String?> refreshObject(String url) async {
Map<String, dynamic> data = {'reference': url}; Map<String, dynamic> data = {'reference': url};

View File

@ -124,4 +124,5 @@ String kTelegramSupportLink = 'https://t.me/yimaruacademy2026';
String kErrorUrl = 'https://api.yimaruacademy.com/payment/error'; String kErrorUrl = 'https://api.yimaruacademy.com/payment/error';
String kSuccessUrl = 'https://api.yimaruacademy.com/payment/success'; String kSuccessUrl =
'https://api.yimaruacademy.com/payment/success';

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

View File

@ -2,7 +2,7 @@
// ignore_for_file: constant_identifier_names // ignore_for_file: constant_identifier_names
abstract class LocaleKeys { abstract class LocaleKeys {
static const loading = 'loading'; static const loading = 'loading';
static const welcome_back = 'welcome_back'; static const welcome_back = 'welcome_back';
static const checking_user_info = 'checking_user_info'; static const checking_user_info = 'checking_user_info';
@ -161,8 +161,7 @@ abstract class LocaleKeys {
static const educational_background = 'educational_background'; static const educational_background = 'educational_background';
static const education_for_personalization = 'education_for_personalization'; static const education_for_personalization = 'education_for_personalization';
static const your_occupation = 'your_occupation'; static const your_occupation = 'your_occupation';
static const occupation_for_personalization = static const occupation_for_personalization = 'occupation_for_personalization';
'occupation_for_personalization';
static const location = 'location'; static const location = 'location';
static const select_country_region = 'select_country_region'; static const select_country_region = 'select_country_region';
static const select_country = 'select_country'; static const select_country = 'select_country';
@ -189,14 +188,13 @@ abstract class LocaleKeys {
static const finish_all_practice_lesson = 'finish_all_practice_lesson'; static const finish_all_practice_lesson = 'finish_all_practice_lesson';
static const finish_all_practice_module = 'finish_all_practice_module'; static const finish_all_practice_module = 'finish_all_practice_module';
static const finish_all_practice_course = 'finish_all_practice_course'; static const finish_all_practice_course = 'finish_all_practice_course';
static const finish_all_practice_previouse_module = static const finish_all_practice_previouse_module = 'finish_all_practice_previouse_module';
'finish_all_practice_previouse_module'; static const finish_all_practice_previouse_course = 'finish_all_practice_previouse_course';
static const finish_all_practice_previouse_course =
'finish_all_practice_previouse_course';
static const track_journey = 'track_journey'; static const track_journey = 'track_journey';
static const learn_english = 'learn_english'; static const learn_english = 'learn_english';
static const keep_momentum = 'keep_momentum'; static const keep_momentum = 'keep_momentum';
static const completed_practices = 'completed_practices'; static const completed_practices = 'completed_practices';
static const total_practices = 'total_practices'; static const total_practices = 'total_practices';
static const progress_percentage = 'progress_percentage'; static const progress_percentage = 'progress_percentage';
} }

View File

@ -55,6 +55,8 @@ class HomeViewModel extends ReactiveViewModel {
rebuildUi(); rebuildUi();
} }
// Remote api calls // Remote api calls
// In-app update // In-app update

View File

@ -28,13 +28,14 @@ class LanguageViewModel extends ReactiveViewModel {
_localizationService.isSelectedLanguage(title); _localizationService.isSelectedLanguage(title);
Future<void> setSelectedLanguage( Future<void> setSelectedLanguage(
{required BuildContext context, {required BuildContext context,
required Map<String, dynamic> title}) async { required Map<String, dynamic> title}) async {
await _localizationService.setSelectedLanguage( await _localizationService.setSelectedLanguage(
context: context, title: title); context: context, title: title);
rebuildUi(); rebuildUi();
} }
// Navigation // Navigation
void pop() => _navigationService.back(); void pop() => _navigationService.back();
} }

View File

@ -13,10 +13,8 @@ import 'learn_course_viewmodel.dart';
class LearnCourseView extends StackedView<LearnCourseViewModel> { class LearnCourseView extends StackedView<LearnCourseViewModel> {
final int id; final int id;
final bool first;
const LearnCourseView({Key? key, required this.id, required this.first}) const LearnCourseView({Key? key, required this.id}) : super(key: key);
: super(key: key);
Future<void> _onPractice( Future<void> _onPractice(
{required BuildContext context, {required BuildContext context,
@ -153,9 +151,7 @@ class LearnCourseView extends StackedView<LearnCourseViewModel> {
viewModel: viewModel, viewModel: viewModel,
course: viewModel.courses[index]), course: viewModel.courses[index]),
onViewTap: () async => onViewTap: () async =>
await viewModel.navigateToLearnModule( await viewModel.navigateToLearnModule(viewModel.courses[index]),
first: first && index ==0,
course: viewModel.courses[index]),
), ),
separatorBuilder: (context, index) => verticalSpaceSmall, separatorBuilder: (context, index) => verticalSpaceSmall,
); );

View File

@ -32,8 +32,8 @@ class LearnCourseViewModel extends ReactiveViewModel {
Future<void> navigateToLearnSubscription() async => Future<void> navigateToLearnSubscription() async =>
await _navigationService.navigateToLearnSubscriptionView(); await _navigationService.navigateToLearnSubscriptionView();
Future<void> navigateToLearnModule({required bool first,required LearnCourse course}) async => Future<void> navigateToLearnModule(LearnCourse course) async =>
_navigationService.navigateToLearnModuleView(first: first,course: course); _navigationService.navigateToLearnModuleView(course: course);
Future<void> navigateToLearnPractice( Future<void> navigateToLearnPractice(
{required int id, required String level}) async => {required int id, required String level}) async =>

View File

@ -17,25 +17,32 @@ import '../../widgets/small_app_bar.dart';
import 'learn_lesson_viewmodel.dart'; import 'learn_lesson_viewmodel.dart';
class LearnLessonView extends StackedView<LearnLessonViewModel> { class LearnLessonView extends StackedView<LearnLessonViewModel> {
final bool first;
final LearnModule module; final LearnModule module;
const LearnLessonView({Key? key, required this.first, required this.module}) const LearnLessonView({Key? key, required this.module}) : super(key: key);
: super(key: key);
Future<void> _onPractice( Future<void> _onPractice(
{required int index, {required int index,
required LearnLesson lesson, required LearnLesson lesson,
required BuildContext context, required BuildContext context,
required LearnLessonViewModel viewModel}) async { required LearnLessonViewModel viewModel}) async {
if (viewModel.user?.subscriptionStatus?.toLowerCase() == 'active') { /* if (lesson.access?.isAccessible ?? false) {
if (lesson.access?.isAccessible ?? false) { await viewModel.navigateToLearnPractice(lesson.id ?? 0);
await viewModel.navigateToLearnPractice(lesson.id ?? 0); } else {
await _showSheet(context: context, viewModel: viewModel);
}*/
if (index > 1) {
if (viewModel.user?.subscriptionStatus?.toLowerCase() == 'active') {
if (lesson.access?.isAccessible ?? false) {
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
} else {
await _showSheet(context: context, viewModel: viewModel);
}
} else { } else {
await _showSheet(context: context, viewModel: viewModel); await viewModel.navigateToLearnSubscription();
} }
} else { } else {
if (first && index < 3) { if (lesson.access?.isAccessible ?? false) {
await viewModel.navigateToLearnPractice(lesson.id ?? 0); await viewModel.navigateToLearnPractice(lesson.id ?? 0);
} else { } else {
await _showSheet(context: context, viewModel: viewModel); await _showSheet(context: context, viewModel: viewModel);
@ -217,7 +224,6 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildTile( itemBuilder: (context, index) => _buildTile(
index: index, index: index,
first: first && index < 3,
lesson: viewModel.lessons[index], lesson: viewModel.lessons[index],
last: index == viewModel.lessons.length - 1, last: index == viewModel.lessons.length - 1,
onPracticeTap: () async => await _onPractice( onPracticeTap: () async => await _onPractice(
@ -238,14 +244,12 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
Widget _buildTile({ Widget _buildTile({
required bool last, required bool last,
required int index, required int index,
required bool first,
required LearnLesson lesson, required LearnLesson lesson,
required GestureTapCallback? onLessonTap, required GestureTapCallback? onLessonTap,
required GestureTapCallback? onPracticeTap, required GestureTapCallback? onPracticeTap,
}) => }) =>
LearnLessonTile( LearnLessonTile(
last: last, last: last,
first: first,
index: index, index: index,
lesson: lesson, lesson: lesson,
onLessonTap: onLessonTap, onLessonTap: onLessonTap,

View File

@ -31,9 +31,21 @@ class LearnLessonDetailView extends StackedView<LearnLessonDetailViewModel> {
Future<void> _onPractice( Future<void> _onPractice(
{required LearnLesson lesson, {required LearnLesson lesson,
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 (viewModel.user?.subscriptionStatus?.toLowerCase() == 'active') {
await viewModel.pause();
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
} else {
await viewModel.pause();
await viewModel.navigateToLearnSubscription();
}
} else {
await viewModel.pause();
await viewModel.navigateToLearnPractice(lesson.id ?? 0);
}
} }
@override @override

View File

@ -16,11 +16,9 @@ import '../../widgets/small_app_bar.dart';
import 'learn_module_viewmodel.dart'; import 'learn_module_viewmodel.dart';
class LearnModuleView extends StackedView<LearnModuleViewModel> { class LearnModuleView extends StackedView<LearnModuleViewModel> {
final bool first;
final LearnCourse course; final LearnCourse course;
const LearnModuleView({Key? key, required this.first, required this.course}) const LearnModuleView({Key? key, required this.course}) : super(key: key);
: super(key: key);
Future<void> _onPractice( Future<void> _onPractice(
{required BuildContext context, {required BuildContext context,
@ -204,9 +202,7 @@ class LearnModuleView extends StackedView<LearnModuleViewModel> {
module: viewModel.modules[index], module: viewModel.modules[index],
), ),
onModuleTap: () async => onModuleTap: () async =>
await viewModel.navigateToLearnLesson( await viewModel.navigateToLearnLesson(viewModel.modules[index]),
first: first && index == 0,
module: viewModel.modules[index]),
), ),
); );

View File

@ -35,8 +35,8 @@ class LearnModuleViewModel extends ReactiveViewModel {
// Navigation // Navigation
void pop() => _navigationService.back(); void pop() => _navigationService.back();
Future<void> navigateToLearnLesson({required bool first, required LearnModule module}) async => Future<void> navigateToLearnLesson(LearnModule module) async =>
await _navigationService.navigateToLearnLessonView(first:first,module: module); await _navigationService.navigateToLearnLessonView(module: module);
Future<void> navigateToLearnPractice( Future<void> navigateToLearnPractice(
{required int id, required String module}) async => {required int id, required String module}) async =>

View File

@ -10,7 +10,6 @@ import 'package:yimaru_app/services/voice_recorder_service.dart';
import 'package:yimaru_app/ui/common/enmus.dart'; import 'package:yimaru_app/ui/common/enmus.dart';
import '../../../app/app.locator.dart'; import '../../../app/app.locator.dart';
import '../../../app/app.router.dart';
import '../../../models/learn_question.dart'; import '../../../models/learn_question.dart';
import '../../../services/api_service.dart'; import '../../../services/api_service.dart';
import '../../../services/audio_player_service.dart'; import '../../../services/audio_player_service.dart';
@ -265,9 +264,6 @@ class LearnPracticeViewModel extends ReactiveViewModel {
// Navigation // Navigation
void pop() => _navigationService.back(); void pop() => _navigationService.back();
Future<void> navigateToLearnSubscription() async =>
await _navigationService.navigateToLearnSubscriptionView();
// Remote api call // Remote api call
// Refresh url // Refresh url

View File

@ -27,14 +27,6 @@ class LearnPracticeIntroScreen extends ViewModelWidget<LearnPracticeViewModel> {
required this.subtitle, required this.subtitle,
required this.practice}); required this.practice});
Future<void> _practice(LearnPracticeViewModel viewModel) async {
if (viewModel.user?.subscriptionStatus?.toLowerCase() == 'active') {
viewModel.goTo(1);
} else {
await viewModel.navigateToLearnSubscription();
}
}
Future<void> _cancel(LearnPracticeViewModel viewModel) async { Future<void> _cancel(LearnPracticeViewModel viewModel) async {
await viewModel.stopRecording(); await viewModel.stopRecording();
viewModel.pop(); viewModel.pop();
@ -215,7 +207,7 @@ class LearnPracticeIntroScreen extends ViewModelWidget<LearnPracticeViewModel> {
text: label, text: label,
borderRadius: 12, borderRadius: 12,
foregroundColor: kcWhite, foregroundColor: kcWhite,
onTap: () => viewModel.goTo(1),
backgroundColor: kcPrimaryColor, backgroundColor: kcPrimaryColor,
onTap: () async => await _practice(viewModel),
); );
} }

View File

@ -87,8 +87,8 @@ class LearnProgramView extends StackedView<LearnProgramViewModel> {
separatorBuilder: (context, index) => verticalSpaceSmall, separatorBuilder: (context, index) => verticalSpaceSmall,
itemBuilder: (context, index) => _buildTile( itemBuilder: (context, index) => _buildTile(
program: viewModel.learnPrograms[index], program: viewModel.learnPrograms[index],
onTap: () async => await viewModel.navigateToLearnCourse( onTap: () async => await viewModel
first: index == 0, id: viewModel.learnPrograms[index].id ?? 0), .navigateToLearnCourse(viewModel.learnPrograms[index].id ?? 0),
), ),
); );

View File

@ -36,8 +36,8 @@ class LearnProgramViewModel extends ReactiveViewModel {
List<LearnProgram> get learnPrograms => _learnPrograms; List<LearnProgram> get learnPrograms => _learnPrograms;
// Navigation // Navigation
Future<void> navigateToLearnCourse({required int id,required bool first}) async => Future<void> navigateToLearnCourse(int id) async =>
_navigationService.navigateToLearnCourseView(id: id,first: first); _navigationService.navigateToLearnCourseView(id: id);
// Remote api call // Remote api call

View File

@ -205,8 +205,8 @@ class OnboardingViewModel extends ReactiveViewModel
_selectedCountry = value; _selectedCountry = value;
if (value?.code?.toLowerCase().trim() == 'et') { if (value?.code?.toLowerCase().trim() == 'et') {
_dropdownRegion = true; _dropdownRegion = true;
_selectedRegion = _regions.firstWhere( _selectedRegion = _regions
(e) => e.code?.toLowerCase().trim().contains('addis_ababa') ?? false); .firstWhere((e) => e.code?.toLowerCase().trim().contains('addis_ababa') ?? false);
} else { } else {
_dropdownRegion = false; _dropdownRegion = false;
} }

View File

@ -26,8 +26,7 @@ class PaymentView extends StackedView<PaymentViewModel> {
@override @override
void onViewModelReady(PaymentViewModel viewModel) async { void onViewModelReady(PaymentViewModel viewModel) async {
await viewModel.createLearnSubscriptionRequest( await viewModel.createLearnSubscriptionRequest(phone: phone,subscription: subscription);
phone: phone, subscription: subscription);
super.onViewModelReady(viewModel); super.onViewModelReady(viewModel);
} }

View File

@ -45,22 +45,18 @@ class PaymentViewModel extends ReactiveViewModel {
// Remote api call // Remote api call
// Learn subscription // Learn subscription
Future<void> createLearnSubscriptionRequest( Future<void> createLearnSubscriptionRequest({required String phone,required LearnSubscription subscription}) async =>
{required String phone, await runBusyFuture(_createLearnSubscriptionRequest(phone: phone,subscription: subscription),
required LearnSubscription subscription}) async =>
await runBusyFuture(
_createLearnSubscriptionRequest(
phone: phone, subscription: subscription),
busyObject: StateObjects.learnSubscription); busyObject: StateObjects.learnSubscription);
Future<void> _createLearnSubscriptionRequest( Future<void> _createLearnSubscriptionRequest({required String phone,required LearnSubscription subscription}) async {
{required String phone, required LearnSubscription subscription}) async {
if (await _statusChecker.checkConnection()) { if (await _statusChecker.checkConnection()) {
Map<String, dynamic> data = { Map<String, dynamic> data = {
'provider': 'CHAPA', 'provider': 'CHAPA',
'phone': '251$phone', 'phone': '251$phone',
'email': 'test@gmail.com', 'email': 'test@gmail.com',
'plan_id': subscription.id, 'plan_id': subscription.id,
}; };
Map<String, dynamic> response = Map<String, dynamic> response =

View File

@ -166,7 +166,7 @@ class ProfileView extends StackedView<ProfileViewModel> {
List<Widget> _buildSettingsChildren(ProfileViewModel viewModel) => [ List<Widget> _buildSettingsChildren(ProfileViewModel viewModel) => [
// _buildDownloadsCard(viewModel), // _buildDownloadsCard(viewModel),
_buildProgressCard(viewModel), _buildProgressCard(viewModel),
_buildAccountCard(viewModel), _buildAccountCard(viewModel),
_buildSupportCard(viewModel) _buildSupportCard(viewModel)
]; ];

View File

@ -104,7 +104,7 @@ class ProfileDetailView extends StackedView<ProfileDetailViewModel>
viewModel.setSelectedOccupation(viewModel.occupations viewModel.setSelectedOccupation(viewModel.occupations
.where((e) => (e.code ?? '') == viewModel.user?.occupation) .where((e) => (e.code ?? '') == viewModel.user?.occupation)
.first); .first);
viewModel.setSelectedCountry(viewModel.countries viewModel.setSelectedCountry(viewModel.countries
.where((e) => (e.code ?? '') == viewModel.user?.country) .where((e) => (e.code ?? '') == viewModel.user?.country)
.first); .first);
if (viewModel.user?.country?.toLowerCase() == 'et') { if (viewModel.user?.country?.toLowerCase() == 'et') {

View File

@ -136,8 +136,8 @@ class ProfileDetailViewModel extends ReactiveViewModel
void setEthiopianRegion(String region) { void setEthiopianRegion(String region) {
_dropdownRegion = true; _dropdownRegion = true;
_selectedRegion = _regions _selectedRegion =
.firstWhere((r) => r.code?.toLowerCase() == region.toLowerCase()); _regions.firstWhere((r) => r.code?.toLowerCase() == region.toLowerCase());
rebuildUi(); rebuildUi();
} }

View File

@ -17,6 +17,7 @@ class ProgressViewModel extends ReactiveViewModel {
@override @override
List<ListenableServiceMixin> get listenableServices => [_learnService]; List<ListenableServiceMixin> get listenableServices => [_learnService];
// Total practice count // Total practice count
int get _totalCount => _learnService.totalCount; int get _totalCount => _learnService.totalCount;
@ -32,6 +33,7 @@ class ProgressViewModel extends ReactiveViewModel {
int get totalProgress => _totalProgress; int get totalProgress => _totalProgress;
// Courses // Courses
final List<Map<String, dynamic>> _courses = [ final List<Map<String, dynamic>> _courses = [
{ {
@ -51,9 +53,8 @@ class ProgressViewModel extends ReactiveViewModel {
// Learning progress // Learning progress
Future<void> getProgressSummary() async => Future<void> getProgressSummary() async => runBusyFuture(_getProgressSummary(),
runBusyFuture(_getProgressSummary(), busyObject: StateObjects.progressSummary);
busyObject: StateObjects.progressSummary);
Future<void> _getProgressSummary() async { Future<void> _getProgressSummary() async {
if (await _statusCheckerService.checkConnection()) { if (await _statusCheckerService.checkConnection()) {

View File

@ -17,7 +17,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 bool last;
final bool first;
final LearnLesson lesson; final LearnLesson lesson;
final GestureTapCallback? onLessonTap; final GestureTapCallback? onLessonTap;
final GestureTapCallback? onPracticeTap; final GestureTapCallback? onPracticeTap;
@ -27,7 +26,6 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
this.onLessonTap, this.onLessonTap,
this.onPracticeTap, this.onPracticeTap,
required this.last, required this.last,
required this.first,
required this.index, required this.index,
required this.lesson}); required this.lesson});
@ -37,9 +35,7 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
Widget _buildContainerWrapper(LearnLessonViewModel viewModel) => Widget _buildContainerWrapper(LearnLessonViewModel viewModel) =>
GestureDetector( GestureDetector(
onTap: viewModel.user?.subscriptionStatus?.toLowerCase() == 'active' ? !(lesson.access?.isAccessible ?? false) onTap: !(lesson.access?.isAccessible ?? false) ? onPracticeTap : null,
? onPracticeTap
: null: !first ? onPracticeTap:null,
child: _buildContainer(viewModel), child: _buildContainer(viewModel),
); );
@ -60,7 +56,7 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
Widget _buildTileStack(LearnLessonViewModel viewModel) => Stack( Widget _buildTileStack(LearnLessonViewModel viewModel) => Stack(
children: [ children: [
_buildExpansionTile(viewModel), _buildExpansionTile(viewModel),
_buildContainerShaderState(viewModel) _buildContainerShaderState()
], ],
); );
@ -74,6 +70,7 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
shape: Border.all(color: kcTransparent), shape: Border.all(color: kcTransparent),
expandedAlignment: Alignment.centerLeft, expandedAlignment: Alignment.centerLeft,
leading: _buildLeadingWrapper(viewModel), leading: _buildLeadingWrapper(viewModel),
enabled: (lesson.access?.isAccessible ?? false),
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),
@ -88,7 +85,6 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
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),
enabled: first ? true : (lesson.access?.isAccessible ?? false),
children: _buildExpansionTileChildren(viewModel), children: _buildExpansionTileChildren(viewModel),
); );
@ -207,14 +203,9 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
backgroundColor: kcPrimaryColor, backgroundColor: kcPrimaryColor,
); );
Widget _buildContainerShaderState(LearnLessonViewModel viewModel) => Widget _buildContainerShaderState() => !(lesson.access?.isAccessible ?? false)
viewModel.user?.subscriptionStatus?.toLowerCase() == 'active' ? _buildContainerShader()
? !(lesson.access?.isAccessible ?? false) : Container();
? _buildContainerShader()
: Container()
: !first
? _buildContainerShader()
: Container();
Widget _buildContainerShader() => const CustomContainerShader(); Widget _buildContainerShader() => const CustomContainerShader();
} }

View File

@ -1,6 +1,6 @@
name: yimaru_app name: yimaru_app
publish_to: 'none' publish_to: 'none'
version: 0.1.34+36 version: 0.1.33+35
description: A new Flutter project. description: A new Flutter project.
environment: environment: