Initial commit
This commit is contained in:
283
app_code/lib/presenters/address_presenter.dart
Normal file
283
app_code/lib/presenters/address_presenter.dart
Normal file
@@ -0,0 +1,283 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:grostore/apis/address_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/models/city_response.dart';
|
||||
import 'package:grostore/models/country_response.dart';
|
||||
import 'package:grostore/models/edit_address_response.dart';
|
||||
import 'package:grostore/models/state_response.dart';
|
||||
import 'package:grostore/models/user/addresses_response.dart';
|
||||
|
||||
class AddressPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
AddressPresenter.context = context;
|
||||
}
|
||||
|
||||
List<AddressInfo> addresses = [];
|
||||
List<CountryInfo> countries = [];
|
||||
List<StateInfo> states = [];
|
||||
List<CityInfo> cities = [];
|
||||
List<CountryInfo> filteredCountries = [];
|
||||
List<StateInfo> filteredStates = [];
|
||||
List<CityInfo> filteredCities = [];
|
||||
|
||||
String defaultAddress = "No";
|
||||
EditAddressResponse? editAddress;
|
||||
|
||||
CountryInfo? selectedCountry;
|
||||
|
||||
StateInfo? selectedState;
|
||||
|
||||
CityInfo? selectedCity;
|
||||
|
||||
bool isFetchAddress = false;
|
||||
|
||||
TextEditingController addressController = TextEditingController();
|
||||
|
||||
fetchAddresses() async {
|
||||
var res = await AddressApi.getAddresses();
|
||||
addresses.clear();
|
||||
addresses.addAll(res.object.data);
|
||||
isFetchAddress = true;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
initState() {
|
||||
fetchAddresses();
|
||||
}
|
||||
|
||||
Future<void> onRefresh()async{
|
||||
return await fetchAddresses();
|
||||
}
|
||||
|
||||
clear(){
|
||||
addresses.clear();
|
||||
isFetchAddress = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
filterCountry(String text) {
|
||||
filteredCountries.clear();
|
||||
if (text.isNotEmpty) {
|
||||
filteredCountries.addAll(countries.where((element) {
|
||||
return element.name.toLowerCase().contains(text.toLowerCase());
|
||||
}));
|
||||
} else {
|
||||
filteredCountries.addAll(countries);
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
filterState(String text) {
|
||||
filteredStates.clear();
|
||||
if (text.isNotEmpty) {
|
||||
filteredStates.addAll(states.where((element) {
|
||||
return element.name.toLowerCase().contains(text.toLowerCase());
|
||||
}));
|
||||
} else {
|
||||
filteredStates.addAll(states);
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
filterCity(String text) {
|
||||
filteredCities.clear();
|
||||
if (text.isNotEmpty) {
|
||||
filteredCities.addAll(cities.where((element) {
|
||||
return element.name.toLowerCase().contains(text.toLowerCase());
|
||||
}));
|
||||
} else {
|
||||
filteredCities.addAll(cities);
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
getCountries() async {
|
||||
var response = await AddressApi.getCountries();
|
||||
countries.addAll(response.object.data);
|
||||
|
||||
if(editAddress!=null){
|
||||
countries.forEach((element) {
|
||||
if(element.id==editAddress!.data.countryId){
|
||||
setSelectedCountry(element);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
filteredCountries.addAll(countries);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
getStates(id) async {
|
||||
var response = await AddressApi.getState(id);
|
||||
states.addAll(response.object.data);
|
||||
if(editAddress!=null){
|
||||
states.forEach((element) {
|
||||
if(element.id==editAddress!.data.stateId){
|
||||
setSelectedState(element);
|
||||
}
|
||||
});
|
||||
}
|
||||
filteredStates.addAll(states);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
getCities(id) async {
|
||||
var response = await AddressApi.getCity(id);
|
||||
cities.addAll(response.object.data);
|
||||
if(editAddress!=null){
|
||||
cities.forEach((element) {
|
||||
print(element.id);
|
||||
print(editAddress!.data.cityId);
|
||||
if(element.id==editAddress!.data.cityId){
|
||||
setSelectedCity(element);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
setSelectedCountry(CountryInfo countryInfo) {
|
||||
selectedCountry = countryInfo;
|
||||
selectedState = null;
|
||||
selectedCity = null;
|
||||
getStates(countryInfo.id);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
setSelectedState(StateInfo stateInfo) {
|
||||
selectedState = stateInfo;
|
||||
selectedCity = null;
|
||||
getCities(stateInfo.id);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
setSelectedCity(CityInfo cityInfo) {
|
||||
selectedCity = cityInfo;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
setDefaultAddress(String? value) {
|
||||
if (value != null) {
|
||||
defaultAddress = value;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
addAddress(BuildContext context,
|
||||
{required CountryInfo? countryInfo,
|
||||
required StateInfo? stateInfo,
|
||||
required CityInfo? cityInfo,
|
||||
required String? fullAddress,
|
||||
required int? isDefault}) async {
|
||||
if (!checkAddressValidation(context,
|
||||
countryInfo: countryInfo,
|
||||
stateInfo: stateInfo,
|
||||
cityInfo: cityInfo,
|
||||
fullAddress: fullAddress,
|
||||
isDefault: isDefault)) {
|
||||
return;
|
||||
}
|
||||
Loading.show(context);
|
||||
var response = await AddressApi.addAddress(
|
||||
countryId: countryInfo!.id,
|
||||
stateId: stateInfo!.id,
|
||||
cityId: cityInfo!.id,
|
||||
isDefault: isDefault!,
|
||||
address: fullAddress!);
|
||||
Loading.close();
|
||||
if (!context.mounted) return;
|
||||
ToastUi.show(context, response.object.message);
|
||||
if (response.object.result) {
|
||||
Navigator.pop(context);
|
||||
}
|
||||
}
|
||||
|
||||
updateAddress(BuildContext context,
|
||||
{
|
||||
required int id,
|
||||
required CountryInfo? countryInfo,
|
||||
required StateInfo? stateInfo,
|
||||
required CityInfo? cityInfo,
|
||||
required String? fullAddress,
|
||||
required int? isDefault}) async {
|
||||
if (!checkAddressValidation(context,
|
||||
countryInfo: countryInfo,
|
||||
stateInfo: stateInfo,
|
||||
cityInfo: cityInfo,
|
||||
fullAddress: fullAddress,
|
||||
isDefault: isDefault)) {
|
||||
return;
|
||||
}
|
||||
Loading.show(context);
|
||||
var response = await AddressApi.updateAddress(
|
||||
id: id,
|
||||
countryId: countryInfo!.id,
|
||||
stateId: stateInfo!.id,
|
||||
cityId: cityInfo!.id,
|
||||
isDefault: isDefault!,
|
||||
address: fullAddress!);
|
||||
Loading.close();
|
||||
if (!context.mounted) return;
|
||||
ToastUi.show(context, response.object.message);
|
||||
if (response.object.result) {
|
||||
Navigator.pop(context);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool checkAddressValidation(BuildContext context,
|
||||
{required CountryInfo? countryInfo,
|
||||
required StateInfo? stateInfo,
|
||||
required CityInfo? cityInfo,
|
||||
required String? fullAddress,
|
||||
required int? isDefault}) {
|
||||
if (countryInfo == null) {
|
||||
ToastUi.show(context, AppLang.local(context).please_select_a_country);
|
||||
return false;
|
||||
}
|
||||
if (stateInfo == null) {
|
||||
ToastUi.show(context, AppLang.local(context).please_select_a_state);
|
||||
return false;
|
||||
}
|
||||
if (cityInfo == null) {
|
||||
ToastUi.show(context, AppLang.local(context).please_select_a_city);
|
||||
return false;
|
||||
}
|
||||
if (fullAddress == null || fullAddress.trim().isEmpty) {
|
||||
ToastUi.show(context, AppLang.local(context).please_enter_address);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
getEditAddressData(id,BuildContext context)async{
|
||||
Loading.show(context);
|
||||
var response =await AddressApi.editAddresses(id);
|
||||
Loading.close();
|
||||
if(response.statusCode==200 && response.object.result){
|
||||
editAddress= response.object;
|
||||
getCountries();
|
||||
//setSelectedCountry(CountryInfo(id: response.object.data.countryId, code: "0", name: response.object.data.countryName, isActive: true));
|
||||
//setSelectedState(StateInfo(id: response.object.data.stateId,name: response.object.data.stateName, isActive: true, countryId: response.object.data.countryId));
|
||||
//setSelectedCity(CityInfo(id: response.object.data.cityId,name: response.object.data.cityName, isActive: true, stateId: response.object.data.stateId));
|
||||
|
||||
setDefaultAddress(editAddress!.data.isDefault==1?"Set Default":"No");
|
||||
addressController.text=response.object.data.address;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
deleteAddress(id,BuildContext context)async{
|
||||
Loading.show(context);
|
||||
var response = await AddressApi.deleteAddress(id: id);
|
||||
Loading.close();
|
||||
ToastUi.show(context, response.object.message);
|
||||
onRefresh();
|
||||
}
|
||||
|
||||
}
|
||||
715
app_code/lib/presenters/auth/aa.dart
Normal file
715
app_code/lib/presenters/auth/aa.dart
Normal file
@@ -0,0 +1,715 @@
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
// import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/auth_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/constant/country_code.dart';
|
||||
import 'package:grostore/custom_classes/system_data.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/helpers/route.dart';
|
||||
import 'package:grostore/helpers/shared_value_helper.dart';
|
||||
import 'package:grostore/models/auth/login_response_model.dart';
|
||||
import 'package:grostore/models/common/user_info.dart';
|
||||
import 'package:grostore/models/user_info_response_model.dart';
|
||||
import 'package:grostore/screens/auth/password_otp.dart';
|
||||
import 'package:grostore/screens/main.dart';
|
||||
|
||||
class AuthPresenterf extends ChangeNotifier {
|
||||
UserInfo userInfo = userInfoResponseDefault().data;
|
||||
static BuildContext? _context;
|
||||
|
||||
static BuildContext get getContext => _context!;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
AuthPresenterf._context = context;
|
||||
}
|
||||
|
||||
List<Country> country = CountryCode().get();
|
||||
|
||||
List<Country> filteredCountry = CountryCode().get();
|
||||
|
||||
void filterCountry(String query) {
|
||||
query = query.toLowerCase();
|
||||
|
||||
filteredCountry = country.where((product) {
|
||||
if (product.name.toLowerCase().contains(query)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}).toList();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
//controllers
|
||||
TextEditingController loginPhoneNumberController = TextEditingController();
|
||||
TextEditingController loginEmailController = TextEditingController();
|
||||
TextEditingController loginPasswordController = TextEditingController();
|
||||
|
||||
String loginBy = "phone"; //phone or email
|
||||
String initialCountry = 'US';
|
||||
var countriesCode = <String>[];
|
||||
Country regCountry = CountryCode().get().last;
|
||||
String loginPhone = "";
|
||||
late String loginEmail, loginPassword;
|
||||
|
||||
/// Registration variables
|
||||
String registerBy = "email"; //phone or email
|
||||
String regPhone = "";
|
||||
bool isAgree = false;
|
||||
|
||||
//controllers
|
||||
TextEditingController regNameController = TextEditingController();
|
||||
TextEditingController regPhoneNumberController = TextEditingController();
|
||||
TextEditingController regPasswordController = TextEditingController();
|
||||
TextEditingController regPasswordConfirmController = TextEditingController();
|
||||
|
||||
fetch_country() async {
|
||||
// var data = await AddressRepository().getCountryList();
|
||||
// data.countries.forEach((c) => countries_code.add(c.code));
|
||||
}
|
||||
|
||||
String makeLoginPostBody(login,pass) {
|
||||
return jsonEncode({
|
||||
"phone": login,
|
||||
"password": pass,
|
||||
});
|
||||
}
|
||||
|
||||
onPressedLogin() async {
|
||||
|
||||
loginPhone = loginPhoneNumberController.text.toString().trim();
|
||||
loginPassword = loginPasswordController.text.toString().trim();
|
||||
|
||||
loginPhone = "+998$loginPhone";
|
||||
|
||||
print("Loginn::: $loginPhone");
|
||||
print("Password::: $loginPassword");
|
||||
|
||||
if (loginPhone == "") {
|
||||
ToastUi.show(_context!, AppLang
|
||||
.local(_context!)
|
||||
.please_enter_phone);
|
||||
return;
|
||||
} else if (loginPassword == "") {
|
||||
ToastUi.show(_context!, AppLang
|
||||
.local(_context!)
|
||||
.please_enter_password);
|
||||
return;
|
||||
}
|
||||
|
||||
var body = makeLoginPostBody(loginPhone, loginPassword);
|
||||
print("JsonBody::: $body");
|
||||
|
||||
Loading.show(_context!);
|
||||
var response =await AuthApi.login(body, _context!);
|
||||
Loading.close();
|
||||
if (response.result == false) {
|
||||
var message = "";
|
||||
|
||||
if (response.message.runtimeType == List) {
|
||||
// response.message.forEach((key, value) {
|
||||
// value.forEach((messages) {
|
||||
// message += messages + "\n";
|
||||
// });
|
||||
// }
|
||||
// )
|
||||
message = response.message;
|
||||
} else {
|
||||
message = response.message;
|
||||
}
|
||||
|
||||
ToastUi.show(_context!, message);
|
||||
} else {
|
||||
ToastUi.show(_context!, response.message);
|
||||
|
||||
loginPasswordController.text == '';
|
||||
loginPasswordController.text == '';
|
||||
|
||||
SystemData.isLogIn = true;
|
||||
// MakeRoute.clearProviders(_context!);
|
||||
Navigator.pushReplacement(_context!, MaterialPageRoute(builder: (_)=> const Main()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
tokenCheck(BuildContext context) async {
|
||||
var response = await AuthApi.tokenCheck(context);
|
||||
if (response.result) {
|
||||
SystemData.isLogIn = response.result;
|
||||
SystemData.userInfo = response.user;
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
logout(BuildContext context) async {
|
||||
var response = await AuthApi.logout(context);
|
||||
if (response.result) {
|
||||
SystemData.isLogIn = false;
|
||||
SystemData.userInfo = response.user;
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
///registration methods
|
||||
|
||||
onChangeCountry(Country country) {
|
||||
regCountry = country;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
String makeRegBody(name, phone, password, confirmPassword) {
|
||||
return jsonEncode({
|
||||
"name": name,
|
||||
"phone": phone,
|
||||
"password": password,
|
||||
"password_confirmation": confirmPassword
|
||||
});
|
||||
}
|
||||
|
||||
onPressSignUp() async {
|
||||
var name = regNameController.text.toString();
|
||||
var password = regPasswordController.text.toString();
|
||||
var passwordConfirm = regPasswordConfirmController.text.toString();
|
||||
regPhone = regPhoneNumberController.value.text.toString();
|
||||
String valu = '';
|
||||
String value = '';
|
||||
if (regPhone.isNotEmpty) {
|
||||
// valu = regPhone.substring(0,2);
|
||||
// value = regPhone.substring(2);
|
||||
regPhone = "+998$regPhone";
|
||||
// regPhone = "+998($valu)$value";
|
||||
}
|
||||
|
||||
if (name == "") {
|
||||
ToastUi.show(_context!, AppLang
|
||||
.local(_context!)
|
||||
.please_enter_phone);
|
||||
return;
|
||||
} else if (password == "") {
|
||||
ToastUi.show(_context!, AppLang
|
||||
.local(_context!)
|
||||
.please_enter_password);
|
||||
return;
|
||||
} else if (passwordConfirm == "") {
|
||||
ToastUi.show(
|
||||
_context!, AppLang
|
||||
.local(_context!)
|
||||
.please_enter_confirm_password);
|
||||
return;
|
||||
} else if (password.length < 6) {
|
||||
ToastUi.show(
|
||||
_context!, AppLang
|
||||
.local(_context!)
|
||||
.password_must_be_at_last_6_digit);
|
||||
return;
|
||||
} else if (password != passwordConfirm) {
|
||||
ToastUi.show(
|
||||
_context!,
|
||||
AppLang
|
||||
.local(_context!)
|
||||
.password_and_confirm_password_is_not_matching);
|
||||
return;
|
||||
}
|
||||
|
||||
var body = makeRegBody(
|
||||
name,
|
||||
regPhone,
|
||||
password,
|
||||
passwordConfirm);
|
||||
|
||||
Loading.show(_context!);
|
||||
var signupResponse = await AuthApi.registration(_context!, body);
|
||||
Loading.close();
|
||||
|
||||
if (signupResponse == false) {
|
||||
var message = "";
|
||||
if (signupResponse.message.runtimeType == List) {
|
||||
signupResponse.message.forEach((key, value) {
|
||||
value.forEach((messages) {
|
||||
message += messages + "\n";
|
||||
});
|
||||
});
|
||||
} else {
|
||||
message = signupResponse.message;
|
||||
}
|
||||
|
||||
ToastUi.show(_context!, message);
|
||||
} else {
|
||||
ToastUi.show(_context!, signupResponse.message);
|
||||
|
||||
regPasswordController.text = "";
|
||||
// SystemData.isLogIn = true;
|
||||
// MakeRoute.clearProviders(_context!);
|
||||
Navigator.pushReplacement(_context!, MaterialPageRoute(builder: (_)=>PasswordOtp()));
|
||||
}
|
||||
// notifyListeners();
|
||||
}
|
||||
///
|
||||
|
||||
/// ForgetPassword
|
||||
///
|
||||
|
||||
//controllers
|
||||
TextEditingController forgetEmailController = TextEditingController();
|
||||
TextEditingController forgetPhoneNumberController = TextEditingController();
|
||||
|
||||
onPressSendCode() async {
|
||||
var email = forgetEmailController.text.toString();
|
||||
|
||||
if (email == "") {
|
||||
ToastUi.show(_context!, AppLang.local(_context!).please_enter_email);
|
||||
return;
|
||||
}
|
||||
|
||||
var passwordForgetResponse = await AuthApi.forgetPassword(_context!, email);
|
||||
|
||||
if (passwordForgetResponse.result == false) {
|
||||
ToastUi.show(_context!, passwordForgetResponse.message);
|
||||
} else {
|
||||
ToastUi.show(_context!, passwordForgetResponse.message);
|
||||
|
||||
// Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// return PasswordOtp(
|
||||
// verify_by: _send_code_by,
|
||||
// );
|
||||
// }));
|
||||
}
|
||||
}
|
||||
|
||||
String makeRegOTP(code) {
|
||||
return jsonEncode({
|
||||
"code": code
|
||||
});
|
||||
}
|
||||
TextEditingController otpController = TextEditingController();
|
||||
|
||||
/// Otp
|
||||
onPressOTP() async {
|
||||
var code = otpCodeController.text.toString();
|
||||
|
||||
|
||||
if (code == "") {
|
||||
ToastUi.show(
|
||||
_context!,
|
||||
AppLang.local(_context!).enter_otp_code,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
var otp = makeRegOTP(code);
|
||||
|
||||
var passwordConfirmResponse =await AuthApi.forgetOTP(_context!, otp);
|
||||
|
||||
if (passwordConfirmResponse.result == false) {
|
||||
ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
} else {
|
||||
ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
// MakeRoute.clearProviders(_context!);
|
||||
SystemData.isLogIn = true;
|
||||
|
||||
Navigator.pushReplacement(_context!, MaterialPageRoute(builder: (_)=> const Main()));
|
||||
}
|
||||
// notifyListeners();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//controllers
|
||||
TextEditingController otpCodeController = TextEditingController();
|
||||
TextEditingController otpPasswordController = TextEditingController();
|
||||
TextEditingController otpPasswordConfirmController = TextEditingController();
|
||||
bool otpResetPasswordSuccess = false;
|
||||
|
||||
onPressConfirm() async {
|
||||
var code = otpCodeController.text.toString();
|
||||
var password = otpPasswordController.text.toString();
|
||||
var password_confirm = otpPasswordConfirmController.text.toString();
|
||||
|
||||
if (code == "") {
|
||||
ToastUi.show(
|
||||
_context!,
|
||||
AppLang.local(_context!).enter_otp_code,
|
||||
);
|
||||
return;
|
||||
} else if (password == "") {
|
||||
ToastUi.show(_context!, AppLang.local(_context!).please_enter_password);
|
||||
return;
|
||||
} else if (password_confirm == "") {
|
||||
ToastUi.show(
|
||||
_context!, AppLang.local(_context!).please_enter_confirm_password);
|
||||
return;
|
||||
} else if (password.length < 6) {
|
||||
ToastUi.show(
|
||||
_context!, AppLang.local(_context!).password_must_be_at_last_6_digit);
|
||||
return;
|
||||
} else if (password != password_confirm) {
|
||||
ToastUi.show(
|
||||
_context!,
|
||||
AppLang.local(_context!)
|
||||
.password_and_confirm_password_is_not_matching);
|
||||
return;
|
||||
}
|
||||
|
||||
var passwordConfirmResponse =
|
||||
await AuthApi.forgetPassword(_context!, password);
|
||||
|
||||
if (passwordConfirmResponse.result == false) {
|
||||
ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
} else {
|
||||
ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
}
|
||||
}
|
||||
|
||||
onTapResend() async {
|
||||
var passwordResendCodeResponse =
|
||||
await AuthApi.forgetPassword(_context!, "");
|
||||
|
||||
if (passwordResendCodeResponse.result == false) {
|
||||
ToastUi.show(_context!, passwordResendCodeResponse.message);
|
||||
} else {
|
||||
ToastUi.show(_context!, passwordResendCodeResponse.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// import 'dart:convert';
|
||||
//
|
||||
// import 'package:flutter/cupertino.dart';
|
||||
// import 'package:grostore/apis/auth_api.dart';
|
||||
// import 'package:grostore/app_lang.dart';
|
||||
// import 'package:grostore/constant/country_code.dart';
|
||||
// import 'package:grostore/custom_classes/system_data.dart';
|
||||
// import 'package:grostore/custom_ui/loading.dart';
|
||||
// import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
// import 'package:grostore/helpers/common_functions.dart';
|
||||
// import 'package:grostore/helpers/route.dart';
|
||||
// import 'package:grostore/helpers/shared_value_helper.dart';
|
||||
// import 'package:grostore/models/auth/login_response_model.dart';
|
||||
// import 'package:grostore/models/common/user_info.dart';
|
||||
// import 'package:grostore/models/user_info_response_model.dart';
|
||||
// import 'package:grostore/screens/main.dart';
|
||||
//
|
||||
// class AuthPresenter extends ChangeNotifier {
|
||||
// UserInfo userInfo = userInfoResponseDefault().data;
|
||||
// static BuildContext? _context;
|
||||
//
|
||||
// static BuildContext get getContext => _context!;
|
||||
//
|
||||
// setContext(BuildContext context) {
|
||||
// AuthPresenter._context = context;
|
||||
// }
|
||||
//
|
||||
// List<Country> country = CountryCode().get();
|
||||
//
|
||||
// List<Country> filteredCountry = CountryCode().get();
|
||||
//
|
||||
// void filterCountry(String query) {
|
||||
// query = query.toLowerCase();
|
||||
//
|
||||
// filteredCountry = country.where((product) {
|
||||
// if (product.name.toLowerCase().contains(query)) {
|
||||
// return true;
|
||||
// } else {
|
||||
// return false;
|
||||
// }
|
||||
// }).toList();
|
||||
// notifyListeners();
|
||||
// }
|
||||
//
|
||||
// //controllers
|
||||
// TextEditingController loginPhoneNumberController = TextEditingController();
|
||||
// TextEditingController loginEmailController = TextEditingController();
|
||||
// TextEditingController loginPasswordController = TextEditingController();
|
||||
//
|
||||
// String loginBy = "email"; //phone or email
|
||||
// String initialCountry = 'US';
|
||||
// var countriesCode = <String>[];
|
||||
// Country regCountry = CountryCode().get().last;
|
||||
// String loginPhone = "";
|
||||
// late String loginEmail, loginPassword;
|
||||
//
|
||||
// /// Registration variables
|
||||
// String registerBy = "email"; //phone or email
|
||||
// String regPhone = "";
|
||||
// bool isAgree = false;
|
||||
//
|
||||
// //controllers
|
||||
// TextEditingController regNameController = TextEditingController();
|
||||
// TextEditingController regEmailController = TextEditingController();
|
||||
// TextEditingController regPhoneNumberController = TextEditingController();
|
||||
// TextEditingController regPasswordController = TextEditingController();
|
||||
// TextEditingController regPasswordConfirmController = TextEditingController();
|
||||
//
|
||||
// fetch_country() async {
|
||||
// // var data = await AddressRepository().getCountryList();
|
||||
// // data.countries.forEach((c) => countries_code.add(c.code));
|
||||
// }
|
||||
//
|
||||
// onPressedLogin() async {
|
||||
// if (checkLoginValidation()) {
|
||||
// makeLogin();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// String makeLoginPostBody() {
|
||||
// return jsonEncode({
|
||||
// "email": loginEmail,
|
||||
// "type": "customer",
|
||||
// "password": loginPassword,
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// bool checkLoginValidation() {
|
||||
// loginEmail = loginEmailController.text.toString().trim();
|
||||
// loginPassword = loginPasswordController.text.toString().trim();
|
||||
// if (loginBy == "email") {
|
||||
// if (loginEmail.isEmpty || !isEmail(loginEmail)) {
|
||||
// ToastUi.show(_context!, AppLang.getLocal().please_enter_valid_email);
|
||||
// return false;
|
||||
// }
|
||||
// } else {
|
||||
// ///todo phone no validation
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// if (loginPassword.isEmpty) {
|
||||
// return false;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// makeLogin() async {
|
||||
// Loading.show(_context!);
|
||||
// LoginResponse response =
|
||||
// await AuthApi.login(makeLoginPostBody(), _context!);
|
||||
// Loading.close();
|
||||
// if (response.result) {
|
||||
// access_token.update((p0) => response.accessToken);
|
||||
// access_token.save();
|
||||
// loginEmailController.clear();
|
||||
// loginPasswordController.clear();
|
||||
// SystemData.isLogIn = true;
|
||||
// SystemData.userInfo = response.user;
|
||||
// MakeRoute.goAndRemoveAll(_context!, Main());
|
||||
// //UserInfo(name: response.name, email: response.email, phone: response.phone, balance: response.balance, avatar: response.avatar);
|
||||
// }
|
||||
// ToastUi.show(_context!, response.message);
|
||||
// }
|
||||
//
|
||||
// tokenCheck(BuildContext context) async {
|
||||
// var response = await AuthApi.tokenCheck(context);
|
||||
// if (response.result) {
|
||||
// SystemData.isLogIn = response.result;
|
||||
// SystemData.userInfo = response.user;
|
||||
// }
|
||||
// notifyListeners();
|
||||
// }
|
||||
//
|
||||
// logout(BuildContext context) async {
|
||||
// var response = await AuthApi.logout(context);
|
||||
// if (response.result) {
|
||||
// SystemData.isLogIn = false;
|
||||
// SystemData.userInfo = response.user;
|
||||
// }
|
||||
// notifyListeners();
|
||||
// }
|
||||
//
|
||||
// ///registration methods
|
||||
//
|
||||
// onChangeCountry(Country country) {
|
||||
// regCountry = country;
|
||||
// notifyListeners();
|
||||
// }
|
||||
//
|
||||
// String makeRegBody(name, email, phone, password, confirmPassword) {
|
||||
// return jsonEncode({
|
||||
// "name": name,
|
||||
// "email": email,
|
||||
// "phone": phone,
|
||||
// "password": password,
|
||||
// "password_confirmation": confirmPassword
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// onPressSignUp() async {
|
||||
// var name = regNameController.text.toString();
|
||||
// var email = regEmailController.text.toString();
|
||||
// var password = regPasswordController.text.toString();
|
||||
// var password_confirm = regPasswordConfirmController.text.toString();
|
||||
// regPhone = regPhoneNumberController.text.trim();
|
||||
// if (regPhone.isNotEmpty) {
|
||||
// regPhone = regCountry.dial_code + regPhone;
|
||||
// }
|
||||
//
|
||||
// if (name == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_name);
|
||||
// return;
|
||||
// } else if (registerBy == 'email' && (email == "" || !isEmail(email))) {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_email);
|
||||
// return;
|
||||
// } else if (registerBy == 'phone' && regPhone == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_phone);
|
||||
// return;
|
||||
// } else if (password == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_password);
|
||||
// return;
|
||||
// } else if (password_confirm == "") {
|
||||
// ToastUi.show(
|
||||
// _context!, AppLang.local(_context!).please_enter_confirm_password);
|
||||
// return;
|
||||
// } else if (password.length < 6) {
|
||||
// ToastUi.show(
|
||||
// _context!, AppLang.local(_context!).password_must_be_at_last_6_digit);
|
||||
// return;
|
||||
// } else if (password != password_confirm) {
|
||||
// ToastUi.show(
|
||||
// _context!,
|
||||
// AppLang.local(_context!)
|
||||
// .password_and_confirm_password_is_not_matching);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// var body = makeRegBody(name, email, regPhone, password, password_confirm);
|
||||
// Loading.show(_context!);
|
||||
// var signupResponse = await AuthApi.registration(_context!, body);
|
||||
// Loading.close();
|
||||
// print(signupResponse.toJson());
|
||||
// if (signupResponse.result == false) {
|
||||
// var message = "";
|
||||
// if (signupResponse.message.runtimeType == List) {
|
||||
// signupResponse.message.forEach((key, value) {
|
||||
// value.forEach((messages) {
|
||||
// message += messages + "\n";
|
||||
// });
|
||||
// });
|
||||
// } else {
|
||||
// message = signupResponse.message;
|
||||
// }
|
||||
//
|
||||
// ToastUi.show(_context!, message);
|
||||
// } else {
|
||||
// ToastUi.show(_context!, signupResponse.message);
|
||||
// access_token.update((p0) => signupResponse.accessToken);
|
||||
// access_token.save();
|
||||
// loginEmailController.clear();
|
||||
// loginPasswordController.clear();
|
||||
// SystemData.isLogIn = true;
|
||||
// SystemData.userInfo = signupResponse.user;
|
||||
// MakeRoute.goAndRemoveAll(_context!, Main());
|
||||
//
|
||||
// // if ((mail_verification_status.$ && _register_by == "email") ||
|
||||
// // _register_by == "phone") {
|
||||
// // Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// // return Otp(
|
||||
// // verify_by: _register_by,
|
||||
// // user_id: signupResponse.user_id,
|
||||
// // );
|
||||
// // }));
|
||||
// //
|
||||
// // } else {
|
||||
// // Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// // return Login();
|
||||
// // }));
|
||||
// // }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// ///
|
||||
//
|
||||
// /// ForgetPassword
|
||||
// ///
|
||||
//
|
||||
// //controllers
|
||||
// TextEditingController forgetEmailController = TextEditingController();
|
||||
// TextEditingController forgetPhoneNumberController = TextEditingController();
|
||||
//
|
||||
// onPressSendCode() async {
|
||||
// var email = forgetEmailController.text.toString();
|
||||
//
|
||||
// if (email == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_email);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// var passwordForgetResponse = await AuthApi.forgetPassword(_context!, email);
|
||||
//
|
||||
// if (passwordForgetResponse.result == false) {
|
||||
// ToastUi.show(_context!, passwordForgetResponse.message);
|
||||
// } else {
|
||||
// ToastUi.show(_context!, passwordForgetResponse.message);
|
||||
//
|
||||
// // Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// // return PasswordOtp(
|
||||
// // verify_by: _send_code_by,
|
||||
// // );
|
||||
// // }));
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// /// Otp
|
||||
// ///
|
||||
//
|
||||
// //controllers
|
||||
// TextEditingController otpCodeController = TextEditingController();
|
||||
// TextEditingController otpPasswordController = TextEditingController();
|
||||
// TextEditingController otpPasswordConfirmController = TextEditingController();
|
||||
// bool otpResetPasswordSuccess = false;
|
||||
//
|
||||
// onPressConfirm() async {
|
||||
// var code = otpCodeController.text.toString();
|
||||
// var password = otpPasswordController.text.toString();
|
||||
// var password_confirm = otpPasswordConfirmController.text.toString();
|
||||
//
|
||||
// if (code == "") {
|
||||
// ToastUi.show(
|
||||
// _context!,
|
||||
// AppLang.local(_context!).enter_otp_code,
|
||||
// );
|
||||
// return;
|
||||
// } else if (password == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_password);
|
||||
// return;
|
||||
// } else if (password_confirm == "") {
|
||||
// ToastUi.show(
|
||||
// _context!, AppLang.local(_context!).please_enter_confirm_password);
|
||||
// return;
|
||||
// } else if (password.length < 6) {
|
||||
// ToastUi.show(
|
||||
// _context!, AppLang.local(_context!).password_must_be_at_last_6_digit);
|
||||
// return;
|
||||
// } else if (password != password_confirm) {
|
||||
// ToastUi.show(
|
||||
// _context!,
|
||||
// AppLang.local(_context!)
|
||||
// .password_and_confirm_password_is_not_matching);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// var passwordConfirmResponse =
|
||||
// await AuthApi.forgetPassword(_context!, password);
|
||||
//
|
||||
// if (passwordConfirmResponse.result == false) {
|
||||
// ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
// } else {
|
||||
// ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// onTapResend() async {
|
||||
// var passwordResendCodeResponse =
|
||||
// await AuthApi.forgetPassword(_context!, "");
|
||||
//
|
||||
// if (passwordResendCodeResponse.result == false) {
|
||||
// ToastUi.show(_context!, passwordResendCodeResponse.message);
|
||||
// } else {
|
||||
// ToastUi.show(_context!, passwordResendCodeResponse.message);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
713
app_code/lib/presenters/auth/auth_presenter.dart
Normal file
713
app_code/lib/presenters/auth/auth_presenter.dart
Normal file
@@ -0,0 +1,713 @@
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/auth_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/constant/country_code.dart';
|
||||
import 'package:grostore/custom_classes/system_data.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/helpers/route.dart';
|
||||
import 'package:grostore/helpers/shared_value_helper.dart';
|
||||
import 'package:grostore/models/auth/login_response_model.dart';
|
||||
import 'package:grostore/models/common/user_info.dart';
|
||||
import 'package:grostore/models/user_info_response_model.dart';
|
||||
import 'package:grostore/screens/auth/password_otp.dart';
|
||||
import 'package:grostore/screens/main.dart';
|
||||
|
||||
class AuthPresenter extends ChangeNotifier {
|
||||
UserInfo userInfo = userInfoResponseDefault().data;
|
||||
static BuildContext? _context;
|
||||
|
||||
static BuildContext get getContext => _context!;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
AuthPresenter._context = context;
|
||||
}
|
||||
|
||||
List<Country> country = CountryCode().get();
|
||||
|
||||
List<Country> filteredCountry = CountryCode().get();
|
||||
|
||||
void filterCountry(String query) {
|
||||
query = query.toLowerCase();
|
||||
|
||||
filteredCountry = country.where((product) {
|
||||
if (product.name.toLowerCase().contains(query)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}).toList();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
//controllers
|
||||
TextEditingController loginPhoneNumberController = TextEditingController();
|
||||
TextEditingController loginEmailController = TextEditingController();
|
||||
TextEditingController loginPasswordController = TextEditingController();
|
||||
|
||||
String loginBy = "phone"; //phone or email
|
||||
String initialCountry = 'US';
|
||||
var countriesCode = <String>[];
|
||||
Country regCountry = CountryCode().get().last;
|
||||
String loginPhone = "";
|
||||
late String loginEmail, loginPassword;
|
||||
|
||||
/// Registration variables
|
||||
String registerBy = "email"; //phone or email
|
||||
String regPhone = "";
|
||||
bool isAgree = false;
|
||||
|
||||
//controllers
|
||||
TextEditingController regNameController = TextEditingController();
|
||||
TextEditingController regPhoneNumberController = TextEditingController();
|
||||
TextEditingController regPasswordController = TextEditingController();
|
||||
TextEditingController regPasswordConfirmController = TextEditingController();
|
||||
|
||||
fetch_country() async {
|
||||
// var data = await AddressRepository().getCountryList();
|
||||
// data.countries.forEach((c) => countries_code.add(c.code));
|
||||
}
|
||||
|
||||
onPressedLogin() async {
|
||||
if (checkLoginValidation()) {
|
||||
makeLogin();
|
||||
}
|
||||
}
|
||||
|
||||
String makeLoginPostBody(phone,pass) {
|
||||
return jsonEncode({
|
||||
"phone": phone,
|
||||
"password": pass,
|
||||
});
|
||||
}
|
||||
|
||||
bool checkLoginValidation() {
|
||||
loginPhone = loginPhoneNumberController.text.toString().trim();
|
||||
loginPassword = loginPasswordController.text.toString().trim();
|
||||
|
||||
loginPhone = "+998$loginPhone";
|
||||
|
||||
if (loginBy == "phone") {
|
||||
if (loginPhone.isEmpty) {
|
||||
ToastUi.show(_context!, AppLang.getLocal().please_enter_valid_email);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (loginPassword.isEmpty) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
makeLogin() async {
|
||||
loginPhone = loginPhoneNumberController.text.toString().trim();
|
||||
loginPassword = loginPasswordController.text.toString().trim();
|
||||
loginPhone = "+998$loginPhone";
|
||||
|
||||
print("Hello==$loginPhone");
|
||||
print("Hello==$loginPassword");
|
||||
|
||||
Loading.show(_context!);
|
||||
LoginResponse response = await AuthApi.login(makeLoginPostBody(loginPhone,loginPassword), _context!);
|
||||
Loading.close();
|
||||
if (response.result == true) {
|
||||
access_token.update((p0) => response.accessToken);
|
||||
access_token.save();
|
||||
loginPhoneNumberController.text = '';
|
||||
loginPasswordController.text = '';
|
||||
SystemData.isLogIn = true;
|
||||
MakeRoute.goAndRemoveAll(_context!, const Main());
|
||||
//UserInfo(name: response.name, email: response.email, phone: response.phone, balance: response.balance, avatar: response.avatar);
|
||||
ToastUi.show(_context!, AppLang.local(_context!).success_login);
|
||||
}
|
||||
ToastUi.show(_context!, AppLang.local(_context!).no_such_user_exists);
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
tokenCheck(BuildContext context) async {
|
||||
var response = await AuthApi.tokenCheck(context);
|
||||
if (response.result) {
|
||||
SystemData.isLogIn = response.result;
|
||||
SystemData.userInfo = response.user;
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
logout(BuildContext context) async {
|
||||
var response = await AuthApi.logout(context);
|
||||
if (response.result) {
|
||||
SystemData.isLogIn = false;
|
||||
SystemData.userInfo = response.user;
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
///registration methods
|
||||
|
||||
onChangeCountry(Country country) {
|
||||
regCountry = country;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
String makeRegBody(name, phone, password, confirmPassword) {
|
||||
return jsonEncode({
|
||||
"name": name,
|
||||
"phone": phone,
|
||||
"password": password,
|
||||
"password_confirmation": confirmPassword
|
||||
});
|
||||
}
|
||||
|
||||
onPressSignUp() async {
|
||||
var name = regNameController.text.toString();
|
||||
var password = regPasswordController.text.toString();
|
||||
var passwordConfirm = regPasswordConfirmController.text.toString();
|
||||
regPhone = regPhoneNumberController.value.text.toString();
|
||||
String valu = '';
|
||||
String value = '';
|
||||
if (regPhone.isNotEmpty) {
|
||||
// valu = regPhone.substring(0,2);
|
||||
// value = regPhone.substring(2);
|
||||
regPhone = "+998$regPhone";
|
||||
// regPhone = "+998($valu)$value";
|
||||
}
|
||||
|
||||
if (name == "") {
|
||||
ToastUi.show(_context!, AppLang
|
||||
.local(_context!)
|
||||
.please_enter_phone);
|
||||
return;
|
||||
} else if (password == "") {
|
||||
ToastUi.show(_context!, AppLang
|
||||
.local(_context!)
|
||||
.please_enter_password);
|
||||
return;
|
||||
} else if (passwordConfirm == "") {
|
||||
ToastUi.show(
|
||||
_context!, AppLang
|
||||
.local(_context!)
|
||||
.please_enter_confirm_password);
|
||||
return;
|
||||
} else if (password.length < 6) {
|
||||
ToastUi.show(
|
||||
_context!, AppLang
|
||||
.local(_context!)
|
||||
.password_must_be_at_last_6_digit);
|
||||
return;
|
||||
} else if (password != passwordConfirm) {
|
||||
ToastUi.show(
|
||||
_context!,
|
||||
AppLang
|
||||
.local(_context!)
|
||||
.password_and_confirm_password_is_not_matching);
|
||||
return;
|
||||
}
|
||||
|
||||
var body = makeRegBody(
|
||||
name,
|
||||
regPhone,
|
||||
password,
|
||||
passwordConfirm);
|
||||
|
||||
Loading.show(_context!);
|
||||
var signupResponse = await AuthApi.registration(_context!, body);
|
||||
Loading.close();
|
||||
|
||||
if (signupResponse.result == false) {
|
||||
var message = "";
|
||||
if (signupResponse.message.runtimeType == List) {
|
||||
signupResponse.message.forEach((key, value) {
|
||||
value.forEach((messages) {
|
||||
message += messages + "\n";
|
||||
});
|
||||
});
|
||||
} else {
|
||||
message = signupResponse.message;
|
||||
}
|
||||
|
||||
await ToastUi.show(_context!, message);
|
||||
} else {
|
||||
// loginPasswordController.clear();
|
||||
// SystemData.isLogIn = true;
|
||||
MakeRoute.go(_context!, PasswordOtp());
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
///
|
||||
|
||||
|
||||
String makePhone(code) {
|
||||
return jsonEncode({
|
||||
"phone": code
|
||||
});
|
||||
}
|
||||
//controllers
|
||||
TextEditingController forgetPhoneNumberController = TextEditingController();
|
||||
|
||||
onPressSendCode() async {
|
||||
var phoneNum = forgetPhoneNumberController.text.toString();
|
||||
phoneNum = "+998$phoneNum";
|
||||
|
||||
if (phoneNum == "") {
|
||||
ToastUi.show(_context!, AppLang.local(_context!).please_enter_phone);
|
||||
return;
|
||||
}
|
||||
|
||||
var passwordForgetResponse = await AuthApi.forgetPassword(_context!, makePhone(phoneNum));
|
||||
|
||||
if (passwordForgetResponse.result == false) {
|
||||
ToastUi.show(_context!, passwordForgetResponse.message);
|
||||
} else {
|
||||
// ToastUi.show(_context!, passwordForgetResponse.message);
|
||||
|
||||
// MakeRoute.goAndRemoveAll(_context!, PasswordOtp(phone_num: phoneNum));
|
||||
Navigator.push(_context!, MaterialPageRoute(builder: (context) {
|
||||
return PasswordOtp(
|
||||
verify_by: phoneNum,
|
||||
);
|
||||
}));
|
||||
forgetPhoneNumberController.text = "";
|
||||
}
|
||||
}
|
||||
|
||||
/// Otp
|
||||
String makeRegOTP(code) {
|
||||
return jsonEncode({
|
||||
"code": code
|
||||
});
|
||||
}
|
||||
|
||||
/// #OTP
|
||||
TextEditingController otpController = TextEditingController();
|
||||
onPressOTP() async {
|
||||
var code = otpCodeController.text.toString();
|
||||
|
||||
|
||||
if (code == "") {
|
||||
ToastUi.show(
|
||||
_context!,
|
||||
AppLang.local(_context!).enter_otp_code,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
var confirmOTP =await AuthApi.forgetOTP(_context!, makeRegOTP(code));
|
||||
|
||||
if (confirmOTP.result == false) {
|
||||
ToastUi.show(_context!, confirmOTP.message);
|
||||
}else{
|
||||
access_token.update((p0) => confirmOTP.accessToken);
|
||||
access_token.save();
|
||||
SystemData.isLogIn = true;
|
||||
MakeRoute.goAndRemoveAll(_context!, const Main());
|
||||
otpController.text = "";
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).success_register);
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//controllers
|
||||
TextEditingController otpCodeController = TextEditingController();
|
||||
TextEditingController otpPasswordController = TextEditingController();
|
||||
TextEditingController otpPasswordConfirmController = TextEditingController();
|
||||
bool otpResetPasswordSuccess = false;
|
||||
|
||||
onPressConfirm() async {
|
||||
var code = otpCodeController.text.toString();
|
||||
var password = otpPasswordController.text.toString();
|
||||
var password_confirm = otpPasswordConfirmController.text.toString();
|
||||
|
||||
if (code == "") {
|
||||
ToastUi.show(
|
||||
_context!,
|
||||
AppLang.local(_context!).enter_otp_code,
|
||||
);
|
||||
return;
|
||||
} else if (password == "") {
|
||||
ToastUi.show(_context!, AppLang.local(_context!).please_enter_password);
|
||||
return;
|
||||
} else if (password_confirm == "") {
|
||||
ToastUi.show(
|
||||
_context!, AppLang.local(_context!).please_enter_confirm_password);
|
||||
return;
|
||||
} else if (password.length < 6) {
|
||||
ToastUi.show(
|
||||
_context!, AppLang.local(_context!).password_must_be_at_last_6_digit);
|
||||
return;
|
||||
} else if (password != password_confirm) {
|
||||
ToastUi.show(
|
||||
_context!,
|
||||
AppLang.local(_context!)
|
||||
.password_and_confirm_password_is_not_matching);
|
||||
return;
|
||||
}
|
||||
|
||||
var passwordConfirmResponse =
|
||||
await AuthApi.forgetPassword(_context!, password);
|
||||
|
||||
if (passwordConfirmResponse.result == false) {
|
||||
ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
} else {
|
||||
ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
}
|
||||
}
|
||||
|
||||
onTapResend() async {
|
||||
var passwordResendCodeResponse =
|
||||
await AuthApi.forgetPassword(_context!, "");
|
||||
|
||||
if (passwordResendCodeResponse.result == false) {
|
||||
ToastUi.show(_context!, passwordResendCodeResponse.message);
|
||||
} else {
|
||||
ToastUi.show(_context!, passwordResendCodeResponse.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// import 'dart:convert';
|
||||
//
|
||||
// import 'package:flutter/cupertino.dart';
|
||||
// import 'package:grostore/apis/auth_api.dart';
|
||||
// import 'package:grostore/app_lang.dart';
|
||||
// import 'package:grostore/constant/country_code.dart';
|
||||
// import 'package:grostore/custom_classes/system_data.dart';
|
||||
// import 'package:grostore/custom_ui/loading.dart';
|
||||
// import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
// import 'package:grostore/helpers/common_functions.dart';
|
||||
// import 'package:grostore/helpers/route.dart';
|
||||
// import 'package:grostore/helpers/shared_value_helper.dart';
|
||||
// import 'package:grostore/models/auth/login_response_model.dart';
|
||||
// import 'package:grostore/models/common/user_info.dart';
|
||||
// import 'package:grostore/models/user_info_response_model.dart';
|
||||
// import 'package:grostore/screens/main.dart';
|
||||
//
|
||||
// class AuthPresenter extends ChangeNotifier {
|
||||
// UserInfo userInfo = userInfoResponseDefault().data;
|
||||
// static BuildContext? _context;
|
||||
//
|
||||
// static BuildContext get getContext => _context!;
|
||||
//
|
||||
// setContext(BuildContext context) {
|
||||
// AuthPresenter._context = context;
|
||||
// }
|
||||
//
|
||||
// List<Country> country = CountryCode().get();
|
||||
//
|
||||
// List<Country> filteredCountry = CountryCode().get();
|
||||
//
|
||||
// void filterCountry(String query) {
|
||||
// query = query.toLowerCase();
|
||||
//
|
||||
// filteredCountry = country.where((product) {
|
||||
// if (product.name.toLowerCase().contains(query)) {
|
||||
// return true;
|
||||
// } else {
|
||||
// return false;
|
||||
// }
|
||||
// }).toList();
|
||||
// notifyListeners();
|
||||
// }
|
||||
//
|
||||
// //controllers
|
||||
// TextEditingController loginPhoneNumberController = TextEditingController();
|
||||
// TextEditingController loginEmailController = TextEditingController();
|
||||
// TextEditingController loginPasswordController = TextEditingController();
|
||||
//
|
||||
// String loginBy = "email"; //phone or email
|
||||
// String initialCountry = 'US';
|
||||
// var countriesCode = <String>[];
|
||||
// Country regCountry = CountryCode().get().last;
|
||||
// String loginPhone = "";
|
||||
// late String loginEmail, loginPassword;
|
||||
//
|
||||
// /// Registration variables
|
||||
// String registerBy = "email"; //phone or email
|
||||
// String regPhone = "";
|
||||
// bool isAgree = false;
|
||||
//
|
||||
// //controllers
|
||||
// TextEditingController regNameController = TextEditingController();
|
||||
// TextEditingController regEmailController = TextEditingController();
|
||||
// TextEditingController regPhoneNumberController = TextEditingController();
|
||||
// TextEditingController regPasswordController = TextEditingController();
|
||||
// TextEditingController regPasswordConfirmController = TextEditingController();
|
||||
//
|
||||
// fetch_country() async {
|
||||
// // var data = await AddressRepository().getCountryList();
|
||||
// // data.countries.forEach((c) => countries_code.add(c.code));
|
||||
// }
|
||||
//
|
||||
// onPressedLogin() async {
|
||||
// if (checkLoginValidation()) {
|
||||
// makeLogin();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// String makeLoginPostBody() {
|
||||
// return jsonEncode({
|
||||
// "email": loginEmail,
|
||||
// "type": "customer",
|
||||
// "password": loginPassword,
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// bool checkLoginValidation() {
|
||||
// loginEmail = loginEmailController.text.toString().trim();
|
||||
// loginPassword = loginPasswordController.text.toString().trim();
|
||||
// if (loginBy == "email") {
|
||||
// if (loginEmail.isEmpty || !isEmail(loginEmail)) {
|
||||
// ToastUi.show(_context!, AppLang.getLocal().please_enter_valid_email);
|
||||
// return false;
|
||||
// }
|
||||
// } else {
|
||||
// ///todo phone no validation
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// if (loginPassword.isEmpty) {
|
||||
// return false;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// makeLogin() async {
|
||||
// Loading.show(_context!);
|
||||
// LoginResponse response =
|
||||
// await AuthApi.login(makeLoginPostBody(), _context!);
|
||||
// Loading.close();
|
||||
// if (response.result) {
|
||||
// access_token.update((p0) => response.accessToken);
|
||||
// access_token.save();
|
||||
// loginEmailController.clear();
|
||||
// loginPasswordController.clear();
|
||||
// SystemData.isLogIn = true;
|
||||
// SystemData.userInfo = response.user;
|
||||
// MakeRoute.goAndRemoveAll(_context!, Main());
|
||||
// //UserInfo(name: response.name, email: response.email, phone: response.phone, balance: response.balance, avatar: response.avatar);
|
||||
// }
|
||||
// ToastUi.show(_context!, response.message);
|
||||
// }
|
||||
//
|
||||
// tokenCheck(BuildContext context) async {
|
||||
// var response = await AuthApi.tokenCheck(context);
|
||||
// if (response.result) {
|
||||
// SystemData.isLogIn = response.result;
|
||||
// SystemData.userInfo = response.user;
|
||||
// }
|
||||
// notifyListeners();
|
||||
// }
|
||||
//
|
||||
// logout(BuildContext context) async {
|
||||
// var response = await AuthApi.logout(context);
|
||||
// if (response.result) {
|
||||
// SystemData.isLogIn = false;
|
||||
// SystemData.userInfo = response.user;
|
||||
// }
|
||||
// notifyListeners();
|
||||
// }
|
||||
//
|
||||
// ///registration methods
|
||||
//
|
||||
// onChangeCountry(Country country) {
|
||||
// regCountry = country;
|
||||
// notifyListeners();
|
||||
// }
|
||||
//
|
||||
// String makeRegBody(name, email, phone, password, confirmPassword) {
|
||||
// return jsonEncode({
|
||||
// "name": name,
|
||||
// "email": email,
|
||||
// "phone": phone,
|
||||
// "password": password,
|
||||
// "password_confirmation": confirmPassword
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// onPressSignUp() async {
|
||||
// var name = regNameController.text.toString();
|
||||
// var email = regEmailController.text.toString();
|
||||
// var password = regPasswordController.text.toString();
|
||||
// var password_confirm = regPasswordConfirmController.text.toString();
|
||||
// regPhone = regPhoneNumberController.text.trim();
|
||||
// if (regPhone.isNotEmpty) {
|
||||
// regPhone = regCountry.dial_code + regPhone;
|
||||
// }
|
||||
//
|
||||
// if (name == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_name);
|
||||
// return;
|
||||
// } else if (registerBy == 'email' && (email == "" || !isEmail(email))) {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_email);
|
||||
// return;
|
||||
// } else if (registerBy == 'phone' && regPhone == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_phone);
|
||||
// return;
|
||||
// } else if (password == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_password);
|
||||
// return;
|
||||
// } else if (password_confirm == "") {
|
||||
// ToastUi.show(
|
||||
// _context!, AppLang.local(_context!).please_enter_confirm_password);
|
||||
// return;
|
||||
// } else if (password.length < 6) {
|
||||
// ToastUi.show(
|
||||
// _context!, AppLang.local(_context!).password_must_be_at_last_6_digit);
|
||||
// return;
|
||||
// } else if (password != password_confirm) {
|
||||
// ToastUi.show(
|
||||
// _context!,
|
||||
// AppLang.local(_context!)
|
||||
// .password_and_confirm_password_is_not_matching);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// var body = makeRegBody(name, email, regPhone, password, password_confirm);
|
||||
// Loading.show(_context!);
|
||||
// var signupResponse = await AuthApi.registration(_context!, body);
|
||||
// Loading.close();
|
||||
// print(signupResponse.toJson());
|
||||
// if (signupResponse.result == false) {
|
||||
// var message = "";
|
||||
// if (signupResponse.message.runtimeType == List) {
|
||||
// signupResponse.message.forEach((key, value) {
|
||||
// value.forEach((messages) {
|
||||
// message += messages + "\n";
|
||||
// });
|
||||
// });
|
||||
// } else {
|
||||
// message = signupResponse.message;
|
||||
// }
|
||||
//
|
||||
// ToastUi.show(_context!, message);
|
||||
// } else {
|
||||
// ToastUi.show(_context!, signupResponse.message);
|
||||
// access_token.update((p0) => signupResponse.accessToken);
|
||||
// access_token.save();
|
||||
// loginEmailController.clear();
|
||||
// loginPasswordController.clear();
|
||||
// SystemData.isLogIn = true;
|
||||
// SystemData.userInfo = signupResponse.user;
|
||||
// MakeRoute.goAndRemoveAll(_context!, Main());
|
||||
//
|
||||
// // if ((mail_verification_status.$ && _register_by == "email") ||
|
||||
// // _register_by == "phone") {
|
||||
// // Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// // return Otp(
|
||||
// // verify_by: _register_by,
|
||||
// // user_id: signupResponse.user_id,
|
||||
// // );
|
||||
// // }));
|
||||
// //
|
||||
// // } else {
|
||||
// // Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// // return Login();
|
||||
// // }));
|
||||
// // }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// ///
|
||||
//
|
||||
// /// ForgetPassword
|
||||
// ///
|
||||
//
|
||||
// //controllers
|
||||
// TextEditingController forgetEmailController = TextEditingController();
|
||||
// TextEditingController forgetPhoneNumberController = TextEditingController();
|
||||
//
|
||||
// onPressSendCode() async {
|
||||
// var email = forgetEmailController.text.toString();
|
||||
//
|
||||
// if (email == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_email);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// var passwordForgetResponse = await AuthApi.forgetPassword(_context!, email);
|
||||
//
|
||||
// if (passwordForgetResponse.result == false) {
|
||||
// ToastUi.show(_context!, passwordForgetResponse.message);
|
||||
// } else {
|
||||
// ToastUi.show(_context!, passwordForgetResponse.message);
|
||||
//
|
||||
// // Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// // return PasswordOtp(
|
||||
// // verify_by: _send_code_by,
|
||||
// // );
|
||||
// // }));
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// /// Otp
|
||||
// ///
|
||||
//
|
||||
// //controllers
|
||||
// TextEditingController otpCodeController = TextEditingController();
|
||||
// TextEditingController otpPasswordController = TextEditingController();
|
||||
// TextEditingController otpPasswordConfirmController = TextEditingController();
|
||||
// bool otpResetPasswordSuccess = false;
|
||||
//
|
||||
// onPressConfirm() async {
|
||||
// var code = otpCodeController.text.toString();
|
||||
// var password = otpPasswordController.text.toString();
|
||||
// var password_confirm = otpPasswordConfirmController.text.toString();
|
||||
//
|
||||
// if (code == "") {
|
||||
// ToastUi.show(
|
||||
// _context!,
|
||||
// AppLang.local(_context!).enter_otp_code,
|
||||
// );
|
||||
// return;
|
||||
// } else if (password == "") {
|
||||
// ToastUi.show(_context!, AppLang.local(_context!).please_enter_password);
|
||||
// return;
|
||||
// } else if (password_confirm == "") {
|
||||
// ToastUi.show(
|
||||
// _context!, AppLang.local(_context!).please_enter_confirm_password);
|
||||
// return;
|
||||
// } else if (password.length < 6) {
|
||||
// ToastUi.show(
|
||||
// _context!, AppLang.local(_context!).password_must_be_at_last_6_digit);
|
||||
// return;
|
||||
// } else if (password != password_confirm) {
|
||||
// ToastUi.show(
|
||||
// _context!,
|
||||
// AppLang.local(_context!)
|
||||
// .password_and_confirm_password_is_not_matching);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// var passwordConfirmResponse =
|
||||
// await AuthApi.forgetPassword(_context!, password);
|
||||
//
|
||||
// if (passwordConfirmResponse.result == false) {
|
||||
// ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
// } else {
|
||||
// ToastUi.show(_context!, passwordConfirmResponse.message);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// onTapResend() async {
|
||||
// var passwordResendCodeResponse =
|
||||
// await AuthApi.forgetPassword(_context!, "");
|
||||
//
|
||||
// if (passwordResendCodeResponse.result == false) {
|
||||
// ToastUi.show(_context!, passwordResendCodeResponse.message);
|
||||
// } else {
|
||||
// ToastUi.show(_context!, passwordResendCodeResponse.message);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
19
app_code/lib/presenters/bloc/lang/lang_bloc.dart
Normal file
19
app_code/lib/presenters/bloc/lang/lang_bloc.dart
Normal file
@@ -0,0 +1,19 @@
|
||||
import 'dart:async';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
part 'lang_event.dart';
|
||||
part 'lang_state.dart';
|
||||
|
||||
class LangBloc extends Bloc<LangEvent, LangState> {
|
||||
LangBloc() : super(LangLoading()) {
|
||||
on<LanguageEvent>(_setLocale);
|
||||
}
|
||||
|
||||
void _setLocale(LanguageEvent event, Emitter emit){
|
||||
emit(LangLoading());
|
||||
emit(LangSuccess(locale: event.locale));
|
||||
}
|
||||
}
|
||||
14
app_code/lib/presenters/bloc/lang/lang_event.dart
Normal file
14
app_code/lib/presenters/bloc/lang/lang_event.dart
Normal file
@@ -0,0 +1,14 @@
|
||||
part of 'lang_bloc.dart';
|
||||
|
||||
abstract class LangEvent extends Equatable {
|
||||
const LangEvent();
|
||||
}
|
||||
|
||||
class LanguageEvent extends LangEvent{
|
||||
final Locale locale;
|
||||
|
||||
const LanguageEvent({required this.locale});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
22
app_code/lib/presenters/bloc/lang/lang_state.dart
Normal file
22
app_code/lib/presenters/bloc/lang/lang_state.dart
Normal file
@@ -0,0 +1,22 @@
|
||||
part of 'lang_bloc.dart';
|
||||
|
||||
abstract class LangState extends Equatable {
|
||||
const LangState();
|
||||
}
|
||||
|
||||
class LangLoading extends LangState {
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
class LangSuccess extends LangState {
|
||||
final Locale locale;
|
||||
|
||||
const LangSuccess({required this.locale});
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class LangFailed extends LangState {
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
83
app_code/lib/presenters/cart_presenter.dart
Normal file
83
app_code/lib/presenters/cart_presenter.dart
Normal file
@@ -0,0 +1,83 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/cart_api.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_classes/system_data.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/models/cart_response.dart';
|
||||
import 'package:grostore/models/order/order_summery_response.dart';
|
||||
|
||||
class CartPresenter extends ChangeNotifier{
|
||||
static BuildContext? context;
|
||||
setContext(BuildContext context){
|
||||
CartPresenter.context=context;
|
||||
}
|
||||
TextEditingController couponTxtController = TextEditingController();
|
||||
OrderSummeryResponse orderSummery = OrderSummeryResponse(subTotal: "", tax: "", shippingCharge: "", isFreeShipping:false, couponDiscount: "", total: "");
|
||||
|
||||
CartResponse cartResponse=CartResponse(result: false, message: '', carts: [], cartCount: 0, subTotal: '0.0', total: "0.0",couponDiscount: '');
|
||||
bool isCartResponseFetch=false;
|
||||
|
||||
|
||||
fetchCart()async{
|
||||
var res = await CartApi.carts();
|
||||
if(res.object.result) {
|
||||
cartResponse = res.object;
|
||||
isCartResponseFetch=true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
addToCart(variantId,qty,BuildContext context)async{
|
||||
var res = await CartApi.addToCart(variantId: variantId, qty: qty);
|
||||
if(res.object.result) {
|
||||
cartResponse = res.object;
|
||||
isCartResponseFetch=true;
|
||||
notifyListeners();
|
||||
}
|
||||
// ToastUi.show(context, res.object.message);
|
||||
ToastUi.showAdd(context, AppLang.local(context).add_to_cart);
|
||||
}
|
||||
|
||||
applyCoupon(BuildContext context,code)async{
|
||||
var res = await CartApi.couponApply(code:code );
|
||||
if(res.object.result) {
|
||||
SystemData.couponCode=code;
|
||||
cartResponse = res.object;
|
||||
isCartResponseFetch=true;
|
||||
notifyListeners();
|
||||
}
|
||||
ToastUi.show(context, res.object.message);
|
||||
}
|
||||
|
||||
updateCart({required cartId,required BuildContext context,required String action})async{
|
||||
var res = await CartApi.cartUpdate(id: cartId, action: action);
|
||||
if(res.object.result) {
|
||||
cartResponse = res.object;
|
||||
isCartResponseFetch=true;
|
||||
// ToastUi.show(context, res.object.message);
|
||||
ToastUi.show(context, AppLang.local(context).update);
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
getOrderSummery({String logistic_zone_id="0"})async{
|
||||
var res = await OrderApi.getSummery(logistic_zone_id: logistic_zone_id);
|
||||
orderSummery =res.object;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
clearAll(){
|
||||
couponTxtController = TextEditingController();
|
||||
orderSummery = OrderSummeryResponse(subTotal: "", tax: "", shippingCharge: "", isFreeShipping:false, couponDiscount: "", total: "");
|
||||
cartResponse=CartResponse(result: false, message: '', carts: [], cartCount: 0, subTotal: '0.0', total: "0.0",couponDiscount: '');
|
||||
isCartResponseFetch=false;
|
||||
|
||||
}
|
||||
|
||||
init(){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
69
app_code/lib/presenters/categories_presenter.dart
Normal file
69
app_code/lib/presenters/categories_presenter.dart
Normal file
@@ -0,0 +1,69 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/category_api.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/models/common/category_info.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
import 'package:grostore/models/category_response.dart';
|
||||
|
||||
class CategoriesPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
ScrollController scrollController = ScrollController();
|
||||
setContext(BuildContext context) {
|
||||
CategoriesPresenter.context = context;
|
||||
}
|
||||
|
||||
List<CategoryInfo> categories = [];
|
||||
int page = 1;
|
||||
bool isCategoryInit=false;
|
||||
|
||||
getCategories() async {
|
||||
var response = await CategoryApi.getCategories(page);
|
||||
print(response.object.data);
|
||||
if (response.statusCode == 200 && response.object.data.isNotEmpty) {
|
||||
categories.addAll(response.object.data);
|
||||
page++;
|
||||
isCategoryInit=true;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fetchAll() {
|
||||
getCategories();
|
||||
}
|
||||
|
||||
scrollListener(){
|
||||
scrollController.addListener(() {
|
||||
if(scrollController.position.maxScrollExtent <= scrollController.position.pixels){
|
||||
getCategories();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
page = 1;
|
||||
isCategoryInit=false;
|
||||
categories.clear();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> onRefresh()async{
|
||||
await clearAll();
|
||||
return fetchAll();
|
||||
}
|
||||
|
||||
initState() {
|
||||
onRefresh();
|
||||
scrollListener();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
// TODO: implement dispose
|
||||
clearAll();
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
343
app_code/lib/presenters/check_out_presenter.dart
Normal file
343
app_code/lib/presenters/check_out_presenter.dart
Normal file
@@ -0,0 +1,343 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/api_request.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/apis/user_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_classes/system_data.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/helpers/route.dart';
|
||||
import 'package:grostore/models/logistics_response.dart';
|
||||
import 'package:grostore/models/order/order_details_response.dart';
|
||||
import 'package:grostore/models/order/order_summery_response.dart';
|
||||
import 'package:grostore/models/payment_types_response.dart';
|
||||
import 'package:grostore/models/time_slote_response.dart';
|
||||
import 'package:grostore/models/user/addresses_response.dart';
|
||||
import 'package:grostore/presenters/order_presenter.dart';
|
||||
import 'package:grostore/screens/main.dart';
|
||||
import 'package:grostore/screens/order/order_details.dart';
|
||||
import 'package:grostore/screens/order/orders.dart';
|
||||
import 'package:grostore/screens/payment.dart';
|
||||
|
||||
class CheckOutPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
CheckOutPresenter.context = context;
|
||||
}
|
||||
|
||||
TextEditingController phoneTxt = TextEditingController(text: SystemData.userInfo.phone);
|
||||
TextEditingController additionalPhoneTxt = TextEditingController();
|
||||
TextEditingController additionalInfoTxt = TextEditingController();
|
||||
TextEditingController tipsTxt = TextEditingController(text: "0");
|
||||
|
||||
int billingAddressId = 0;
|
||||
AddressInfo selectedShippingAddress = AddressInfo(
|
||||
id: 0,
|
||||
userId: 0,
|
||||
countryId: 0,
|
||||
countryName: "",
|
||||
stateId: 0,
|
||||
stateName: "",
|
||||
cityId: 0,
|
||||
cityName: "",
|
||||
address: "",
|
||||
isDefault: 0);
|
||||
|
||||
List<AddressInfo> addresses = [];
|
||||
List<LogisticInfo> logistics = [];
|
||||
List<PaymentTypesResponse> paymentTypes = [];
|
||||
LogisticInfo selectedLogistic = LogisticInfo(id: 0, name: "", logisticId: 0, price: "", image: "");
|
||||
PaymentTypesResponse? selectedPaymentMethod;
|
||||
List<TimeSlot> timeSlots = [];
|
||||
TimeSlot? selectedTimeslot;
|
||||
String paymentType = "Naqd pul";
|
||||
|
||||
// bool isFetchLogistic= false;
|
||||
bool isFetchDeliveryAddress = false;
|
||||
bool isFetchBillingAddress = false;
|
||||
bool isFetchTimeSlot = false;
|
||||
|
||||
OrderSummeryResponse orderSummeryResponse = OrderSummeryResponse(
|
||||
subTotal: "",
|
||||
tax: "",
|
||||
shippingCharge: "",
|
||||
isFreeShipping: false,
|
||||
couponDiscount: "",
|
||||
total: "");
|
||||
|
||||
var firstDate;
|
||||
var lastDate;
|
||||
DateTime? selectedDate;
|
||||
String shipping_delivery_type = "regular";
|
||||
|
||||
fetchAddresses(BuildContext context) async {
|
||||
var res = await UserApi.getAddresses();
|
||||
addresses.clear();
|
||||
addresses.addAll(res.data);
|
||||
if (addresses.isNotEmpty) {
|
||||
onChangeShippingAddress(addresses.first);
|
||||
billingAddressId = addresses.first.id;
|
||||
}
|
||||
isFetchDeliveryAddress = true;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
fetchOrderSummery(id) async {
|
||||
var res = await OrderApi.getSummery(logistic_zone_id: 2);
|
||||
orderSummeryResponse = res.object;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
fetchLogistic(cityId) async {
|
||||
var res = await OrderApi.getLogistics(cityId: cityId);
|
||||
logistics.clear();
|
||||
logistics.addAll(res.object.data);
|
||||
if (logistics.isNotEmpty) {
|
||||
onChangeLogistic(logistics.last);
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
// fetchPaymentTypes() async {
|
||||
// var res = await OrderApi.getPaymentTypes();
|
||||
// paymentTypes.clear();
|
||||
// paymentTypes.addAll(res.object);
|
||||
// onChangePaymentMethod(paymentTypes.first);
|
||||
// notifyListeners();
|
||||
// }
|
||||
|
||||
fetchTimeSlots() async {
|
||||
firstDate = DateTime.now();
|
||||
lastDate = DateTime(2100);
|
||||
var response = await OrderApi.getTimeSlot();
|
||||
timeSlots.clear();
|
||||
timeSlots.addAll(response.object.timeSlots);
|
||||
selectedTimeslot = timeSlots.first;
|
||||
// TimeSlot(id: 0, timeline: "1", sortingOrder: '');
|
||||
selectedDate = firstDate;
|
||||
isFetchTimeSlot = true;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onChangeBillingAddress(id) {
|
||||
billingAddressId = id;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onChangeShippingAddress(AddressInfo info) {
|
||||
selectedShippingAddress = info;
|
||||
fetchLogistic(selectedShippingAddress.cityId);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onChangeLogistic(LogisticInfo info) {
|
||||
selectedLogistic = info;
|
||||
fetchOrderSummery(info.logisticId);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onChangeTimeSlot(TimeSlot timeSlot) {
|
||||
selectedTimeslot = timeSlot;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onChangeDate(date) {
|
||||
selectedDate = date;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onChangeDeliveryType(type) {
|
||||
shipping_delivery_type = type;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onChangePaymentMethod(PaymentTypesResponse method) {
|
||||
selectedPaymentMethod = method;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
billingAddressId = 0;
|
||||
selectedShippingAddress = AddressInfo(
|
||||
id: 0,
|
||||
userId: 0,
|
||||
countryId: 0,
|
||||
countryName: "",
|
||||
stateId: 0,
|
||||
stateName: "",
|
||||
cityId: 0,
|
||||
cityName: "",
|
||||
address: "",
|
||||
isDefault: 0);
|
||||
addresses = [];
|
||||
logistics = [];
|
||||
paymentTypes = [];
|
||||
selectedLogistic = LogisticInfo(id: 0, name: "", logisticId: 0, price: "", image: "");
|
||||
timeSlots = [];
|
||||
selectedTimeslot = null;
|
||||
// bool isFetchLogistic= false;
|
||||
isFetchDeliveryAddress = false;
|
||||
isFetchBillingAddress = false;
|
||||
isFetchTimeSlot = false;
|
||||
|
||||
orderSummeryResponse = OrderSummeryResponse(
|
||||
subTotal: "",
|
||||
tax: "",
|
||||
shippingCharge: "",
|
||||
isFreeShipping: false,
|
||||
couponDiscount: "",
|
||||
total: "");
|
||||
|
||||
firstDate = null;
|
||||
lastDate = null;
|
||||
selectedDate = null;
|
||||
tipsTxt.text = "";
|
||||
shipping_delivery_type = "regular";
|
||||
}
|
||||
|
||||
init(context) {
|
||||
fetchAddresses(context);
|
||||
fetchTimeSlots();
|
||||
// fetchPaymentTypes();
|
||||
}
|
||||
|
||||
peyMethod(String pay) {
|
||||
paymentType = pay;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
OrderPresenter ordr = OrderPresenter();
|
||||
|
||||
_store(BuildContext context) async {
|
||||
Loading.show(context);
|
||||
var response = await OrderApi.createOrder(
|
||||
shippingId: selectedShippingAddress.id,
|
||||
billingId: billingAddressId,
|
||||
phone: phoneTxt.text.trim(),
|
||||
alternativePhone: additionalPhoneTxt.text.trim(),
|
||||
logisticZoneId: 2,
|
||||
tips: tipsTxt.text == "" ? "0" : tipsTxt.text.trim(),
|
||||
shippingDeliveryType: shipping_delivery_type,
|
||||
timeslot: selectedTimeslot!.id,
|
||||
scheduledData: selectedDate!.day,
|
||||
paymentType: paymentType);
|
||||
Loading.close();
|
||||
if (response.object.result) {
|
||||
SystemData.couponCode = "";
|
||||
print("-----------------------");
|
||||
print(response.object.result);
|
||||
print(response.object.orderCode);
|
||||
print("-----------------------");
|
||||
ToastUi.showAdd2(context, "${AppLang.local(context).order_accepted}\nBuyurtma raqami: ${response.object.orderCode}");
|
||||
Future.delayed(const Duration(seconds: 1)).then((value) {
|
||||
MakeRoute.goAndRemoveAll(context, const Main());
|
||||
MakeRoute.go( context,OrderDetails(code: response.object.orderCode,));
|
||||
});
|
||||
// MakeRoute.go(context,Payment(
|
||||
// code: response.object.orderCode,
|
||||
// title: selectedPaymentMethod?.name ?? "",
|
||||
// payment_method: selectedPaymentMethod?.key ?? ""));
|
||||
// ToastUi.show(context, response.object.message);
|
||||
}
|
||||
{}
|
||||
}
|
||||
|
||||
_byCOD(BuildContext context) async {
|
||||
Loading.show(context);
|
||||
var response = await OrderApi.createOrderByCOD(
|
||||
shippingId: selectedShippingAddress.id,
|
||||
billingId: billingAddressId,
|
||||
phone: phoneTxt.text.trim(),
|
||||
alternativePhone: additionalPhoneTxt.text.trim(),
|
||||
logisticZoneId: selectedLogistic.logisticId,
|
||||
tips: tipsTxt.text.trim(),
|
||||
shippingDeliveryType: shipping_delivery_type,
|
||||
timeslot: selectedTimeslot!.id,
|
||||
scheduledData: selectedDate!.microsecond);
|
||||
Loading.close();
|
||||
if (response.object.result) {
|
||||
SystemData.couponCode = "";
|
||||
MakeRoute.go(
|
||||
context,
|
||||
Orders(
|
||||
fromBottomBar: false,
|
||||
fromCheckOut: true,
|
||||
));
|
||||
}
|
||||
ToastUi.show(context, response.object.message);
|
||||
}
|
||||
|
||||
_byWallet(BuildContext context) async {
|
||||
Loading.show(context);
|
||||
var response = await OrderApi.createOrderByCOD(
|
||||
shippingId: selectedShippingAddress.id,
|
||||
billingId: billingAddressId,
|
||||
phone: phoneTxt.text.trim(),
|
||||
alternativePhone: additionalPhoneTxt.text.trim(),
|
||||
logisticZoneId: selectedLogistic.logisticId,
|
||||
tips: tipsTxt.text.trim(),
|
||||
shippingDeliveryType: shipping_delivery_type,
|
||||
timeslot: selectedTimeslot!.id,
|
||||
scheduledData: selectedDate!.microsecond);
|
||||
Loading.close();
|
||||
if (response.object.result) {
|
||||
SystemData.couponCode = "";
|
||||
MakeRoute.go(
|
||||
context,
|
||||
Orders(
|
||||
fromBottomBar: false,
|
||||
fromCheckOut: true,
|
||||
));
|
||||
}
|
||||
ToastUi.show(context, response.object.message);
|
||||
}
|
||||
|
||||
placeOrder(BuildContext context) async {
|
||||
if (selectedLogistic.id == 0) {
|
||||
ToastUi.show(context, "Logistic not founded!");
|
||||
return;
|
||||
}
|
||||
_store(context);
|
||||
|
||||
// if (selectedPaymentMethod!.key == "cod") {
|
||||
// _byCOD(context);
|
||||
// return;
|
||||
// }
|
||||
// if (selectedPaymentMethod!.key == "wallet") {
|
||||
// _byWallet(context);
|
||||
// return;
|
||||
// }
|
||||
|
||||
// if (selectedPaymentMethod!.key == "paypal" ||
|
||||
// selectedPaymentMethod!.key == "stripe" ||
|
||||
// selectedPaymentMethod!.key == "paytm" ||
|
||||
// selectedPaymentMethod!.key == "razorpay" ||
|
||||
// selectedPaymentMethod!.key == "iyzico") {
|
||||
|
||||
// return;
|
||||
// }
|
||||
// ToastUi.show(context, "Not implemented Payment Method");
|
||||
}
|
||||
|
||||
// createOrder(BuildContext context) async {
|
||||
// final tips = tipsTxt.text.trim();
|
||||
//
|
||||
//
|
||||
// final response = await OrderApi.createOrder(
|
||||
// shippingId: selectedShippingAddress.id,
|
||||
// billingId: billingAddressId,
|
||||
// phone: phoneTxt.text.trim(),
|
||||
// alternativePhone: additionalPhoneTxt.text.trim(),
|
||||
// logisticZoneId: selectedLogistic.logisticId,
|
||||
// tips: tips,
|
||||
// shippingDeliveryType: onChangeDeliveryType,
|
||||
// timeslot: timeSlots,
|
||||
// scheduledData: selectedDate!.microsecond);
|
||||
// if(response.statusCode == 200 || response.statusCode == 201){
|
||||
// MakeRoute.go(context, Orders(fromBottomBar: false, fromCheckOut: true,));
|
||||
// }else{
|
||||
// ToastUi.show(context, response.object.message);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
59
app_code/lib/presenters/coupon_presenter.dart
Normal file
59
app_code/lib/presenters/coupon_presenter.dart
Normal file
@@ -0,0 +1,59 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_countdown_timer/countdown_timer_controller.dart';
|
||||
import 'package:grostore/apis/coupons_api.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/models/coupon_response.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
|
||||
class CouponPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
List<CountdownTimerController> controller=[];
|
||||
setContext(BuildContext context) {
|
||||
CouponPresenter.context = context;
|
||||
}
|
||||
|
||||
List<CouponInfo> coupons = [];
|
||||
bool isCouponsInit = false;
|
||||
|
||||
DateTime convertTimeStampToDateTime(int timeStamp) {
|
||||
var dateToTimeStamp = DateTime.fromMillisecondsSinceEpoch(timeStamp * 1000);
|
||||
return dateToTimeStamp;
|
||||
}
|
||||
|
||||
|
||||
getCoupons() async {
|
||||
var response = await CouponsApi.getCoupons();
|
||||
if (response.statusCode == 200) {
|
||||
coupons.addAll(response.object.data);
|
||||
isCouponsInit=true;
|
||||
coupons.forEach((element) {
|
||||
|
||||
DateTime end = convertTimeStampToDateTime(
|
||||
int.parse(element.endDate)); // YYYY-mm-dd
|
||||
DateTime now = DateTime.now();
|
||||
int diff = end.difference(now).inMilliseconds;
|
||||
int endTime = diff + now.millisecondsSinceEpoch;
|
||||
|
||||
|
||||
print(element.endDate);
|
||||
controller.add( CountdownTimerController(endTime:endTime , onEnd: (){}));
|
||||
});
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
fetchAll() {
|
||||
getCoupons();
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
isCouponsInit=false;
|
||||
coupons.clear();
|
||||
}
|
||||
|
||||
initState() {
|
||||
clearAll();
|
||||
fetchAll();
|
||||
}
|
||||
}
|
||||
177
app_code/lib/presenters/filter_presenter.dart
Normal file
177
app_code/lib/presenters/filter_presenter.dart
Normal file
@@ -0,0 +1,177 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/category_api.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/apis/product_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/models/common/category_info.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
import 'package:grostore/models/category_response.dart';
|
||||
import 'package:grostore/models/product_mini_response.dart';
|
||||
|
||||
class FilterPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
ScrollController scrollController = ScrollController();
|
||||
TextEditingController searchTxt = TextEditingController();
|
||||
|
||||
setContext(BuildContext context) {
|
||||
FilterPresenter.context = context;
|
||||
}
|
||||
|
||||
int page = 1;
|
||||
int page2 = 1;
|
||||
int selectedCategoryId = 0;
|
||||
bool isCategoryInit = false;
|
||||
List<CategoryInfo> categories = [];
|
||||
List<ProductMini> products = [];
|
||||
|
||||
RangeValues price=RangeValues(0, 5);
|
||||
|
||||
//fetch data
|
||||
getCategories() async {
|
||||
var response = await CategoryApi.getCategories(page);
|
||||
if (response.statusCode == 200 && response.object.data.isNotEmpty) {
|
||||
categories.addAll(response.object.data);
|
||||
page++;
|
||||
isCategoryInit = true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
getFilteredProducts() async {
|
||||
// products.clear();
|
||||
Loading.show(FilterPresenter.context!);
|
||||
var productResponse = await ProductApi.getAllProducts(
|
||||
page: page2,
|
||||
categoryId: selectedCategoryId==0?'':selectedCategoryId.toString(),
|
||||
// min_price: price.start==0?'':price.start.round().toString(),
|
||||
// max_price: price.end==0?'':price.end.round().toString(),
|
||||
// search: searchTxt.text.isEmpty?'':searchTxt.text.trim().toString()
|
||||
);
|
||||
Loading.close();
|
||||
page2++;
|
||||
if(productResponse.statusCode == 200) {
|
||||
products.addAll(productResponse.object.data);
|
||||
notifyListeners();
|
||||
if(products.isEmpty) {
|
||||
ToastUi.show(context!, AppLang.local(context!).data_is_not_available);
|
||||
}
|
||||
notifyListeners();
|
||||
}else{
|
||||
ToastUi.show(context!, AppLang.local(context!).something_went_wrong);
|
||||
}
|
||||
}
|
||||
|
||||
getProducts() async {
|
||||
var productResponse = await ProductApi.getAllProducts(
|
||||
page:page,
|
||||
categoryId: selectedCategoryId==0?'':selectedCategoryId.toString(),
|
||||
// min_price: price.start==0?'':price.start.round().toString(),
|
||||
// max_price: price.end==0?'':price.end.round().toString(),
|
||||
// search: searchTxt.text.isEmpty?'':searchTxt.text.trim().toString()
|
||||
);
|
||||
|
||||
if (productResponse.statusCode == 200) {
|
||||
if (productResponse.object.data.isEmpty && page > 1) {
|
||||
ToastUi.simpleToast(
|
||||
context!, AppLang.local(context!).no_more_data);
|
||||
return;
|
||||
}
|
||||
page++;
|
||||
print(productResponse.object.data.length);
|
||||
// isAllProductInitial = true;
|
||||
products.addAll(productResponse.object.data);
|
||||
notifyListeners();
|
||||
} else {
|
||||
ToastUi.simpleToast(context!, AppLang.local(context!).something_went_wrong);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
clearCategory(){
|
||||
selectedCategoryId=0;
|
||||
notifyListeners();
|
||||
}
|
||||
clearPriceRange(){
|
||||
price=RangeValues(0, 0);
|
||||
notifyListeners();
|
||||
}
|
||||
clearKeyWord(){
|
||||
searchTxt.clear();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
//handlers
|
||||
Future<void> onRefresh() async {
|
||||
await clearAll();
|
||||
await fetchAll();
|
||||
return;
|
||||
}
|
||||
|
||||
onSelectCategory(id) {
|
||||
selectedCategoryId = int.parse(id.toString());
|
||||
notifyListeners();
|
||||
}
|
||||
onChangePrice(newPrice) {
|
||||
price = newPrice;
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
//others
|
||||
scrollListener() {
|
||||
scrollController.addListener(() {
|
||||
if (scrollController.position.maxScrollExtent ==
|
||||
scrollController.position.pixels) {
|
||||
// getCategories();
|
||||
getProducts();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
page = 1;
|
||||
isCategoryInit = false;
|
||||
categories.clear();
|
||||
products = [];
|
||||
price=const RangeValues(0, 1);
|
||||
searchTxt.text = "";
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
fetchAll() {
|
||||
// getCategories();
|
||||
getProducts();
|
||||
}
|
||||
|
||||
initState() {
|
||||
clearAll();
|
||||
scrollListener();
|
||||
fetchAll();
|
||||
getProducts();
|
||||
}
|
||||
setInitData({searchKey,
|
||||
sort_by,
|
||||
max_price,
|
||||
min_price,
|
||||
category_id,
|
||||
tag_id,
|
||||
per_page}){
|
||||
|
||||
selectedCategoryId=int.parse((category_id??"0").toString());
|
||||
price= RangeValues(double.parse((min_price??0.0).toString()), double.parse((max_price??0.0).toString()));
|
||||
getProducts();
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
clearAll();
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
31
app_code/lib/presenters/help_center_presenter.dart
Normal file
31
app_code/lib/presenters/help_center_presenter.dart
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:grostore/apis/setting_api.dart';
|
||||
import 'package:grostore/models/help_center_response.dart';
|
||||
|
||||
class HelpCenterPresenter extends ChangeNotifier{
|
||||
|
||||
HelpCenterResponse? helpCenter;
|
||||
|
||||
|
||||
getData()async{
|
||||
var response = await SettingApi.getHelpCenter();
|
||||
helpCenter=response.object;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
initState(){
|
||||
getData();
|
||||
}
|
||||
|
||||
Future<void> onRefresh()async{
|
||||
clear();
|
||||
return getData();
|
||||
}
|
||||
clear(){
|
||||
helpCenter=null;
|
||||
}
|
||||
|
||||
}
|
||||
167
app_code/lib/presenters/home_presenter.dart
Normal file
167
app_code/lib/presenters/home_presenter.dart
Normal file
@@ -0,0 +1,167 @@
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:carousel_slider/carousel_controller.dart';
|
||||
import 'package:grostore/apis/banners_api.dart';
|
||||
import 'package:grostore/apis/category_api.dart';
|
||||
import 'package:grostore/apis/product_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_ui/Button.dart';
|
||||
import 'package:grostore/custom_ui/Image_view.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/helpers/device_info_helper.dart';
|
||||
import 'package:grostore/models/common/category_info.dart';
|
||||
import 'package:grostore/models/home_banner_response.dart';
|
||||
import 'package:grostore/models/product_mini_response.dart';
|
||||
import 'package:grostore/models/category_response.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class HomePresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
HomePresenter.context = context;
|
||||
}
|
||||
|
||||
int currentSlider = 0;
|
||||
|
||||
List<Widget> homeBannerImages = [];
|
||||
List<CategoryInfo> topCategoryList = [];
|
||||
List<ProductMini> bestSellingProductList = [];
|
||||
List<ProductMini> products = [];
|
||||
int page = 1;
|
||||
|
||||
bool isTopCategoryInitial = false;
|
||||
bool isHomeBannerInitial = false;
|
||||
bool isBestSellingProductInitial = false;
|
||||
bool isAllProductInitial = false;
|
||||
ScrollController homeScrollController = ScrollController();
|
||||
|
||||
fetchAll() {
|
||||
getProducts();
|
||||
fetchBannerImages();
|
||||
fetchTopCategories();
|
||||
fetBestSellingProducts();
|
||||
}
|
||||
|
||||
Widget bannerImageSimple(BannerData data) {
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 5),
|
||||
child: Button(
|
||||
minWidth: getWidth(context),
|
||||
onPressed: () {},
|
||||
child: ImageView(
|
||||
url: data.image,
|
||||
width: getWidth(context),
|
||||
height: 200,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
getProducts() async {
|
||||
var productResponse = await ProductApi.getAllProducts(page: page);
|
||||
|
||||
if (productResponse.statusCode == 200) {
|
||||
if (productResponse.object.data.isEmpty && page > 1) {
|
||||
ToastUi.simpleToast(
|
||||
context!, AppLang.local(context!).no_more_data);
|
||||
return;
|
||||
}
|
||||
page++;
|
||||
print(productResponse.object.data.length);
|
||||
isAllProductInitial = true;
|
||||
products.addAll(productResponse.object.data);
|
||||
notifyListeners();
|
||||
} else {
|
||||
ToastUi.simpleToast(context!, AppLang.local(context!).something_went_wrong);
|
||||
}
|
||||
}
|
||||
|
||||
onChangeBannerIndex(index) {
|
||||
currentSlider = index;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
fetchBannerImages() async {
|
||||
homeBannerImages = [];
|
||||
var bannerOneResponse = await BannersApi.homeBanner(context!);
|
||||
if (bannerOneResponse.statusCode == 200) {
|
||||
bannerOneResponse.object.data.forEach((slider) {
|
||||
homeBannerImages.add(bannerImageSimple(slider));
|
||||
});
|
||||
isHomeBannerInitial = true;
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
fetchTopCategories() async {
|
||||
var categoryResponse = await CategoryApi.topCategory();
|
||||
if (categoryResponse.statusCode == 200) {
|
||||
topCategoryList.addAll(categoryResponse.object.data);
|
||||
isTopCategoryInitial = true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
fetBestSellingProducts() async {
|
||||
var productResponse = await ProductApi.bestSelling(context!);
|
||||
|
||||
if (productResponse.statusCode == 200) {
|
||||
bestSellingProductList.addAll(productResponse.object.data);
|
||||
isBestSellingProductInitial = true;
|
||||
notifyListeners();
|
||||
} else {
|
||||
ToastUi.show(context!, AppLang.local(context!).something_went_wrong);
|
||||
}
|
||||
}
|
||||
|
||||
reset() {
|
||||
page=1;
|
||||
currentSlider = 0;
|
||||
homeBannerImages = [];
|
||||
topCategoryList = [];
|
||||
bestSellingProductList = [];
|
||||
products.clear();
|
||||
isAllProductInitial = false;
|
||||
isTopCategoryInitial = false;
|
||||
isHomeBannerInitial = false;
|
||||
isBestSellingProductInitial = false;
|
||||
}
|
||||
|
||||
Future<void> onRefresh() async {
|
||||
reset();
|
||||
fetchAll();
|
||||
}
|
||||
|
||||
changeCurrentSlider(index) {
|
||||
currentSlider = index;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
mainScrollListener(BuildContext context) {
|
||||
homeScrollController.addListener(() {
|
||||
//print("position: " + xcrollController.position.pixels.toString());
|
||||
//print("max: " + xcrollController.position.maxScrollExtent.toString());
|
||||
|
||||
if (homeScrollController.position.pixels ==
|
||||
homeScrollController.position.maxScrollExtent) {
|
||||
ToastUi.simpleToast(context, "Loading more...");
|
||||
getProducts();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
initState(BuildContext context) {
|
||||
mainScrollListener(context);
|
||||
reset();
|
||||
fetchAll();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
reset();
|
||||
}
|
||||
}
|
||||
50
app_code/lib/presenters/landing_page_presenter.dart
Normal file
50
app_code/lib/presenters/landing_page_presenter.dart
Normal file
@@ -0,0 +1,50 @@
|
||||
|
||||
import 'package:carousel_slider/carousel_controller.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/screens/landing_pages/auth_model.dart';
|
||||
import 'package:grostore/screens/landing_pages/page_model.dart';
|
||||
|
||||
class LandingPagePresenter extends ChangeNotifier{
|
||||
int currentIndex = 0;
|
||||
List<Widget> pages = [];
|
||||
static BuildContext? context;
|
||||
CarouselSliderController controller =CarouselSliderController();
|
||||
setContext(BuildContext context){
|
||||
LandingPagePresenter.context??=context;
|
||||
}
|
||||
iniState(){
|
||||
if(pages.isEmpty) {
|
||||
pages.addAll([
|
||||
PageModel(
|
||||
img: "landing_img1.png",
|
||||
headerTxt: AppLang.local(context!)
|
||||
.welcome_to_online_fresh_food_grocery_application,
|
||||
txt: AppLang.local(context!)
|
||||
.energetically_streamline_one_to_one_web_readiness_before_extensive_meta_services),
|
||||
PageModel(
|
||||
img: "landing_img2.png",
|
||||
headerTxt: AppLang.local(context!)
|
||||
.welcome_to_online_fresh_food_grocery_application,
|
||||
txt: AppLang.local(context!)
|
||||
.energetically_streamline_one_to_one_web_readiness_before_extensive_meta_services),
|
||||
PageModel(
|
||||
img: "landing_img3.png",
|
||||
headerTxt: AppLang.local(context!).welcome_to_online_fresh_food_grocery_application,
|
||||
txt: AppLang.local(context!)
|
||||
.energetically_streamline_one_to_one_web_readiness_before_extensive_meta_services),
|
||||
const AuthPageModel(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
indexChange(index){
|
||||
currentIndex=index;
|
||||
notifyListeners();
|
||||
}
|
||||
onChangeSlider(){
|
||||
controller.nextPage();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
}
|
||||
53
app_code/lib/presenters/main_persenter.dart
Normal file
53
app_code/lib/presenters/main_persenter.dart
Normal file
@@ -0,0 +1,53 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/custom_classes/system_data.dart';
|
||||
import 'package:grostore/helpers/shared_value_helper.dart';
|
||||
import 'package:grostore/screens/auth/login.dart';
|
||||
import 'package:grostore/screens/categories.dart';
|
||||
import 'package:grostore/screens/home.dart';
|
||||
import 'package:grostore/screens/order/orders.dart';
|
||||
import 'package:grostore/screens/profile.dart';
|
||||
import 'package:route_transitions/route_transitions.dart';
|
||||
|
||||
class MainPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
MainPresenter.context = context;
|
||||
}
|
||||
|
||||
int bottomAppbarIndex = 0;
|
||||
|
||||
// BottomAppbarIndex bottomAppbarIndex = BottomAppbarIndex();
|
||||
|
||||
var bottomAppbarChildren = [Home(), Categories(), Orders(), Account()];
|
||||
|
||||
fetchAll() {
|
||||
getCartCount();
|
||||
}
|
||||
|
||||
void onTapped(int i) {
|
||||
if ((i == 2)) {
|
||||
if ((!SystemData.isLogIn)) {
|
||||
Navigator.push(
|
||||
context!, MaterialPageRoute(builder: (context) => Login()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 3) {
|
||||
language_is_rtl.$
|
||||
? slideLeftWidget(newPage: Account(), context: context!)
|
||||
: slideRightWidget(newPage: Account(), context: context!);
|
||||
return;
|
||||
}
|
||||
|
||||
bottomAppbarIndex = i;
|
||||
|
||||
notifyListeners();
|
||||
//print("i$i");
|
||||
}
|
||||
|
||||
getCartCount() async {
|
||||
// Provider.of<Cart>(context, listen: false).getCount();
|
||||
}
|
||||
}
|
||||
49
app_code/lib/presenters/order_details_presenter.dart
Normal file
49
app_code/lib/presenters/order_details_presenter.dart
Normal file
@@ -0,0 +1,49 @@
|
||||
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/models/order/order_details_response.dart';
|
||||
|
||||
class OrderDetailsPresenter extends ChangeNotifier{
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
OrderDetailsPresenter.context = context;
|
||||
}
|
||||
|
||||
bool isInitDetails = false;
|
||||
OrderDetailsInfo? orderInfo ;
|
||||
static var orderCode= 0;
|
||||
|
||||
|
||||
getDetails(code) async {
|
||||
print(code);
|
||||
var response = await OrderApi.getDetails(code:code);
|
||||
if (response.statusCode == 200) {
|
||||
orderInfo=response.object.data;
|
||||
isInitDetails = true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
fetchAll(code) async {
|
||||
getDetails(code);
|
||||
}
|
||||
|
||||
Future<void>onRefresh(code) {
|
||||
clearAll();
|
||||
return fetchAll(code);
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
orderInfo=null;
|
||||
isInitDetails = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
initState(code) {
|
||||
fetchAll(code);
|
||||
orderCode = code;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
90
app_code/lib/presenters/order_presenter.dart
Normal file
90
app_code/lib/presenters/order_presenter.dart
Normal file
@@ -0,0 +1,90 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/models/order/order_details_response.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
import 'package:grostore/models/order/track_order_response.dart';
|
||||
|
||||
class OrderPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
OrderPresenter.context = context;
|
||||
}
|
||||
|
||||
Map<String, String> searchKey = {};
|
||||
int keySelectedIndex = 0;
|
||||
bool isOrdersInit = false;
|
||||
List<OrderInfo> orders = [];
|
||||
int page = 1;
|
||||
|
||||
TrackInfo? trackInfo;
|
||||
|
||||
TextEditingController trackOrderController = TextEditingController();
|
||||
|
||||
insetSearchKeys() {
|
||||
searchKey = {
|
||||
"all": AppLang.local(context!).all_order,
|
||||
"order_placed": AppLang.local(context!).pending,
|
||||
"processing": AppLang.local(context!).processing,
|
||||
"delivered": AppLang.local(context!).delivered,
|
||||
"cancelled": AppLang.local(context!).cancelled,
|
||||
};
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
getOrders() async {
|
||||
var response = await OrderApi.getOrders(searchKey.keys.elementAt(keySelectedIndex), page);
|
||||
if (response.statusCode == 200) {
|
||||
orders.addAll(response.object.data);
|
||||
page++;
|
||||
isOrdersInit = true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
trackOrder(id,BuildContext context) async {
|
||||
Loading.show(context);
|
||||
var response = await OrderApi.trackOrder(id);
|
||||
Loading.close();
|
||||
if (response.statusCode == 200) {
|
||||
trackInfo=response.object.data;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
onChangeIndex(int index) {
|
||||
if (index != keySelectedIndex) {
|
||||
keySelectedIndex = index;
|
||||
orders.clear();
|
||||
page = 1;
|
||||
isOrdersInit = false;
|
||||
notifyListeners();
|
||||
getOrders();
|
||||
}
|
||||
}
|
||||
|
||||
fetchAll() async {
|
||||
getOrders();
|
||||
}
|
||||
|
||||
onRefresh() {
|
||||
clearAll();
|
||||
return fetchAll();
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
page = 1;
|
||||
orders.clear();
|
||||
keySelectedIndex = 0;
|
||||
isOrdersInit = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
initState() {
|
||||
insetSearchKeys();
|
||||
fetchAll();
|
||||
}
|
||||
}
|
||||
103
app_code/lib/presenters/page_presenter.dart
Normal file
103
app_code/lib/presenters/page_presenter.dart
Normal file
@@ -0,0 +1,103 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/apis/page_api.dart';
|
||||
import 'package:grostore/apis/refund_api.dart';
|
||||
import 'package:grostore/apis/wallet_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
import 'package:grostore/models/page_response.dart';
|
||||
import 'package:grostore/models/refund_response.dart';
|
||||
import 'package:grostore/models/wallet_history_response.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class PagePresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
PagePresenter.context = context;
|
||||
}
|
||||
|
||||
bool isInitPageInfo = false;
|
||||
PageInfo? pageInfo;
|
||||
|
||||
WebViewController controller = WebViewController()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted);
|
||||
|
||||
getRefundHistory(slug) async {
|
||||
var response = await PageApi.getPage(slug: slug);
|
||||
if (response.statusCode == 200) {
|
||||
pageInfo = response.object.data;
|
||||
|
||||
controller.loadHtmlString(htmlBody(response.object.data.content));
|
||||
isInitPageInfo = true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
String htmlBody(htmlCode) {
|
||||
return """
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>Title of the document</title>
|
||||
<style>
|
||||
*{
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
#wrap {
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
#scaled-frame {
|
||||
zoom: 2;
|
||||
-moz-transform: scale(2);
|
||||
-moz-transform-origin: 0 0;
|
||||
-o-transform: scale(2);
|
||||
-o-transform-origin: 0 0;
|
||||
-webkit-transform: scale(2);
|
||||
-webkit-transform-origin: 0 0;
|
||||
}
|
||||
#scaled-frame {
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
#scaled-frame {
|
||||
zoom: 2;
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="scaled-frame">
|
||||
$htmlCode
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
""";
|
||||
}
|
||||
|
||||
fetchAll(slug) async {
|
||||
getRefundHistory(slug);
|
||||
}
|
||||
|
||||
Future<void> onRefresh(slug) {
|
||||
clearAll();
|
||||
return fetchAll(slug);
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
pageInfo = null;
|
||||
isInitPageInfo = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
initState(slug) {
|
||||
fetchAll(slug);
|
||||
}
|
||||
}
|
||||
38
app_code/lib/presenters/payment_presenter.dart
Normal file
38
app_code/lib/presenters/payment_presenter.dart
Normal file
@@ -0,0 +1,38 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/apis/page_api.dart';
|
||||
import 'package:grostore/apis/refund_api.dart';
|
||||
import 'package:grostore/apis/wallet_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/configs/app_config.dart';
|
||||
import 'package:grostore/helpers/shared_value_helper.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
import 'package:grostore/models/page_response.dart';
|
||||
import 'package:grostore/models/refund_response.dart';
|
||||
import 'package:grostore/models/wallet_history_response.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class PaymentPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
PaymentPresenter.context = context;
|
||||
}
|
||||
|
||||
WebViewController controller = WebViewController()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted);
|
||||
|
||||
loadUrl(code, method) async {
|
||||
controller.loadRequest(
|
||||
Uri.parse(
|
||||
"${AppConfig.apiUrl}/order/online-payment?code=$code&payment_method=$method"),
|
||||
headers: {"Authorization": "Bearer ${access_token.$}"});
|
||||
|
||||
notifyListeners();
|
||||
|
||||
|
||||
}
|
||||
initState(code, method) {
|
||||
loadUrl(code, method);
|
||||
}
|
||||
}
|
||||
175
app_code/lib/presenters/product_details_presenter.dart
Normal file
175
app_code/lib/presenters/product_details_presenter.dart
Normal file
@@ -0,0 +1,175 @@
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:carousel_slider/carousel_controller.dart';
|
||||
import 'package:grostore/apis/banners_api.dart';
|
||||
import 'package:grostore/apis/category_api.dart';
|
||||
import 'package:grostore/apis/product_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_classes/product_variation_data.dart';
|
||||
import 'package:grostore/custom_classes/system_data.dart';
|
||||
import 'package:grostore/custom_ui/Button.dart';
|
||||
import 'package:grostore/custom_ui/Image_view.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/helpers/device_info_helper.dart';
|
||||
import 'package:grostore/models/common/category_info.dart';
|
||||
import 'package:grostore/models/home_banner_response.dart';
|
||||
import 'package:grostore/models/product_details_response.dart';
|
||||
import 'package:grostore/models/product_mini_response.dart';
|
||||
import 'package:grostore/models/category_response.dart';
|
||||
import 'package:grostore/presenters/wishlist_presenter.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class ProductDetailsPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
ProductDetailsPresenter.context = context;
|
||||
}
|
||||
|
||||
String slug = "";
|
||||
int currentSlider = 0, quantity = 1;
|
||||
Variation? selectedVariation;
|
||||
|
||||
|
||||
// ScrollController mainScrollController = ScrollController();
|
||||
ProductDetailsInfo? productInfo;
|
||||
List<ProductMini> relatedProducts = [];
|
||||
List<ProductVariationData> variations = [];
|
||||
|
||||
bool isProductInfoInitial = false;
|
||||
bool isRelatedInitial = false;
|
||||
|
||||
fetchAll(String slug) {
|
||||
this.slug = slug;
|
||||
reset();
|
||||
fetchProductInfo(slug);
|
||||
fetchRelatedProduct(slug);
|
||||
}
|
||||
|
||||
onChangeBannerIndex(index) {
|
||||
currentSlider = index;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
incrementQty() {
|
||||
if (selectedVariation != null && selectedVariation!.sock > quantity) {
|
||||
quantity++;
|
||||
notifyListeners();
|
||||
}else{
|
||||
ToastUi.show(context!, AppLang.local(context!).product_stock_not_available);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
decrementQty() {
|
||||
if (1 < quantity) {
|
||||
quantity--;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
fetchProductInfo(String slug) async {
|
||||
var response = await ProductApi.details(context!, slug);
|
||||
if(response.statusCode==200){
|
||||
productInfo = response.object.data;
|
||||
if(SystemData.isLogIn) {
|
||||
Provider.of<WishlistPresenter>(context!,listen: false).checkWishlist(productInfo!.id);
|
||||
|
||||
}
|
||||
isProductInfoInitial = true;
|
||||
selectedVariation = productInfo!.variations.first;
|
||||
productInfo!.variationMaterials.forEach((element) {
|
||||
List<ProductVariationValue> value = [];
|
||||
element.values.forEach((valueElement) {
|
||||
var code;
|
||||
if (valueElement.code != null) {
|
||||
code =
|
||||
"0xFF" + valueElement.code!.replaceAll("#", "").toUpperCase();
|
||||
}
|
||||
value.add(ProductVariationValue(
|
||||
id: valueElement.id,
|
||||
isChosen: false,
|
||||
name: valueElement.name,
|
||||
code: code));
|
||||
});
|
||||
if (value.isNotEmpty) {
|
||||
value.first.isChosen = true;
|
||||
}
|
||||
variations.add(ProductVariationData(
|
||||
id: element.id, name: element.name, values: value));
|
||||
});
|
||||
notifyListeners();
|
||||
}else{
|
||||
_toastMessage();
|
||||
}
|
||||
}
|
||||
|
||||
_toastMessage(){
|
||||
ToastUi.show(context!, AppLang.local(context!).something_went_wrong);
|
||||
}
|
||||
|
||||
onChangeVariation(int variationIndex, int valueIndex) {
|
||||
int previousIndex = variations[variationIndex]
|
||||
.values
|
||||
.indexWhere((element) => element.isChosen);
|
||||
variations[variationIndex].values[previousIndex].isChosen = false;
|
||||
variations[variationIndex].values[valueIndex].isChosen = true;
|
||||
var variation_key = "";
|
||||
variations.forEach((element) {
|
||||
element.values.forEach((variationValue) {
|
||||
if (variationValue.isChosen) {
|
||||
variation_key += "${element.id}:${variationValue.id}/";
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
selectedVariation = productInfo!.variations
|
||||
.firstWhere((element) => element.variationKey == variation_key);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
fetchRelatedProduct(slug) async {
|
||||
var response = await ProductApi.relatedProducts(context!, slug);
|
||||
if(response.statusCode==200){
|
||||
relatedProducts.addAll(response.object.data);
|
||||
isRelatedInitial = true;
|
||||
notifyListeners();
|
||||
}else{
|
||||
_toastMessage();
|
||||
}
|
||||
}
|
||||
|
||||
fetBestSellingProducts() async {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
reset() {
|
||||
currentSlider = 0;
|
||||
quantity = 1;
|
||||
// ScrollController mainScrollController = ScrollController();
|
||||
productInfo = null;
|
||||
relatedProducts = [];
|
||||
variations = [];
|
||||
|
||||
isProductInfoInitial = false;
|
||||
isRelatedInitial = false;
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> onRefresh() async {
|
||||
reset();
|
||||
return fetchAll(slug);
|
||||
}
|
||||
|
||||
changeCurrentSlider(index) {
|
||||
currentSlider = index;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
iniState(slug) {
|
||||
reset();
|
||||
fetchAll(slug);
|
||||
}
|
||||
|
||||
}
|
||||
63
app_code/lib/presenters/refund_presenter.dart
Normal file
63
app_code/lib/presenters/refund_presenter.dart
Normal file
@@ -0,0 +1,63 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/apis/refund_api.dart';
|
||||
import 'package:grostore/apis/wallet_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
import 'package:grostore/models/refund_response.dart';
|
||||
import 'package:grostore/models/wallet_history_response.dart';
|
||||
import 'package:grostore/presenters/order_details_presenter.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class RefundPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
RefundPresenter.context = context;
|
||||
}
|
||||
|
||||
bool isRefundInit = false;
|
||||
List<RefundInfo> refundHistory = [];
|
||||
int page = 1;
|
||||
|
||||
|
||||
getRefundHistory() async {
|
||||
var response = await RefundApi.getRefundHistory(page);
|
||||
if (response.statusCode == 200) {
|
||||
refundHistory.addAll(response.object.data);
|
||||
page++;
|
||||
isRefundInit = true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
Future<bool> refundReq(BuildContext context,id,reason) async {
|
||||
Loading.show(context);
|
||||
var response = await RefundApi.refundRequest(id,reason);
|
||||
Loading.close();
|
||||
ToastUi.show(context, response.object.message);
|
||||
return response.object.result;
|
||||
}
|
||||
|
||||
fetchAll() async {
|
||||
getRefundHistory();
|
||||
}
|
||||
|
||||
Future<void>onRefresh() {
|
||||
clearAll();
|
||||
return fetchAll();
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
page = 1;
|
||||
refundHistory.clear();
|
||||
isRefundInit = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
initState() {
|
||||
clearAll();
|
||||
fetchAll();
|
||||
}
|
||||
}
|
||||
83
app_code/lib/presenters/setting_presenter.dart
Normal file
83
app_code/lib/presenters/setting_presenter.dart
Normal file
@@ -0,0 +1,83 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:grostore/apis/currency_api.dart';
|
||||
import 'package:grostore/apis/language_api.dart';
|
||||
import 'package:grostore/custom_classes/system_data.dart';
|
||||
import 'package:grostore/models/currency_response.dart';
|
||||
import 'package:grostore/models/language_response.dart';
|
||||
|
||||
import '../helpers/shared_value_helper.dart';
|
||||
|
||||
class SettingPresenter extends ChangeNotifier{
|
||||
|
||||
|
||||
|
||||
Locale _locale=Locale(app_language.$,'');
|
||||
|
||||
List<CurrencyInfo> currencyList=[];
|
||||
List<LanguageInfo> languageList=[];
|
||||
LanguageInfo? selectedLanguage ;
|
||||
CurrencyInfo? selectedCurrency ;
|
||||
|
||||
fetchCurrencyListData()async{
|
||||
currencyList.clear();
|
||||
var res = await CurrencyApi().getList();
|
||||
|
||||
currencyList.addAll(res.object.data);
|
||||
|
||||
print("Currency");
|
||||
currencyList.forEach((element) {
|
||||
if(system_currency.$.isEmpty && element.isDefault){
|
||||
print("Currency isDefault");
|
||||
onChange(element);
|
||||
}else
|
||||
if(system_currency.$.isNotEmpty && element.code == system_currency.$){
|
||||
print("Currency not isDefault");
|
||||
print(element.toJson());
|
||||
onChange(element);
|
||||
}
|
||||
});
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
fetchLanguageListData()async{
|
||||
languageList.clear();
|
||||
var res = await LanguageApi.getLanguages();
|
||||
languageList.addAll(res.object.data);
|
||||
languageList.forEach((element) {
|
||||
if(app_language.$ == element.code){
|
||||
selectedLanguage = element;
|
||||
}
|
||||
});
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onChange(CurrencyInfo currency){
|
||||
if(currency!=null) {
|
||||
selectedCurrency = currency;
|
||||
// SystemData.systemCurrency = currency;
|
||||
system_currency.$ = currency.code;
|
||||
system_currency.save();
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
Locale get locale {
|
||||
//print("app_mobile_language.isEmpty${app_mobile_language.$.isEmpty}");
|
||||
return _locale ;
|
||||
}
|
||||
|
||||
void setLocale(LanguageInfo languageInfo){
|
||||
_locale = Locale(languageInfo.code,'');
|
||||
selectedLanguage= languageInfo;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
|
||||
initState(){
|
||||
fetchCurrencyListData();
|
||||
fetchLanguageListData();
|
||||
}
|
||||
|
||||
}
|
||||
58
app_code/lib/presenters/stock_locations_presenter.dart
Normal file
58
app_code/lib/presenters/stock_locations_presenter.dart
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:grostore/apis/locations_api.dart';
|
||||
import 'package:grostore/helpers/shared_value_helper.dart';
|
||||
import 'package:grostore/models/locations_response.dart';
|
||||
|
||||
class StockLocationsPresenter extends ChangeNotifier{
|
||||
static BuildContext? context;
|
||||
setContext(BuildContext context){
|
||||
StockLocationsPresenter.context=context;
|
||||
}
|
||||
|
||||
List<LocationInfo> locations=[];
|
||||
bool isLocationInit=false;
|
||||
int selectedIndex=0;
|
||||
|
||||
|
||||
fetchLocations(BuildContext context) async {
|
||||
locations =[];
|
||||
var res = await LocationApi.getLocations(context);
|
||||
locations.addAll(res.object.data);
|
||||
isLocationInit = true;
|
||||
await stock_location_id.load();
|
||||
if(stock_location_id.$.isEmpty){
|
||||
locations.forEach((element) {
|
||||
if(element.isDefault) {
|
||||
stock_location_id.$ = element.id.toString();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
onchange(id){
|
||||
stock_location_id.$=id.toString();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
cleanAll(){
|
||||
locations=[];
|
||||
isLocationInit=false;
|
||||
}
|
||||
|
||||
initState(){
|
||||
cleanAll();
|
||||
fetchLocations(context!);
|
||||
}
|
||||
|
||||
Future<void> onRefresh(){
|
||||
cleanAll();
|
||||
fetchLocations(context!);
|
||||
return Future.delayed(Duration.zero);
|
||||
}
|
||||
|
||||
}
|
||||
156
app_code/lib/presenters/user_presenter.dart
Normal file
156
app_code/lib/presenters/user_presenter.dart
Normal file
@@ -0,0 +1,156 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:developer' show log;
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:grostore/apis/user_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_classes/system_data.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/helpers/route.dart';
|
||||
import 'package:grostore/models/user/addresses_response.dart';
|
||||
import 'package:grostore/screens/main.dart';
|
||||
import 'package:grostore/screens/profile.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
|
||||
class UserPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
UserPresenter.context = context;
|
||||
}
|
||||
|
||||
List<AddressInfo> addresses = [];
|
||||
bool isFetchAddress = false;
|
||||
final TextEditingController nameController =
|
||||
TextEditingController(text: SystemData.userInfo.name);
|
||||
|
||||
final TextEditingController phoneController =
|
||||
TextEditingController(text: SystemData.userInfo.phone);
|
||||
|
||||
TextEditingController emailController =
|
||||
TextEditingController(text: SystemData.userInfo.name);
|
||||
TextEditingController passwordController = TextEditingController();
|
||||
TextEditingController passwordConfirmController = TextEditingController();
|
||||
|
||||
bool showPassword = false;
|
||||
bool showConfirmPassword = false;
|
||||
|
||||
//for image uploading
|
||||
final ImagePicker _picker = ImagePicker();
|
||||
XFile? file;
|
||||
|
||||
chooseAndUploadImage(context) async {
|
||||
final fileX = await _picker.pickImage(source: ImageSource.gallery);
|
||||
final bytes = await fileX?.length() ?? 0;
|
||||
final size = bytes / (1024 * 1024);
|
||||
|
||||
if (size < 1) {
|
||||
file = fileX;
|
||||
notifyListeners();
|
||||
} else {
|
||||
ToastUi.show3(context, AppLang.local(context).image_mustbe_less_1_mb);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _onPageRefresh() async {}
|
||||
|
||||
onPressUpdate(BuildContext context) async {
|
||||
var name = nameController.text.toString();
|
||||
var phone = phoneController.text.toString();
|
||||
File? tmpFile;
|
||||
if (file != null) {
|
||||
tmpFile = File(file!.path);
|
||||
final bytes = await file?.length() ?? 0;
|
||||
log("Image size=====>>>>>>>>>>>>>>>");
|
||||
log("${(bytes) / (1024 * 1024)}");
|
||||
}
|
||||
|
||||
Loading.show(context);
|
||||
var response =
|
||||
await UserApi.updateProfile(file: tmpFile, name: name, phone: phone);
|
||||
Loading.close();
|
||||
ToastUi.show(context, response.object.message);
|
||||
if (response.object.result) {
|
||||
SystemData.userInfo.name = name;
|
||||
SystemData.userInfo.phone = phone;
|
||||
Navigator.of(context).pop();
|
||||
Navigator.of(context).pop();
|
||||
|
||||
//MakeRoute.goAndRemoveAll(context, Account());
|
||||
}
|
||||
}
|
||||
|
||||
onPressUpdatePassword(BuildContext context) async {
|
||||
var password = passwordController.text.toString();
|
||||
var password_confirm = passwordConfirmController.text.toString();
|
||||
|
||||
var change_password = password != "" ||
|
||||
password_confirm !=
|
||||
""; // if both fields are empty we will not change user's password
|
||||
|
||||
if (!change_password && password == "") {
|
||||
ToastUi.show(context, "Password is empty");
|
||||
return;
|
||||
}
|
||||
if (!change_password && password_confirm == "") {
|
||||
ToastUi.show(context, "Confirm Password is empty");
|
||||
return;
|
||||
}
|
||||
if (change_password && password.length < 6) {
|
||||
ToastUi.show(
|
||||
context, AppLang.local(context).password_must_be_at_last_6_digit);
|
||||
return;
|
||||
}
|
||||
if (change_password && password != password_confirm) {
|
||||
ToastUi.show(context, "Password and Confirm Password does not matched!");
|
||||
return;
|
||||
}
|
||||
|
||||
var post_body = jsonEncode({
|
||||
"password": "$password",
|
||||
"password_confirmation": "$password_confirm"
|
||||
});
|
||||
|
||||
var res = await UserApi.updatePassword(post_body);
|
||||
if (res.object.result) {
|
||||
ToastUi.show(context, "Parolingiz muvaffaqiytli yangilandi");
|
||||
}
|
||||
{
|
||||
ToastUi.show(context, "Nimadur muammoga sabab bo'ldi.");
|
||||
}
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
|
||||
Future<void> refresh() {
|
||||
return Future(() => 0);
|
||||
}
|
||||
|
||||
passwordShowHide() {
|
||||
showPassword = !showPassword;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
conPasswordShowHide() {
|
||||
showConfirmPassword = !showConfirmPassword;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
fetchAddresses() async {
|
||||
var res = await UserApi.getAddresses();
|
||||
addresses.clear();
|
||||
addresses.addAll(res.data);
|
||||
isFetchAddress = true;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
initState() {
|
||||
fetchAddresses();
|
||||
}
|
||||
|
||||
addAddress() {}
|
||||
|
||||
getCountries() {}
|
||||
}
|
||||
49
app_code/lib/presenters/wallet_presenter.dart
Normal file
49
app_code/lib/presenters/wallet_presenter.dart
Normal file
@@ -0,0 +1,49 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/apis/wallet_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
import 'package:grostore/models/wallet_history_response.dart';
|
||||
|
||||
class WalletPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
|
||||
setContext(BuildContext context) {
|
||||
WalletPresenter.context = context;
|
||||
}
|
||||
|
||||
bool isWalletInit = false;
|
||||
List<WalletInfo> walletHistory = [];
|
||||
int page = 1;
|
||||
|
||||
|
||||
getWalletHistory() async {
|
||||
var response = await WalletApi.getWalletHistory(page);
|
||||
if (response.statusCode == 200) {
|
||||
walletHistory.addAll(response.object.data);
|
||||
page++;
|
||||
isWalletInit = true;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
fetchAll() async {
|
||||
getWalletHistory();
|
||||
}
|
||||
|
||||
Future<void> onRefresh()async {
|
||||
clearAll();
|
||||
return fetchAll();
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
page = 1;
|
||||
walletHistory.clear();
|
||||
isWalletInit = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
initState() {
|
||||
fetchAll();
|
||||
}
|
||||
}
|
||||
96
app_code/lib/presenters/wishlist_presenter.dart
Normal file
96
app_code/lib/presenters/wishlist_presenter.dart
Normal file
@@ -0,0 +1,96 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_countdown_timer/countdown_timer_controller.dart';
|
||||
import 'package:grostore/apis/coupons_api.dart';
|
||||
import 'package:grostore/apis/order_api.dart';
|
||||
import 'package:grostore/apis/wishlist_api.dart';
|
||||
import 'package:grostore/app_lang.dart';
|
||||
import 'package:grostore/custom_ui/loading.dart';
|
||||
import 'package:grostore/custom_ui/toast_ui.dart';
|
||||
import 'package:grostore/models/coupon_response.dart';
|
||||
import 'package:grostore/models/order/orders_response.dart';
|
||||
import 'package:grostore/models/product_mini_response.dart';
|
||||
import 'package:grostore/models/wishlist_response.dart';
|
||||
|
||||
class WishlistPresenter extends ChangeNotifier {
|
||||
static BuildContext? context;
|
||||
setContext(BuildContext context) {
|
||||
WishlistPresenter.context = context;
|
||||
}
|
||||
|
||||
List<WishlistInfo> wishlists = [];
|
||||
bool isWishlistInit = false;
|
||||
bool isAddedWishlist = false;
|
||||
|
||||
|
||||
fetchWishlistProducts() async {
|
||||
var productResponse = await WishlistApi.getWishlist();
|
||||
if(productResponse.statusCode==200) {
|
||||
wishlists.addAll(productResponse.object.data);
|
||||
isWishlistInit = true;
|
||||
notifyListeners();
|
||||
}else{
|
||||
ToastUi.show(context!, AppLang.local(context!).something_went_wrong);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
addWishlist(id,BuildContext context) async {
|
||||
var response = await WishlistApi.addWishlist(id);
|
||||
if(response.statusCode==200) {
|
||||
ToastUi.show(context, response.object.message);
|
||||
isAddedWishlist = true;
|
||||
notifyListeners();
|
||||
}else{
|
||||
ToastUi.show(context, AppLang.local(context).something_went_wrong);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
deleteWishlist(id,BuildContext context) async {
|
||||
|
||||
Loading.show(context);
|
||||
var response = await WishlistApi.deleteWishlist(id);
|
||||
Loading.close();
|
||||
if(response.statusCode==200) {
|
||||
ToastUi.show(context, response.object.message);
|
||||
isAddedWishlist = false;
|
||||
initState();
|
||||
notifyListeners();
|
||||
}else{
|
||||
ToastUi.show(context, AppLang.local(context).something_went_wrong);
|
||||
}
|
||||
}
|
||||
checkWishlist(id) async {
|
||||
var response = await WishlistApi.checkWishlist(id);
|
||||
if(response.statusCode==200) {
|
||||
isAddedWishlist=response.object.result;
|
||||
print("isAddedWishlist");
|
||||
print(isAddedWishlist);
|
||||
notifyListeners();
|
||||
}else{
|
||||
ToastUi.show(context!, AppLang.local(context!).something_went_wrong);
|
||||
}
|
||||
}
|
||||
|
||||
fetchAll() async{
|
||||
await fetchWishlistProducts();
|
||||
}
|
||||
|
||||
clearAll() {
|
||||
isWishlistInit=false;
|
||||
wishlists.clear();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> reFresh(){
|
||||
clearAll();
|
||||
return fetchAll();
|
||||
}
|
||||
|
||||
initState() {
|
||||
clearAll();
|
||||
fetchAll();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user