Initial commit

This commit is contained in:
jahongireshonqulov
2025-10-17 19:42:02 +05:00
commit 9fbdabafb4
1420 changed files with 28021 additions and 0 deletions

View 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();
}
}

View 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);
// }
// }
// }

View 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);
// }
// }
// }

View 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));
}
}

View 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 => [];
}

View 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 => [];
}

View 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(){
}
}

View 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();
}
}

View 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);
// }
// }
}

View 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();
}
}

View 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();
}
}

View 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;
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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);
}
}

View 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);
}
}

View 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);
}
}

View 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();
}
}

View 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();
}
}

View 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);
}
}

View 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() {}
}

View 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();
}
}

View 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();
}
}