ApiProvider
unknown
dart
3 years ago
56 kB
8
Indexable
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:base_architecture/data_layer/api/dio_interceptor.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/add_to_library_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/categories_selections.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/change_password_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/main_categories_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/put_mark_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/recover_password_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/search_query_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/social_login_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/update_password_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/arab_settings_model.dart';
import 'package:base_architecture/data_layer/models/api_models/book_details_model.dart';
import 'package:base_architecture/data_layer/models/api_models/categories_model.dart';
import 'package:base_architecture/data_layer/models/api_models/contributors.dart';
import 'package:base_architecture/data_layer/models/api_models/favourite_categories_model.dart';
import 'package:base_architecture/data_layer/models/api_models/home_main_categories_model.dart';
import 'package:base_architecture/data_layer/models/api_models/home_strips_model.dart';
import 'package:base_architecture/data_layer/models/api_models/is_following_model.dart';
import 'package:base_architecture/data_layer/models/api_models/search_result_model.dart';
import 'package:base_architecture/data_layer/models/api_models/see_more_model.dart';
import 'package:base_architecture/data_layer/models/banner_model.dart';
import 'package:base_architecture/data_layer/models/comments_model.dart';
import 'package:base_architecture/presentation/notifiers/auth_notifier/auth_notifier.dart';
import 'package:base_architecture/presentation/notifiers/bottom_nav_bar_notifier.dart/bottom_nav_bar_notifier.dart';
import 'package:base_architecture/presentation/notifiers/contact_us_notifier/contact_us_notifier.dart';
import 'package:base_architecture/presentation/pages/terms_page/pop_up_terms_page/pop_up_terms_page.dart';
import 'package:dio/dio.dart' as m_part;
import 'package:dio/dio.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:rx_shared_preferences/rx_shared_preferences.dart';
import 'package:base_architecture/core/enums/dialog_path_enum.dart';
import 'package:base_architecture/core/shared_widgets/custom_dialog.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/login_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/register_dto.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/verify_otp_dto.dart';
import 'package:base_architecture/data_layer/models/app_user_model/app_user_model.dart';
import 'package:base_architecture/data_layer/models/api_models/countries_list.dart';
import 'package:base_architecture/presentation/pages/bottom_navigation_bar/bottom_nav_bar.dart';
import 'package:base_architecture/presentation/pages/main/main_page.dart';
import 'package:base_architecture/presentation/pages/phone_verification_page/phone_verification_page.dart';
import 'package:base_architecture/presentation/pages/phone_verification_page/widgets/success_dialog.dart';
import 'package:base_architecture/presentation/props/phone_verification_props.dart';
class ApiProvider {
ApiProvider({required this.httpClient}) {
httpClient.interceptors.add(DioInterceptors(httpClient));
}
String baseUrl = 'https://arabcast.nqa.nadsoft.co/api/v1/';
final Dio httpClient;
Future registerUser(RegisterationDto param, List<File> posts) async {
m_part.FormData form = m_part.FormData.fromMap({
'first_name': param.firstName,
'last_name': param.lastName,
'gender': param.gender,
'dob': param.dob,
'mobile': param.mobile,
'email': param.email,
'password': param.password,
'confirm_password': param.confirmPassword,
'country_id': param.countryId,
'disable[]': param.disable,
'iso_code': param.isoCode,
'phone_code': param.phoneCode,
'condition_accepted': param.conditionAccepted,
});
for (final File post in posts) {
form.files.add(
MapEntry(
'files[]',
m_part.MultipartFile.fromBytes(
post.readAsBytesSync(),
filename: post.path.split('/').last,
),
),
);
}
try {
await httpClient
.post(
baseUrl + 'register',
data: form,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
),
)
.then(
(m_part.Response value) async {
if (value.statusCode == 200) {
await showDialog(
context: navigatorKey.currentContext!,
builder: (BuildContext context) {
Future.delayed(
const Duration(
seconds: 5,
),
() {
Navigator.of(context).pop();
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
PhoneVerificationPage(
props: PhoneVerificationProps(
phoneNumber: param.mobile!,
pathEnum: DialogPathEnum.introPage,
),
),
),
);
},
);
return CustomDialog(
assetPath: 'assets/svg/icSentImage.svg',
header:
'We have sent a message to your phone to complete the registration',
body: value.data['custom_message'],
hasButton: false,
);
},
);
}
return value;
},
);
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'].toString()),
backgroundColor: Colors.red,
),
);
}
}
Future<int?> checkUserSocial(SocialLoginDto param) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
int? statusCode;
m_part.FormData form = m_part.FormData.fromMap({
'provider': param.provider,
'provider_id': param.providerId,
'access_provider_token': param.accessProviderToken,
'email': param.email,
});
log(param.toJson().toString());
try {
m_part.Response response = await httpClient.post(
baseUrl + 'social/login',
data: form,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
),
);
if (response.statusCode == 200) {
await rxPrefs.setString(
'token',
response.data['token_data']['token'],
);
// await rxPrefs.setString(
// 'refresh_token',
// response.data['token_data']['refresh_token'],
// );
// await rxPrefs.setString(
// 'server_time',
// response.data['token_data']['server_time'],
// );
await getUserDataByToken(
response.data['token_data']['token'],
);
}
statusCode = response.statusCode;
return statusCode;
} on DioError catch (e) {
// log(e.error);
statusCode = e.response!.statusCode;
return statusCode;
}
}
Future sociaLogin(SocialLoginDto param, List<File> posts) async {
m_part.FormData form = m_part.FormData.fromMap({
'provider': param.provider,
'provider_id': param.providerId,
'access_provider_token': param.accessProviderToken,
'first_name': param.firstName,
'last_name': param.lastName,
'gender': param.gender,
'dob': param.dob,
'mobile': param.mobile,
'email': param.email,
'country_id': param.countryId,
'disable[]': param.disable,
'iso_code': param.isoCode,
'phone_code': param.phoneCode,
'condition_accepted': param.conditionAccepted,
});
for (final File post in posts) {
form.files.add(
MapEntry(
'files[]',
m_part.MultipartFile.fromBytes(
post.readAsBytesSync(),
filename: post.path.split('/').last,
),
),
);
}
try {
m_part.Response response = await httpClient.post(
baseUrl + 'social/login',
data: form,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
),
);
if (response.statusCode == 200) {
await showDialog(
context: navigatorKey.currentContext!,
builder: (BuildContext context) {
Future.delayed(
const Duration(
seconds: 5,
),
() {
Navigator.of(context).pop();
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => PhoneVerificationPage(
props: PhoneVerificationProps(
phoneNumber: param.mobile!,
pathEnum: DialogPathEnum.introPage,
),
),
),
);
},
);
return CustomDialog(
assetPath: 'assets/svg/icSentImage.svg',
header:
'We have sent a message to your phone to complete the registration',
body: response.data['custom_message'],
hasButton: false,
);
},
);
} else if (response.statusCode == 412) {}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
}
}
Future verifyUser(VerifyOtpDto param, List<File> posts) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final AppUser appUser = AppUser();
m_part.FormData form = m_part.FormData.fromMap(
{
'provider': param.provider,
'provider_id': param.providerId,
'first_name': param.firstName,
'last_name': param.lastName,
'gender': param.gender,
'dob': param.dob,
'mobile': param.mobile,
'email': param.email,
'password': param.password,
'confirm_password': param.confirmPassword,
'country_id': param.countryId,
'iso_code': param.isoCode,
'disable[]': param.disable,
'phone_code': param.phoneCode,
'condition_accepted': param.conditionAccepted,
'code': param.code,
},
);
for (final File post in posts) {
form.files.add(
MapEntry(
'files[]',
m_part.MultipartFile.fromBytes(
post.readAsBytesSync(),
filename: post.path.split('/').last,
),
),
);
}
try {
m_part.Response response = await httpClient.post(
baseUrl + 'verify-mobile',
data: form,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
),
);
if (response.statusCode == 200) {
await rxPrefs.setString(
'token',
response.data['token_data']['token'],
);
await getUserDataByToken(
response.data['token_data']['token'],
path: DialogPathEnum.introPage,
);
return appUser;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
return e;
}
}
Future verifySocialUser(VerifyOtpDto param, List<File> posts) async {
final AppUser appUser = AppUser();
m_part.FormData form = m_part.FormData.fromMap(
{
'provider': param.provider,
'provider_id': param.providerId,
'access_provider_token': param.accessProviderToken,
'first_name': param.firstName,
'last_name': param.lastName,
'gender': param.gender,
'dob': param.dob,
'mobile': param.mobile,
'email': param.email,
'country_id': param.countryId,
'iso_code': param.isoCode,
'disable[]': param.disable,
'phone_code': param.phoneCode,
'code': param.code,
},
);
for (final File post in posts) {
form.files.add(
MapEntry(
'files[]',
m_part.MultipartFile.fromBytes(
post.readAsBytesSync(),
filename: post.path.split('/').last,
),
),
);
}
try {
m_part.Response response = await httpClient.post(
baseUrl + 'verify-mobile',
data: form,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
),
);
if (response.statusCode == 200) {
return appUser;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
return e;
}
}
providerLogin(AppUserDto param) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final AppUser appUser = AppUser();
BottomNavBarNotifier barNotifier = Provider.of<BottomNavBarNotifier>(
navigatorKey.currentContext!,
listen: false,
);
try {
m_part.Response response = await httpClient.post(
baseUrl + 'login',
data: param.toJson(),
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
);
if (response.statusCode == 200) {
await rxPrefs.setString(
'token',
response.data['token_data']['token'],
);
await getUserDataByToken(
response.data['token_data']['token'],
).then((value) async {
barNotifier.setSelectedIndexToHomeTab();
await Navigator.pushReplacement(
navigatorKey.currentContext!,
MaterialPageRoute(
builder: (BuildContext context) => const BottomNavBar(),
),
);
});
return appUser;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
return appUser;
}
}
// FOR LOGIN AND REGISTERATION
Future getUserDataByToken(String token, {DialogPathEnum? path}) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final AuthNotifier authNotifier = Provider.of<AuthNotifier>(
navigatorKey.currentContext!,
listen: false,
);
AppUser appUser = AppUser();
try {
m_part.Response response = await httpClient.get(
baseUrl + 'users/user-account',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
);
if (response.statusCode == 200) {
await getArabSettings();
appUser = AppUser.fromJson(response.data['data']);
if (response.data['token_data']['last_condition_accepted'] == true) {
authNotifier.setAppUser(appUser);
await rxPrefs.setBool('onBoard', false);
if (path == DialogPathEnum.introPage) {
await showDialog(
context: navigatorKey.currentContext!,
builder: (BuildContext context) => const SuccessDialog(
pathEnum: DialogPathEnum.introPage,
title: 'Registration completed successfully',
description:
'In the library, guests can listen, read books and listen to podcasts.',
),
);
} else {}
} else {
// pop view
await Navigator.of(navigatorKey.currentContext!).push(
MaterialPageRoute(
fullscreenDialog: true,
builder: (BuildContext context) =>
const PopUpTermsAndConditionsPage(),
),
);
}
}
} on DioError catch (e) {
await AuthNotifier().resetAppUser();
return appUser;
}
return appUser;
}
acceptTerms() async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.post(
baseUrl + 'users/accept-conditions',
options: Options(
headers: {},
),
);
if (response.statusCode == 200) {
} else {}
} on DioError catch (e) {
return e;
}
}
// FOR UPDATING ACCOUNT
getUserDataByTokenAccount(String token) async {
final AuthNotifier authNotifier = Provider.of<AuthNotifier>(
navigatorKey.currentContext!,
listen: false,
);
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
AppUser appUser = AppUser();
try {
m_part.Response response = await httpClient.get(
baseUrl + 'users/user-account',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
);
if (response.statusCode == 200) {
await rxPrefs.setString(
'token',
response.data['token_data']['token'],
);
appUser = AppUser.fromJson(response.data['data']);
authNotifier.setAppUser(appUser);
} else {}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
}
return appUser;
}
Future<int> recoverPassword(RecoverPasswordDto param) async {
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'password-recovery',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
data: param.toJson(),
);
if (response.statusCode == 200) {
statusCode = response.statusCode!;
return statusCode;
}
} on DioError catch (e) {
statusCode = e.response!.statusCode!;
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
return statusCode;
}
return statusCode ?? 0;
}
Future<int> verifyPasswordOtp(RecoverPasswordDto param) async {
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'password-verify',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
data: param.toJson(),
);
if (response.statusCode == 200) {
statusCode = response.statusCode!;
return statusCode;
}
} on DioError catch (e) {
statusCode = e.response!.statusCode!;
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
return statusCode;
}
return statusCode ?? 0;
}
Future<int> updatePassword(UpdatePasswordDto param) async {
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'update-password',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
data: param.toJson(),
);
if (response.statusCode == 200) {
statusCode = response.statusCode!;
return statusCode;
}
} on DioError catch (e) {
statusCode = e.response!.statusCode!;
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
return statusCode;
}
return statusCode ?? 0;
}
Future<CountriesList?> getAllCountries() async {
m_part.Response response = await httpClient.get(
baseUrl + 'countries',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
);
if (response.statusCode == 200) {
final Map<String, dynamic> validMap =
json.decode(json.encode(response.data)) as Map<String, dynamic>;
CountriesList resp = CountriesList.fromJson(validMap);
return resp;
}
return null;
}
Future<FavouriteCategoriesModel> getAllFavCategories() async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
m_part.Response response = await httpClient.get(
baseUrl + 'categories/main-categories',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
FavouriteCategoriesModel resp =
FavouriteCategoriesModel.fromJson(validMap);
return resp;
}
return response.data;
}
postFavCategories(MainCategoriesDto param) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.post(
baseUrl + 'categories/fav-categories',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
data: param.toJson(),
);
if (response.statusCode == 200) {
await Navigator.pushReplacement(
navigatorKey.currentContext!,
MaterialPageRoute(
builder: (BuildContext context) => const BottomNavBar(),
),
);
}
} on DioError catch (e) {
return e;
}
}
Future<int?> verifyEmail(String token) async {
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'verify-email',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
);
if (response.statusCode == 200) {
statusCode = response.statusCode;
return statusCode;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
}
return statusCode ?? 2;
}
Future<int?> verifyCompare(String token, VerifyOtpDto pincode) async {
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'verify-compare',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
data: pincode.toJson(),
);
if (response.statusCode == 200) {
statusCode = response.statusCode;
return statusCode;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
}
return statusCode ?? 2;
}
Future<int?> changePassword(String token, ChangePasswordDto param) async {
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'users/change-password',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
data: param.toJson(),
);
if (response.statusCode == 200) {
statusCode = response.statusCode;
return statusCode;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
}
return statusCode ?? 2;
}
Future<int?> updateMobile(String token, VerifyOtpDto param) async {
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'users/update-mobile',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
data: param.toJson(),
);
if (response.statusCode == 200) {
statusCode = response.statusCode;
return statusCode;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.statusCode.toString()),
backgroundColor: Colors.red,
),
);
}
return statusCode ?? 2;
}
Future<int?> verifyUpdatePhone(String token, VerifyOtpDto param) async {
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'users/verify-mobile',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
data: param.toJson(),
);
if (response.statusCode == 200) {
getUserDataByTokenAccount(token);
statusCode = response.statusCode;
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(response.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.green,
),
);
return statusCode;
}
} on DioError catch (e) {
print('object');
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text('NP'),
backgroundColor: Colors.red,
),
);
}
return statusCode ?? 2;
}
Future<int?> updateAccount(
String? token,
RegisterationDto param,
List<Map<String, dynamic>> posts,
List<int> removed_ids,
) async {
int? statusCode;
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
m_part.FormData form = m_part.FormData.fromMap({
'first_name': param.firstName,
'last_name': param.lastName,
'dob': param.dob,
'email': param.email,
'country_id': param.countryId,
'removed_files[]': removed_ids,
'files[]': param.files,
});
log(jsonEncode(removed_ids));
for (final Map<String, dynamic> post in posts) {
form.files.add(
MapEntry(
'files[]',
m_part.MultipartFile.fromBytes(
post['file_path'].readAsBytesSync(),
filename: post['file_path'].path.split('/').last,
),
),
);
}
try {
m_part.Response response = await httpClient.post(
baseUrl + 'users/user-account',
data: form,
queryParameters: {},
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'multipart/form-data',
'token': token,
},
),
);
if (response.statusCode == 200) {
statusCode = response.statusCode;
await rxPrefs.setString(
'token',
response.data['token_data']['token'],
);
await getUserDataByTokenAccount(
response.data['token_data']['token'],
);
return statusCode;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
print(e.response!);
}
return statusCode ?? 2;
}
Future<SearchResultModel> simpleSearch(SearchQueryDto query) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'books/filter',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'multipart/form-data',
'token': token,
},
),
queryParameters: {
'keyword': query.keyword,
'sort': query.sort,
'category_id': query.categoryId,
'author_id': query.authorId,
'reader_id': query.readerId,
'publisher_id': query.publisherId,
'translator_id': query.translatorId,
'length_book': query.lengthBook,
'publication_date': query.publicationDate,
'format': query.format,
'rate': query.rate,
'type': query.type,
'book_lang': query.bookLang
},
);
if (response.statusCode == 200) {
final Map<String, dynamic> validMap =
json.decode(json.encode(response.data)) as Map<String, dynamic>;
SearchResultModel resp = SearchResultModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
return e.response!.data;
}
}
Future<HomeMainCategoriesModel> getHomeCategories(
int limit,
int offset,
) async {
try {
m_part.Response response = await httpClient.get(
baseUrl + 'categories/home',
options: Options(
headers: {
'accept': 'application/json',
},
),
queryParameters: {'limit': limit, 'offset': 0},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
HomeMainCategoriesModel resp =
HomeMainCategoriesModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
return e.response!.data;
}
}
Future<SeeMoreModel> seeMoreRecentBooks() async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'books/last-added',
options: Options(
headers: {
'accept': 'application/json',
},
),
queryParameters: {'limit': 15, 'offset': 0},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
SeeMoreModel resp = SeeMoreModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
return e.response!.data;
}
}
Future<SeeMoreModel> seeMoreForYouBooks() async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'books/fav-books',
options: Options(
headers: {
'accept': 'application/json',
},
),
queryParameters: {'limit': 15, 'offset': 0},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
SeeMoreModel resp = SeeMoreModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
return e.response!.data;
}
}
Future<SeeMoreModel> seeMoreWritersBooks() async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'books/writers-chose',
options: Options(
headers: {
'accept': 'application/json',
},
),
queryParameters: {'limit': 15, 'offset': 0},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
SeeMoreModel resp = SeeMoreModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
return e.response!.data;
}
}
Future<SeeMoreModel> seeMoreMostReadBooks() async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'books/most-read',
options: Options(
headers: {
'accept': 'application/json',
},
),
queryParameters: {'limit': 15, 'offset': 0},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
SeeMoreModel resp = SeeMoreModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
return e.response!.data;
}
}
Future<CategoriesModel> getContributorInfo(
CategoriesSelections selections,
int pageIndex,
int pageLimit,
) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'categories',
options: Options(
headers: {
'accept': 'application/json',
},
),
queryParameters: {
'type': selections.type,
'id': selections.id,
},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
CategoriesModel resp = CategoriesModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
print('tttttttttttttt');
log(e.response!.data.toString());
return e.response!.data;
}
}
Future<CategoriesModel> getAllCategories(
CategoriesSelections selections,
int pageIndex,
int pageLimit,
) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
print(selections.toJson());
print('===============OFFSET==============');
m_part.Response response = await httpClient.get(
baseUrl + 'categories',
options: Options(
headers: {
'accept': 'application/json',
},
),
queryParameters: {
'type': selections.type,
'keyword': selections.keyword,
'id': selections.id,
'sub_id': selections.sub_id,
'sub_sub_id': selections.sub_sub_id,
'limit': pageLimit,
'offset': pageIndex,
},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
CategoriesModel resp = CategoriesModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
print(e.response!.statusMessage);
print('ssssssssssss');
log(e.response!.data.toString());
return e.response!.data;
}
}
Future<IsFollowingModel> followContributor(
int role_Id,
int contributor_id,
String type,
) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
int? statusCode;
try {
m_part.Response response = await httpClient.post(
baseUrl + 'contributors/${contributor_id}/user-action',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
queryParameters: {
'role_id': role_Id,
'type': type,
},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
IsFollowingModel resp = IsFollowingModel.fromJson(validMap);
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(response.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.green,
duration: const Duration(milliseconds: 1000),
),
);
return resp;
}
return response.data;
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
return e.response!.data;
}
}
Future<IsFollowingModel> followCategory(int category_id) async {
m_part.Response response;
try {
response = await httpClient.post(
baseUrl + 'contributors/${category_id}/user-action',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
queryParameters: {
'role_id': 1,
'type': 'category',
},
);
if (response.statusCode == 200) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(response.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.green,
duration: const Duration(milliseconds: 500),
),
);
return response.data;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
return e.response!.data;
}
return response.data;
}
Future<ArabSettingsModel?> getArabSettings() async {
ArabSettingsModel settings = ArabSettingsModel();
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? isoCode = await rxPrefs.getString('iso_code');
final AuthNotifier authNotifier = Provider.of<AuthNotifier>(
navigatorKey.currentContext!,
listen: false,
);
try {
m_part.Response response = await httpClient.get(
baseUrl + 'settings',
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
},
),
);
if (response.statusCode == 200) {
settings = ArabSettingsModel.fromJson(response.data);
await rxPrefs.setString(
'arabSettings',
jsonEncode(settings),
);
await authNotifier.setArabSettings(settings);
return settings;
}
} on DioError catch (e) {
log(e.toString());
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
}
return null;
}
Future<BannerModel> getBannersList() async {
BannerModel bannerModel = BannerModel();
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
final String? isoCode = await rxPrefs.getString('iso_code');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'banners',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
);
if (response.statusCode == 200) {
final banner = json.decode(json.encode(response.data));
bannerModel = BannerModel.fromJson(banner);
return bannerModel;
} else {}
return bannerModel;
} on DioError catch (e) {
return e.response!.data;
}
}
Future contactUs(List<File> posts) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
final ContactUsNotifier contactNotifier = Provider.of<ContactUsNotifier>(
navigatorKey.currentContext!,
listen: false,
);
bool tokenVar = token == null;
m_part.FormData data = m_part.FormData.fromMap({
'user_name': tokenVar ? contactNotifier.nameController!.text : null,
'email': tokenVar ? contactNotifier.emailController!.text : null,
'phone_code': tokenVar ? contactNotifier.phoneKey : null,
'phone_number': tokenVar ? contactNotifier.phoneController!.text : null,
'note': contactNotifier.notesController!.text,
'contact_id': contactNotifier.selectedSubject.id ?? 1,
'source': 'app',
});
for (final File image in posts) {
data.files.add(
MapEntry(
'image',
m_part.MultipartFile.fromBytes(
image.readAsBytesSync(),
filename: image.path.split('/').last,
),
),
);
}
try {
Future<m_part.Response> response = httpClient
.post(
baseUrl + 'contact-us',
data: data,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
)
.then((m_part.Response value) async {
if (value.statusCode == 200) {
contactNotifier.nameController!.clear();
contactNotifier.emailController!.clear();
contactNotifier.phoneController!.clear();
contactNotifier.notesController!.clear();
await showDialog(
context: navigatorKey.currentContext!,
builder: (BuildContext builder) => CustomDialog(
assetPath: 'assets/svg/icSentImage.svg',
header: 'Message sent successfully'.tr(),
body: value.data['custom_message'] ?? 'Message',
hasButton: true,
buttonText: 'Ok'.tr(),
onPressed: () => Navigator.pop(navigatorKey.currentContext!),
),
);
}
return value;
});
} on DioError catch (e) {
return e.response!.data;
}
}
Future<BookDetails> getBookDetails(int bookId) async {
BookDetails bookDetails = BookDetails();
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'books/$bookId',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
);
if (response.statusCode == 200) {
print(response.statusCode);
final book = json.decode(json.encode(response.data));
bookDetails = BookDetails.fromJson(book);
return bookDetails;
}
return bookDetails;
} on DioError catch (e) {
return e.response!.data;
}
}
Future reportAnError(
int? id,
String? type,
String? typeReport,
TextEditingController? controller,
int? commentId,
) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
m_part.FormData data = m_part.FormData.fromMap({
'note': controller!.text,
'related_id': id,
'source': 'app',
'type': type,
'type_report': typeReport,
'comment_id': commentId ?? null
});
try {
Future<m_part.Response> response = httpClient
.post(
baseUrl + 'reports',
data: data,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
)
.then((m_part.Response value) async {
if (value.statusCode == 200) {
await showDialog(
context: navigatorKey.currentContext!,
builder: (BuildContext builder) => CustomDialog(
assetPath: 'assets/svg/icSentImage.svg',
header: 'Report Sent Done'.tr(),
body: '',
hasButton: true,
buttonText: 'Ok'.tr(),
onPressed: () => Navigator.pop(navigatorKey.currentContext!),
),
);
}
return value;
});
} on DioError catch (e) {
return e.response!.data;
}
}
Future CommentForBookOrProdcast(
int? type,
int? id,
int? rate,
TextEditingController? controller,
) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
m_part.FormData data = m_part.FormData.fromMap({
'note': controller!.text,
'related_id': id,
'source': 'app',
'rate': rate,
});
try {
Future<m_part.Response> response = httpClient
.post(
baseUrl + 'user-reports/create/comment/$type',
data: data,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
)
.then((m_part.Response value) => value);
} on DioError catch (e) {
return e.response!.data;
}
}
Future<Comments> getCommentWithPagination(
int? id, int? type, int pageSize, int pageIndex) async {
Comments comments = Comments();
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
m_part.Response response = await httpClient.get(
baseUrl + 'user-reports/$id',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
queryParameters: {'type': type, 'limit': pageSize, 'offset': pageIndex},
);
print('pageSize= ${pageSize} ::::::: ${pageIndex}');
if (response.statusCode == 200) {
final comment = json.decode(json.encode(response.data));
comments = Comments.fromJson(comment);
print(response.statusCode);
}
return comments;
} on DioError catch (e) {
return e.response!.data;
}
}
Future editComment(
int? id,
String? commentText,
String? commentTime,
int? rate,
int? bookId,
) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
m_part.FormData data = m_part.FormData.fromMap({
'note': commentText,
'updated_at': commentTime,
'rate': rate,
});
try {
Future<m_part.Response> response = httpClient.post(
baseUrl + 'user-reports/$id/$bookId',
data: data,
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
);
} on DioError {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text('Update Comment Expired'.tr()),
backgroundColor: Colors.red,
),
);
}
}
Future deleteComment(int? id, int? bookId) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
Future<m_part.Response> response = httpClient
.delete(
baseUrl + 'user-reports/$id/$bookId',
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
)
.then((m_part.Response value) {
print(value.statusCode);
return value;
});
} on DioError catch (e) {
return e.response!.data;
}
}
Future addToFavOrWishList(int? id, String? type) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
Future<m_part.Response> response = httpClient.post(
baseUrl + 'books/$id/user-action',
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
queryParameters: {'type': type},
).then((m_part.Response value) {
print(value.statusCode);
print(value.data);
return value;
});
} on DioError catch (e) {
return e.response!.data;
}
}
Future commentLikeOrDislike(int? commentId, int? bookId) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
Future<m_part.Response> response = httpClient
.post(
baseUrl + 'user-reports/like-comment/$commentId/$bookId',
options: Options(
maxRedirects: 1,
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
),
)
.then((m_part.Response value) {
print(value.statusCode);
print(value.data);
return value;
});
} on DioError catch (e) {
return e.response!.data;
}
}
Future<Contributors> getFollowingList(int? roleId) async {
Contributors following = Contributors();
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
Response<dynamic> response = await httpClient.get(
baseUrl + 'contributors/followed',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'token': token,
'Authorization': 'bearer $token',
},
),
queryParameters: {'role_id': roleId, 'limit': 15, 'offset': 0},
);
if (response.statusCode == 200) {
print(response.statusCode);
final dynamic follow = json.decode(json.encode(response.data));
following = Contributors.fromJson(follow);
return following;
} else {}
return following;
} on DioError catch (e) {
log(e.response.toString());
return e.response!.data;
}
}
Future<int> putBookmark(
PutMarkDto param,
int bookId,
int fileId,
) async {
int? statusCode;
try {
print(param.toJson());
m_part.Response response = await httpClient.post(
baseUrl + 'books/${bookId}/file/${fileId}/bookmark',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
data: param.toJson(),
);
print(response.statusCode ?? 'NO RESPONSE');
if (response.statusCode == 200) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(response.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.green,
duration: const Duration(milliseconds: 500),
),
);
return statusCode ?? 2;
}
} on DioError catch (e) {
ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar(
SnackBar(
content: Text(e.response!.data['custom_message'] ?? 'NP'),
backgroundColor: Colors.red,
),
);
}
return statusCode ?? 2;
}
Future<int> postAudioToLibrary(
AddToLibraryDto param,
) async {
int? statusCode;
try {
print(param.toJson());
m_part.Response response = await httpClient.post(
baseUrl + 'libraries/${param.related_id}/chapters/${param.chapter_id}',
options: Options(
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'lang': navigatorKey.currentContext!.locale.toString()
},
),
queryParameters: {
'type': param.type,
'percentage': param.percentage,
},
data: param.toJson(),
);
print(response.statusCode ?? 'NO RESPONSE');
if (response.statusCode == 200) {
return statusCode ?? 2;
}
} on DioError catch (e) {
return e.response!.statusCode!;
}
return statusCode ?? 2;
}
Future<HomeStripsModel> getHomeStrips(int stripId) async {
final RxSharedPreferences rxPrefs = RxSharedPreferences.getInstance();
final String? token = await rxPrefs.getString('token');
try {
print(
baseUrl + 'strips/${stripId}/books',
);
Response<dynamic> response = await httpClient.get(
baseUrl + 'strips/${stripId}/books',
options: Options(
headers: {
'accept': 'application/json',
},
),
queryParameters: {'limit': 15, 'offset': 0},
);
if (response.statusCode == 200) {
final validMap = json.decode(json.encode(response.data));
HomeStripsModel resp = HomeStripsModel.fromJson(validMap);
return resp;
}
return response.data;
} on DioError catch (e) {
log(e.response!.data.toString());
return e.response!.data;
}
}
}
Editor is loading...