Commit 6b980613 authored by DatHV's avatar DatHV
Browse files

update project structure

parent bfff9e47
import 'dart:async'; import 'dart:async';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:mypoint_flutter_app/base/app_loading.dart'; import 'package:mypoint_flutter_app/shared/widgets/loading/app_loading.dart';
import '../../base/app_navigator.dart'; import '../../../app/routing/app_navigator.dart';
import '../dio_http_service.dart';
import '../error_mapper.dart'; import '../error_mapper.dart';
import '../dio_http_service.dart';
class ExceptionInterceptor extends Interceptor { class ExceptionInterceptor extends Interceptor {
static Completer<bool>? _currentRetryPrompt; static Completer<bool>? _currentRetryPrompt;
......
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:mypoint_flutter_app/preference/data_preference.dart'; import 'package:mypoint_flutter_app/shared/preferences/data_preference.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class RequestInterceptor extends Interceptor { class RequestInterceptor extends Interceptor {
......
import 'dart:convert'; import 'dart:convert';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:mypoint_flutter_app/base/base_response_model.dart'; import 'package:mypoint_flutter_app/shared/widgets/base_view/base_response_model.dart';
import '../configs/callbacks.dart'; import '../../app/config/callbacks.dart';
import '../configs/constants.dart'; import '../../app/config/constants.dart';
enum Method { GET, POST, PUT, DELETE } enum Method { GET, POST, PUT, DELETE }
......
import 'dart:io'; import 'dart:io';
import 'package:mypoint_flutter_app/configs/api_paths.dart'; import 'package:mypoint_flutter_app/app/config/api_paths.dart';
import 'package:mypoint_flutter_app/base/base_response_model.dart'; import 'package:mypoint_flutter_app/shared/widgets/base_view/base_response_model.dart';
import 'package:mypoint_flutter_app/configs/constants.dart'; import 'package:mypoint_flutter_app/app/config/constants.dart';
import 'package:mypoint_flutter_app/extensions/string_extension.dart'; import 'package:mypoint_flutter_app/core/utils/extensions/string_extension.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client.dart'; import 'package:mypoint_flutter_app/core/network/restful_api_client.dart';
import 'package:mypoint_flutter_app/preference/data_preference.dart'; import 'package:mypoint_flutter_app/shared/preferences/data_preference.dart';
import 'package:mypoint_flutter_app/screen/voucher/models/product_model.dart'; import 'package:mypoint_flutter_app/features/voucher/models/product_model.dart';
import '../configs/callbacks.dart'; import '../../app/config/callbacks.dart';
import '../configs/device_info.dart'; import '../services/device_info.dart';
import '../directional/directional_screen.dart'; import '../../shared/navigation/directional_screen.dart';
import '../model/auth/biometric_register_response_model.dart'; import '../../features/home/models/header_home_model.dart';
import '../model/auth/login_token_response_model.dart'; import '../../features/biometric/model/biometric_register_response_model.dart';
import '../model/auth/profile_response_model.dart'; import '../../features/login/model/login_token_response_model.dart';
import '../preference/package_info.dart'; import '../../features/personal/model/profile_response_model.dart';
import '../screen/health_book/health_book_model.dart'; import '../services/package_info.dart';
import '../screen/history_point/models/history_point_models.dart'; import '../../features/health_book/health_book_model.dart';
import '../screen/history_point/models/transaction_summary_by_date_model.dart'; import '../../features/history_point/models/history_point_models.dart';
import '../screen/register_campaign/model/verify_register_model.dart'; import '../../features/history_point/models/transaction_summary_by_date_model.dart';
import '../screen/splash/models/update_response_model.dart'; import '../../features/register_campaign/model/verify_register_model.dart';
import '../preference/point/header_home_model.dart'; import '../../features/splash/models/update_response_model.dart';
import '../screen/bank_account_manager/bank_account_info_model.dart'; import '../../features/bank_account_manager/bank_account_info_model.dart';
import '../screen/campaign7day/models/campaign_7day_info_model.dart'; import '../../features/campaign7day/models/campaign_7day_info_model.dart';
import '../screen/campaign7day/models/campaign_7day_mission_model.dart'; import '../../features/campaign7day/models/campaign_7day_mission_model.dart';
import '../screen/campaign7day/models/campaign_7day_reward_model.dart'; import '../../features/campaign7day/models/campaign_7day_reward_model.dart';
import '../screen/daily_checkin/daily_checkin_models.dart'; import '../../features/daily_checkin/daily_checkin_models.dart';
import '../screen/device_manager/device_manager_model.dart'; import '../../features/device_manager/device_manager_model.dart';
import '../screen/electric_payment/models/customer_contract_object_model.dart'; import '../../features/electric_payment/models/customer_contract_object_model.dart';
import '../screen/electric_payment/models/electric_payment_response_model.dart'; import '../../features/electric_payment/models/electric_payment_response_model.dart';
import '../screen/flash_sale/models/flash_sale_category_model.dart'; import '../../features/flash_sale/models/flash_sale_category_model.dart';
import '../screen/flash_sale/models/flash_sale_detail_response.dart'; import '../../features/flash_sale/models/flash_sale_detail_response.dart';
import '../screen/history_point_cashback/models/history_point_cashback_model.dart'; import '../../features/history_point_cashback/models/history_point_cashback_model.dart';
import '../screen/home/models/achievement_model.dart'; import '../../features/achievement/model/achievement_model.dart';
import '../screen/home/models/hover_data_model.dart'; import '../../features/home/models/hover_data_model.dart';
import '../screen/home/models/main_section_config_model.dart'; import '../../features/home/models/main_section_config_model.dart';
import '../screen/home/models/pipi_detail_model.dart'; import '../../features/pipi/model/pipi_detail_model.dart';
import '../screen/interested_categories/models/interested_categories_model.dart'; import '../../features/interested_categories/models/interested_categories_model.dart';
import '../screen/invite_friend_campaign/models/invite_friend_campaign_model.dart'; import '../../features/invite_friend_campaign/models/invite_friend_campaign_model.dart';
import '../screen/membership/models/membership_info_response.dart'; import '../../features/membership/models/membership_info_response.dart';
import '../screen/onboarding/model/check_phone_response_model.dart'; import '../../features/onboarding/model/check_phone_response_model.dart';
import '../screen/onboarding/model/onboarding_info_model.dart'; import '../../features/onboarding/model/onboarding_info_model.dart';
import '../screen/otp/model/create_otp_response_model.dart'; import '../../features/otp/model/create_otp_response_model.dart';
import '../screen/otp/model/otp_verify_response_model.dart'; import '../../features/otp/model/otp_verify_response_model.dart';
import '../screen/popup_manager/popup_manager_model.dart'; import '../../features/popup_manager/popup_manager_model.dart';
import '../screen/quiz_campaign/quiz_campaign_model.dart'; import '../../features/quiz_campaign/quiz_campaign_model.dart';
import '../screen/register_campaign/model/registration_form_package_model.dart'; import '../../features/register_campaign/model/registration_form_package_model.dart';
import '../screen/traffic_service/traffic_service_model.dart'; import '../../features/traffic_service/traffic_service_model.dart';
import '../screen/transaction/history/transaction_category_model.dart'; import '../../features/transaction/history/transaction_category_model.dart';
import '../screen/transaction/history/transaction_history_model.dart'; import '../../features/transaction/history/transaction_history_model.dart';
import '../screen/transaction/history/transaction_history_response_model.dart'; import '../../features/transaction/history/transaction_history_response_model.dart';
export 'api/affiliate_api.dart';
export 'api/website_api.dart';
export 'api/notification_api.dart';
export 'api/location_api.dart';
export 'api/product_api.dart';
extension RestfulAPIClientAllRequest on RestfulAPIClient { extension RestfulAPIClientAllRequest on RestfulAPIClient {
Future<BaseResponseModel<UpdateResponseModel>> checkUpdateApp() async { Future<BaseResponseModel<UpdateResponseModel>> checkUpdateApp() async {
...@@ -65,12 +61,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -65,12 +61,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
"version": version, "version": version,
"build_number": buildNumber, "build_number": buildNumber,
}; };
return requestNormal( return requestNormal(APIPaths.checkUpdate, Method.POST, body, (data) => UpdateResponseModel.fromJson(data as Json));
APIPaths.checkUpdate,
Method.POST,
body,
(data) => UpdateResponseModel.fromJson(data as Json),
);
} }
Future<BaseResponseModel<OnboardingInfoModel>> getOnboardingInfo() async { Future<BaseResponseModel<OnboardingInfoModel>> getOnboardingInfo() async {
...@@ -82,16 +73,10 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -82,16 +73,10 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<CheckPhoneResponseModel>> checkPhoneNumber( Future<BaseResponseModel<CheckPhoneResponseModel>> checkPhoneNumber(String phone) async {
String phone,
) async {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
var key = "$phone+_=$deviceKey/*8854"; var key = "$phone+_=$deviceKey/*8854";
final body = { final body = {"device_key": deviceKey, "phone_number": phone, "key": key.toSha256()};
"device_key": deviceKey,
"phone_number": phone,
"key": key.toSha256(),
};
return requestNormal( return requestNormal(
APIPaths.checkPhoneNumber, APIPaths.checkPhoneNumber,
Method.POST, Method.POST,
...@@ -100,10 +85,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -100,10 +85,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<OTPVerifyResponseModel>> verifyOTP( Future<BaseResponseModel<OTPVerifyResponseModel>> verifyOTP(String otp, String mfaToken) async {
String otp,
String mfaToken,
) async {
final body = {"otp": otp, "mfaToken": mfaToken}; final body = {"otp": otp, "mfaToken": mfaToken};
return requestNormal( return requestNormal(
APIPaths.verifyOtpWithAction, APIPaths.verifyOtpWithAction,
...@@ -113,9 +95,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -113,9 +95,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<OTPResendResponseModel>> resendOTP( Future<BaseResponseModel<OTPResendResponseModel>> resendOTP(String mfaToken) async {
String mfaToken,
) async {
final body = {"mfaToken": mfaToken}; final body = {"mfaToken": mfaToken};
return requestNormal( return requestNormal(
APIPaths.retryOtpWithAction, APIPaths.retryOtpWithAction,
...@@ -125,8 +105,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -125,8 +105,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<CreateOTPResponseModel>> Future<BaseResponseModel<CreateOTPResponseModel>> requestOtpDeleteAccount() async {
requestOtpDeleteAccount() async {
return requestNormal( return requestNormal(
APIPaths.otpDeleteAccountRequest, APIPaths.otpDeleteAccountRequest,
Method.POST, Method.POST,
...@@ -135,39 +114,19 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -135,39 +114,19 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<CreateOTPResponseModel>> verifyDeleteAccount( Future<BaseResponseModel<CreateOTPResponseModel>> verifyDeleteAccount(String otp) async {
String otp, return requestNormal(APIPaths.verifyDeleteAccount, Method.POST, {
) async { "otp": otp,
return requestNormal( }, (data) => CreateOTPResponseModel.fromJson(data as Json));
APIPaths.verifyDeleteAccount,
Method.POST,
{"otp": otp},
(data) => CreateOTPResponseModel.fromJson(data as Json),
);
} }
Future<BaseResponseModel<EmptyCodable>> signup( Future<BaseResponseModel<EmptyCodable>> signup(String phone, String password) async {
String phone,
String password,
) async {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
final body = { final body = {"username": phone, "password": password.toSha256(), "device_key": deviceKey};
"username": phone, return requestNormal(APIPaths.signup, Method.POST, body, (data) => EmptyCodable.fromJson(data as Json));
"password": password.toSha256(),
"device_key": deviceKey,
};
return requestNormal(
APIPaths.signup,
Method.POST,
body,
(data) => EmptyCodable.fromJson(data as Json),
);
} }
Future<BaseResponseModel<LoginTokenResponseModel>> login( Future<BaseResponseModel<LoginTokenResponseModel>> login(String phone, String password) async {
String phone,
String password,
) async {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
final body = { final body = {
"username": phone, "username": phone,
...@@ -175,37 +134,20 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -175,37 +134,20 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
"device_key": deviceKey, "device_key": deviceKey,
"workspace_code": "8854", "workspace_code": "8854",
}; };
return requestNormal( return requestNormal(APIPaths.login, Method.POST, body, (data) => LoginTokenResponseModel.fromJson(data as Json));
APIPaths.login,
Method.POST,
body,
(data) => LoginTokenResponseModel.fromJson(data as Json),
);
} }
Future<BaseResponseModel<EmptyCodable>> logout() async { Future<BaseResponseModel<EmptyCodable>> logout() async {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
var phone = DataPreference.instance.phone ?? ""; var phone = DataPreference.instance.phone ?? "";
final body = {"username": phone, "device_key": deviceKey, "lang": "vi"}; final body = {"username": phone, "device_key": deviceKey, "lang": "vi"};
return requestNormal( return requestNormal(APIPaths.logout, Method.POST, body, (data) => EmptyCodable.fromJson(data as Json));
APIPaths.logout,
Method.POST,
body,
(data) => EmptyCodable.fromJson(data as Json),
);
} }
Future<BaseResponseModel<LoginTokenResponseModel>> loginWithBiometric( Future<BaseResponseModel<LoginTokenResponseModel>> loginWithBiometric(String phone) async {
String phone,
) async {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
var bioToken = await DataPreference.instance.getBioToken(phone) ?? ""; var bioToken = await DataPreference.instance.getBioToken(phone) ?? "";
final body = { final body = {"username": phone, "bioToken": bioToken, "deviceKey": deviceKey, "workspaceCode": "8854"};
"username": phone,
"bioToken": bioToken,
"deviceKey": deviceKey,
"workspaceCode": "8854",
};
return requestNormal( return requestNormal(
APIPaths.loginWithBiometric, APIPaths.loginWithBiometric,
Method.POST, Method.POST,
...@@ -215,22 +157,13 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -215,22 +157,13 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
} }
Future<BaseResponseModel<ProfileResponseModel>> getUserProfile() async { Future<BaseResponseModel<ProfileResponseModel>> getUserProfile() async {
return requestNormal( return requestNormal(APIPaths.getUserInfo, Method.GET, {}, (data) => ProfileResponseModel.fromJson(data as Json));
APIPaths.getUserInfo,
Method.GET,
{},
(data) => ProfileResponseModel.fromJson(data as Json),
);
} }
Future<BaseResponseModel<TokenRefreshResponseModel>> refreshToken() async { Future<BaseResponseModel<TokenRefreshResponseModel>> refreshToken() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
String? refreshToken = DataPreference.instance.refreshToken ?? ""; String? refreshToken = DataPreference.instance.refreshToken ?? "";
final body = { final body = {"access_token_old": token, "refresh_token": refreshToken, 'lang': 'vi'};
"access_token_old": token,
"refresh_token": refreshToken,
'lang': 'vi',
};
return requestNormal( return requestNormal(
APIPaths.refreshToken, APIPaths.refreshToken,
Method.POST, Method.POST,
...@@ -239,15 +172,8 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -239,15 +172,8 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<CreateOTPResponseModel>> otpCreateNew( Future<BaseResponseModel<CreateOTPResponseModel>> otpCreateNew(String ownerId) async {
String ownerId, final body = {"owner_id": ownerId, "ttl": Constants.otpTtl, "resend_after_second": Constants.otpTtl, 'lang': 'vi'};
) async {
final body = {
"owner_id": ownerId,
"ttl": Constants.otpTtl,
"resend_after_second": Constants.otpTtl,
'lang': 'vi',
};
return requestNormal( return requestNormal(
APIPaths.otpCreateNew, APIPaths.otpCreateNew,
Method.POST, Method.POST,
...@@ -276,10 +202,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -276,10 +202,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<EmptyCodable>> accountPasswordReset( Future<BaseResponseModel<EmptyCodable>> accountPasswordReset(String phone, String password) async {
String phone,
String password,
) async {
final body = {"login_name": phone, "password": password.toSha256()}; final body = {"login_name": phone, "password": password.toSha256()};
return requestNormal( return requestNormal(
APIPaths.accountPasswordReset, APIPaths.accountPasswordReset,
...@@ -289,16 +212,9 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -289,16 +212,9 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<EmptyCodable>> accountPasswordChange( Future<BaseResponseModel<EmptyCodable>> accountPasswordChange(String phone, String password) async {
String phone,
String password,
) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = { final body = {"login_name": phone, "password": password.toSha256(), "access_token": token};
"login_name": phone,
"password": password.toSha256(),
"access_token": token,
};
return requestNormal( return requestNormal(
APIPaths.accountPasswordChange, APIPaths.accountPasswordChange,
Method.POST, Method.POST,
...@@ -307,16 +223,9 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -307,16 +223,9 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<EmptyCodable>> accountLoginForPasswordChange( Future<BaseResponseModel<EmptyCodable>> accountLoginForPasswordChange(String phone, String password) async {
String phone,
String password,
) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = { final body = {"login_name": phone, "password": password.toSha256(), "access_token": token};
"login_name": phone,
"password": password.toSha256(),
"access_token": token,
};
return requestNormal( return requestNormal(
APIPaths.accountLoginForPasswordChange, APIPaths.accountLoginForPasswordChange,
Method.POST, Method.POST,
...@@ -325,8 +234,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -325,8 +234,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<BiometricRegisterResponseModel>> Future<BaseResponseModel<BiometricRegisterResponseModel>> accountBioCredential() async {
accountBioCredential() async {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
final body = {"deviceKey": deviceKey}; final body = {"deviceKey": deviceKey};
return requestNormal( return requestNormal(
...@@ -337,8 +245,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -337,8 +245,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
); );
} }
Future<BaseResponseModel<BiometricRegisterResponseModel>> Future<BaseResponseModel<BiometricRegisterResponseModel>> registerBiometric() async {
registerBiometric() async {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
final body = {"deviceKey": deviceKey}; final body = {"deviceKey": deviceKey};
return requestNormal( return requestNormal(
...@@ -353,35 +260,21 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -353,35 +260,21 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
final path = "${APIPaths.unRegisterBiometric}/$deviceKey"; final path = "${APIPaths.unRegisterBiometric}/$deviceKey";
final body = {"deviceKey": deviceKey}; final body = {"deviceKey": deviceKey};
return requestNormal( return requestNormal(path, Method.POST, body, (data) => EmptyCodable.fromJson(data as Json));
path,
Method.POST,
body,
(data) => EmptyCodable.fromJson(data as Json),
);
} }
Future<BaseResponseModel<HeaderHomeModel>> getHomeHeaderData() async { Future<BaseResponseModel<HeaderHomeModel>> getHomeHeaderData() async {
return requestNormal( return requestNormal(APIPaths.headerHome, Method.GET, {}, (data) => HeaderHomeModel.fromJson(data as Json));
APIPaths.headerHome,
Method.GET,
{},
(data) => HeaderHomeModel.fromJson(data as Json),
);
} }
Future<BaseResponseModel<RegistrationFormPackageModel>> getRegistrationForm( Future<BaseResponseModel<RegistrationFormPackageModel>> getRegistrationForm(String id) async {
String id,
) async {
final path = APIPaths.getRegistrationForm.replaceAll("%@", id); final path = APIPaths.getRegistrationForm.replaceAll("%@", id);
return requestNormal(path, Method.GET, {}, (data) { return requestNormal(path, Method.GET, {}, (data) {
return RegistrationFormPackageModel.fromJson(data as Json); return RegistrationFormPackageModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<TransactionHistoryModel>> getTransactionHistoryDetail( Future<BaseResponseModel<TransactionHistoryModel>> getTransactionHistoryDetail(String id) async {
String id,
) async {
final path = APIPaths.getTransactionHistoryDetail.replaceAll("%@", id); final path = APIPaths.getTransactionHistoryDetail.replaceAll("%@", id);
return requestNormal(path, Method.GET, {}, (data) { return requestNormal(path, Method.GET, {}, (data) {
return TransactionHistoryModel.fromJson(data as Json); return TransactionHistoryModel.fromJson(data as Json);
...@@ -396,20 +289,15 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -396,20 +289,15 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
}); });
} }
Future<BaseResponseModel<List<MainSectionConfigModel>>> Future<BaseResponseModel<List<MainSectionConfigModel>>> getSectionLayoutHome() async {
getSectionLayoutHome() async {
return requestNormal(APIPaths.getSectionLayoutHome, Method.GET, {}, (data) { return requestNormal(APIPaths.getSectionLayoutHome, Method.GET, {}, (data) {
final list = data as List<dynamic>; final list = data as List<dynamic>;
return list.map((e) => MainSectionConfigModel.fromJson(e)).toList(); return list.map((e) => MainSectionConfigModel.fromJson(e)).toList();
}); });
} }
Future<BaseResponseModel<AchievementListResponse>> getAchievementList( Future<BaseResponseModel<AchievementListResponse>> getAchievementList(Json body) async {
Json body, return requestNormal(APIPaths.achievementGetList, Method.POST, body, (data) {
) async {
return requestNormal(APIPaths.achievementGetList, Method.POST, body, (
data,
) {
return AchievementListResponse.fromJson(data as Json); return AchievementListResponse.fromJson(data as Json);
}); });
} }
...@@ -426,65 +314,47 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -426,65 +314,47 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
}); });
} }
Future<BaseResponseModel<EmptyCodable>> updateWorkerSiteProfile( Future<BaseResponseModel<EmptyCodable>> updateWorkerSiteProfile(Json body) async {
Json body,
) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
body["access_token"] = token; body["access_token"] = token;
return requestNormal(APIPaths.updateWorkerSiteProfile, Method.POST, body, ( return requestNormal(APIPaths.updateWorkerSiteProfile, Method.POST, body, (data) {
data,
) {
return EmptyCodable.fromJson(data as Json); return EmptyCodable.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<MembershipInfoResponse>> Future<BaseResponseModel<MembershipInfoResponse>> getMembershipLevelInfo() async {
getMembershipLevelInfo() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, "lang": "vi"}; final body = {"access_token": token, "lang": "vi"};
return requestNormal(APIPaths.getMembershipLevelInfo, Method.POST, body, ( return requestNormal(APIPaths.getMembershipLevelInfo, Method.POST, body, (data) {
data,
) {
return MembershipInfoResponse.fromJson(data as Json); return MembershipInfoResponse.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<HistoryPointCashBackResponse>> Future<BaseResponseModel<HistoryPointCashBackResponse>> historyPointCashBackRequest(Json body) async {
historyPointCashBackRequest(Json body) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
body["access_token"] = token; body["access_token"] = token;
return requestNormal(APIPaths.historyCashBackPoint, Method.GET, body, ( return requestNormal(APIPaths.historyCashBackPoint, Method.GET, body, (data) {
data,
) {
return HistoryPointCashBackResponse.fromJson(data as Json); return HistoryPointCashBackResponse.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<InviteFriendDetailModel>> Future<BaseResponseModel<InviteFriendDetailModel>> getCampaignInviteFriend() async {
getCampaignInviteFriend() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token}; final body = {"access_token": token};
return requestNormal(APIPaths.campaignInviteFriend, Method.GET, body, ( return requestNormal(APIPaths.campaignInviteFriend, Method.GET, body, (data) {
data,
) {
return InviteFriendDetailModel.fromJson(data as Json); return InviteFriendDetailModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<CampaignInviteFriendDetail>> Future<BaseResponseModel<CampaignInviteFriendDetail>> getDetailCampaignInviteFriend() async {
getDetailCampaignInviteFriend() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token}; final body = {"access_token": token};
return requestNormal(APIPaths.inviteFriendCampaigns, Method.GET, body, ( return requestNormal(APIPaths.inviteFriendCampaigns, Method.GET, body, (data) {
data,
) {
return CampaignInviteFriendDetail.fromJson(data as Json); return CampaignInviteFriendDetail.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<InviteFriendResponse>> phoneInviteFriend( Future<BaseResponseModel<InviteFriendResponse>> phoneInviteFriend(String phone) async {
String phone,
) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, 'username': phone}; final body = {"access_token": token, 'username': phone};
return requestNormal(APIPaths.phoneInviteFriend, Method.POST, body, (data) { return requestNormal(APIPaths.phoneInviteFriend, Method.POST, body, (data) {
...@@ -495,9 +365,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -495,9 +365,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
Future<BaseResponseModel<CheckInDataModel>> rewardOpportunityGetList() async { Future<BaseResponseModel<CheckInDataModel>> rewardOpportunityGetList() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, 'number_day': '7'}; final body = {"access_token": token, 'number_day': '7'};
return requestNormal(APIPaths.rewardOpportunityGetList, Method.POST, body, ( return requestNormal(APIPaths.rewardOpportunityGetList, Method.POST, body, (data) {
data,
) {
return CheckInDataModel.fromJson(data as Json); return CheckInDataModel.fromJson(data as Json);
}); });
} }
...@@ -505,119 +373,79 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -505,119 +373,79 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
Future<BaseResponseModel<SubmitCheckInData>> submitCheckIn() async { Future<BaseResponseModel<SubmitCheckInData>> submitCheckIn() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token}; final body = {"access_token": token};
return requestNormal( return requestNormal(APIPaths.rewardOpportunityOpenRequest, Method.POST, body, (data) {
APIPaths.rewardOpportunityOpenRequest, return SubmitCheckInData.fromJson(data as Json);
Method.POST, });
body,
(data) {
return SubmitCheckInData.fromJson(data as Json);
},
);
} }
Future<BaseResponseModel<TransactionHistoryResponse>> Future<BaseResponseModel<TransactionHistoryResponse>> getTransactionHistoryResponse(Json body) async {
getTransactionHistoryResponse(Json body) async { await Future.delayed(Duration(milliseconds: 3500));
return requestNormal( return requestNormal(APIPaths.getTransactionOrderHistory, Method.GET, body, (data) {
APIPaths.getTransactionOrderHistory, return TransactionHistoryResponse.fromJson(data as Json);
Method.GET, });
body,
(data) {
return TransactionHistoryResponse.fromJson(data as Json);
},
);
} }
Future<BaseResponseModel<List<TransactionCategoryModel>>> Future<BaseResponseModel<List<TransactionCategoryModel>>> getTransactionHistoryCategories() async {
getTransactionHistoryCategories() async { return requestNormal(APIPaths.orderHistoryCategories, Method.GET, {}, (data) {
return requestNormal(APIPaths.orderHistoryCategories, Method.GET, {}, (
data,
) {
final list = data as List<dynamic>; final list = data as List<dynamic>;
return list.map((e) => TransactionCategoryModel.fromJson(e)).toList(); return list.map((e) => TransactionCategoryModel.fromJson(e)).toList();
}); });
} }
Future<BaseResponseModel<CustomerContractModel>> Future<BaseResponseModel<CustomerContractModel>> customerContractRequestSearch(String maKH) async {
customerContractRequestSearch(String maKH) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, 'ma_khang': maKH}; final body = {"access_token": token, 'ma_khang': maKH};
return requestNormal( return requestNormal(APIPaths.customerContractRequestSearch, Method.POST, body, (data) {
APIPaths.customerContractRequestSearch, return CustomerContractModel.fromJson(data as Json);
Method.POST, });
body,
(data) {
return CustomerContractModel.fromJson(data as Json);
},
);
} }
Future<BaseResponseModel<List<CustomerContractModel>>> Future<BaseResponseModel<List<CustomerContractModel>>> customerContractSearchHistoryGetList() async {
customerContractSearchHistoryGetList() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token}; final body = {"access_token": token};
return requestNormal( return requestNormal(APIPaths.customerContractSearchHistoryGetList, Method.POST, body, (data) {
APIPaths.customerContractSearchHistoryGetList, final list = data as List<dynamic>;
Method.POST, return list.map((e) => CustomerContractModel.fromJson(e)).toList();
body, });
(data) {
final list = data as List<dynamic>;
return list.map((e) => CustomerContractModel.fromJson(e)).toList();
},
);
} }
Future<BaseResponseModel<bool>> customerContractDelete(String maKHs) async { Future<BaseResponseModel<bool>> customerContractDelete(String maKHs) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, 'ma_khang': maKHs}; final body = {"access_token": token, 'ma_khang': maKHs};
return requestNormal(APIPaths.customerContractDelete, Method.POST, body, ( return requestNormal(APIPaths.customerContractDelete, Method.POST, body, (data) {
data,
) {
return data == true; return data == true;
}); });
} }
Future<BaseResponseModel<HealthBookResponseModel>> getHealthBookCards( Future<BaseResponseModel<HealthBookResponseModel>> getHealthBookCards(Json body) async {
Json body,
) async {
return requestNormal(APIPaths.getHealthBookCards, Method.GET, body, (data) { return requestNormal(APIPaths.getHealthBookCards, Method.GET, body, (data) {
return HealthBookResponseModel.fromJson(data as Json); return HealthBookResponseModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<HealthBookCardItemModel>> getDetailHealthBookCard( Future<BaseResponseModel<HealthBookCardItemModel>> getDetailHealthBookCard(String id) async {
String id,
) async {
final path = APIPaths.detailHealthBookCardDetail.replaceAll("%@", id); final path = APIPaths.detailHealthBookCardDetail.replaceAll("%@", id);
return requestNormal(path, Method.GET, {}, (data) { return requestNormal(path, Method.GET, {}, (data) {
return HealthBookCardItemModel.fromJson(data as Json); return HealthBookCardItemModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<TrafficServiceDetailModel>> getDetailMyPackageVnTra( Future<BaseResponseModel<TrafficServiceDetailModel>> getDetailMyPackageVnTra(String id) async {
String id,
) async {
final path = APIPaths.detailMyPackageVnTra.replaceAll("%@", id); final path = APIPaths.detailMyPackageVnTra.replaceAll("%@", id);
return requestNormal(path, Method.GET, {}, (data) { return requestNormal(path, Method.GET, {}, (data) {
return TrafficServiceDetailModel.fromJson(data as Json); return TrafficServiceDetailModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<EmptyCodable>> submitPerformMission( Future<BaseResponseModel<EmptyCodable>> submitPerformMission(Campaign7DayMissionModel mission, String id) async {
Campaign7DayMissionModel mission, final path = APIPaths.submitCampaignMission.replaceFirst('%@', id).replaceFirst('%@', mission.id.toString());
String id,
) async {
final path = APIPaths.submitCampaignMission
.replaceFirst('%@', id)
.replaceFirst('%@', mission.id.toString());
return requestNormal(path, Method.POST, {}, (data) { return requestNormal(path, Method.POST, {}, (data) {
return EmptyCodable.fromJson(data as Json); return EmptyCodable.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<List<Campaign7DayRewardModel>>> getCampaignRewards( Future<BaseResponseModel<List<Campaign7DayRewardModel>>> getCampaignRewards(String id) async {
String id,
) async {
final path = APIPaths.getCampaignReward.replaceFirst('%@', id); final path = APIPaths.getCampaignReward.replaceFirst('%@', id);
return requestNormal(path, Method.GET, {}, (data) { return requestNormal(path, Method.GET, {}, (data) {
final list = data as List<dynamic>; final list = data as List<dynamic>;
...@@ -625,9 +453,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -625,9 +453,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
}); });
} }
Future<BaseResponseModel<List<String>>> getCampaignLiveTransactions( Future<BaseResponseModel<List<String>>> getCampaignLiveTransactions(String id) async {
String id,
) async {
final path = APIPaths.getCampaignLiveTransactions.replaceFirst('%@', id); final path = APIPaths.getCampaignLiveTransactions.replaceFirst('%@', id);
return requestNormal(path, Method.GET, {}, (data) { return requestNormal(path, Method.GET, {}, (data) {
if (data is List) { if (data is List) {
...@@ -637,56 +463,40 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -637,56 +463,40 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
}); });
} }
Future<BaseResponseModel<Campaign7DayInfoModel>> getCampaignMissions( Future<BaseResponseModel<Campaign7DayInfoModel>> getCampaignMissions(String id) async {
String id,
) async {
final path = APIPaths.getCampaignMissions.replaceFirst('%@', id); final path = APIPaths.getCampaignMissions.replaceFirst('%@', id);
return requestNormal(path, Method.GET, {}, (data) { return requestNormal(path, Method.GET, {}, (data) {
return Campaign7DayInfoModel.fromJson(data as Json); return Campaign7DayInfoModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<SurveyCampaignInfoModel>> getCampaignQuizSurvey( Future<BaseResponseModel<SurveyCampaignInfoModel>> getCampaignQuizSurvey(String id) async {
String id,
) async {
final path = APIPaths.getQuizCampaign.replaceFirst('%@', id); final path = APIPaths.getQuizCampaign.replaceFirst('%@', id);
return requestNormal(path, Method.GET, {}, (data) { return requestNormal(path, Method.GET, {}, (data) {
return SurveyCampaignInfoModel.fromJson(data as Json); return SurveyCampaignInfoModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<QuizCampaignSubmitResponseModel>> quizSubmitCampaign( Future<BaseResponseModel<QuizCampaignSubmitResponseModel>> quizSubmitCampaign(String id, Json body) async {
String id,
Json body,
) async {
final path = APIPaths.quizSubmitCampaign.replaceFirst('%@', id); final path = APIPaths.quizSubmitCampaign.replaceFirst('%@', id);
return requestNormal(path, Method.POST, body, (data) { return requestNormal(path, Method.POST, body, (data) {
return QuizCampaignSubmitResponseModel.fromJson(data as Json); return QuizCampaignSubmitResponseModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<List<FlashSaleCategoryModel>>> Future<BaseResponseModel<List<FlashSaleCategoryModel>>> getFlashSaleCategories(String groupId) async {
getFlashSaleCategories(String groupId) async {
final path = APIPaths.getFlashSaleGroup.replaceFirst('%@', groupId); final path = APIPaths.getFlashSaleGroup.replaceFirst('%@', groupId);
return requestNormal(path, Method.GET, const {}, (data) { return requestNormal(path, Method.GET, const {}, (data) {
if (data is List) { if (data is List) {
return data return data.whereType<Map<String, dynamic>>().map(FlashSaleCategoryModel.fromJson).toList();
.whereType<Map<String, dynamic>>()
.map(FlashSaleCategoryModel.fromJson)
.toList();
} }
if (data is Map<String, dynamic>) { if (data is Map<String, dynamic>) {
final categories = data['categories'] ?? data['data'] ?? data['items']; final categories = data['categories'] ?? data['data'] ?? data['items'];
if (categories is List) { if (categories is List) {
return categories return categories.whereType<Map<String, dynamic>>().map(FlashSaleCategoryModel.fromJson).toList();
.whereType<Map<String, dynamic>>()
.map(FlashSaleCategoryModel.fromJson)
.toList();
} }
if (data.containsKey('_id')) { if (data.containsKey('_id')) {
return [ return [FlashSaleCategoryModel.fromJson(Map<String, dynamic>.from(data))];
FlashSaleCategoryModel.fromJson(Map<String, dynamic>.from(data)),
];
} }
} }
return <FlashSaleCategoryModel>[]; return <FlashSaleCategoryModel>[];
...@@ -700,11 +510,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -700,11 +510,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
int? categoryId, int? categoryId,
}) async { }) async {
final path = APIPaths.getFlashSaleDetail.replaceFirst('%@', groupId); final path = APIPaths.getFlashSaleDetail.replaceFirst('%@', groupId);
final params = <String, dynamic>{ final params = <String, dynamic>{'index': index, 'size': size, if (categoryId != null) 'category_id': categoryId};
'index': index,
'size': size,
if (categoryId != null) 'category_id': categoryId,
};
return requestNormal(path, Method.GET, params, (data) { return requestNormal(path, Method.GET, params, (data) {
if (data is Map<String, dynamic>) { if (data is Map<String, dynamic>) {
return FlashSaleDetailResponse.fromJson(data); return FlashSaleDetailResponse.fromJson(data);
...@@ -725,9 +531,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -725,9 +531,7 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
}); });
} }
Future<BaseResponseModel<DevicesLogoutListResponse>> getLogoutDevices( Future<BaseResponseModel<DevicesLogoutListResponse>> getLogoutDevices(Json body) async {
Json body,
) async {
return requestNormal(APIPaths.getLogoutDevices, Method.GET, body, (data) { return requestNormal(APIPaths.getLogoutDevices, Method.GET, body, (data) {
return DevicesLogoutListResponse.fromJson(data as Json); return DevicesLogoutListResponse.fromJson(data as Json);
}); });
...@@ -738,43 +542,31 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -738,43 +542,31 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
return requestNormal(path, Method.DELETE, {}, (data) => data as String); return requestNormal(path, Method.DELETE, {}, (data) => data as String);
} }
Future<BaseResponseModel<InterestedCategoriesResponse>> Future<BaseResponseModel<InterestedCategoriesResponse>> categoryTopLevelGetList() async {
categoryTopLevelGetList() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, "lang": "vi"}; final body = {"access_token": token, "lang": "vi"};
return requestNormal(APIPaths.categoryTopLevelGetList, Method.POST, body, ( return requestNormal(APIPaths.categoryTopLevelGetList, Method.POST, body, (data) {
data,
) {
return InterestedCategoriesResponse.fromJson(data as Json); return InterestedCategoriesResponse.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<EmptyCodable>> submitCategorySubscribe( Future<BaseResponseModel<EmptyCodable>> submitCategorySubscribe(String code) async {
String code,
) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, 'category_codes': code}; final body = {"access_token": token, 'category_codes': code};
return requestNormal(APIPaths.categorySubscribeList, Method.POST, body, ( return requestNormal(APIPaths.categorySubscribeList, Method.POST, body, (data) {
data,
) {
return EmptyCodable.fromJson(data as Json); return EmptyCodable.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<EmptyCodable>> submitCategoryUnsubscribeList( Future<BaseResponseModel<EmptyCodable>> submitCategoryUnsubscribeList(String code) async {
String code,
) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, 'category_codes': code}; final body = {"access_token": token, 'category_codes': code};
return requestNormal(APIPaths.categoryUnsubscribeList, Method.POST, body, ( return requestNormal(APIPaths.categoryUnsubscribeList, Method.POST, body, (data) {
data,
) {
return EmptyCodable.fromJson(data as Json); return EmptyCodable.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<ElectricPaymentResponseModel>> Future<BaseResponseModel<ElectricPaymentResponseModel>> customerEvnPaymentGatewayRequest(
customerEvnPaymentGatewayRequest(
CustomerContractModel contract, CustomerContractModel contract,
String paymentMethod, String paymentMethod,
) async { ) async {
...@@ -786,18 +578,12 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -786,18 +578,12 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
'amount': contract.amount ?? 0, 'amount': contract.amount ?? 0,
'payment_method': paymentMethod, 'payment_method': paymentMethod,
}; };
return requestNormal( return requestNormal(APIPaths.customerEvnPaymentGatewayRequest, Method.POST, body, (data) {
APIPaths.customerEvnPaymentGatewayRequest, return ElectricPaymentResponseModel.fromJson(data as Json);
Method.POST, });
body,
(data) {
return ElectricPaymentResponseModel.fromJson(data as Json);
},
);
} }
Future<BaseResponseModel<List<PopupManagerModel>>> Future<BaseResponseModel<List<PopupManagerModel>>> getPopupManagerCommonScreen() async {
getPopupManagerCommonScreen() async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
final body = {"access_token": token, "lang": "vi"}; final body = {"access_token": token, "lang": "vi"};
return requestNormal(APIPaths.getPopup, Method.POST, body, (data) { return requestNormal(APIPaths.getPopup, Method.POST, body, (data) {
...@@ -806,20 +592,14 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -806,20 +592,14 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
}); });
} }
Future<BaseResponseModel<List<BankAccountInfoModel>>> Future<BaseResponseModel<List<BankAccountInfoModel>>> getOrderPaymentMyAccounts() async {
getOrderPaymentMyAccounts() async { return requestNormal(APIPaths.orderPaymentMyAccounts, Method.GET, {}, (data) {
return requestNormal(APIPaths.orderPaymentMyAccounts, Method.GET, {}, (
data,
) {
final list = data as List<dynamic>; final list = data as List<dynamic>;
return list.map((e) => BankAccountInfoModel.fromJson(e)).toList(); return list.map((e) => BankAccountInfoModel.fromJson(e)).toList();
}); });
} }
Future<BaseResponseModel<String>> setDefaultBankAccount( Future<BaseResponseModel<String>> setDefaultBankAccount(String id, bool isDefault) async {
String id,
bool isDefault,
) async {
final path = APIPaths.bankAccountSetDefault.replaceFirst('%@', id); final path = APIPaths.bankAccountSetDefault.replaceFirst('%@', id);
final body = {"is_default": isDefault ? 1 : 0}; final body = {"is_default": isDefault ? 1 : 0};
return requestNormal(path, Method.POST, body, (data) => data as String); return requestNormal(path, Method.POST, body, (data) => data as String);
...@@ -830,47 +610,30 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -830,47 +610,30 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
return requestNormal(path, Method.DELETE, {}, (data) => data as String); return requestNormal(path, Method.DELETE, {}, (data) => data as String);
} }
Future<BaseResponseModel<TransactionSummaryByDateModel>> Future<BaseResponseModel<TransactionSummaryByDateModel>> transactionGetSummaryByDate(Json body) async {
transactionGetSummaryByDate(Json body) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
body["access_token"] = token; body["access_token"] = token;
return requestNormal( return requestNormal(APIPaths.transactionGetSummaryByDate, Method.POST, body, (data) {
APIPaths.transactionGetSummaryByDate, return TransactionSummaryByDateModel.fromJson(data as Json);
Method.POST, });
body,
(data) {
return TransactionSummaryByDateModel.fromJson(data as Json);
},
);
} }
Future<BaseResponseModel<ListHistoryResponseModel>> transactionHistoryGetList( Future<BaseResponseModel<ListHistoryResponseModel>> transactionHistoryGetList(Json body) async {
Json body,
) async {
String? token = DataPreference.instance.token ?? ""; String? token = DataPreference.instance.token ?? "";
body["access_token"] = token; body["access_token"] = token;
return requestNormal( return requestNormal(APIPaths.transactionHistoryGetList, Method.POST, body, (data) {
APIPaths.transactionHistoryGetList, return ListHistoryResponseModel.fromJson(data as Json);
Method.POST, });
body,
(data) {
return ListHistoryResponseModel.fromJson(data as Json);
},
);
} }
Future<BaseResponseModel<DirectionalScreen>> getDirectionOfflineBrand( Future<BaseResponseModel<DirectionalScreen>> getDirectionOfflineBrand(String id) async {
String id,
) async {
final body = {"bank_account": id}; final body = {"bank_account": id};
return requestNormal(APIPaths.getOfflineBrand, Method.GET, body, (data) { return requestNormal(APIPaths.getOfflineBrand, Method.GET, body, (data) {
return DirectionalScreen.fromJson(data as Json); return DirectionalScreen.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<EmptyCodable>> pushNotificationDeviceUpdateToken( Future<BaseResponseModel<EmptyCodable>> pushNotificationDeviceUpdateToken(String token) async {
String token,
) async {
var deviceKey = await DeviceInfo.getDeviceId(); var deviceKey = await DeviceInfo.getDeviceId();
final details = await DeviceInfo.getDetails(); final details = await DeviceInfo.getDetails();
String? accessToken = DataPreference.instance.token ?? ""; String? accessToken = DataPreference.instance.token ?? "";
...@@ -881,53 +644,35 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient { ...@@ -881,53 +644,35 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
body["lang"] = 'vi'; body["lang"] = 'vi';
body["software_type"] = "Application"; body["software_type"] = "Application";
body["software_model"] = "MyPoint"; body["software_model"] = "MyPoint";
return requestNormal( return requestNormal(APIPaths.pushNotificationDeviceUpdateToken, Method.POST, body, (data) {
APIPaths.pushNotificationDeviceUpdateToken, return EmptyCodable.fromJson(data as Json);
Method.POST, });
body,
(data) {
return EmptyCodable.fromJson(data as Json);
},
);
} }
Future<BaseResponseModel<DirectionalScreen>> getDirectionScreen( Future<BaseResponseModel<DirectionalScreen>> getDirectionScreen(String path) async {
String path,
) async {
var path_ = path.startsWith('/') ? path : '/$path'; var path_ = path.startsWith('/') ? path : '/$path';
return requestNormal(path_, Method.GET, {}, (data) { return requestNormal(path_, Method.GET, {}, (data) {
return DirectionalScreen.fromJson(data as Json); return DirectionalScreen.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<EmptyCodable>> submitShareContent( Future<BaseResponseModel<EmptyCodable>> submitShareContent(String path) async {
String path,
) async {
var path_ = path.startsWith('/') ? path : '/$path'; var path_ = path.startsWith('/') ? path : '/$path';
return requestNormal(path_, Method.GET, {}, (data) { return requestNormal(path_, Method.GET, {}, (data) {
return EmptyCodable.fromJson(data as Json); return EmptyCodable.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<VerifyRegisterCampaignModel>> verifyRegisterForm( Future<BaseResponseModel<VerifyRegisterCampaignModel>> verifyRegisterForm(String path, Json body) async {
String path,
Json body,
) async {
var path_ = path.startsWith('/') ? path : '/$path'; var path_ = path.startsWith('/') ? path : '/$path';
return requestNormal(path_, Method.POST, body, (data) { return requestNormal(path_, Method.POST, body, (data) {
return VerifyRegisterCampaignModel.fromJson(data as Json); return VerifyRegisterCampaignModel.fromJson(data as Json);
}); });
} }
Future<BaseResponseModel<SubmitViewVoucherCompletedResponse>> Future<BaseResponseModel<SubmitViewVoucherCompletedResponse>> submitCampaignViewVoucherComplete() async {
submitCampaignViewVoucherComplete() async { return requestNormal(APIPaths.submitCampaignViewVoucherComplete, Method.POST, {}, (data) {
return requestNormal( return SubmitViewVoucherCompletedResponse.fromJson(data as Json);
APIPaths.submitCampaignViewVoucherComplete, });
Method.POST,
{},
(data) {
return SubmitViewVoucherCompletedResponse.fromJson(data as Json);
},
);
} }
} }
import 'dart:async'; import 'dart:async';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client.dart'; import 'package:mypoint_flutter_app/core/network/restful_api_client.dart';
import '../base/base_response_model.dart'; import '../../shared/widgets/base_view/base_response_model.dart';
import '../base/base_view_model.dart'; import '../../shared/widgets/base_view/base_view_model.dart';
import '../configs/constants.dart'; import '../../app/config/constants.dart';
import '../base/app_navigator.dart'; import '../../app/routing/app_navigator.dart';
import 'interceptor/network_error_gate.dart';
import 'dio_extra_keys.dart'; import 'dio_extra_keys.dart';
import 'dio_http_service.dart'; import 'dio_http_service.dart';
import 'error_mapper.dart'; import 'error_mapper.dart';
import 'interceptor/network_error_gate.dart';
typedef ApiCall<T> = Future<BaseResponseModel<T>> Function(); typedef ApiCall<T> = Future<BaseResponseModel<T>> Function();
typedef OnSuccess<T> = typedef OnSuccess<T> =
...@@ -33,9 +33,11 @@ class RestfulApiViewModel extends BaseViewModel { ...@@ -33,9 +33,11 @@ class RestfulApiViewModel extends BaseViewModel {
OnComplete? onComplete, OnComplete? onComplete,
bool showAppNavigatorDialog = false, bool showAppNavigatorDialog = false,
bool withLoading = true, bool withLoading = true,
bool trackLoading = true,
String defaultError = ErrorCodes.commonError, String defaultError = ErrorCodes.commonError,
}) async { }) async {
if (withLoading) showLoading(); if (withLoading) showLoading();
if (trackLoading) beginTrackedLoading();
BaseResponseModel<T>? res; BaseResponseModel<T>? res;
try { try {
res = await request(); res = await request();
...@@ -86,6 +88,7 @@ class RestfulApiViewModel extends BaseViewModel { ...@@ -86,6 +88,7 @@ class RestfulApiViewModel extends BaseViewModel {
} }
} finally { } finally {
if (withLoading) hideLoading(); if (withLoading) hideLoading();
if (trackLoading) endTrackedLoading();
onComplete?.call(); onComplete?.call();
} }
} }
......
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:local_auth/local_auth.dart'; import 'package:local_auth/local_auth.dart';
import '../resources/base_color.dart'; import '../theme/base_color.dart';
import '../widgets/alert/custom_alert_dialog.dart'; import '../../shared/widgets/alert/custom_alert_dialog.dart';
import '../widgets/alert/data_alert_model.dart'; import '../../shared/widgets/alert/data_alert_model.dart';
enum BiometricTypeEnum { enum BiometricTypeEnum {
none, none,
......
import 'dart:async'; import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_branch_sdk/flutter_branch_sdk.dart'; import 'package:flutter_branch_sdk/flutter_branch_sdk.dart';
import 'package:mypoint_flutter_app/extensions/string_extension.dart'; import 'package:mypoint_flutter_app/core/utils/extensions/string_extension.dart';
import 'package:uni_links/uni_links.dart'; import 'package:uni_links/uni_links.dart';
import 'package:mypoint_flutter_app/directional/directional_screen.dart'; import 'package:mypoint_flutter_app/shared/navigation/directional_screen.dart';
import 'package:mypoint_flutter_app/extensions/crypto.dart' as mycrypto; import 'package:mypoint_flutter_app/core/utils/crypto.dart' as mycrypto;
import '../directional/directional_action_type.dart'; import '../../app/routing/directional_action_type.dart';
class DeepLinkService { class DeepLinkService {
DeepLinkService._internal(); DeepLinkService._internal();
...@@ -17,6 +17,7 @@ class DeepLinkService { ...@@ -17,6 +17,7 @@ class DeepLinkService {
bool _initialized = false; bool _initialized = false;
Future<void> initialize() async { Future<void> initialize() async {
if (kIsWeb) return;
if (_initialized) return; if (_initialized) return;
_initialized = true; _initialized = true;
debugPrint('🔗 Initializing DeepLinkService...'); debugPrint('🔗 Initializing DeepLinkService...');
...@@ -57,6 +58,10 @@ class DeepLinkService { ...@@ -57,6 +58,10 @@ class DeepLinkService {
} catch (_) {} } catch (_) {}
} }
bool handleIncomingUri(String uri) {
return _routeFromUriString(uri) ?? false;
}
void _listenLinkStream() { void _listenLinkStream() {
try { try {
_linkSub = linkStream.listen((uri) { _linkSub = linkStream.listen((uri) {
...@@ -67,10 +72,10 @@ class DeepLinkService { ...@@ -67,10 +72,10 @@ class DeepLinkService {
} }
// Firebase Dynamic Links removed due to version constraints. // Firebase Dynamic Links removed due to version constraints.
void _routeFromUriString(String uriStr) { bool? _routeFromUriString(String uriStr) {
debugPrint('🔗 Deep link received: $uriStr'); debugPrint('🔗 Deep link received: $uriStr');
final uri = Uri.tryParse(uriStr); final uri = Uri.tryParse(uriStr);
if (uri == null) return; if (uri == null) return false;
final type = uri.queryParameters[Defines.actionType] ?? uri.queryParameters['action_type']; final type = uri.queryParameters[Defines.actionType] ?? uri.queryParameters['action_type'];
final param = uri.queryParameters[Defines.actionParams] ?? uri.queryParameters['action_param']; final param = uri.queryParameters[Defines.actionParams] ?? uri.queryParameters['action_param'];
...@@ -91,13 +96,12 @@ class DeepLinkService { ...@@ -91,13 +96,12 @@ class DeepLinkService {
direction?.extraData = { direction?.extraData = {
'password': param, 'password': param,
}; };
direction?.begin(); return direction?.begin(); // Use if you need to attach to userInfo later
return; // Use if you need to attach to userInfo later
} }
} }
} }
final screen = DirectionalScreen.build(clickActionType: type, clickActionParam: param); final screen = DirectionalScreen.build(clickActionType: type, clickActionParam: param);
screen?.begin(); return screen?.begin();
} }
void _handleBranchSession(Map<dynamic, dynamic> data) { void _handleBranchSession(Map<dynamic, dynamic> data) {
......
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:mypoint_flutter_app/base/base_response_model.dart'; import 'package:mypoint_flutter_app/shared/widgets/base_view/base_response_model.dart';
import 'package:mypoint_flutter_app/configs/constants.dart'; import 'package:mypoint_flutter_app/app/config/constants.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'; import 'package:mypoint_flutter_app/core/network/restful_api_client_all_request.dart';
import 'package:mypoint_flutter_app/preference/data_preference.dart'; import 'package:mypoint_flutter_app/shared/preferences/data_preference.dart';
import '../firebase/push_token_service.dart'; import '../firebase/push_token_service.dart';
import '../model/auth/login_token_response_model.dart'; import '../../features/login/model/login_token_response_model.dart';
import '../networking/restful_api_viewmodel.dart'; import '../network/restful_api_viewmodel.dart';
/// Login result enum để handle các trạng thái khác nhau /// Login result enum để handle các trạng thái khác nhau
enum LoginResult { enum LoginResult {
...@@ -43,15 +43,12 @@ class LoginService extends RestfulApiViewModel { ...@@ -43,15 +43,12 @@ class LoginService extends RestfulApiViewModel {
try { try {
// Step 1: Authenticate user // Step 1: Authenticate user
final authResponse = await client.login(phone, password); final authResponse = await client.login(phone, password);
if (!authResponse.isSuccess || authResponse.data == null) { if (!authResponse.isSuccess || authResponse.data == null) {
debugPrint('Login failed: ${authResponse.errorMessage}'); debugPrint('Login failed: ${authResponse.errorMessage}');
return _handleAuthError(authResponse); return _handleAuthError(authResponse);
} }
// Step 2: Save token // Step 2: Save token
await DataPreference.instance.saveLoginToken(authResponse.data!); await DataPreference.instance.saveLoginToken(authResponse.data!);
// Step 3: Get user profile (critical step) // Step 3: Get user profile (critical step)
final profileResult = await _getUserProfileWithRetry(); final profileResult = await _getUserProfileWithRetry();
if (profileResult.result != LoginResult.success) { if (profileResult.result != LoginResult.success) {
...@@ -62,16 +59,13 @@ class LoginService extends RestfulApiViewModel { ...@@ -62,16 +59,13 @@ class LoginService extends RestfulApiViewModel {
message: profileResult.message ?? Constants.commonError, message: profileResult.message ?? Constants.commonError,
); );
} }
// Step 4: Upload FCM token (non-critical, don't fail login if this fails) // Step 4: Upload FCM token (non-critical, don't fail login if this fails)
await _uploadFCMTokenSafely(); await _uploadFCMTokenSafely();
return LoginResponse(result: LoginResult.success); return LoginResponse(result: LoginResult.success);
} catch (e) { } catch (e) {
return LoginResponse( return LoginResponse(
result: LoginResult.networkError, result: LoginResult.networkError,
message: 'Đăng nhập thất bại: ${e.toString()}', message: ErrorCodes.commonError,
); );
} }
} }
...@@ -120,12 +114,10 @@ class LoginService extends RestfulApiViewModel { ...@@ -120,12 +114,10 @@ class LoginService extends RestfulApiViewModel {
for (int attempt = 1; attempt <= maxRetries; attempt++) { for (int attempt = 1; attempt <= maxRetries; attempt++) {
try { try {
final response = await client.getUserProfile(); final response = await client.getUserProfile();
if (response.isSuccess && response.data != null) { if (response.isSuccess && response.data != null) {
await DataPreference.instance.saveUserProfile(response.data!); await DataPreference.instance.saveUserProfile(response.data!);
return LoginResponse(result: LoginResult.success); return LoginResponse(result: LoginResult.success);
} }
// If not last attempt, wait before retry // If not last attempt, wait before retry
if (attempt < maxRetries) { if (attempt < maxRetries) {
await Future.delayed(Duration(seconds: attempt * 2)); await Future.delayed(Duration(seconds: attempt * 2));
...@@ -134,16 +126,16 @@ class LoginService extends RestfulApiViewModel { ...@@ -134,16 +126,16 @@ class LoginService extends RestfulApiViewModel {
if (attempt == maxRetries) { if (attempt == maxRetries) {
return LoginResponse( return LoginResponse(
result: LoginResult.networkError, result: LoginResult.networkError,
message: 'Không thể tải thông tin người dùng: ${e.toString()}', message: ErrorCodes.commonError,
); );
} }
await Future.delayed(Duration(seconds: attempt * 2)); await Future.delayed(Duration(seconds: attempt * 2));
} }
} }
debugPrint('Failed to fetch user profile after $maxRetries attempts');
return LoginResponse( return LoginResponse(
result: LoginResult.networkError, result: LoginResult.networkError,
message: 'Không thể tải thông tin người dùng sau $maxRetries lần thử', message: ErrorCodes.commonError,
); );
} }
...@@ -161,13 +153,10 @@ class LoginService extends RestfulApiViewModel { ...@@ -161,13 +153,10 @@ class LoginService extends RestfulApiViewModel {
Future<LoginResponse> biometricLogin(String phone) async { Future<LoginResponse> biometricLogin(String phone) async {
try { try {
final response = await client.loginWithBiometric(phone); final response = await client.loginWithBiometric(phone);
if (!response.isSuccess || response.data == null) { if (!response.isSuccess || response.data == null) {
return _handleAuthError(response); return _handleAuthError(response);
} }
await DataPreference.instance.saveLoginToken(response.data!); await DataPreference.instance.saveLoginToken(response.data!);
final profileResult = await _getUserProfileWithRetry(); final profileResult = await _getUserProfileWithRetry();
if (profileResult.result != LoginResult.success) { if (profileResult.result != LoginResult.success) {
await DataPreference.instance.clearLoginToken(); await DataPreference.instance.clearLoginToken();
...@@ -176,14 +165,12 @@ class LoginService extends RestfulApiViewModel { ...@@ -176,14 +165,12 @@ class LoginService extends RestfulApiViewModel {
message: profileResult.message ?? Constants.commonError, message: profileResult.message ?? Constants.commonError,
); );
} }
await _uploadFCMTokenSafely(); await _uploadFCMTokenSafely();
return LoginResponse(result: LoginResult.success); return LoginResponse(result: LoginResult.success);
} catch (e) { } catch (e) {
return LoginResponse( return LoginResponse(
result: LoginResult.networkError, result: LoginResult.networkError,
message: 'Đăng nhập sinh trắc thất bại: ${e.toString()}', message: ErrorCodes.commonError,
); );
} }
} }
......
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import '../network/dio_http_service.dart';
import '../networking/dio_http_service.dart'; import '../network/restful_api_client.dart';
import '../networking/restful_api_client.dart'; import '../network/restful_api_client_all_request.dart';
import '../networking/restful_api_client_all_request.dart'; import '../../shared/preferences/data_preference.dart';
import '../preference/data_preference.dart';
class LogoutService { class LogoutService {
LogoutService._(); LogoutService._();
......
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:mypoint_flutter_app/extensions/string_extension.dart'; import 'package:mypoint_flutter_app/core/utils/extensions/string_extension.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'; import 'package:mypoint_flutter_app/core/network/restful_api_client_all_request.dart';
import '../configs/constants.dart'; import '../../app/config/constants.dart';
import '../model/auth/login_token_response_model.dart'; import '../../features/login/model/login_token_response_model.dart';
import '../networking/restful_api_viewmodel.dart'; import '../network/restful_api_viewmodel.dart';
import '../preference/data_preference.dart'; import '../../shared/preferences/data_preference.dart';
import '../base/app_navigator.dart'; import '../../app/routing/app_navigator.dart';
class TokenRefreshService extends RestfulApiViewModel { class TokenRefreshService extends RestfulApiViewModel {
static final TokenRefreshService _instance = TokenRefreshService._internal(); static final TokenRefreshService _instance = TokenRefreshService._internal();
......
...@@ -41,6 +41,10 @@ void webResetSDK() { ...@@ -41,6 +41,10 @@ void webResetSDK() {
// no-op on non-web // no-op on non-web
} }
void webNotifySplashScreenReady() {
// no-op on non-web
}
Future<dynamic> webConfigUIApp(Map<String, dynamic> config) async { Future<dynamic> webConfigUIApp(Map<String, dynamic> config) async {
return null; return null;
} }
......
// Web-specific implementations for x-app-sdk // Web-specific implementations for x-app-sdk
import 'dart:html' as html;
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'x_app_sdk_service.dart'; import 'x_app_sdk_service.dart';
...@@ -81,6 +82,14 @@ void webResetSDK() { ...@@ -81,6 +82,14 @@ void webResetSDK() {
} }
} }
void webNotifySplashScreenReady() {
try {
html.window.dispatchEvent(html.CustomEvent('mypoint-splash-ready'));
} catch (e) {
debugPrint('❌ Error notifying splash readiness: $e');
}
}
Future<dynamic> webConfigUIApp(Map<String, dynamic> config) async { Future<dynamic> webConfigUIApp(Map<String, dynamic> config) async {
try { try {
return await XAppSDKService().configUIApp(config); return await XAppSDKService().configUIApp(config);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment