Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Hoàng Văn Đạt
mypoint_flutter_app
Commits
a6797435
Commit
a6797435
authored
Nov 05, 2025
by
DatHV
Browse files
refactor print, log, request
parent
f0334970
Changes
117
Hide whitespace changes
Inline
Side-by-side
lib/main.dart
View file @
a6797435
import
'package:flutter/foundation.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_localizations/flutter_localizations.dart'
;
import
'package:get/get.dart'
;
import
'package:mypoint_flutter_app/base/app_navigator.dart'
;
import
'package:mypoint_flutter_app/resources/base_color.dart'
;
...
...
@@ -40,14 +39,6 @@ class MyApp extends StatelessWidget {
primaryColor:
BaseColor
.
primary500
,
),
locale:
const
Locale
(
'vi'
),
supportedLocales:
const
[
Locale
(
'vi'
,
'VN'
),
// Vietnamese
],
localizationsDelegates:
const
[
GlobalMaterialLocalizations
.
delegate
,
GlobalWidgetsLocalizations
.
delegate
,
GlobalCupertinoLocalizations
.
delegate
,
],
home:
SplashScreen
(),
getPages:
RouterPage
.
pages
(),
);
...
...
lib/networking/api/affiliate_api.dart
0 → 100644
View file @
a6797435
import
'package:mypoint_flutter_app/base/base_response_model.dart'
;
import
'package:mypoint_flutter_app/configs/api_paths.dart'
;
import
'package:mypoint_flutter_app/configs/callbacks.dart'
;
import
'package:mypoint_flutter_app/networking/restful_api_client.dart'
;
import
'package:mypoint_flutter_app/preference/data_preference.dart'
;
import
'../../screen/affiliate/model/affiliate_brand_model.dart'
;
import
'../../screen/affiliate/model/affiliate_category_model.dart'
;
import
'../../screen/affiliate/model/affiliate_product_top_sale_model.dart'
;
import
'../../screen/affiliate/model/cashback_overview_model.dart'
;
import
'../../screen/affiliate_brand_detail/models/affiliate_brand_detail_model.dart'
;
class
AffiliateApi
{
AffiliateApi
(
this
.
client
);
final
RestfulAPIClient
client
;
Future
<
BaseResponseModel
<
List
<
AffiliateCategoryModel
>>>
affiliateCategoryGetList
()
async
{
final
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
client
.
requestNormal
(
APIPaths
.
affiliateCategoryGetList
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
AffiliateCategoryModel
.
fromJson
(
e
)).
toList
();
},
);
}
Future
<
BaseResponseModel
<
List
<
AffiliateBrandModel
>>>
affiliateBrandGetList
({
String
?
categoryCode
,
})
async
{
final
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
if
((
categoryCode
??
''
).
isNotEmpty
)
{
body
[
'category_code'
]
=
categoryCode
!;
}
return
client
.
requestNormal
(
APIPaths
.
affiliateBrandGetList
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
AffiliateBrandModel
.
fromJson
(
e
)).
toList
();
},
);
}
Future
<
BaseResponseModel
<
List
<
AffiliateProductTopSaleModel
>>>
affiliateProductTopSale
()
async
{
final
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
client
.
requestNormal
(
APIPaths
.
affiliateProductTopSale
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
AffiliateProductTopSaleModel
.
fromJson
(
e
))
.
toList
();
},
);
}
Future
<
BaseResponseModel
<
CashbackOverviewModel
>>
getCashBackOverview
()
async
{
return
client
.
requestNormal
(
APIPaths
.
getCashbackOverview
,
Method
.
GET
,
{},
(
data
,
)
{
return
CashbackOverviewModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
AffiliateBrandDetailModel
>>
getAffiliateBrandDetail
(
String
brandId
,
)
async
{
final
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
"brand_id"
:
brandId
};
return
client
.
requestNormal
(
APIPaths
.
affiliateBrandGetDetail
,
Method
.
POST
,
body
,
(
data
)
{
return
AffiliateBrandDetailModel
.
fromJson
(
data
as
Json
);
},
);
}
}
lib/networking/api/game_api.dart
0 → 100644
View file @
a6797435
import
'../../base/base_response_model.dart'
;
import
'../../configs/api_paths.dart'
;
import
'../../configs/callbacks.dart'
;
import
'../restful_api_client.dart'
;
import
'../../screen/game/models/game_bundle_item_model.dart'
;
import
'../../screen/game/models/game_bundle_response.dart'
;
class
GameApi
{
GameApi
(
this
.
client
);
final
RestfulAPIClient
client
;
Future
<
BaseResponseModel
<
GameBundleResponse
>>
getGames
()
{
return
client
.
requestNormal
(
APIPaths
.
getGames
,
Method
.
GET
,
const
{},
(
data
)
=>
GameBundleResponse
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
GameBundleItemModel
>>
getGameDetail
(
String
id
)
{
final
path
=
APIPaths
.
getGameDetail
.
replaceAll
(
'%@'
,
id
);
return
client
.
requestNormal
(
path
,
Method
.
POST
,
const
{},
(
data
)
=>
GameBundleItemModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
GameBundleItemModel
>>
submitGameCard
(
String
gameId
,
String
itemId
,
)
{
final
path
=
APIPaths
.
submitGameCard
.
replaceFirst
(
'%@'
,
gameId
)
.
replaceFirst
(
'%@'
,
itemId
);
return
client
.
requestNormal
(
path
,
Method
.
POST
,
const
{},
(
data
)
=>
GameBundleItemModel
.
fromJson
(
data
as
Json
),
);
}
}
lib/networking/api/location_api.dart
0 → 100644
View file @
a6797435
import
'../../base/base_response_model.dart'
;
import
'../../configs/api_paths.dart'
;
import
'../../configs/callbacks.dart'
;
import
'../../networking/restful_api_client.dart'
;
import
'../../preference/data_preference.dart'
;
import
'../../screen/location_address/models/district_address_model.dart'
;
import
'../../screen/location_address/models/province_address_model.dart'
;
class
LocationApi
{
LocationApi
(
this
.
client
);
final
RestfulAPIClient
client
;
Future
<
BaseResponseModel
<
ProvinceAddressResponse
>>
locationProvinceGetList
()
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'access_token'
:
token
,
'country_code2'
:
'VN'
};
return
client
.
requestNormal
(
APIPaths
.
locationProvinceGetList
,
Method
.
POST
,
body
,
(
data
)
=>
ProvinceAddressResponse
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
DistrictAddressResponse
>>
locationDistrictGetList
(
String
provinceCode
,
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'access_token'
:
token
,
'province_code'
:
provinceCode
};
return
client
.
requestNormal
(
APIPaths
.
locationDistrictGetList
,
Method
.
POST
,
body
,
(
data
)
=>
DistrictAddressResponse
.
fromJson
(
data
as
Json
),
);
}
}
lib/networking/api/notification_api.dart
0 → 100644
View file @
a6797435
import
'../../base/base_response_model.dart'
;
import
'../../configs/api_paths.dart'
;
import
'../../configs/callbacks.dart'
;
import
'../../networking/restful_api_client.dart'
;
import
'../../preference/data_preference.dart'
;
import
'../../screen/home/models/notification_unread_model.dart'
;
import
'../../screen/notification/models/category_notify_item_model.dart'
;
import
'../../screen/notification/models/notification_detail_model.dart'
;
import
'../../screen/notification/models/notification_list_data_model.dart'
;
class
NotificationApi
{
NotificationApi
(
this
.
client
);
final
RestfulAPIClient
client
;
Future
<
BaseResponseModel
<
List
<
CategoryNotifyItemModel
>>>
getNotificationCategories
()
{
return
client
.
requestNormal
(
APIPaths
.
getNotificationCategories
,
Method
.
GET
,
const
{},
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
item
)
=>
CategoryNotifyItemModel
.
fromJson
(
item
)).
toList
();
});
}
Future
<
BaseResponseModel
<
NotificationListDataModel
>>
getNotifications
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
getNotifications
,
Method
.
POST
,
body
,
(
data
)
=>
NotificationListDataModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
deleteNotification
(
String
id
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
return
client
.
requestNormal
(
APIPaths
.
deleteNotification
,
Method
.
POST
,
{
'notification_id'
:
id
,
'lang'
:
'vi'
,
'access_token'
:
token
,
},
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
deleteAllNotifications
()
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
deleteAllNotifications
,
Method
.
POST
,
body
,
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
notificationMarkAsSeen
()
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
notificationMarkAsSeen
,
Method
.
POST
,
body
,
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
NotificationDetailResponseModel
>>
getNotificationDetail
(
String
id
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'notification_id'
:
id
,
'mark_as_seen'
:
'1'
,
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
notificationGetDetail
,
Method
.
POST
,
body
,
(
data
)
=>
NotificationDetailResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
NotificationUnreadData
>>
getNotificationUnread
()
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
getNotificationUnread
,
Method
.
POST
,
body
,
(
data
)
=>
NotificationUnreadData
.
fromJson
(
data
as
Json
),
);
}
}
lib/networking/api/product_api.dart
0 → 100644
View file @
a6797435
import
'../../base/base_response_model.dart'
;
import
'../../configs/api_paths.dart'
;
import
'../../configs/callbacks.dart'
;
import
'../../networking/restful_api_client.dart'
;
import
'../../preference/data_preference.dart'
;
import
'../../screen/data_network_service/product_network_data_model.dart'
;
import
'../../screen/home/models/my_product_model.dart'
;
import
'../../screen/mobile_card/models/mobile_service_redeem_data.dart'
;
import
'../../screen/mobile_card/models/product_mobile_card_model.dart'
;
import
'../../screen/mobile_card/models/usable_voucher_model.dart'
;
import
'../../screen/topup/models/brand_network_model.dart'
;
import
'../../screen/traffic_service/traffic_service_model.dart'
;
import
'../../screen/transaction/model/order_product_payment_response_model.dart'
;
import
'../../screen/transaction/model/payment_bank_account_info_model.dart'
;
import
'../../screen/transaction/model/payment_method_model.dart'
;
import
'../../screen/transaction/model/preview_order_payment_model.dart'
;
import
'../../screen/voucher/models/like_product_response_model.dart'
;
import
'../../screen/voucher/models/my_mobile_card_response.dart'
;
import
'../../screen/voucher/models/my_product_status_type.dart'
;
import
'../../screen/voucher/models/product_brand_model.dart'
;
import
'../../screen/voucher/models/product_model.dart'
;
import
'../../screen/voucher/models/product_store_model.dart'
;
import
'../../screen/voucher/models/product_type.dart'
;
import
'../../screen/voucher/models/search_product_response_model.dart'
;
class
ProductApi
{
ProductApi
(
this
.
client
);
final
RestfulAPIClient
client
;
Future
<
BaseResponseModel
<
List
<
ProductModel
>>>
getProducts
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
getProducts
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
SearchProductResponseModel
>>
getSearchProducts
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
getSearchProducts
,
Method
.
POST
,
body
,
(
data
)
=>
SearchProductResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
List
<
ProductModel
>>>
productsCustomerLikes
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
productsCustomerLikes
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
ProductModel
>>
getProduct
(
int
id
)
{
final
path
=
APIPaths
.
getProductDetail
.
replaceAll
(
'%@'
,
id
.
toString
());
return
client
.
requestNormal
(
path
,
Method
.
GET
,
const
{},
(
data
)
=>
ProductModel
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
ProductModel
>>
getCustomerProductDetail
(
int
id
)
{
final
path
=
APIPaths
.
getCustomerProductDetail
.
replaceAll
(
'%@'
,
id
.
toString
());
return
client
.
requestNormal
(
path
,
Method
.
GET
,
const
{},
(
data
)
=>
ProductModel
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
List
<
ProductStoreModel
>>>
getProductStores
(
int
id
)
{
final
body
=
{
'product_id'
:
id
,
'size'
:
20
,
'index'
:
0
};
return
client
.
requestNormal
(
APIPaths
.
getProductStores
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductStoreModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
LikeProductResponseModel
>>
likeProduct
(
int
id
)
{
final
body
=
{
'product_id'
:
id
};
return
client
.
requestNormal
(
APIPaths
.
productCustomerLikes
,
Method
.
POST
,
body
,
(
data
)
{
return
LikeProductResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
unlikeProduct
(
int
id
)
{
final
path
=
APIPaths
.
productCustomerUnlikes
.
replaceAll
(
'%@'
,
id
.
toString
());
return
client
.
requestNormal
(
path
,
Method
.
DELETE
,
const
{},
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
List
<
EmptyCodable
>>>
verifyOrderProduct
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
verifyOrderProduct
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
EmptyCodable
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
PreviewOrderPaymentModel
>>
getPreviewOrderInfo
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
getPreviewOrderInfo
,
Method
.
POST
,
body
,
(
data
)
=>
PreviewOrderPaymentModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
List
<
PaymentBankAccountInfoModel
>>>
getPreviewOrderBankAccounts
()
{
return
client
.
requestNormal
(
APIPaths
.
getPreviewOrderBankAccounts
,
Method
.
GET
,
const
{},
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
PaymentBankAccountInfoModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
List
<
PaymentMethodModel
>>>
getPreviewPaymentMethods
()
{
return
client
.
requestNormal
(
APIPaths
.
getPreviewPaymentMethods
,
Method
.
GET
,
const
{},
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
PaymentMethodModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
OrderProductPaymentResponseModel
>>
orderSubmitPayment
({
required
List
<
ProductModel
>
products
,
required
int
quantity
,
required
String
requestId
,
int
?
point
,
int
?
cash
,
PaymentMethodModel
?
method
,
int
?
paymentTokenId
,
bool
?
saveToken
,
String
?
metadata
,
String
?
targetPhoneNumber
,
})
{
final
items
=
products
.
map
((
product
)
{
return
{
'product_id'
:
product
.
id
,
'product_type'
:
product
.
type
??
''
,
'quantity'
:
quantity
,
'target_phone_number'
:
targetPhoneNumber
??
''
,
};
}).
toList
();
final
Map
<
String
,
dynamic
>
params
=
{
'request_id'
:
requestId
,
'items'
:
items
,
'flow'
:
'21'
};
final
firstProduct
=
products
.
first
;
if
(
firstProduct
.
previewFlashSale
?.
isFlashSalePrice
==
true
&&
firstProduct
.
previewFlashSale
?.
id
!=
null
)
{
params
[
'flash_sale_id'
]
=
firstProduct
.
previewFlashSale
!.
id
;
}
if
(
method
!=
null
)
{
params
[
'payment_method'
]
=
method
.
code
;
}
if
(
point
!=
null
&&
point
!=
0
)
{
params
[
'pay_point'
]
=
point
;
}
if
(
cash
!=
null
&&
cash
!=
0
)
{
params
[
'pay_cash'
]
=
cash
;
}
if
(
paymentTokenId
!=
null
)
{
params
[
'payment_token_id'
]
=
paymentTokenId
;
}
if
(
saveToken
!=
null
)
{
params
[
'save_token'
]
=
saveToken
;
}
if
(
metadata
!=
null
)
{
params
[
'metadata'
]
=
metadata
;
}
return
client
.
requestNormal
(
APIPaths
.
orderSubmitPayment
,
Method
.
POST
,
params
,
(
data
)
{
return
OrderProductPaymentResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
MyProductModel
>>>
getCustomerProducts
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
getCustomerProducts
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
MyProductModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
List
<
ProductBrandModel
>>>
getTopUpBrands
(
ProductType
type
)
{
final
body
=
{
'type'
:
type
.
value
};
return
client
.
requestNormal
(
APIPaths
.
getTopUpBrands
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductBrandModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
List
<
ProductBrandModel
>>>
productTopUpBrands
()
{
final
body
=
{
'topup_type'
:
'PRODUCT_MODEL_MOBILE_SERVICE'
,
'page_size'
:
'999'
,
'page_index'
:
0
};
return
client
.
requestNormal
(
APIPaths
.
productTopUpsBrands
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductBrandModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
BrandNameCheckResponse
>>
checkMobileNetwork
(
String
phone
)
{
final
body
=
{
'phone'
:
phone
};
return
client
.
requestNormal
(
APIPaths
.
checkMobileNetwork
,
Method
.
GET
,
body
,
(
data
)
{
return
BrandNameCheckResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
ProductMobileCardResponse
>>
productMobileCardGetList
()
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'start'
:
0
,
'limit'
:
200
,
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
productMobileCardGetList
,
Method
.
POST
,
body
,
(
data
)
{
return
ProductMobileCardResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
MobileServiceRedeemData
>>
redeemMobileCard
(
String
productId
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'product_id'
:
productId
,
'get_customer_balance'
:
'1'
,
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
redeemMobileCard
,
Method
.
POST
,
body
,
(
data
)
{
return
MobileServiceRedeemData
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
RedeemProductResponseModel
>>
getMobileCardCode
(
String
itemId
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'product_item_id'
:
itemId
,
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
getMobileCardCode
,
Method
.
POST
,
body
,
(
data
)
{
return
RedeemProductResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
TopUpNetworkDataModel
>>>
getNetworkProducts
(
String
brandId
)
{
final
body
=
{
'brand_id'
:
brandId
,
'topup_type'
:
'PRODUCT_MODEL_MOBILE_SERVICE'
,
'page_size'
:
'999'
,
'page_index'
:
0
,
};
return
client
.
requestNormal
(
APIPaths
.
getNetworkProducts
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
TopUpNetworkDataModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
redeemProductTopUps
(
int
productId
,
String
phoneNumber
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'access_token'
:
token
,
'product_id'
:
productId
,
'quantity'
:
1
,
'phone_number'
:
phoneNumber
,
'lang'
:
'vi'
,
};
return
client
.
requestNormal
(
APIPaths
.
redeemProductTopUps
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
MyVoucherResponse
>>
getMyMobileCards
(
MyProductStatusType
status
,
Json
body
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
body
[
'access_token'
]
=
token
;
body
[
'product_model_code'
]
=
'PRODUCT_MODEL_MOBILE_CARD'
;
body
[
'list_order'
]
=
'DESC'
;
var
path
=
''
;
switch
(
status
)
{
case
MyProductStatusType
.
waiting
:
path
=
APIPaths
.
getMyProductGetWaitingList
;
case
MyProductStatusType
.
used
:
path
=
APIPaths
.
getMyProductGetUsedList
;
case
MyProductStatusType
.
expired
:
path
=
APIPaths
.
getMyProductGetExpiredList
;
}
return
client
.
requestNormal
(
path
,
Method
.
POST
,
body
,
(
data
)
{
return
MyVoucherResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
myProductMarkAsUsed
(
String
id
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'product_item_id'
:
id
,
'lang'
:
'vi'
,
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
myProductMarkAsUsed
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
myProductMarkAsNotUsedYet
(
String
id
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'product_item_id'
:
id
,
'lang'
:
'vi'
,
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
myProductMarkAsNotUsedYet
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
TrafficServiceResponseModel
>>
getProductVnTraSold
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
getProductVnTraSold
,
Method
.
GET
,
body
,
(
data
)
{
return
TrafficServiceResponseModel
.
fromJson
(
data
as
Json
);
});
}
}
lib/networking/api/website_api.dart
0 → 100644
View file @
a6797435
import
'../../base/base_response_model.dart'
;
import
'../../configs/api_paths.dart'
;
import
'../../configs/callbacks.dart'
;
import
'../../networking/restful_api_client.dart'
;
import
'../../preference/data_preference.dart'
;
import
'../../screen/faqs/faqs_model.dart'
;
import
'../../screen/pageDetail/model/campaign_detail_model.dart'
;
import
'../../screen/pageDetail/model/detail_page_rule_type.dart'
;
class
WebsiteApi
{
WebsiteApi
(
this
.
client
);
final
RestfulAPIClient
client
;
Future
<
BaseResponseModel
<
CampaignDetailResponseModel
>>
websitePageGetDetail
(
String
id
)
{
final
token
=
DataPreference
.
instance
.
token
??
''
;
final
body
=
{
'website_page_id'
:
id
,
'access_token'
:
token
};
return
client
.
requestNormal
(
APIPaths
.
websitePageGetDetail
,
Method
.
POST
,
body
,
(
data
)
=>
CampaignDetailResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
CampaignDetailResponseModel
>>
websitePage
(
DetailPageRuleType
rule
)
{
final
body
=
{
'code'
:
rule
.
key
};
return
client
.
requestNormal
(
APIPaths
.
websitePage
,
Method
.
GET
,
body
,
(
data
)
=>
CampaignDetailResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
FAQItemModelResponse
>>
websiteFolderGetPageList
(
Json
body
)
{
return
client
.
requestNormal
(
APIPaths
.
websiteFolderGetPageList
,
Method
.
POST
,
body
,
(
data
)
=>
FAQItemModelResponse
.
fromJson
(
data
as
Json
),
);
}
}
lib/networking/interceptor/auth_interceptor.dart
View file @
a6797435
...
...
@@ -20,6 +20,7 @@ class AuthInterceptor extends Interceptor {
APIPaths
.
login
,
APIPaths
.
refreshToken
,
APIPaths
.
logout
,
APIPaths
.
deleteNotification
,
'assets'
,
];
...
...
lib/networking/interceptor/exception_interceptor.dart
View file @
a6797435
import
'dart:async'
;
import
'package:dio/dio.dart'
;
import
'package:flutter/foundation.dart'
;
import
'package:mypoint_flutter_app/base/app_loading.dart'
;
import
'../../base/app_navigator.dart'
;
import
'../dio_http_service.dart'
;
...
...
@@ -14,17 +15,17 @@ class ExceptionInterceptor extends Interceptor {
final
apiError
=
ErrorMapper
.
map
(
err
);
err
.
requestOptions
.
extra
[
'mapped_error'
]
=
apiError
;
// return handler.next(err);
p
rint
(
'ExceptionInterceptor: onError:
$apiError
'
);
debugP
rint
(
'ExceptionInterceptor: onError:
$apiError
'
);
final
extra
=
err
.
requestOptions
.
extra
;
final
silent
=
extra
[
'silent'
]
==
true
;
// Nếu không phải network error hoặc không thể retry -> forward
if
(!
ErrorMapper
.
isNetworkError
(
err
))
return
handler
.
next
(
err
);
if
(
silent
)
return
handler
.
next
(
err
);
p
rint
(
'ExceptionInterceptor: onError:
$apiError
'
);
debugP
rint
(
'ExceptionInterceptor: onError:
$apiError
'
);
// Chỉ cho phép retry với GET hoặc request được mark allow_retry
final
allowRetry
=
_shouldAllowRetry
(
err
.
requestOptions
);
if
(!
allowRetry
)
return
handler
.
next
(
err
);
p
rint
(
'ExceptionInterceptor: onError:
$_isPrompting
'
);
debugP
rint
(
'ExceptionInterceptor: onError:
$_isPrompting
'
);
if
(
_isPrompting
)
return
handler
.
next
(
err
);
_isPrompting
=
true
;
// ask user retry
...
...
lib/networking/interceptor/logger_interceptor.dart
View file @
a6797435
import
'dart:convert'
;
import
'package:dio/dio.dart'
;
import
'package:logger/logger.dart'
;
...
...
lib/networking/interceptor/request_interceptor.dart
View file @
a6797435
...
...
@@ -72,9 +72,7 @@ class RequestInterceptor extends Interceptor {
}
options
.
data
=
jsonEncode
(
body
);
}
catch
(
e
)
{
if
(
kDebugMode
)
{
print
(
'⚠️ RequestInterceptor: failed to normalize JSON body -
$e
'
);
}
debugPrint
(
'⚠️ RequestInterceptor: failed to normalize JSON body -
$e
'
);
}
}
}
lib/networking/restful_api_client.dart
View file @
a6797435
...
...
@@ -118,8 +118,6 @@ class RestfulAPIClient {
}
void
_debug
(
Object
e
)
{
if
(
kDebugMode
)
{
print
(
'=== API DEBUG ===
$e
'
);
}
debugPrint
(
'=== API DEBUG ===
$e
'
);
}
}
lib/networking/restful_api_client_all_request.dart
View file @
a6797435
import
'dart:io'
;
import
'package:flutter/foundation.dart'
;
import
'package:mypoint_flutter_app/configs/api_paths.dart'
;
import
'package:mypoint_flutter_app/base/base_response_model.dart'
;
import
'package:mypoint_flutter_app/configs/constants.dart'
;
import
'package:mypoint_flutter_app/extensions/string_extension.dart'
;
import
'package:mypoint_flutter_app/networking/restful_api_client.dart'
;
import
'package:mypoint_flutter_app/preference/data_preference.dart'
;
import
'package:mypoint_flutter_app/screen/game/models/game_bundle_response.dart'
;
import
'package:mypoint_flutter_app/screen/voucher/models/product_model.dart'
;
import
'../configs/callbacks.dart'
;
import
'../configs/device_info.dart'
;
...
...
@@ -21,75 +19,58 @@ import '../screen/history_point/models/transaction_summary_by_date_model.dart';
import
'../screen/register_campaign/model/verify_register_model.dart'
;
import
'../screen/splash/models/update_response_model.dart'
;
import
'../preference/point/header_home_model.dart'
;
import
'../screen/affiliate/model/affiliate_brand_model.dart'
;
import
'../screen/affiliate/model/affiliate_category_model.dart'
;
import
'../screen/affiliate/model/affiliate_product_top_sale_model.dart'
;
import
'../screen/affiliate/model/cashback_overview_model.dart'
;
import
'../screen/affiliate_brand_detail/models/affiliate_brand_detail_model.dart'
;
import
'../screen/bank_account_manager/bank_account_info_model.dart'
;
import
'../screen/campaign7day/models/campaign_7day_info_model.dart'
;
import
'../screen/campaign7day/models/campaign_7day_mission_model.dart'
;
import
'../screen/campaign7day/models/campaign_7day_reward_model.dart'
;
import
'../screen/daily_checkin/daily_checkin_models.dart'
;
import
'../screen/data_network_service/product_network_data_model.dart'
;
import
'../screen/device_manager/device_manager_model.dart'
;
import
'../screen/electric_payment/models/customer_contract_object_model.dart'
;
import
'../screen/electric_payment/models/electric_payment_response_model.dart'
;
import
'../screen/faqs/faqs_model.dart'
;
import
'../screen/flash_sale/models/flash_sale_category_model.dart'
;
import
'../screen/flash_sale/models/flash_sale_detail_response.dart'
;
import
'../screen/game/models/game_bundle_item_model.dart'
;
import
'../screen/history_point_cashback/models/history_point_cashback_model.dart'
;
import
'../screen/home/models/achievement_model.dart'
;
import
'../screen/home/models/hover_data_model.dart'
;
import
'../screen/home/models/main_section_config_model.dart'
;
import
'../screen/home/models/my_product_model.dart'
;
import
'../screen/home/models/notification_unread_model.dart'
;
import
'../screen/home/models/pipi_detail_model.dart'
;
import
'../screen/interested_categories/models/interested_categories_model.dart'
;
import
'../screen/invite_friend_campaign/models/invite_friend_campaign_model.dart'
;
import
'../screen/location_address/models/district_address_model.dart'
;
import
'../screen/location_address/models/province_address_model.dart'
;
import
'../screen/membership/models/membership_info_response.dart'
;
import
'../screen/mobile_card/models/mobile_service_redeem_data.dart'
;
import
'../screen/mobile_card/models/product_mobile_card_model.dart'
;
import
'../screen/mobile_card/models/usable_voucher_model.dart'
;
import
'../screen/notification/models/category_notify_item_model.dart'
;
import
'../screen/notification/models/notification_detail_model.dart'
;
import
'../screen/notification/models/notification_list_data_model.dart'
;
import
'../screen/onboarding/model/check_phone_response_model.dart'
;
import
'../screen/onboarding/model/onboarding_info_model.dart'
;
import
'../screen/otp/model/create_otp_response_model.dart'
;
import
'../screen/otp/model/otp_verify_response_model.dart'
;
import
'../screen/pageDetail/model/campaign_detail_model.dart'
;
import
'../screen/pageDetail/model/detail_page_rule_type.dart'
;
import
'../screen/popup_manager/popup_manager_model.dart'
;
import
'../screen/quiz_campaign/quiz_campaign_model.dart'
;
import
'../screen/register_campaign/model/registration_form_package_model.dart'
;
import
'../screen/topup/models/brand_network_model.dart'
;
import
'../screen/traffic_service/traffic_service_model.dart'
;
import
'../screen/transaction/history/transaction_category_model.dart'
;
import
'../screen/transaction/history/transaction_history_model.dart'
;
import
'../screen/transaction/history/transaction_history_response_model.dart'
;
import
'../screen/transaction/model/order_product_payment_response_model.dart'
;
import
'../screen/transaction/model/payment_bank_account_info_model.dart'
;
import
'../screen/transaction/model/payment_method_model.dart'
;
import
'../screen/transaction/model/preview_order_payment_model.dart'
;
import
'../screen/voucher/models/like_product_response_model.dart'
;
import
'../screen/voucher/models/my_mobile_card_response.dart'
;
import
'../screen/voucher/models/my_product_status_type.dart'
;
import
'../screen/voucher/models/product_brand_model.dart'
;
import
'../screen/voucher/models/product_store_model.dart'
;
import
'../screen/voucher/models/product_type.dart'
;
import
'../screen/voucher/models/search_product_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
{
Future
<
BaseResponseModel
<
UpdateResponseModel
>>
checkUpdateApp
()
async
{
final
operatingSystem
=
Platform
.
operatingSystem
;
final
version
=
await
AppInfoHelper
.
version
;
final
buildNumber
=
await
AppInfoHelper
.
buildNumber
;
final
body
=
{
"operating_system"
:
operatingSystem
,
"software_model"
:
"MyPoint"
,
"version"
:
version
,
"build_number"
:
buildNumber
};
return
requestNormal
(
APIPaths
.
checkUpdate
,
Method
.
POST
,
body
,
(
data
)
=>
UpdateResponseModel
.
fromJson
(
data
as
Json
));
final
body
=
{
"operating_system"
:
operatingSystem
,
"software_model"
:
"MyPoint"
,
"version"
:
version
,
"build_number"
:
buildNumber
,
};
return
requestNormal
(
APIPaths
.
checkUpdate
,
Method
.
POST
,
body
,
(
data
)
=>
UpdateResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
OnboardingInfoModel
>>
getOnboardingInfo
()
async
{
...
...
@@ -101,10 +82,16 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
CheckPhoneResponseModel
>>
checkPhoneNumber
(
String
phone
)
async
{
Future
<
BaseResponseModel
<
CheckPhoneResponseModel
>>
checkPhoneNumber
(
String
phone
,
)
async
{
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
var
key
=
"
$phone
+_=
$deviceKey
/*8854"
;
final
body
=
{
"device_key"
:
deviceKey
,
"phone_number"
:
phone
,
"key"
:
key
.
toSha256
()};
final
body
=
{
"device_key"
:
deviceKey
,
"phone_number"
:
phone
,
"key"
:
key
.
toSha256
(),
};
return
requestNormal
(
APIPaths
.
checkPhoneNumber
,
Method
.
POST
,
...
...
@@ -113,7 +100,10 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
OTPVerifyResponseModel
>>
verifyOTP
(
String
otp
,
String
mfaToken
)
async
{
Future
<
BaseResponseModel
<
OTPVerifyResponseModel
>>
verifyOTP
(
String
otp
,
String
mfaToken
,
)
async
{
final
body
=
{
"otp"
:
otp
,
"mfaToken"
:
mfaToken
};
return
requestNormal
(
APIPaths
.
verifyOtpWithAction
,
...
...
@@ -123,7 +113,9 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
OTPResendResponseModel
>>
resendOTP
(
String
mfaToken
)
async
{
Future
<
BaseResponseModel
<
OTPResendResponseModel
>>
resendOTP
(
String
mfaToken
,
)
async
{
final
body
=
{
"mfaToken"
:
mfaToken
};
return
requestNormal
(
APIPaths
.
retryOtpWithAction
,
...
...
@@ -133,7 +125,8 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
CreateOTPResponseModel
>>
requestOtpDeleteAccount
()
async
{
Future
<
BaseResponseModel
<
CreateOTPResponseModel
>>
requestOtpDeleteAccount
()
async
{
return
requestNormal
(
APIPaths
.
otpDeleteAccountRequest
,
Method
.
POST
,
...
...
@@ -142,19 +135,39 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
CreateOTPResponseModel
>>
verifyDeleteAccount
(
String
otp
)
async
{
return
requestNormal
(
APIPaths
.
verifyDeleteAccount
,
Method
.
POST
,
{
"otp"
:
otp
,
},
(
data
)
=>
CreateOTPResponseModel
.
fromJson
(
data
as
Json
));
Future
<
BaseResponseModel
<
CreateOTPResponseModel
>>
verifyDeleteAccount
(
String
otp
,
)
async
{
return
requestNormal
(
APIPaths
.
verifyDeleteAccount
,
Method
.
POST
,
{
"otp"
:
otp
},
(
data
)
=>
CreateOTPResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
signup
(
String
phone
,
String
password
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
signup
(
String
phone
,
String
password
,
)
async
{
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
final
body
=
{
"username"
:
phone
,
"password"
:
password
.
toSha256
(),
"device_key"
:
deviceKey
};
return
requestNormal
(
APIPaths
.
signup
,
Method
.
POST
,
body
,
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
));
final
body
=
{
"username"
:
phone
,
"password"
:
password
.
toSha256
(),
"device_key"
:
deviceKey
,
};
return
requestNormal
(
APIPaths
.
signup
,
Method
.
POST
,
body
,
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
LoginTokenResponseModel
>>
login
(
String
phone
,
String
password
)
async
{
Future
<
BaseResponseModel
<
LoginTokenResponseModel
>>
login
(
String
phone
,
String
password
,
)
async
{
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
final
body
=
{
"username"
:
phone
,
...
...
@@ -162,24 +175,37 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
"device_key"
:
deviceKey
,
"workspace_code"
:
"8854"
,
};
return
requestNormal
(
APIPaths
.
login
,
Method
.
POST
,
body
,
(
data
)
=>
LoginTokenResponseModel
.
fromJson
(
data
as
Json
));
return
requestNormal
(
APIPaths
.
login
,
Method
.
POST
,
body
,
(
data
)
=>
LoginTokenResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
logout
()
async
{
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
var
phone
=
DataPreference
.
instance
.
phone
??
""
;
final
body
=
{
"username"
:
phone
,
"device_key"
:
deviceKey
,
"lang"
:
"vi"
,
};
return
requestNormal
(
APIPaths
.
logout
,
Method
.
POST
,
body
,
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
));
final
body
=
{
"username"
:
phone
,
"device_key"
:
deviceKey
,
"lang"
:
"vi"
};
return
requestNormal
(
APIPaths
.
logout
,
Method
.
POST
,
body
,
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
LoginTokenResponseModel
>>
loginWithBiometric
(
String
phone
)
async
{
Future
<
BaseResponseModel
<
LoginTokenResponseModel
>>
loginWithBiometric
(
String
phone
,
)
async
{
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
var
bioToken
=
await
DataPreference
.
instance
.
getBioToken
(
phone
)
??
""
;
final
body
=
{
"username"
:
phone
,
"bioToken"
:
bioToken
,
"deviceKey"
:
deviceKey
,
"workspaceCode"
:
"8854"
};
final
body
=
{
"username"
:
phone
,
"bioToken"
:
bioToken
,
"deviceKey"
:
deviceKey
,
"workspaceCode"
:
"8854"
,
};
return
requestNormal
(
APIPaths
.
loginWithBiometric
,
Method
.
POST
,
...
...
@@ -189,7 +215,12 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
}
Future
<
BaseResponseModel
<
ProfileResponseModel
>>
getUserProfile
()
async
{
return
requestNormal
(
APIPaths
.
getUserInfo
,
Method
.
GET
,
{},
(
data
)
=>
ProfileResponseModel
.
fromJson
(
data
as
Json
));
return
requestNormal
(
APIPaths
.
getUserInfo
,
Method
.
GET
,
{},
(
data
)
=>
ProfileResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
TokenRefreshResponseModel
>>
refreshToken
()
async
{
...
...
@@ -200,11 +231,23 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
"refresh_token"
:
refreshToken
,
'lang'
:
'vi'
,
};
return
requestNormal
(
APIPaths
.
refreshToken
,
Method
.
POST
,
body
,
(
data
)
=>
TokenRefreshResponseModel
.
fromJson
(
data
as
Json
));
return
requestNormal
(
APIPaths
.
refreshToken
,
Method
.
POST
,
body
,
(
data
)
=>
TokenRefreshResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
CreateOTPResponseModel
>>
otpCreateNew
(
String
ownerId
)
async
{
final
body
=
{
"owner_id"
:
ownerId
,
"ttl"
:
Constants
.
otpTtl
,
"resend_after_second"
:
Constants
.
otpTtl
,
'lang'
:
'vi'
};
Future
<
BaseResponseModel
<
CreateOTPResponseModel
>>
otpCreateNew
(
String
ownerId
,
)
async
{
final
body
=
{
"owner_id"
:
ownerId
,
"ttl"
:
Constants
.
otpTtl
,
"resend_after_second"
:
Constants
.
otpTtl
,
'lang'
:
'vi'
,
};
return
requestNormal
(
APIPaths
.
otpCreateNew
,
Method
.
POST
,
...
...
@@ -233,37 +276,10 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
CampaignDetailResponseModel
>>
websitePageGetDetail
(
String
id
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"website_page_id"
:
id
,
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
websitePageGetDetail
,
Method
.
POST
,
body
,
(
data
)
=>
CampaignDetailResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
CampaignDetailResponseModel
>>
websitePage
(
DetailPageRuleType
rule
)
async
{
final
body
=
{
"code"
:
rule
.
key
};
return
requestNormal
(
APIPaths
.
websitePage
,
Method
.
GET
,
body
,
(
data
)
=>
CampaignDetailResponseModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
FAQItemModelResponse
>>
websiteFolderGetPageList
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
websiteFolderGetPageList
,
Method
.
POST
,
body
,
(
data
)
=>
FAQItemModelResponse
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
accountPasswordReset
(
String
phone
,
String
password
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
accountPasswordReset
(
String
phone
,
String
password
,
)
async
{
final
body
=
{
"login_name"
:
phone
,
"password"
:
password
.
toSha256
()};
return
requestNormal
(
APIPaths
.
accountPasswordReset
,
...
...
@@ -273,9 +289,16 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
accountPasswordChange
(
String
phone
,
String
password
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
accountPasswordChange
(
String
phone
,
String
password
,
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"login_name"
:
phone
,
"password"
:
password
.
toSha256
(),
"access_token"
:
token
};
final
body
=
{
"login_name"
:
phone
,
"password"
:
password
.
toSha256
(),
"access_token"
:
token
,
};
return
requestNormal
(
APIPaths
.
accountPasswordChange
,
Method
.
POST
,
...
...
@@ -284,9 +307,16 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
accountLoginForPasswordChange
(
String
phone
,
String
password
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
accountLoginForPasswordChange
(
String
phone
,
String
password
,
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"login_name"
:
phone
,
"password"
:
password
.
toSha256
(),
"access_token"
:
token
};
final
body
=
{
"login_name"
:
phone
,
"password"
:
password
.
toSha256
(),
"access_token"
:
token
,
};
return
requestNormal
(
APIPaths
.
accountLoginForPasswordChange
,
Method
.
POST
,
...
...
@@ -295,7 +325,8 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
BiometricRegisterResponseModel
>>
accountBioCredential
()
async
{
Future
<
BaseResponseModel
<
BiometricRegisterResponseModel
>>
accountBioCredential
()
async
{
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
final
body
=
{
"deviceKey"
:
deviceKey
};
return
requestNormal
(
...
...
@@ -306,7 +337,8 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
);
}
Future
<
BaseResponseModel
<
BiometricRegisterResponseModel
>>
registerBiometric
()
async
{
Future
<
BaseResponseModel
<
BiometricRegisterResponseModel
>>
registerBiometric
()
async
{
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
final
body
=
{
"deviceKey"
:
deviceKey
};
return
requestNormal
(
...
...
@@ -321,257 +353,41 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
final
path
=
"
${APIPaths.unRegisterBiometric}
/
$deviceKey
"
;
final
body
=
{
"deviceKey"
:
deviceKey
};
return
requestNormal
(
path
,
Method
.
POST
,
body
,
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
HeaderHomeModel
>>
getHomeHeaderData
()
async
{
return
requestNormal
(
APIPaths
.
headerHome
,
Method
.
GET
,
{},
(
data
)
=>
HeaderHomeModel
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
List
<
ProductModel
>>>
getProducts
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
getProducts
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
SearchProductResponseModel
>>
getSearchProducts
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
getSearchProducts
,
path
,
Method
.
POST
,
body
,
(
data
)
=>
SearchProductResponseModel
.
fromJson
(
data
as
Json
),
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
List
<
ProductModel
>>>
productsCustomerLikes
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
productsCustomerLikes
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
ProductModel
>>
getProduct
(
int
id
)
async
{
final
path
=
APIPaths
.
getProductDetail
.
replaceAll
(
"%@"
,
id
.
toString
());
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
=>
ProductModel
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
ProductModel
>>
getCustomerProductDetail
(
int
id
)
async
{
final
path
=
APIPaths
.
getCustomerProductDetail
.
replaceAll
(
"%@"
,
id
.
toString
());
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
=>
ProductModel
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
List
<
ProductStoreModel
>>>
getProductStores
(
int
id
)
async
{
final
body
=
{
"product_id"
:
id
,
"size"
:
20
,
"index"
:
0
};
return
requestNormal
(
APIPaths
.
getProductStores
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductStoreModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
LikeProductResponseModel
>>
likeProduct
(
int
id
)
async
{
final
body
=
{
"product_id"
:
id
};
return
requestNormal
(
APIPaths
.
productCustomerLikes
,
Method
.
POST
,
body
,
(
data
)
{
return
LikeProductResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
unlikeProduct
(
int
id
)
async
{
final
path
=
APIPaths
.
productCustomerUnlikes
.
replaceAll
(
"%@"
,
id
.
toString
());
return
requestNormal
(
path
,
Method
.
DELETE
,
{},
(
data
)
=>
EmptyCodable
.
fromJson
(
data
as
Json
));
}
Future
<
BaseResponseModel
<
GameBundleResponse
>>
getGames
()
async
{
return
requestNormal
(
APIPaths
.
getGames
,
Method
.
GET
,
{},
(
data
)
{
return
GameBundleResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
EmptyCodable
>>>
verifyOrderProduct
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
verifyOrderProduct
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
EmptyCodable
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
GameBundleItemModel
>>
getGameDetail
(
String
id
)
async
{
final
path
=
APIPaths
.
getGameDetail
.
replaceAll
(
"%@"
,
id
);
return
requestNormal
(
path
,
Method
.
POST
,
{},
(
data
)
{
return
GameBundleItemModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
GameBundleItemModel
>>
submitGameCard
(
String
gameId
,
String
itemId
)
async
{
final
path
=
APIPaths
.
submitGameCard
.
replaceFirst
(
"%@"
,
gameId
).
replaceFirst
(
"%@"
,
itemId
);
return
requestNormal
(
path
,
Method
.
POST
,
{},
(
data
)
{
return
GameBundleItemModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
AffiliateCategoryModel
>>>
affiliateCategoryGetList
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
affiliateCategoryGetList
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
AffiliateCategoryModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
List
<
AffiliateBrandModel
>>>
affiliateBrandGetList
({
String
?
categoryCode
})
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
if
((
categoryCode
??
''
).
isNotEmpty
)
{
body
[
'category_code'
]
=
categoryCode
!;
}
return
requestNormal
(
APIPaths
.
affiliateBrandGetList
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
AffiliateBrandModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
List
<
AffiliateProductTopSaleModel
>>>
affiliateProductTopSale
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
affiliateProductTopSale
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
AffiliateProductTopSaleModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
CashbackOverviewModel
>>
getCashBackOverview
()
async
{
return
requestNormal
(
APIPaths
.
getCashbackOverview
,
Method
.
GET
,
{},
(
data
)
{
return
CashbackOverviewModel
.
fromJson
(
data
as
Json
);
});
Future
<
BaseResponseModel
<
HeaderHomeModel
>>
getHomeHeaderData
()
async
{
return
requestNormal
(
APIPaths
.
headerHome
,
Method
.
GET
,
{},
(
data
)
=>
HeaderHomeModel
.
fromJson
(
data
as
Json
),
);
}
Future
<
BaseResponseModel
<
RegistrationFormPackageModel
>>
getRegistrationForm
(
String
id
)
async
{
Future
<
BaseResponseModel
<
RegistrationFormPackageModel
>>
getRegistrationForm
(
String
id
,
)
async
{
final
path
=
APIPaths
.
getRegistrationForm
.
replaceAll
(
"%@"
,
id
);
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
{
return
RegistrationFormPackageModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
PreviewOrderPaymentModel
>>
getPreviewOrderInfo
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
getPreviewOrderInfo
,
Method
.
POST
,
body
,
(
data
)
{
return
PreviewOrderPaymentModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
PaymentBankAccountInfoModel
>>>
getPreviewOrderBankAccounts
()
async
{
return
requestNormal
(
APIPaths
.
getPreviewOrderBankAccounts
,
Method
.
GET
,
{},
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
PaymentBankAccountInfoModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
List
<
PaymentMethodModel
>>>
getPreviewPaymentMethods
()
async
{
return
requestNormal
(
APIPaths
.
getPreviewPaymentMethods
,
Method
.
GET
,
{},
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
PaymentMethodModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
List
<
CategoryNotifyItemModel
>>>
getNotificationCategories
()
async
{
return
requestNormal
(
APIPaths
.
getNotificationCategories
,
Method
.
GET
,
{},
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
CategoryNotifyItemModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
NotificationListDataModel
>>
getNotifications
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
getNotifications
,
Method
.
POST
,
body
,
(
data
)
{
return
NotificationListDataModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
deleteNotification
(
String
id
)
async
{
return
requestNormal
(
APIPaths
.
deleteNotification
,
Method
.
POST
,
{
"notification_id__"
:
id
},
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
deleteAllNotifications
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
deleteAllNotifications
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
notificationMarkAsSeen
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
notificationMarkAsSeen
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
NotificationDetailResponseModel
>>
getNotificationDetail
(
String
id
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"notification_id"
:
id
,
"mark_as_seen"
:
"1"
,
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
notificationGetDetail
,
Method
.
POST
,
body
,
(
data
)
{
return
NotificationDetailResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
TransactionHistoryModel
>>
getTransactionHistoryDetail
(
String
id
)
async
{
Future
<
BaseResponseModel
<
TransactionHistoryModel
>>
getTransactionHistoryDetail
(
String
id
,
)
async
{
final
path
=
APIPaths
.
getTransactionHistoryDetail
.
replaceAll
(
"%@"
,
id
);
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
{
return
TransactionHistoryModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
OrderProductPaymentResponseModel
>>
orderSubmitPayment
({
required
List
<
ProductModel
>
products
,
required
int
quantity
,
required
String
requestId
,
int
?
point
,
int
?
cash
,
PaymentMethodModel
?
method
,
int
?
paymentTokenId
,
bool
?
saveToken
,
String
?
metadata
,
String
?
targetPhoneNumber
,
})
async
{
final
items
=
products
.
map
((
product
)
{
return
{
'product_id'
:
product
.
id
,
'product_type'
:
product
.
type
??
''
,
'quantity'
:
quantity
,
'target_phone_number'
:
targetPhoneNumber
??
''
,
};
}).
toList
();
final
Map
<
String
,
dynamic
>
params
=
{
'request_id'
:
requestId
,
'items'
:
items
,
'flow'
:
'21'
};
// flash_sale
final
firstProduct
=
products
.
first
;
if
(
firstProduct
.
previewFlashSale
?.
isFlashSalePrice
==
true
&&
firstProduct
.
previewFlashSale
?.
id
!=
null
)
{
params
[
'flash_sale_id'
]
=
firstProduct
.
previewFlashSale
!.
id
;
}
// Optional parameters
if
(
method
!=
null
)
{
params
[
'payment_method'
]
=
method
.
code
;
}
if
(
point
!=
null
&&
point
!=
0
)
{
params
[
'pay_point'
]
=
point
;
}
if
(
cash
!=
null
&&
cash
!=
0
)
{
params
[
'pay_cash'
]
=
cash
;
}
if
(
paymentTokenId
!=
null
)
{
params
[
'payment_token_id'
]
=
paymentTokenId
;
}
if
(
saveToken
!=
null
)
{
params
[
'save_token'
]
=
saveToken
;
}
if
(
metadata
!=
null
)
{
params
[
'metadata'
]
=
metadata
;
}
return
requestNormal
(
APIPaths
.
orderSubmitPayment
,
Method
.
POST
,
params
,
(
data
)
{
return
OrderProductPaymentResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
PipiDetailResponseModel
>>
getPipiDetail
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
...
...
@@ -580,15 +396,20 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
});
}
Future
<
BaseResponseModel
<
List
<
MainSectionConfigModel
>>>
getSectionLayoutHome
()
async
{
Future
<
BaseResponseModel
<
List
<
MainSectionConfigModel
>>>
getSectionLayoutHome
()
async
{
return
requestNormal
(
APIPaths
.
getSectionLayoutHome
,
Method
.
GET
,
{},
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
MainSectionConfigModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
AchievementListResponse
>>
getAchievementList
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
achievementGetList
,
Method
.
POST
,
body
,
(
data
)
{
Future
<
BaseResponseModel
<
AchievementListResponse
>>
getAchievementList
(
Json
body
,
)
async
{
return
requestNormal
(
APIPaths
.
achievementGetList
,
Method
.
POST
,
body
,
(
data
,
)
{
return
AchievementListResponse
.
fromJson
(
data
as
Json
);
});
}
...
...
@@ -599,161 +420,71 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
});
}
Future
<
BaseResponseModel
<
NotificationUnreadData
>>
getNotificationUnread
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
getNotificationUnread
,
Method
.
POST
,
body
,
(
data
)
{
return
NotificationUnreadData
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
HeaderHomeModel
>>
getDynamicHeaderHome
()
async
{
return
requestNormal
(
APIPaths
.
getDynamicHeaderHome
,
Method
.
GET
,
{},
(
data
)
{
return
HeaderHomeModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
MyProductModel
>>>
getCustomerProducts
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
getCustomerProducts
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
MyProductModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
updateWorkerSiteProfile
(
Json
body
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
updateWorkerSiteProfile
(
Json
body
,
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
body
[
"access_token"
]
=
token
;
return
requestNormal
(
APIPaths
.
updateWorkerSiteProfile
,
Method
.
POST
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
updateWorkerSiteProfile
,
Method
.
POST
,
body
,
(
data
,
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
ProvinceAddressResponse
>>
locationProvinceGetList
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
"country_code2"
:
"VN"
};
return
requestNormal
(
APIPaths
.
locationProvinceGetList
,
Method
.
POST
,
body
,
(
data
)
{
return
ProvinceAddressResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
DistrictAddressResponse
>>
locationDistrictGetList
(
String
provinceCode
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
"province_code"
:
provinceCode
};
return
requestNormal
(
APIPaths
.
locationDistrictGetList
,
Method
.
POST
,
body
,
(
data
)
{
return
DistrictAddressResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
MembershipInfoResponse
>>
getMembershipLevelInfo
()
async
{
Future
<
BaseResponseModel
<
MembershipInfoResponse
>>
getMembershipLevelInfo
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
"lang"
:
"vi"
};
return
requestNormal
(
APIPaths
.
getMembershipLevelInfo
,
Method
.
POST
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
getMembershipLevelInfo
,
Method
.
POST
,
body
,
(
data
,
)
{
return
MembershipInfoResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
ProductBrandModel
>>>
getTopUpBrands
(
ProductType
type
)
async
{
final
body
=
{
"type"
:
type
.
value
};
return
requestNormal
(
APIPaths
.
getTopUpBrands
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductBrandModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
List
<
ProductBrandModel
>>>
productTopUpBrands
()
async
{
final
body
=
{
"topup_type"
:
"PRODUCT_MODEL_MOBILE_SERVICE"
,
"page_size"
:
"999"
,
"page_index"
:
0
};
return
requestNormal
(
APIPaths
.
productTopUpsBrands
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
ProductBrandModel
.
fromJson
(
e
)).
toList
();
});
}
// productTopUpsBrands
Future
<
BaseResponseModel
<
BrandNameCheckResponse
>>
checkMobileNetwork
(
String
phone
)
async
{
final
body
=
{
"phone"
:
phone
};
return
requestNormal
(
APIPaths
.
checkMobileNetwork
,
Method
.
GET
,
body
,
(
data
)
{
return
BrandNameCheckResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
ProductMobileCardResponse
>>
productMobileCardGetList
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"start"
:
0
,
"limit"
:
200
,
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
productMobileCardGetList
,
Method
.
POST
,
body
,
(
data
)
{
return
ProductMobileCardResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
MobileServiceRedeemData
>>
redeemMobileCard
(
String
productId
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"product_id"
:
productId
,
"get_customer_balance"
:
"1"
,
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
redeemMobileCard
,
Method
.
POST
,
body
,
(
data
)
{
return
MobileServiceRedeemData
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
RedeemProductResponseModel
>>
getMobileCardCode
(
String
itemId
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"product_item_id"
:
itemId
,
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
getMobileCardCode
,
Method
.
POST
,
body
,
(
data
)
{
return
RedeemProductResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
TopUpNetworkDataModel
>>>
getNetworkProducts
(
String
brandId
)
async
{
final
body
=
{
"brand_id"
:
brandId
,
"topup_type"
:
"PRODUCT_MODEL_MOBILE_SERVICE"
,
"page_size"
:
"999"
,
"page_index"
:
0
,
};
return
requestNormal
(
APIPaths
.
getNetworkProducts
,
Method
.
GET
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
TopUpNetworkDataModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
redeemProductTopUps
(
int
productId
,
String
phoneNumber
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
"product_id"
:
productId
,
"quantity"
:
1
,
"phone_number"
:
phoneNumber
,
"lang"
:
"vi"
};
return
requestNormal
(
APIPaths
.
redeemProductTopUps
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
HistoryPointCashBackResponse
>>
historyPointCashBackRequest
(
Json
body
)
async
{
Future
<
BaseResponseModel
<
HistoryPointCashBackResponse
>>
historyPointCashBackRequest
(
Json
body
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
body
[
"access_token"
]
=
token
;
return
requestNormal
(
APIPaths
.
historyCashBackPoint
,
Method
.
GET
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
historyCashBackPoint
,
Method
.
GET
,
body
,
(
data
,
)
{
return
HistoryPointCashBackResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
AffiliateBrandDetailModel
>>
getAffiliateBrandDetail
(
String
brandId
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
"brand_id"
:
brandId
};
return
requestNormal
(
APIPaths
.
affiliateBrandGetDetail
,
Method
.
POST
,
body
,
(
data
)
{
return
AffiliateBrandDetailModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
InviteFriendDetailModel
>>
getCampaignInviteFriend
()
async
{
Future
<
BaseResponseModel
<
InviteFriendDetailModel
>>
getCampaignInviteFriend
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
campaignInviteFriend
,
Method
.
GET
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
campaignInviteFriend
,
Method
.
GET
,
body
,
(
data
,
)
{
return
InviteFriendDetailModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
CampaignInviteFriendDetail
>>
getDetailCampaignInviteFriend
()
async
{
Future
<
BaseResponseModel
<
CampaignInviteFriendDetail
>>
getDetailCampaignInviteFriend
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
inviteFriendCampaigns
,
Method
.
GET
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
inviteFriendCampaigns
,
Method
.
GET
,
body
,
(
data
,
)
{
return
CampaignInviteFriendDetail
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
InviteFriendResponse
>>
phoneInviteFriend
(
String
phone
)
async
{
Future
<
BaseResponseModel
<
InviteFriendResponse
>>
phoneInviteFriend
(
String
phone
,
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
'username'
:
phone
};
return
requestNormal
(
APIPaths
.
phoneInviteFriend
,
Method
.
POST
,
body
,
(
data
)
{
...
...
@@ -764,7 +495,9 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
Future
<
BaseResponseModel
<
CheckInDataModel
>>
rewardOpportunityGetList
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
'number_day'
:
'7'
};
return
requestNormal
(
APIPaths
.
rewardOpportunityGetList
,
Method
.
POST
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
rewardOpportunityGetList
,
Method
.
POST
,
body
,
(
data
,
)
{
return
CheckInDataModel
.
fromJson
(
data
as
Json
);
});
}
...
...
@@ -772,84 +505,119 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
Future
<
BaseResponseModel
<
SubmitCheckInData
>>
submitCheckIn
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
rewardOpportunityOpenRequest
,
Method
.
POST
,
body
,
(
data
)
{
return
SubmitCheckInData
.
fromJson
(
data
as
Json
);
});
return
requestNormal
(
APIPaths
.
rewardOpportunityOpenRequest
,
Method
.
POST
,
body
,
(
data
)
{
return
SubmitCheckInData
.
fromJson
(
data
as
Json
);
},
);
}
Future
<
BaseResponseModel
<
TransactionHistoryResponse
>>
getTransactionHistoryResponse
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
getTransactionOrderHistory
,
Method
.
GET
,
body
,
(
data
)
{
return
TransactionHistoryResponse
.
fromJson
(
data
as
Json
);
});
Future
<
BaseResponseModel
<
TransactionHistoryResponse
>>
getTransactionHistoryResponse
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
getTransactionOrderHistory
,
Method
.
GET
,
body
,
(
data
)
{
return
TransactionHistoryResponse
.
fromJson
(
data
as
Json
);
},
);
}
Future
<
BaseResponseModel
<
List
<
TransactionCategoryModel
>>>
getTransactionHistoryCategories
()
async
{
return
requestNormal
(
APIPaths
.
orderHistoryCategories
,
Method
.
GET
,
{},
(
data
)
{
Future
<
BaseResponseModel
<
List
<
TransactionCategoryModel
>>>
getTransactionHistoryCategories
()
async
{
return
requestNormal
(
APIPaths
.
orderHistoryCategories
,
Method
.
GET
,
{},
(
data
,
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
TransactionCategoryModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
CustomerContractModel
>>
customerContractRequestSearch
(
String
maKH
)
async
{
Future
<
BaseResponseModel
<
CustomerContractModel
>>
customerContractRequestSearch
(
String
maKH
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
'ma_khang'
:
maKH
};
return
requestNormal
(
APIPaths
.
customerContractRequestSearch
,
Method
.
POST
,
body
,
(
data
)
{
return
CustomerContractModel
.
fromJson
(
data
as
Json
);
});
return
requestNormal
(
APIPaths
.
customerContractRequestSearch
,
Method
.
POST
,
body
,
(
data
)
{
return
CustomerContractModel
.
fromJson
(
data
as
Json
);
},
);
}
Future
<
BaseResponseModel
<
List
<
CustomerContractModel
>>>
customerContractSearchHistoryGetList
()
async
{
Future
<
BaseResponseModel
<
List
<
CustomerContractModel
>>>
customerContractSearchHistoryGetList
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
};
return
requestNormal
(
APIPaths
.
customerContractSearchHistoryGetList
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
CustomerContractModel
.
fromJson
(
e
)).
toList
();
});
return
requestNormal
(
APIPaths
.
customerContractSearchHistoryGetList
,
Method
.
POST
,
body
,
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
CustomerContractModel
.
fromJson
(
e
)).
toList
();
},
);
}
Future
<
BaseResponseModel
<
bool
>>
customerContractDelete
(
String
maKHs
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
'ma_khang'
:
maKHs
};
return
requestNormal
(
APIPaths
.
customerContractDelete
,
Method
.
POST
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
customerContractDelete
,
Method
.
POST
,
body
,
(
data
,
)
{
return
data
==
true
;
});
}
Future
<
BaseResponseModel
<
HealthBookResponseModel
>>
getHealthBookCards
(
Json
body
)
async
{
Future
<
BaseResponseModel
<
HealthBookResponseModel
>>
getHealthBookCards
(
Json
body
,
)
async
{
return
requestNormal
(
APIPaths
.
getHealthBookCards
,
Method
.
GET
,
body
,
(
data
)
{
return
HealthBookResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
HealthBookCardItemModel
>>
getDetailHealthBookCard
(
String
id
)
async
{
Future
<
BaseResponseModel
<
HealthBookCardItemModel
>>
getDetailHealthBookCard
(
String
id
,
)
async
{
final
path
=
APIPaths
.
detailHealthBookCardDetail
.
replaceAll
(
"%@"
,
id
);
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
{
return
HealthBookCardItemModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
TrafficServiceResponseModel
>>
getProductVnTraSold
(
Json
body
)
async
{
return
requestNormal
(
APIPaths
.
getProductVnTraSold
,
Method
.
GET
,
body
,
(
data
)
{
return
TrafficServiceResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
TrafficServiceDetailModel
>>
getDetailMyPackageVnTra
(
String
id
)
async
{
Future
<
BaseResponseModel
<
TrafficServiceDetailModel
>>
getDetailMyPackageVnTra
(
String
id
,
)
async
{
final
path
=
APIPaths
.
detailMyPackageVnTra
.
replaceAll
(
"%@"
,
id
);
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
{
return
TrafficServiceDetailModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
submitPerformMission
(
Campaign7DayMissionModel
mission
,
String
id
)
async
{
final
path
=
APIPaths
.
submitCampaignMission
.
replaceFirst
(
'%@'
,
id
).
replaceFirst
(
'%@'
,
mission
.
id
.
toString
());
Future
<
BaseResponseModel
<
EmptyCodable
>>
submitPerformMission
(
Campaign7DayMissionModel
mission
,
String
id
,
)
async
{
final
path
=
APIPaths
.
submitCampaignMission
.
replaceFirst
(
'%@'
,
id
)
.
replaceFirst
(
'%@'
,
mission
.
id
.
toString
());
return
requestNormal
(
path
,
Method
.
POST
,
{},
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
Campaign7DayRewardModel
>>>
getCampaignRewards
(
String
id
)
async
{
Future
<
BaseResponseModel
<
List
<
Campaign7DayRewardModel
>>>
getCampaignRewards
(
String
id
,
)
async
{
final
path
=
APIPaths
.
getCampaignReward
.
replaceFirst
(
'%@'
,
id
);
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
{
final
list
=
data
as
List
<
dynamic
>;
...
...
@@ -857,7 +625,9 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
});
}
Future
<
BaseResponseModel
<
List
<
String
>>>
getCampaignLiveTransactions
(
String
id
)
async
{
Future
<
BaseResponseModel
<
List
<
String
>>>
getCampaignLiveTransactions
(
String
id
,
)
async
{
final
path
=
APIPaths
.
getCampaignLiveTransactions
.
replaceFirst
(
'%@'
,
id
);
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
{
if
(
data
is
List
)
{
...
...
@@ -867,40 +637,56 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
});
}
Future
<
BaseResponseModel
<
Campaign7DayInfoModel
>>
getCampaignMissions
(
String
id
)
async
{
Future
<
BaseResponseModel
<
Campaign7DayInfoModel
>>
getCampaignMissions
(
String
id
,
)
async
{
final
path
=
APIPaths
.
getCampaignMissions
.
replaceFirst
(
'%@'
,
id
);
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
{
return
Campaign7DayInfoModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
SurveyCampaignInfoModel
>>
getCampaignQuizSurvey
(
String
id
)
async
{
Future
<
BaseResponseModel
<
SurveyCampaignInfoModel
>>
getCampaignQuizSurvey
(
String
id
,
)
async
{
final
path
=
APIPaths
.
getQuizCampaign
.
replaceFirst
(
'%@'
,
id
);
return
requestNormal
(
path
,
Method
.
GET
,
{},
(
data
)
{
return
SurveyCampaignInfoModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
QuizCampaignSubmitResponseModel
>>
quizSubmitCampaign
(
String
id
,
Json
body
)
async
{
Future
<
BaseResponseModel
<
QuizCampaignSubmitResponseModel
>>
quizSubmitCampaign
(
String
id
,
Json
body
,
)
async
{
final
path
=
APIPaths
.
quizSubmitCampaign
.
replaceFirst
(
'%@'
,
id
);
return
requestNormal
(
path
,
Method
.
POST
,
body
,
(
data
)
{
return
QuizCampaignSubmitResponseModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
FlashSaleCategoryModel
>>>
getFlashSaleCategories
(
String
groupId
)
async
{
Future
<
BaseResponseModel
<
List
<
FlashSaleCategoryModel
>>>
getFlashSaleCategories
(
String
groupId
)
async
{
final
path
=
APIPaths
.
getFlashSaleGroup
.
replaceFirst
(
'%@'
,
groupId
);
return
requestNormal
(
path
,
Method
.
GET
,
const
{},
(
data
)
{
if
(
data
is
List
)
{
return
data
.
whereType
<
Map
<
String
,
dynamic
>>().
map
(
FlashSaleCategoryModel
.
fromJson
).
toList
();
return
data
.
whereType
<
Map
<
String
,
dynamic
>>()
.
map
(
FlashSaleCategoryModel
.
fromJson
)
.
toList
();
}
if
(
data
is
Map
<
String
,
dynamic
>)
{
final
categories
=
data
[
'categories'
]
??
data
[
'data'
]
??
data
[
'items'
];
if
(
categories
is
List
)
{
return
categories
.
whereType
<
Map
<
String
,
dynamic
>>().
map
(
FlashSaleCategoryModel
.
fromJson
).
toList
();
return
categories
.
whereType
<
Map
<
String
,
dynamic
>>()
.
map
(
FlashSaleCategoryModel
.
fromJson
)
.
toList
();
}
if
(
data
.
containsKey
(
'_id'
))
{
return
[
FlashSaleCategoryModel
.
fromJson
(
Map
<
String
,
dynamic
>.
from
(
data
))];
return
[
FlashSaleCategoryModel
.
fromJson
(
Map
<
String
,
dynamic
>.
from
(
data
)),
];
}
}
return
<
FlashSaleCategoryModel
>[];
...
...
@@ -939,7 +725,9 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
});
}
Future
<
BaseResponseModel
<
DevicesLogoutListResponse
>>
getLogoutDevices
(
Json
body
)
async
{
Future
<
BaseResponseModel
<
DevicesLogoutListResponse
>>
getLogoutDevices
(
Json
body
,
)
async
{
return
requestNormal
(
APIPaths
.
getLogoutDevices
,
Method
.
GET
,
body
,
(
data
)
{
return
DevicesLogoutListResponse
.
fromJson
(
data
as
Json
);
});
...
...
@@ -950,31 +738,43 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
return
requestNormal
(
path
,
Method
.
DELETE
,
{},
(
data
)
=>
data
as
String
);
}
Future
<
BaseResponseModel
<
InterestedCategoriesResponse
>>
categoryTopLevelGetList
()
async
{
Future
<
BaseResponseModel
<
InterestedCategoriesResponse
>>
categoryTopLevelGetList
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
"lang"
:
"vi"
};
return
requestNormal
(
APIPaths
.
categoryTopLevelGetList
,
Method
.
POST
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
categoryTopLevelGetList
,
Method
.
POST
,
body
,
(
data
,
)
{
return
InterestedCategoriesResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
submitCategorySubscribe
(
String
code
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
submitCategorySubscribe
(
String
code
,
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
'category_codes'
:
code
};
return
requestNormal
(
APIPaths
.
categorySubscribeList
,
Method
.
POST
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
categorySubscribeList
,
Method
.
POST
,
body
,
(
data
,
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
submitCategoryUnsubscribeList
(
String
code
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
submitCategoryUnsubscribeList
(
String
code
,
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
'category_codes'
:
code
};
return
requestNormal
(
APIPaths
.
categoryUnsubscribeList
,
Method
.
POST
,
body
,
(
data
)
{
return
requestNormal
(
APIPaths
.
categoryUnsubscribeList
,
Method
.
POST
,
body
,
(
data
,
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
ElectricPaymentResponseModel
>>
customerEvnPaymentGatewayRequest
(
Future
<
BaseResponseModel
<
ElectricPaymentResponseModel
>>
customerEvnPaymentGatewayRequest
(
CustomerContractModel
contract
,
String
paymentMethod
,
)
async
{
...
...
@@ -986,12 +786,18 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
'amount'
:
contract
.
amount
??
0
,
'payment_method'
:
paymentMethod
,
};
return
requestNormal
(
APIPaths
.
customerEvnPaymentGatewayRequest
,
Method
.
POST
,
body
,
(
data
)
{
return
ElectricPaymentResponseModel
.
fromJson
(
data
as
Json
);
});
return
requestNormal
(
APIPaths
.
customerEvnPaymentGatewayRequest
,
Method
.
POST
,
body
,
(
data
)
{
return
ElectricPaymentResponseModel
.
fromJson
(
data
as
Json
);
},
);
}
Future
<
BaseResponseModel
<
List
<
PopupManagerModel
>>>
getPopupManagerCommonScreen
()
async
{
Future
<
BaseResponseModel
<
List
<
PopupManagerModel
>>>
getPopupManagerCommonScreen
()
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"access_token"
:
token
,
"lang"
:
"vi"
};
return
requestNormal
(
APIPaths
.
getPopup
,
Method
.
POST
,
body
,
(
data
)
{
...
...
@@ -1000,33 +806,20 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
});
}
Future
<
BaseResponseModel
<
MyVoucherResponse
>>
getMyMobileCards
(
MyProductStatusType
status
,
Json
body
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
body
[
"access_token"
]
=
token
;
body
[
"product_model_code"
]
=
"PRODUCT_MODEL_MOBILE_CARD"
;
body
[
"list_order"
]
=
"DESC"
;
var
path
=
''
;
switch
(
status
)
{
case
MyProductStatusType
.
waiting
:
path
=
APIPaths
.
getMyProductGetWaitingList
;
case
MyProductStatusType
.
used
:
path
=
APIPaths
.
getMyProductGetUsedList
;
case
MyProductStatusType
.
expired
:
path
=
APIPaths
.
getMyProductGetExpiredList
;
}
return
requestNormal
(
path
,
Method
.
POST
,
body
,
(
data
)
{
return
MyVoucherResponse
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
List
<
BankAccountInfoModel
>>>
getOrderPaymentMyAccounts
()
async
{
return
requestNormal
(
APIPaths
.
orderPaymentMyAccounts
,
Method
.
GET
,
{},
(
data
)
{
Future
<
BaseResponseModel
<
List
<
BankAccountInfoModel
>>>
getOrderPaymentMyAccounts
()
async
{
return
requestNormal
(
APIPaths
.
orderPaymentMyAccounts
,
Method
.
GET
,
{},
(
data
,
)
{
final
list
=
data
as
List
<
dynamic
>;
return
list
.
map
((
e
)
=>
BankAccountInfoModel
.
fromJson
(
e
)).
toList
();
});
}
Future
<
BaseResponseModel
<
String
>>
setDefaultBankAccount
(
String
id
,
bool
isDefault
)
async
{
Future
<
BaseResponseModel
<
String
>>
setDefaultBankAccount
(
String
id
,
bool
isDefault
,
)
async
{
final
path
=
APIPaths
.
bankAccountSetDefault
.
replaceFirst
(
'%@'
,
id
);
final
body
=
{
"is_default"
:
isDefault
?
1
:
0
};
return
requestNormal
(
path
,
Method
.
POST
,
body
,
(
data
)
=>
data
as
String
);
...
...
@@ -1037,30 +830,47 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
return
requestNormal
(
path
,
Method
.
DELETE
,
{},
(
data
)
=>
data
as
String
);
}
Future
<
BaseResponseModel
<
TransactionSummaryByDateModel
>>
transactionGetSummaryByDate
(
Json
body
)
async
{
Future
<
BaseResponseModel
<
TransactionSummaryByDateModel
>>
transactionGetSummaryByDate
(
Json
body
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
body
[
"access_token"
]
=
token
;
return
requestNormal
(
APIPaths
.
transactionGetSummaryByDate
,
Method
.
POST
,
body
,
(
data
)
{
return
TransactionSummaryByDateModel
.
fromJson
(
data
as
Json
);
});
return
requestNormal
(
APIPaths
.
transactionGetSummaryByDate
,
Method
.
POST
,
body
,
(
data
)
{
return
TransactionSummaryByDateModel
.
fromJson
(
data
as
Json
);
},
);
}
Future
<
BaseResponseModel
<
ListHistoryResponseModel
>>
transactionHistoryGetList
(
Json
body
)
async
{
Future
<
BaseResponseModel
<
ListHistoryResponseModel
>>
transactionHistoryGetList
(
Json
body
,
)
async
{
String
?
token
=
DataPreference
.
instance
.
token
??
""
;
body
[
"access_token"
]
=
token
;
return
requestNormal
(
APIPaths
.
transactionHistoryGetList
,
Method
.
POST
,
body
,
(
data
)
{
return
ListHistoryResponseModel
.
fromJson
(
data
as
Json
);
});
return
requestNormal
(
APIPaths
.
transactionHistoryGetList
,
Method
.
POST
,
body
,
(
data
)
{
return
ListHistoryResponseModel
.
fromJson
(
data
as
Json
);
},
);
}
Future
<
BaseResponseModel
<
DirectionalScreen
>>
getDirectionOfflineBrand
(
String
id
)
async
{
Future
<
BaseResponseModel
<
DirectionalScreen
>>
getDirectionOfflineBrand
(
String
id
,
)
async
{
final
body
=
{
"bank_account"
:
id
};
return
requestNormal
(
APIPaths
.
getOfflineBrand
,
Method
.
GET
,
body
,
(
data
)
{
return
DirectionalScreen
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
pushNotificationDeviceUpdateToken
(
String
token
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
pushNotificationDeviceUpdateToken
(
String
token
,
)
async
{
var
deviceKey
=
await
DeviceInfo
.
getDeviceId
();
final
details
=
await
DeviceInfo
.
getDetails
();
String
?
accessToken
=
DataPreference
.
instance
.
token
??
""
;
...
...
@@ -1071,59 +881,53 @@ extension RestfulAPIClientAllRequest on RestfulAPIClient {
body
[
"lang"
]
=
'vi'
;
body
[
"software_type"
]
=
"Application"
;
body
[
"software_model"
]
=
"MyPoint"
;
return
requestNormal
(
APIPaths
.
pushNotificationDeviceUpdateToken
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
myProductMarkAsUsed
(
String
id
)
async
{
String
?
accessToken
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"product_item_id"
:
id
,
"lang"
:
"vi"
,
"access_token"
:
accessToken
,
};
return
requestNormal
(
APIPaths
.
myProductMarkAsUsed
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
myProductMarkAsNotUsedYet
(
String
id
)
async
{
String
?
accessToken
=
DataPreference
.
instance
.
token
??
""
;
final
body
=
{
"product_item_id"
:
id
,
"lang"
:
"vi"
,
"access_token"
:
accessToken
,
};
return
requestNormal
(
APIPaths
.
myProductMarkAsNotUsedYet
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
return
requestNormal
(
APIPaths
.
pushNotificationDeviceUpdateToken
,
Method
.
POST
,
body
,
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
},
);
}
Future
<
BaseResponseModel
<
DirectionalScreen
>>
getDirectionScreen
(
String
path
)
async
{
Future
<
BaseResponseModel
<
DirectionalScreen
>>
getDirectionScreen
(
String
path
,
)
async
{
var
path_
=
path
.
startsWith
(
'/'
)
?
path
:
'/
$path
'
;
return
requestNormal
(
path_
,
Method
.
GET
,
{},
(
data
)
{
return
DirectionalScreen
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
EmptyCodable
>>
submitShareContent
(
String
path
)
async
{
Future
<
BaseResponseModel
<
EmptyCodable
>>
submitShareContent
(
String
path
,
)
async
{
var
path_
=
path
.
startsWith
(
'/'
)
?
path
:
'/
$path
'
;
return
requestNormal
(
path_
,
Method
.
GET
,
{},
(
data
)
{
return
EmptyCodable
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
VerifyRegisterCampaignModel
>>
verifyRegisterForm
(
String
path
,
Json
body
)
async
{
Future
<
BaseResponseModel
<
VerifyRegisterCampaignModel
>>
verifyRegisterForm
(
String
path
,
Json
body
,
)
async
{
var
path_
=
path
.
startsWith
(
'/'
)
?
path
:
'/
$path
'
;
return
requestNormal
(
path_
,
Method
.
POST
,
body
,
(
data
)
{
return
VerifyRegisterCampaignModel
.
fromJson
(
data
as
Json
);
});
}
Future
<
BaseResponseModel
<
SubmitViewVoucherCompletedResponse
>>
submitCampaignViewVoucherComplete
()
async
{
return
requestNormal
(
APIPaths
.
submitCampaignViewVoucherComplete
,
Method
.
POST
,
{},
(
data
)
{
return
SubmitViewVoucherCompletedResponse
.
fromJson
(
data
as
Json
);
});
Future
<
BaseResponseModel
<
SubmitViewVoucherCompletedResponse
>>
submitCampaignViewVoucherComplete
()
async
{
return
requestNormal
(
APIPaths
.
submitCampaignViewVoucherComplete
,
Method
.
POST
,
{},
(
data
)
{
return
SubmitViewVoucherCompletedResponse
.
fromJson
(
data
as
Json
);
},
);
}
}
lib/preference/data_preference.dart
View file @
a6797435
...
...
@@ -23,9 +23,7 @@ class DataPreference {
try
{
_loginToken
=
LoginTokenResponseModel
.
fromJson
(
jsonDecode
(
tokenJson
));
}
catch
(
e
)
{
if
(
kDebugMode
)
{
print
(
'Failed to parse login token:
$e
'
);
}
debugPrint
(
'Failed to parse login token:
$e
'
);
// Clear invalid token
await
prefs
.
remove
(
'login_token'
);
}
...
...
@@ -36,17 +34,13 @@ class DataPreference {
_profile
=
ProfileResponseModel
.
fromJson
(
jsonDecode
(
profileJson
));
phoneNumberUsedForLoginScreen
=
_profile
?.
workerSite
?.
phoneNumber
??
""
;
}
catch
(
e
)
{
if
(
kDebugMode
)
{
print
(
'Failed to parse user profile:
$e
'
);
}
debugPrint
(
'Failed to parse user profile:
$e
'
);
// Clear invalid profile
await
prefs
.
remove
(
'user_profile'
);
}
}
}
catch
(
e
)
{
if
(
kDebugMode
)
{
print
(
'DataPreference init failed:
$e
'
);
}
debugPrint
(
'DataPreference init failed:
$e
'
);
}
}
String
get
displayName
{
...
...
@@ -109,9 +103,7 @@ class DataPreference {
try
{
return
jsonDecode
(
jsonString
)
as
String
?;
}
catch
(
e
)
{
if
(
kDebugMode
)
{
print
(
'Failed to parse bio token for
$phone
:
$e
'
);
}
debugPrint
(
'Failed to parse bio token for
$phone
:
$e
'
);
// Clear invalid bio token
await
prefs
.
remove
(
'biometric_login_token_
$phone
'
);
return
null
;
...
...
@@ -119,9 +111,7 @@ class DataPreference {
}
return
null
;
}
catch
(
e
)
{
if
(
kDebugMode
)
{
print
(
'getBioToken failed for
$phone
:
$e
'
);
}
debugPrint
(
'getBioToken failed for
$phone
:
$e
'
);
return
null
;
}
}
...
...
lib/screen/affiliate/affiliate_overview.dart
View file @
a6797435
import
'package:flutter/material.dart'
;
import
'package:flutter_widget_from_html/flutter_widget_from_html.dart'
;
import
'package:flutter_widget_from_html
_core
/flutter_widget_from_html
_core
.dart'
;
class
AffiliateOverviewPopup
extends
StatelessWidget
{
final
List
<
String
>
descriptions
;
...
...
lib/screen/affiliate/affiliate_tab_viewmodel.dart
View file @
a6797435
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'
;
import
'package:mypoint_flutter_app/networking/api/affiliate_api.dart'
deferred
as
affiliate_api
;
import
'../../base/base_response_model.dart'
;
import
'../../networking/restful_api_viewmodel.dart'
;
import
'model/affiliate_brand_model.dart'
;
import
'model/affiliate_category_model.dart'
;
...
...
@@ -16,10 +17,22 @@ class AffiliateTabViewModel extends RestfulApiViewModel {
final
Rxn
<
CashbackOverviewModel
>
overview
=
Rxn
<
CashbackOverviewModel
>();
void
Function
((
List
<
AffiliateBrandModel
>,
String
)
data
)?
onShowAffiliateBrandPopup
;
bool
_affiliateLibLoaded
=
false
;
Future
<
void
>
_ensureAffiliateLibraryLoaded
()
async
{
if
(
_affiliateLibLoaded
)
return
;
await
affiliate_api
.
loadLibrary
();
_affiliateLibLoaded
=
true
;
}
Future
<
BaseResponseModel
<
T
>>
_callAffiliate
<
T
>(
Future
<
BaseResponseModel
<
T
>>
Function
(
dynamic
api
)
fn
)
async
{
await
_ensureAffiliateLibraryLoaded
();
final
api
=
affiliate_api
.
AffiliateApi
(
client
);
return
fn
(
api
);
}
bool
get
isDataAvailable
{
return
affiliateBrands
.
isNotEmpty
||
affiliateCategories
.
isNotEmpty
||
affiliateProducts
.
isNotEmpty
;
return
affiliateBrands
.
isNotEmpty
||
affiliateCategories
.
isNotEmpty
||
affiliateProducts
.
isNotEmpty
;
}
Future
<
void
>
refreshData
({
bool
isShowLoading
=
true
})
async
{
...
...
@@ -36,7 +49,7 @@ class AffiliateTabViewModel extends RestfulApiViewModel {
Future
<
void
>
_getAffiliateBrandGetList
()
async
{
await
callApi
<
List
<
AffiliateBrandModel
>>(
request:
()
=>
client
.
affiliateBrandGetList
(),
request:
()
=>
_callAffiliate
((
api
)
=>
api
.
affiliateBrandGetList
()
)
,
onSuccess:
(
data
,
_
)
{
affiliateBrands
.
assignAll
(
data
);
},
...
...
@@ -49,12 +62,9 @@ class AffiliateTabViewModel extends RestfulApiViewModel {
Future
<
void
>
_getAffiliateCategoryGetList
()
async
{
await
callApi
<
List
<
AffiliateCategoryModel
>>(
request:
()
=>
client
.
affiliateCategoryGetList
(),
request:
()
=>
_callAffiliate
((
api
)
=>
api
.
affiliateCategoryGetList
()
)
,
onSuccess:
(
data
,
_
)
{
final
category
=
AffiliateCategoryModel
(
code:
AffiliateCategoryType
.
other
,
name:
"Khác"
,
);
final
category
=
AffiliateCategoryModel
(
code:
AffiliateCategoryType
.
other
,
name:
"Khác"
);
final
results
=
data
;
allAffiliateCategories
.
assignAll
(
results
);
...
...
@@ -72,11 +82,11 @@ class AffiliateTabViewModel extends RestfulApiViewModel {
Future
<
void
>
_getAffiliateProductTopSale
()
async
{
await
callApi
<
List
<
AffiliateProductTopSaleModel
>>(
request:
()
=>
client
.
affiliateProductTopSale
(),
request:
()
=>
_callAffiliate
((
api
)
=>
api
.
affiliateProductTopSale
()
)
,
onSuccess:
(
data
,
_
)
{
affiliateProducts
.
assignAll
(
data
);
},
onFailure:
(
msg
,
_
,
_
_
)
async
{
onFailure:
(
msg
,
_
,
_
)
async
{
affiliateProducts
.
clear
();
},
withLoading:
false
,
...
...
@@ -85,7 +95,7 @@ class AffiliateTabViewModel extends RestfulApiViewModel {
Future
<
void
>
_getAffiliateOverview
()
async
{
await
callApi
<
CashbackOverviewModel
>(
request:
()
=>
client
.
getCashBackOverview
(),
request:
()
=>
_callAffiliate
((
api
)
=>
api
.
getCashBackOverview
()
)
,
onSuccess:
(
data
,
_
)
{
overview
.
value
=
data
;
},
...
...
@@ -98,7 +108,10 @@ class AffiliateTabViewModel extends RestfulApiViewModel {
Future
<
void
>
affiliateBrandGetListBuyCategory
(
AffiliateCategoryModel
category
)
async
{
await
callApi
<
List
<
AffiliateBrandModel
>>(
request:
()
=>
client
.
affiliateBrandGetList
(
categoryCode:
AffiliateCategoryModel
.
codeToJson
(
category
.
code
)),
request:
()
=>
_callAffiliate
(
(
api
)
=>
api
.
affiliateBrandGetList
(
categoryCode:
AffiliateCategoryModel
.
codeToJson
(
category
.
code
)),
),
onSuccess:
(
data
,
_
)
{
if
(
data
.
isNotEmpty
)
{
onShowAffiliateBrandPopup
?.
call
((
data
,
category
.
name
??
''
));
...
...
@@ -106,4 +119,4 @@ class AffiliateTabViewModel extends RestfulApiViewModel {
},
);
}
}
\ No newline at end of file
}
lib/screen/affiliate_brand_detail/affiliate_brand_detail_viewmodel.dart
View file @
a6797435
import
'package:get/get.dart'
;
import
'package:mypoint_flutter_app/configs/constants.dart'
;
import
'package:mypoint_flutter_app/networking/api/affiliate_api.dart'
deferred
as
affiliate_api
;
import
'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'
;
import
'../../networking/restful_api_viewmodel.dart'
;
import
'models/affiliate_brand_detail_model.dart'
;
class
AffiliateBrandDetailViewModel
extends
RestfulApiViewModel
{
final
String
brandId
;
AffiliateBrandDetailViewModel
(
this
.
brandId
);
void
Function
(
String
message
)?
onShowAlertError
;
final
Rxn
<
AffiliateBrandDetailModel
>
brandDetailData
=
Rxn
<
AffiliateBrandDetailModel
>();
final
Rxn
<
AffiliateBrandDetailModel
>
brandDetailData
=
Rxn
<
AffiliateBrandDetailModel
>();
bool
_affiliateLibLoaded
=
false
;
Future
<
void
>
_ensureAffiliateLibraryLoaded
()
async
{
if
(
_affiliateLibLoaded
)
return
;
await
affiliate_api
.
loadLibrary
();
_affiliateLibLoaded
=
true
;
}
@override
void
onInit
()
{
...
...
@@ -19,7 +32,11 @@ class AffiliateBrandDetailViewModel extends RestfulApiViewModel {
Future
<
void
>
_fetchDetail
()
async
{
await
callApi
<
AffiliateBrandDetailModel
>(
request:
()
=>
client
.
getAffiliateBrandDetail
(
brandId
),
request:
()
async
{
await
_ensureAffiliateLibraryLoaded
();
final
api
=
affiliate_api
.
AffiliateApi
(
client
);
return
api
.
getAffiliateBrandDetail
(
brandId
);
},
onSuccess:
(
data
,
_
)
{
brandDetailData
.
value
=
data
;
},
...
...
lib/screen/affiliate_brand_detail/affiliate_category_grid_viewmodel.dart
View file @
a6797435
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:mypoint_flutter_app/configs/constants.dart'
;
import
'package:mypoint_flutter_app/networking/api/affiliate_api.dart'
deferred
as
affiliate_api
;
import
'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'
;
import
'../../networking/restful_api_viewmodel.dart'
;
import
'../affiliate/model/affiliate_brand_model.dart'
;
import
'../affiliate/model/affiliate_category_model.dart'
;
class
AffiliateCategoryGridViewModel
extends
RestfulApiViewModel
{
void
Function
((
List
<
AffiliateBrandModel
>,
String
)
data
)?
onShowAffiliateBrandPopup
;
void
Function
((
List
<
AffiliateBrandModel
>,
String
)
data
)?
onShowAffiliateBrandPopup
;
void
Function
(
String
message
)?
onShowAlertError
;
Future
<
void
>
affiliateBrandGetListBuyCategory
(
AffiliateCategoryModel
category
)
async
{
bool
_affiliateLibLoaded
=
false
;
Future
<
void
>
_ensureAffiliateLibraryLoaded
()
async
{
if
(
_affiliateLibLoaded
)
return
;
await
affiliate_api
.
loadLibrary
();
_affiliateLibLoaded
=
true
;
}
Future
<
void
>
affiliateBrandGetListBuyCategory
(
AffiliateCategoryModel
category
,
)
async
{
await
callApi
<
List
<
AffiliateBrandModel
>>(
request:
()
=>
client
.
affiliateBrandGetList
(
categoryCode:
AffiliateCategoryModel
.
codeToJson
(
category
.
code
),
),
request:
()
async
{
await
_ensureAffiliateLibraryLoaded
();
final
api
=
affiliate_api
.
AffiliateApi
(
client
);
return
api
.
affiliateBrandGetList
(
categoryCode:
AffiliateCategoryModel
.
codeToJson
(
category
.
code
),
);
},
onSuccess:
(
data
,
_
)
{
if
(
data
.
isNotEmpty
)
{
onShowAffiliateBrandPopup
?.
call
((
data
,
category
.
name
??
''
));
...
...
@@ -24,4 +41,4 @@ class AffiliateCategoryGridViewModel extends RestfulApiViewModel {
},
);
}
}
\ No newline at end of file
}
lib/screen/bank_account_manager/bank_account_manager_screen.dart
View file @
a6797435
import
'package:flutter/foundation.dart'
;
import
'package:flutter/material.dart'
;
import
'package:get/get.dart'
;
import
'package:mypoint_flutter_app/widgets/custom_empty_widget.dart'
;
...
...
@@ -35,7 +36,7 @@ class _BankAccountManagerScreenState extends State<BankAccountManagerScreen> {
await
Get
.
to
(()
=>
BankAccountDetailScreen
(
model:
viewModel
.
bankAccounts
.
value
[
index
],
));
p
rint
(
"reload getBankAccountList"
);
debugP
rint
(
"reload getBankAccountList"
);
viewModel
.
getBankAccountList
();
}),
),
...
...
lib/screen/biometric/biometric_viewmodel.dart
View file @
a6797435
import
'package:flutter/foundation.dart'
;
import
'package:get/get.dart'
;
import
'package:local_auth/local_auth.dart'
;
import
'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'
;
...
...
@@ -27,7 +28,7 @@ class BiometricViewModel extends RestfulApiViewModel {
biometricType
.
value
=
BiometricType
.
fingerprint
;
}
}
catch
(
e
)
{
p
rint
(
"Lỗi kiểm tra sinh trắc học:
$e
"
);
debugP
rint
(
"Lỗi kiểm tra sinh trắc học:
$e
"
);
}
}
...
...
Prev
1
2
3
4
5
6
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment