import 'package:dio/dio.dart'; import 'package:yimaru_app/models/question.dart'; import 'package:yimaru_app/models/course_subcategory.dart'; import 'package:yimaru_app/models/course_category.dart'; import 'package:yimaru_app/models/course_lesson.dart'; import 'package:yimaru_app/models/course_progress.dart'; import 'package:yimaru_app/models/course.dart'; import 'package:yimaru_app/models/practice.dart'; import 'package:yimaru_app/models/practice_question.dart'; import 'package:yimaru_app/models/user_model.dart'; import 'package:yimaru_app/services/dio_service.dart'; import 'package:yimaru_app/ui/common/app_constants.dart'; import '../app/app.locator.dart'; import '../ui/common/enmus.dart'; class ApiService { // Dependency injection final _service = locator(); // Register with email Future> registerWithEmail( Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kRegisterUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Otp sent successfully' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Login Future> login(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kLoginUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Logged in successfully', 'data': UserModel.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Google auth Future> googleAuth(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kGoogleAuthUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Logged in successfully', 'data': UserModel.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Verify otp Future> verifyOtp(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kVerifyOtpUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Otp verified successfully', 'data': UserModel.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Resend otp Future> resendOtp(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kResendOtpUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Otp resend successfully' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Request reset code Future> requestResetCode( Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kRequestResetCode', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Reset code sent successfully', }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Reset password Future> resetPassword(Map data) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$kResetPassword', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Password reset successfully', }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // GEt profile completion status Future> getProfileStatus(UserModel? user) async { try { Response response = await _service.dio.get( '$kBaseUrl/$kUserBaseUrl/${user?.userId}/$kProfileStatusUrl', ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Profile completion status fetched successfully', 'data': response.data['data']['is_profile_completed'] as bool, }; } else { return { 'status': ResponseStatus.failure, 'message': '${response.data['message']}, ${response.data['error']}' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Get profile data Future> getProfileData(int? userId) async { try { Response response = await _service.dio.get( '$kBaseUrl/$kUserBaseUrl/$kGetUserUrl', ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Profile fetched successfully', 'data': UserModel.fromJson(response.data['data']), }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Complete profile Future> completeProfile( Map data) async { try { Response response = await _service.dio.put( '$kBaseUrl/$kUserBaseUrl', data: data, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Profile updated successfully' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Update profile image Future> updateProfileImage( {required int? userId, required Map data}) async { try { late FormData formData; if (data['profile_picture_url'] .toString() .contains('com.yimaru.lms.app/')) { formData = FormData.fromMap({ 'file': data['profile_picture_url'].toString().isNotEmpty ? MultipartFile.fromFileSync( data['profile_picture_url'], filename: data['profile_picture_url'].toString().split('/').last, ) : null, }); } else { formData = FormData.fromMap({ 'file': data['profile_picture_url'].toString().isNotEmpty ? MultipartFile.fromFileSync( data['profile_picture_url'], filename: data['profile_picture_url'].toString().split('/').last, ) : null, }); } Response response = await _service.dio.post( '$kBaseUrl/$kUserBaseUrl/$userId/$kUpdateProfileImage', data: formData, ); if (response.statusCode == 200) { return { 'status': ResponseStatus.success, 'message': 'Profile updated successfully' }; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Get assessments Future> getAssessments() async { try { List assessments = []; final Response response = await _service.dio.get('$kBaseUrl/$kAssessmentsUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; assessments = decodedData.map( (e) { return Question.fromJson(e); }, ).toList(); return assessments; } return []; } catch (e) { return []; } } // Get course categories Future> getCourseCategories() async { try { List categories = []; final Response response = await _service.dio .get('$kBaseUrl/$kCourseBaseUrl/$kCourseCategoryUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['categories'] as List; categories = decodedData.map( (e) { return CourseCategory.fromJson(e); }, ).toList(); return categories; } return []; } catch (e) { return []; } } // Get course subcategory Future> getCourseSubcategories(int id) async { try { List subcategories = []; final Response response = await _service.dio.get( '$kBaseUrl/$kCourseBaseUrl/$kCourseCategoryUrl/$id/$kCoursesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['courses'] as List; subcategories = decodedData.map( (e) { return CourseSubcategory.fromJson(e); }, ).toList(); return subcategories; } return []; } catch (e) { return []; } } // Get courses Future> getCourses(int id) async { try { List courses = []; final Response response = await _service.dio .get('$kBaseUrl/$kCourseBaseUrl/$kCoursesUrl/$id/$kSubcoursesUrl'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data']['sub_courses'] as List; courses = decodedData.map( (e) { return Course.fromJson(e); }, ).toList(); return courses; } return []; } catch (e) { return []; } } // Get course progress Future> getCourseProgress(int id) async { try { List courseProgress = []; final Response response = await _service.dio.get('$kBaseUrl/$kCourseProgressUrl/$id'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; courseProgress = decodedData.map( (e) { return CourseProgress.fromJson(e); }, ).toList(); return courseProgress; } return []; } catch (e) { return []; } } // Get course lessons Future> getCourseLessons(int id) async { try { List courseLessons = []; final Response response = await _service.dio.get( '$kBaseUrl/$kCourseBaseUrl/$kSubcoursesUrl/$id/$kPublishedVideos'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; courseLessons = decodedData.map( (e) { return CourseLesson.fromJson(e); }, ).toList(); return courseLessons; } return []; } catch (e) { return []; } } // Complete lesson Future> completeLesson(int id) async { try { Response response = await _service.dio.post( '$kBaseUrl/$kLessonProgressUrl/$id/$kCompleteLessonUrl', ); if (response.statusCode == 200) { return {'status': ResponseStatus.success, 'message': 'Video completed'}; } else { return { 'status': ResponseStatus.failure, 'message': 'Unknown Error Occurred' }; } } on DioException catch (e) { return { 'status': ResponseStatus.failure, 'message': e.response?.data.toString(), }; } } // Course practices Future> getCoursePractices(int id) async { try { List coursePractices = []; final Response response = await _service.dio.get( '$kBaseUrl/$kPracticeBaseUrl/$kCoursePractice?owner_type=SUB_COURSE&owner_id=$id'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; coursePractices = decodedData.map( (e) { return Practice.fromJson(e); }, ).toList(); return coursePractices; } return []; } catch (e) { return []; } } // Get course practic questions Future> getCoursePracticeQuestions(int id) async { try { List coursePracticeQuestions = []; final Response response = await _service.dio .get('$kBaseUrl/$kPracticeBaseUrl/$id/$kCoursePracticeQuestions'); if (response.statusCode == 200) { var data = response.data; var decodedData = data['data'] as List; coursePracticeQuestions = decodedData.map( (e) { return PracticeQuestion.fromJson(e); }, ).toList(); return coursePracticeQuestions; } return []; } catch (e) { return []; } } // Get course practice question Future getCoursePracticeQuestion(int id) async { try { final Response response = await _service.dio.get('$kBaseUrl/$kCoursePracticeQuestion/$id'); if (response.statusCode == 200) { Question question = Question.fromJson(response.data['data']); return question; } return null; } catch (e) { return null; } } }