Merge branch 'pharmacy' of https://gitlab.com/Cloud_Solution/diplomatic-quarter into fatima_merge

 Conflicts:
	android/app/build.gradle
	lib/config/config.dart
	lib/pages/pharmacy/profile/profile.dart
	lib/widgets/pharmacy/product_tile.dart
merge-requests/228/head
Mohammad Aljammal 4 years ago
commit 16d1f667d4

@ -78,6 +78,7 @@ dependencies {
// exclude group: 'com.google.protobuf',module: 'protobuf-lite'
// })
implementation 'pub.devrel:easypermissions:0.4.0'
// implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'
implementation 'com.google.guava:guava:27.0.1-android'
// Dependency on local binaries
implementation fileTree(dir: 'libs', include: ['*.jar'])

@ -1,5 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true
org.gradle.jvmargs=-Xmx4608m

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

@ -6,7 +6,7 @@ import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
const MAX_SMALL_SCREEN = 660;
const BASE_URL = 'https://uat.hmgwebservices.com/';
const BASE_URL = 'https://hmgwebservices.com/';
//const BASE_PHARMACY_URL = 'http://swd-pharapp-01:7200/api/';
const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/';
const PHARMACY_BASE_URL = 'https://uat.hmgwebservices.com/epharmacy/api/';
@ -245,7 +245,7 @@ const UPDATE_HEALTH_TERMS =
const CHANNEL = 3;
const GENERAL_ID = 'Cs2020@2016\$2958';
const IP_ADDRESS = '10.20.10.20';
const VERSION_ID = 5.6;
const VERSION_ID = 6.1;
const SETUP_ID = '91877';
const LANGUAGE = 2;
const PATIENT_OUT_SA = 0;
@ -359,6 +359,7 @@ const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals";
// pharmacy
const PHARMACY_VERIFY_CUSTOMER = "epharmacy/api/VerifyCustomer";
const PHARMACY_GET_COUNTRY = "epharmacy/api/countries";
const PHARMACY_CREATE_CUSTOMER = "epharmacy/api/CreateCustomer";
const GET_PHARMACY_BANNER = "epharmacy/api/promotionbanners";
const GET_PHARMACY_TOP_MANUFACTURER = "epharmacy/api/topmanufacturer";
@ -367,6 +368,9 @@ const GET_PHARMACY_PRODUCTs_BY_IDS = "epharmacy/api/productsbyids/";
const GET_CUSTOMERS_ADDRESSES = "epharmacy/api/Customers/";
const GET_ORDER = "orders?";
const GET_ORDER_DETAILS = "epharmacy/api/orders/";
const ADD_CUSTOMER_ADDRESS = "epharmacy/api/addcustomeraddress";
const EDIT_CUSTOMER_ADDRESS = "epharmacy/api/editcustomeraddress";
const DELETE_CUSTOMER_ADDRESS = "epharmacy/api/deletecustomeraddress";
const GET_ADDRESS = "Customers/";
const GET_Cancel_ORDER = "cancelorder/";
const WRITE_REVIEW = "Content-Type" + "text/plain; charset=utf-8";
@ -415,11 +419,14 @@ const PHARMACY_MAKE_REVIEW = 'epharmacy/api/insertreviews';
//Pharmacy wishlist
const GET_WISHLIST = "shopping_cart_items/";
const DELETE_WISHLIST = "delete_shopping_cart_item_by_product?customer_id=";
const GET_REVIEW = "customerreviews/";
const GET_BRANDS = "manufacturer";
const GET_TOP_BRANDS = "topmanufacturer?page=1&limit=8";
const GET_PRODUCT_DETAIL = "products/";
const GET_LOCATION = "Services/Patients.svc/REST/GetPharmcyListBySKU";
const GET_SPECIFICATION = "productspecification/";
const GET_BRAND_ITEMS = "products?ManufacturerId=";
// External API
const ADD_ADDRESS_INFO =

@ -678,9 +678,16 @@ const Map localizedValues = {
"shippedMethod": {"en": "SHIP BY:", "ar": " الشحن بواسطة:"},
"orderDetail": {"en": "Order Details", "ar": " تفاصيل الطلب"},
"orderSummary": {"en": "Order Summary", "ar": " تفاصيل المنتج"},
"subtotal": {"en": "Subtotal", "ar": " المجموع"},
"subtotal": {"en": "Subtotal", "ar": " المجموع الفرعي"},
"shipping": {"en": "Shipping", "ar": " الشحن"},
"shipBy": {"en": "SHIP BY:", "ar": "الشحن عن طريق:"},
"lakumPoints": {"en": "Lakum Points", "ar": "نقاط لكم"},
"use": {"en": "USE", "ar": "استخدم"},
"proceedPay": {"en": "PROCEED TO PAY", "ar": "المتابعة للدفع"},
"vat": {"en": "VAT (15%)", "ar": "(15%) القيمة المضافة"},
"inclusiveVat": {"en": "(inclusive VAT)", "ar": "(شامل الضريبة)"},
"items": {"en": "item(s)", "ar": "عنصر"},
"checkOut": {"en": "CHECK OUT", "ar": "الدفع"},
"sar": {"en": "SAR", "ar": " ر.س "},
"payOnline": {"en": "PAY ONLINE", "ar": "اتمام عملية الدفع "},
"cancelOrder": {"en": "CANCEL ORDER", "ar": "الغاء الطلب "},
@ -1163,4 +1170,55 @@ const Map localizedValues = {
"en": "Select Home Health Care Services",
"ar": " حدد خدمات الرعاية الصحية المنزلية"
},
"topBrands":{
"en":"Top Brands",
"ar":"اعلى العلامات التجارية"
},
"notifyMe":{
"en":"notify me",
"ar":"اعلمني"
},
"specification":{
"en":"Specification",
"ar":"تخصيص"
},
"details":{
"en":"Details",
"ar":"تفاصيل"
},
"availability":{
"en":"Availability",
"ar":"التوفر"
},
"quantity":{
"en":"Quantity",
"ar":"التوفر"
},
"quantitySize":{
"en":"Quantity",
"ar":"كميه"
},
"addToCart":{
"en":"add to cart",
"ar":"إضفة للسلة"
},
"buyNow":{
"en":"buy now",
"ar":"إشتري الان"
},
"quantityShortcut":{
"en":"QTY",
"ar":"كمية"
},
"pharmacyServiceTermsCondition": {
"en": "I agree with the terms of service and I adhere to them unconditionally",
"ar": " أوافق على شروط الخدمة وألتزم بها دون قيد أو شرط"
},
};

@ -21,3 +21,4 @@ const THEME_VALUE = 'is_vibration';
const MAIN_USER = 'main-user';
const PHARMACY_LAST_VISITED_PRODUCTS = 'last-visited';
const PHARMACY_CUSTOMER_ID = 'costumer-id';
const PHARMACY_SELECTED_ADDRESS = 'selected-address';

@ -0,0 +1,32 @@
class CountryData {
int id;
String name;
String namen;
String twoLetterIsoCode;
String threeLetterIsoCode;
CountryData(
{this.id,
this.name,
this.namen,
this.twoLetterIsoCode,
this.threeLetterIsoCode});
CountryData.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
namen = json['namen'];
twoLetterIsoCode = json['two_letter_iso_code'];
threeLetterIsoCode = json['three_letter_iso_code'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
data['namen'] = this.namen;
data['two_letter_iso_code'] = this.twoLetterIsoCode;
data['three_letter_iso_code'] = this.threeLetterIsoCode;
return data;
}
}

@ -27,9 +27,9 @@ class LakumInquiryInformationObjVersion {
int transferPoints;
List<PointsAmountPerYear> transferPointsAmountPerYear;
List<PointsDetails> transferPointsDetails;
int waitingPoints;
int loyalityAmount;
int loyalityPoints;
dynamic waitingPoints;
dynamic loyalityAmount;
dynamic loyalityPoints;
int purchaseRate;
LakumInquiryInformationObjVersion(

@ -1,24 +1,117 @@
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/Country.dart';
import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:google_maps_place_picker/google_maps_place_picker.dart';
import '../../../locator.dart';
import '../base_view_model.dart';
class PharmacyAddressesViewModel extends BaseViewModel {
PharmacyAddressService _pharmacyAddressService = locator<PharmacyAddressService>();
List<PharmacyAddressesModel> get address => _pharmacyAddressService.address;
PharmacyAddressService _pharmacyAddressService =
locator<PharmacyAddressService>();
List<Addresses> get addresses => _pharmacyAddressService.addresses;
int get selectedAddressIndex => _pharmacyAddressService.selectedAddressIndex;
CountryData get country => _pharmacyAddressService.country;
setSelectedAddressIndex(int index) {
_pharmacyAddressService.selectedAddressIndex = index;
}
Future getAddress(address) async {
Future getAddressesList() async {
setState(ViewState.Busy);
await _pharmacyAddressService.getAddress(address);
await _pharmacyAddressService.getAddresses();
if (_pharmacyAddressService.hasError) {
error = _pharmacyAddressService.error;
setState(ViewState.Error);
} else {
print(address.length);
setState(ViewState.Idle);
}
}
}
/* Future getCountries(String countryName) async {
setState(ViewState.Busy);
await _pharmacyAddressService.getCountries(countryName);
if (_pharmacyAddressService.hasError) {
error = _pharmacyAddressService.error;
// setState(ViewState.Error);
} else {
// setState(ViewState.Idle);
}
}*/
Future addEditAddress(PickResult value, Addresses editedAddress) async {
setState(ViewState.Busy);
Addresses sendingAddress;
if (editedAddress == null) {
sendingAddress = Addresses();
sendingAddress.id = "0";
sendingAddress.firstName = user.firstName;
sendingAddress.lastName = user.lastName;
sendingAddress.email = user.emailAddress;
sendingAddress.company = null;
} else {
sendingAddress = editedAddress;
}
value.addressComponents.forEach((element) {
if (element.types.contains("country")) {
sendingAddress.country = element.longName;
}
if (element.types.contains("administrative_area_level_1")) {
sendingAddress.city = element.longName;
}
if (element.types.contains("postal_code")) {
sendingAddress.zipPostalCode = element.longName;
}
if (element.types.contains("administrative_area_level_2")) {
sendingAddress.province = element.longName;
}
});
sendingAddress.latLong = value.geometry.location.toString();
await _pharmacyAddressService.getCountries(sendingAddress.country);
sendingAddress.countryId = country.id;
sendingAddress.stateProvinceId = null;
sendingAddress.address1 = value.formattedAddress;
sendingAddress.address2 = "";
sendingAddress.phoneNumber = user.mobileNumber;
sendingAddress.faxNumber = user.faxNumber;
sendingAddress.customerAttributes = "";
sendingAddress.createdOnUtc = DateTime.now().toString();
if (editedAddress == null) {
await _pharmacyAddressService.addCustomerAddress(sendingAddress);
} else {
await _pharmacyAddressService.editCustomerAddress(sendingAddress);
}
if (_pharmacyAddressService.hasError) {
error = _pharmacyAddressService.error;
setState(ViewState.Error);
} else {
setState(ViewState.Idle);
}
}
Future deleteAddresses(Addresses sendingAddress) async {
setState(ViewState.Busy);
await _pharmacyAddressService.deleteCustomerAddress(sendingAddress);
if (_pharmacyAddressService.hasError) {
error = _pharmacyAddressService.error;
setState(ViewState.Error);
} else {
setState(ViewState.Idle);
}
}
Future saveSelectedAddressLocally(Addresses selectedAddress) async {
await sharedPref.setObject(PHARMACY_SELECTED_ADDRESS, selectedAddress);
}
}

@ -14,6 +14,9 @@ class BrandsViewModel extends BaseViewModel{
BrandsService _topBrandsService = locator<BrandsService>();
List<TopBrand> get topBrandsListList => _topBrandsService.topBrandsList;
List<Brand> get searchList =>
_brandsService.searchList;
bool hasError = false;
@ -38,4 +41,17 @@ class BrandsViewModel extends BaseViewModel{
} else
setState(ViewState.Idle);
}
Future searchProducts({String productName}) async {
hasError = false;
_brandsService.clearSearchList();
setState(ViewState.Busy);
await _brandsService.searchProducts(productName: productName);
if (_brandsService.hasError) {
error = _brandsService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
}

@ -1,26 +1,36 @@
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart';
import 'package:diplomaticquarterapp/models/pharmacy/Wishlist.dart';
import 'package:diplomaticquarterapp/models/pharmacy/locationModel.dart';
import 'package:diplomaticquarterapp/models/pharmacy/productDetailModel.dart';
import 'package:diplomaticquarterapp/services/pharmacy_services/product_detail_service.dart';
import 'package:diplomaticquarterapp/models/pharmacy/specification.dart';
import '../../../locator.dart';
class ProductDetailViewModel extends BaseViewModel{
ProductDetailService _productDetailService = locator<ProductDetailService>();
ProductDetailService _productLocationService = locator<ProductDetailService>();
ProductDetailService _productWishlistService = locator<ProductDetailService>();
ProductDetailService _productSpecification = locator<ProductDetailService>();
List<ProductDetail> get productDetailService => _productDetailService.productDetailList;
List<LocationModel> get productLocationService => _productDetailService.productLocationList;
List<LocationModel> get productLocationService => _productLocationService.productLocationList;
List<Wishlist> get wishListItems => _productWishlistService.wishListProducts;
List<SpecificationModel> get productSpecification => _productSpecification.productSpecification;
bool hasError = false;
Future getProductReviewsData() async {
Future getProductReviewsData(productID) async {
print('ENAD REview');
hasError = false;
setState(ViewState.Busy);
await _productDetailService.getProductReviews();
await _productDetailService.getProductReviews(productID);
if (_productDetailService.hasError) {
error = _productDetailService.error;
setState(ViewState.ErrorLocal);
@ -29,15 +39,72 @@ class ProductDetailViewModel extends BaseViewModel{
}
Future getProductLocationData() async {
print('ENAD in model view');
hasError = false;
setState(ViewState.Busy);
await _productDetailService.getProductAvailabiltyDetail();
if (_productDetailService.hasError) {
error = _productDetailService.error;
await _productLocationService.getProductAvailabiltyDetail();
if (_productLocationService.hasError) {
error = _productLocationService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
Future addToCartData(quantity, itemID) async {
hasError = false;
setState(ViewState.Busy);
await _productLocationService.addToCart(quantity, itemID);
if (_productLocationService.hasError) {
error = _productLocationService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
Future addToWishlistData(itemID) async {
hasError = false;
setState(ViewState.Busy);
await _productLocationService.addToWishlist(itemID);
if (_productLocationService.hasError) {
error = _productLocationService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
Future checkWishlistData() async {
hasError = false;
setState(ViewState.Busy);
await _productWishlistService.getWishlistItems();
if (_productWishlistService.hasError) {
error = _productWishlistService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
Future deletWishlistData(itemID) async {
hasError = false;
setState(ViewState.Busy);
await _productWishlistService.delteItemFromWishlist(itemID);
if (_productWishlistService.hasError) {
error = _productWishlistService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
Future productSpecificationData(itemID) async {
hasError = false;
setState(ViewState.Busy);
await _productWishlistService.productSpecificationData(itemID);
if (_productWishlistService.hasError) {
error = _productWishlistService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
}

@ -10,9 +10,11 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';
import 'config/size_config.dart';
import 'core/viewModels/project_view_model.dart';
import 'locator.dart';
import 'pages/pharmacies/compare-list.dart';
void main() async {
setupLocator();
@ -45,7 +47,9 @@ class MyApp extends StatelessWidget {
StreamProvider.value(
value: RobotProvider().intStream(),
initialData: RobotProvider().setValue({}),
)
),
ChangeNotifierProvider<CompareList>(
create: (context) => CompareList()),
],
child: Consumer<ProjectViewModel>(
builder: (context, projectProvider, child) => MaterialApp(

@ -0,0 +1,924 @@
// To parse this JSON data, do
//
// final shoppingCart = shoppingCartFromJson(jsonString);
import 'dart:convert';
ShoppingCart shoppingCartFromJson(String str) => ShoppingCart.fromJson(json.decode(str));
String shoppingCartToJson(ShoppingCart data) => json.encode(data.toJson());
class ShoppingCart {
ShoppingCart({
this.itemCount,
this.quantityCount,
this.subtotal,
this.subtotalWithVat,
this.subtotalVatAmount,
this.subtotalVatRate,
this.shoppingCarts,
});
int itemCount;
int quantityCount;
double subtotal;
double subtotalWithVat;
double subtotalVatAmount;
int subtotalVatRate;
List<ShoppingCartElement> shoppingCarts;
factory ShoppingCart.fromJson(Map<String, dynamic> json) => ShoppingCart(
itemCount: json["item_count"],
quantityCount: json["quantity_count"],
subtotal: json["subtotal"].toDouble(),
subtotalWithVat: json["subtotal_with_vat"].toDouble(),
subtotalVatAmount: json["subtotal_vat_amount"].toDouble(),
subtotalVatRate: json["subtotal_vat_rate"],
shoppingCarts: List<ShoppingCartElement>.from(json["shopping_carts"].map((x) => ShoppingCartElement.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"item_count": itemCount,
"quantity_count": quantityCount,
"subtotal": subtotal,
"subtotal_with_vat": subtotalWithVat,
"subtotal_vat_amount": subtotalVatAmount,
"subtotal_vat_rate": subtotalVatRate,
"shopping_carts": List<dynamic>.from(shoppingCarts.map((x) => x.toJson())),
};
}
class ShoppingCartElement {
ShoppingCartElement({
this.languageId,
this.id,
this.productAttributes,
this.customerEnteredPrice,
this.quantity,
this.discountAmountInclTax,
this.subtotal,
this.subtotalWithVat,
this.subtotalVatAmount,
this.subtotalVatRate,
this.currency,
this.currencyn,
this.rentalStartDateUtc,
this.rentalEndDateUtc,
this.createdOnUtc,
this.updatedOnUtc,
this.shoppingCartType,
this.productId,
this.product,
this.customerId,
this.customer,
});
int languageId;
String id;
List<dynamic> productAttributes;
int customerEnteredPrice;
int quantity;
dynamic discountAmountInclTax;
String subtotal;
String subtotalWithVat;
String subtotalVatAmount;
String subtotalVatRate;
String currency;
String currencyn;
dynamic rentalStartDateUtc;
dynamic rentalEndDateUtc;
DateTime createdOnUtc;
DateTime updatedOnUtc;
String shoppingCartType;
int productId;
Product product;
int customerId;
Customer customer;
factory ShoppingCartElement.fromJson(Map<String, dynamic> json) => ShoppingCartElement(
languageId: json["language_id"],
id: json["id"],
productAttributes: List<dynamic>.from(json["product_attributes"].map((x) => x)),
customerEnteredPrice: json["customer_entered_price"],
quantity: json["quantity"],
discountAmountInclTax: json["discount_amount_incl_tax"],
subtotal: json["subtotal"],
subtotalWithVat: json["subtotal_with_vat"],
subtotalVatAmount: json["subtotal_vat_amount"],
subtotalVatRate: json["subtotal_vat_rate"],
currency: json["currency"],
currencyn: json["currencyn"],
rentalStartDateUtc: json["rental_start_date_utc"],
rentalEndDateUtc: json["rental_end_date_utc"],
createdOnUtc: DateTime.parse(json["created_on_utc"]),
updatedOnUtc: DateTime.parse(json["updated_on_utc"]),
shoppingCartType: json["shopping_cart_type"],
productId: json["product_id"],
product: Product.fromJson(json["product"]),
customerId: json["customer_id"],
customer: Customer.fromJson(json["customer"]),
);
Map<String, dynamic> toJson() => {
"language_id": languageId,
"id": id,
"product_attributes": List<dynamic>.from(productAttributes.map((x) => x)),
"customer_entered_price": customerEnteredPrice,
"quantity": quantity,
"discount_amount_incl_tax": discountAmountInclTax,
"subtotal": subtotal,
"subtotal_with_vat": subtotalWithVat,
"subtotal_vat_amount": subtotalVatAmount,
"subtotal_vat_rate": subtotalVatRate,
"currency": currency,
"currencyn": currencyn,
"rental_start_date_utc": rentalStartDateUtc,
"rental_end_date_utc": rentalEndDateUtc,
"created_on_utc": createdOnUtc.toIso8601String(),
"updated_on_utc": updatedOnUtc.toIso8601String(),
"shopping_cart_type": shoppingCartType,
"product_id": productId,
"product": product.toJson(),
"customer_id": customerId,
"customer": customer.toJson(),
};
}
class Customer {
Customer({
this.billingAddress,
this.shippingAddress,
this.addresses,
this.id,
this.username,
this.email,
this.firstName,
this.lastName,
this.languageId,
this.adminComment,
this.isTaxExempt,
this.hasShoppingCartItems,
this.active,
this.deleted,
this.isSystemAccount,
this.systemName,
this.lastIpAddress,
this.createdOnUtc,
this.lastLoginDateUtc,
this.lastActivityDateUtc,
this.registeredInStoreId,
this.roleIds,
});
Address billingAddress;
Address shippingAddress;
List<Address> addresses;
String id;
String username;
String email;
dynamic firstName;
dynamic lastName;
dynamic languageId;
dynamic adminComment;
bool isTaxExempt;
bool hasShoppingCartItems;
bool active;
bool deleted;
bool isSystemAccount;
dynamic systemName;
String lastIpAddress;
DateTime createdOnUtc;
DateTime lastLoginDateUtc;
DateTime lastActivityDateUtc;
int registeredInStoreId;
List<dynamic> roleIds;
factory Customer.fromJson(Map<String, dynamic> json) => Customer(
billingAddress: Address.fromJson(json["billing_address"]),
shippingAddress: Address.fromJson(json["shipping_address"]),
addresses: List<Address>.from(json["addresses"].map((x) => Address.fromJson(x))),
id: json["id"],
username: json["username"],
email: json["email"],
firstName: json["first_name"],
lastName: json["last_name"],
languageId: json["language_id"],
adminComment: json["admin_comment"],
isTaxExempt: json["is_tax_exempt"],
hasShoppingCartItems: json["has_shopping_cart_items"],
active: json["active"],
deleted: json["deleted"],
isSystemAccount: json["is_system_account"],
systemName: json["system_name"],
lastIpAddress: json["last_ip_address"],
createdOnUtc: DateTime.parse(json["created_on_utc"]),
lastLoginDateUtc: DateTime.parse(json["last_login_date_utc"]),
lastActivityDateUtc: DateTime.parse(json["last_activity_date_utc"]),
registeredInStoreId: json["registered_in_store_id"],
roleIds: List<dynamic>.from(json["role_ids"].map((x) => x)),
);
Map<String, dynamic> toJson() => {
"billing_address": billingAddress.toJson(),
"shipping_address": shippingAddress.toJson(),
"addresses": List<dynamic>.from(addresses.map((x) => x.toJson())),
"id": id,
"username": username,
"email": email,
"first_name": firstName,
"last_name": lastName,
"language_id": languageId,
"admin_comment": adminComment,
"is_tax_exempt": isTaxExempt,
"has_shopping_cart_items": hasShoppingCartItems,
"active": active,
"deleted": deleted,
"is_system_account": isSystemAccount,
"system_name": systemName,
"last_ip_address": lastIpAddress,
"created_on_utc": createdOnUtc.toIso8601String(),
"last_login_date_utc": lastLoginDateUtc.toIso8601String(),
"last_activity_date_utc": lastActivityDateUtc.toIso8601String(),
"registered_in_store_id": registeredInStoreId,
"role_ids": List<dynamic>.from(roleIds.map((x) => x)),
};
}
class Address {
Address({
this.id,
this.firstName,
this.lastName,
this.email,
this.company,
this.countryId,
this.country,
this.stateProvinceId,
this.city,
this.address1,
this.address2,
this.zipPostalCode,
this.phoneNumber,
this.faxNumber,
this.customerAttributes,
this.createdOnUtc,
this.province,
this.latLong,
});
String id;
FirstName firstName;
LastName lastName;
Email email;
dynamic company;
int countryId;
Country country;
dynamic stateProvinceId;
City city;
String address1;
String address2;
String zipPostalCode;
String phoneNumber;
dynamic faxNumber;
String customerAttributes;
DateTime createdOnUtc;
dynamic province;
String latLong;
factory Address.fromJson(Map<String, dynamic> json) => Address(
id: json["id"],
firstName: firstNameValues.map[json["first_name"]],
lastName: lastNameValues.map[json["last_name"]],
email: emailValues.map[json["email"]],
company: json["company"],
countryId: json["country_id"],
country: countryValues.map[json["country"]],
stateProvinceId: json["state_province_id"],
city: cityValues.map[json["city"]],
address1: json["address1"],
address2: json["address2"],
zipPostalCode: json["zip_postal_code"],
phoneNumber: json["phone_number"],
faxNumber: json["fax_number"],
customerAttributes: json["customer_attributes"],
createdOnUtc: DateTime.parse(json["created_on_utc"]),
province: json["province"],
latLong: json["lat_long"],
);
Map<String, dynamic> toJson() => {
"id": id,
"first_name": firstNameValues.reverse[firstName],
"last_name": lastNameValues.reverse[lastName],
"email": emailValues.reverse[email],
"company": company,
"country_id": countryId,
"country": countryValues.reverse[country],
"state_province_id": stateProvinceId,
"city": cityValues.reverse[city],
"address1": address1,
"address2": address2,
"zip_postal_code": zipPostalCode,
"phone_number": phoneNumber,
"fax_number": faxNumber,
"customer_attributes": customerAttributes,
"created_on_utc": createdOnUtc.toIso8601String(),
"province": province,
"lat_long": latLong,
};
}
enum City { CALIFORNIA, RIYADH, AL_OYUN }
final cityValues = EnumValues({
"Al Oyun": City.AL_OYUN,
"California": City.CALIFORNIA,
"Riyadh": City.RIYADH
});
enum Country { UNITED_STATES, SAUDI_ARABIA }
final countryValues = EnumValues({
"Saudi Arabia": Country.SAUDI_ARABIA,
"United States": Country.UNITED_STATES
});
enum Email { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM, TAMER_F_CLOUDSOLUTION_SA_COM }
final emailValues = EnumValues({
"Tamer.dasdasdas@gmail.com": Email.TAMER_DASDASDAS_GMAIL_COM,
"Tamer.fanasheh@gmail.com": Email.TAMER_FANASHEH_GMAIL_COM,
"Tamer.F@cloudsolution-sa.com": Email.TAMER_F_CLOUDSOLUTION_SA_COM
});
enum FirstName { TAMER, TAMER_FANASHEH }
final firstNameValues = EnumValues({
"TAMER": FirstName.TAMER,
"TAMER FANASHEH": FirstName.TAMER_FANASHEH
});
enum LastName { FANASHEH, MUSA }
final lastNameValues = EnumValues({
"FANASHEH": LastName.FANASHEH,
"MUSA": LastName.MUSA
});
class Product {
Product({
this.id,
this.visibleIndividually,
this.name,
this.namen,
this.localizedNames,
this.shortDescription,
this.shortDescriptionn,
this.fullDescription,
this.fullDescriptionn,
this.markasNew,
this.showOnHomePage,
this.metaKeywords,
this.metaDescription,
this.metaTitle,
this.allowCustomerReviews,
this.approvedRatingSum,
this.notApprovedRatingSum,
this.approvedTotalReviews,
this.notApprovedTotalReviews,
this.sku,
this.isRx,
this.prescriptionRequired,
this.rxMessage,
this.rxMessagen,
this.manufacturerPartNumber,
this.gtin,
this.isGiftCard,
this.requireOtherProducts,
this.automaticallyAddRequiredProducts,
this.isDownload,
this.unlimitedDownloads,
this.maxNumberOfDownloads,
this.downloadExpirationDays,
this.hasSampleDownload,
this.hasUserAgreement,
this.isRecurring,
this.recurringCycleLength,
this.recurringTotalCycles,
this.isRental,
this.rentalPriceLength,
this.isShipEnabled,
this.isFreeShipping,
this.shipSeparately,
this.additionalShippingCharge,
this.isTaxExempt,
this.isTelecommunicationsOrBroadcastingOrElectronicServices,
this.useMultipleWarehouses,
this.manageInventoryMethodId,
this.stockQuantity,
this.stockAvailability,
this.stockAvailabilityn,
this.displayStockAvailability,
this.displayStockQuantity,
this.minStockQuantity,
this.notifyAdminForQuantityBelow,
this.allowBackInStockSubscriptions,
this.orderMinimumQuantity,
this.orderMaximumQuantity,
this.allowedQuantities,
this.allowAddingOnlyExistingAttributeCombinations,
this.disableBuyButton,
this.disableWishlistButton,
this.availableForPreOrder,
this.preOrderAvailabilityStartDateTimeUtc,
this.callForPrice,
this.price,
this.oldPrice,
this.productCost,
this.specialPrice,
this.specialPriceStartDateTimeUtc,
this.specialPriceEndDateTimeUtc,
this.customerEntersPrice,
this.minimumCustomerEnteredPrice,
this.maximumCustomerEnteredPrice,
this.basepriceEnabled,
this.basepriceAmount,
this.basepriceBaseAmount,
this.hasTierPrices,
this.hasDiscountsApplied,
this.discountName,
this.discountNamen,
this.discountDescription,
this.discountDescriptionn,
this.discountPercentage,
this.currency,
this.currencyn,
this.weight,
this.length,
this.width,
this.height,
this.availableStartDateTimeUtc,
this.availableEndDateTimeUtc,
this.displayOrder,
this.published,
this.deleted,
this.createdOnUtc,
this.updatedOnUtc,
this.productType,
this.parentGroupedProductId,
this.roleIds,
this.discountIds,
this.storeIds,
this.manufacturerIds,
this.reviews,
this.images,
this.attributes,
this.specifications,
this.associatedProductIds,
this.tags,
this.vendorId,
this.seName,
});
String id;
bool visibleIndividually;
String name;
String namen;
List<LocalizedName> localizedNames;
String shortDescription;
String shortDescriptionn;
String fullDescription;
String fullDescriptionn;
bool markasNew;
bool showOnHomePage;
String metaKeywords;
String metaDescription;
String metaTitle;
bool allowCustomerReviews;
int approvedRatingSum;
int notApprovedRatingSum;
int approvedTotalReviews;
int notApprovedTotalReviews;
String sku;
bool isRx;
bool prescriptionRequired;
dynamic rxMessage;
dynamic rxMessagen;
dynamic manufacturerPartNumber;
dynamic gtin;
bool isGiftCard;
bool requireOtherProducts;
bool automaticallyAddRequiredProducts;
bool isDownload;
bool unlimitedDownloads;
int maxNumberOfDownloads;
dynamic downloadExpirationDays;
bool hasSampleDownload;
bool hasUserAgreement;
bool isRecurring;
int recurringCycleLength;
int recurringTotalCycles;
bool isRental;
int rentalPriceLength;
bool isShipEnabled;
bool isFreeShipping;
bool shipSeparately;
int additionalShippingCharge;
bool isTaxExempt;
bool isTelecommunicationsOrBroadcastingOrElectronicServices;
bool useMultipleWarehouses;
int manageInventoryMethodId;
int stockQuantity;
String stockAvailability;
String stockAvailabilityn;
bool displayStockAvailability;
bool displayStockQuantity;
int minStockQuantity;
int notifyAdminForQuantityBelow;
bool allowBackInStockSubscriptions;
int orderMinimumQuantity;
int orderMaximumQuantity;
dynamic allowedQuantities;
bool allowAddingOnlyExistingAttributeCombinations;
bool disableBuyButton;
bool disableWishlistButton;
bool availableForPreOrder;
dynamic preOrderAvailabilityStartDateTimeUtc;
bool callForPrice;
double price;
int oldPrice;
double productCost;
dynamic specialPrice;
dynamic specialPriceStartDateTimeUtc;
dynamic specialPriceEndDateTimeUtc;
bool customerEntersPrice;
int minimumCustomerEnteredPrice;
int maximumCustomerEnteredPrice;
bool basepriceEnabled;
int basepriceAmount;
int basepriceBaseAmount;
bool hasTierPrices;
bool hasDiscountsApplied;
dynamic discountName;
dynamic discountNamen;
dynamic discountDescription;
dynamic discountDescriptionn;
dynamic discountPercentage;
String currency;
String currencyn;
double weight;
int length;
int width;
int height;
dynamic availableStartDateTimeUtc;
dynamic availableEndDateTimeUtc;
int displayOrder;
bool published;
bool deleted;
DateTime createdOnUtc;
DateTime updatedOnUtc;
String productType;
int parentGroupedProductId;
List<dynamic> roleIds;
List<dynamic> discountIds;
List<dynamic> storeIds;
List<int> manufacturerIds;
List<dynamic> reviews;
List<Image> images;
List<dynamic> attributes;
List<Specification> specifications;
List<dynamic> associatedProductIds;
List<dynamic> tags;
int vendorId;
String seName;
factory Product.fromJson(Map<String, dynamic> json) => Product(
id: json["id"],
visibleIndividually: json["visible_individually"],
name: json["name"],
namen: json["namen"],
localizedNames: List<LocalizedName>.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))),
shortDescription: json["short_description"],
shortDescriptionn: json["short_descriptionn"],
fullDescription: json["full_description"],
fullDescriptionn: json["full_descriptionn"],
markasNew: json["markas_new"],
showOnHomePage: json["show_on_home_page"],
metaKeywords: json["meta_keywords"] == null ? null : json["meta_keywords"],
metaDescription: json["meta_description"] == null ? null : json["meta_description"],
metaTitle: json["meta_title"] == null ? null : json["meta_title"],
allowCustomerReviews: json["allow_customer_reviews"],
approvedRatingSum: json["approved_rating_sum"],
notApprovedRatingSum: json["not_approved_rating_sum"],
approvedTotalReviews: json["approved_total_reviews"],
notApprovedTotalReviews: json["not_approved_total_reviews"],
sku: json["sku"],
isRx: json["is_rx"],
prescriptionRequired: json["prescription_required"],
rxMessage: json["rx_message"],
rxMessagen: json["rx_messagen"],
manufacturerPartNumber: json["manufacturer_part_number"],
gtin: json["gtin"],
isGiftCard: json["is_gift_card"],
requireOtherProducts: json["require_other_products"],
automaticallyAddRequiredProducts: json["automatically_add_required_products"],
isDownload: json["is_download"],
unlimitedDownloads: json["unlimited_downloads"],
maxNumberOfDownloads: json["max_number_of_downloads"],
downloadExpirationDays: json["download_expiration_days"],
hasSampleDownload: json["has_sample_download"],
hasUserAgreement: json["has_user_agreement"],
isRecurring: json["is_recurring"],
recurringCycleLength: json["recurring_cycle_length"],
recurringTotalCycles: json["recurring_total_cycles"],
isRental: json["is_rental"],
rentalPriceLength: json["rental_price_length"],
isShipEnabled: json["is_ship_enabled"],
isFreeShipping: json["is_free_shipping"],
shipSeparately: json["ship_separately"],
additionalShippingCharge: json["additional_shipping_charge"],
isTaxExempt: json["is_tax_exempt"],
isTelecommunicationsOrBroadcastingOrElectronicServices: json["is_telecommunications_or_broadcasting_or_electronic_services"],
useMultipleWarehouses: json["use_multiple_warehouses"],
manageInventoryMethodId: json["manage_inventory_method_id"],
stockQuantity: json["stock_quantity"],
stockAvailability: json["stock_availability"],
stockAvailabilityn: json["stock_availabilityn"],
displayStockAvailability: json["display_stock_availability"],
displayStockQuantity: json["display_stock_quantity"],
minStockQuantity: json["min_stock_quantity"],
notifyAdminForQuantityBelow: json["notify_admin_for_quantity_below"],
allowBackInStockSubscriptions: json["allow_back_in_stock_subscriptions"],
orderMinimumQuantity: json["order_minimum_quantity"],
orderMaximumQuantity: json["order_maximum_quantity"],
allowedQuantities: json["allowed_quantities"],
allowAddingOnlyExistingAttributeCombinations: json["allow_adding_only_existing_attribute_combinations"],
disableBuyButton: json["disable_buy_button"],
disableWishlistButton: json["disable_wishlist_button"],
availableForPreOrder: json["available_for_pre_order"],
preOrderAvailabilityStartDateTimeUtc: json["pre_order_availability_start_date_time_utc"],
callForPrice: json["call_for_price"],
price: json["price"].toDouble(),
oldPrice: json["old_price"],
productCost: json["product_cost"].toDouble(),
specialPrice: json["special_price"],
specialPriceStartDateTimeUtc: json["special_price_start_date_time_utc"],
specialPriceEndDateTimeUtc: json["special_price_end_date_time_utc"],
customerEntersPrice: json["customer_enters_price"],
minimumCustomerEnteredPrice: json["minimum_customer_entered_price"],
maximumCustomerEnteredPrice: json["maximum_customer_entered_price"],
basepriceEnabled: json["baseprice_enabled"],
basepriceAmount: json["baseprice_amount"],
basepriceBaseAmount: json["baseprice_base_amount"],
hasTierPrices: json["has_tier_prices"],
hasDiscountsApplied: json["has_discounts_applied"],
discountName: json["discount_name"],
discountNamen: json["discount_namen"],
discountDescription: json["discount_description"],
discountDescriptionn: json["discount_Descriptionn"],
discountPercentage: json["discount_percentage"],
currency: json["currency"],
currencyn: json["currencyn"],
weight: json["weight"].toDouble(),
length: json["length"],
width: json["width"],
height: json["height"],
availableStartDateTimeUtc: json["available_start_date_time_utc"],
availableEndDateTimeUtc: json["available_end_date_time_utc"],
displayOrder: json["display_order"],
published: json["published"],
deleted: json["deleted"],
createdOnUtc: DateTime.parse(json["created_on_utc"]),
updatedOnUtc: DateTime.parse(json["updated_on_utc"]),
productType: json["product_type"],
parentGroupedProductId: json["parent_grouped_product_id"],
roleIds: List<dynamic>.from(json["role_ids"].map((x) => x)),
discountIds: List<dynamic>.from(json["discount_ids"].map((x) => x)),
storeIds: List<dynamic>.from(json["store_ids"].map((x) => x)),
manufacturerIds: List<int>.from(json["manufacturer_ids"].map((x) => x)),
reviews: List<dynamic>.from(json["reviews"].map((x) => x)),
images: List<Image>.from(json["images"].map((x) => Image.fromJson(x))),
attributes: List<dynamic>.from(json["attributes"].map((x) => x)),
specifications: List<Specification>.from(json["specifications"].map((x) => Specification.fromJson(x))),
associatedProductIds: List<dynamic>.from(json["associated_product_ids"].map((x) => x)),
tags: List<dynamic>.from(json["tags"].map((x) => x)),
vendorId: json["vendor_id"],
seName: json["se_name"],
);
Map<String, dynamic> toJson() => {
"id": id,
"visible_individually": visibleIndividually,
"name": name,
"namen": namen,
"localized_names": List<dynamic>.from(localizedNames.map((x) => x.toJson())),
"short_description": shortDescription,
"short_descriptionn": shortDescriptionn,
"full_description": fullDescription,
"full_descriptionn": fullDescriptionn,
"markas_new": markasNew,
"show_on_home_page": showOnHomePage,
"meta_keywords": metaKeywords == null ? null : metaKeywords,
"meta_description": metaDescription == null ? null : metaDescription,
"meta_title": metaTitle == null ? null : metaTitle,
"allow_customer_reviews": allowCustomerReviews,
"approved_rating_sum": approvedRatingSum,
"not_approved_rating_sum": notApprovedRatingSum,
"approved_total_reviews": approvedTotalReviews,
"not_approved_total_reviews": notApprovedTotalReviews,
"sku": sku,
"is_rx": isRx,
"prescription_required": prescriptionRequired,
"rx_message": rxMessage,
"rx_messagen": rxMessagen,
"manufacturer_part_number": manufacturerPartNumber,
"gtin": gtin,
"is_gift_card": isGiftCard,
"require_other_products": requireOtherProducts,
"automatically_add_required_products": automaticallyAddRequiredProducts,
"is_download": isDownload,
"unlimited_downloads": unlimitedDownloads,
"max_number_of_downloads": maxNumberOfDownloads,
"download_expiration_days": downloadExpirationDays,
"has_sample_download": hasSampleDownload,
"has_user_agreement": hasUserAgreement,
"is_recurring": isRecurring,
"recurring_cycle_length": recurringCycleLength,
"recurring_total_cycles": recurringTotalCycles,
"is_rental": isRental,
"rental_price_length": rentalPriceLength,
"is_ship_enabled": isShipEnabled,
"is_free_shipping": isFreeShipping,
"ship_separately": shipSeparately,
"additional_shipping_charge": additionalShippingCharge,
"is_tax_exempt": isTaxExempt,
"is_telecommunications_or_broadcasting_or_electronic_services": isTelecommunicationsOrBroadcastingOrElectronicServices,
"use_multiple_warehouses": useMultipleWarehouses,
"manage_inventory_method_id": manageInventoryMethodId,
"stock_quantity": stockQuantity,
"stock_availability": stockAvailability,
"stock_availabilityn": stockAvailabilityn,
"display_stock_availability": displayStockAvailability,
"display_stock_quantity": displayStockQuantity,
"min_stock_quantity": minStockQuantity,
"notify_admin_for_quantity_below": notifyAdminForQuantityBelow,
"allow_back_in_stock_subscriptions": allowBackInStockSubscriptions,
"order_minimum_quantity": orderMinimumQuantity,
"order_maximum_quantity": orderMaximumQuantity,
"allowed_quantities": allowedQuantities,
"allow_adding_only_existing_attribute_combinations": allowAddingOnlyExistingAttributeCombinations,
"disable_buy_button": disableBuyButton,
"disable_wishlist_button": disableWishlistButton,
"available_for_pre_order": availableForPreOrder,
"pre_order_availability_start_date_time_utc": preOrderAvailabilityStartDateTimeUtc,
"call_for_price": callForPrice,
"price": price,
"old_price": oldPrice,
"product_cost": productCost,
"special_price": specialPrice,
"special_price_start_date_time_utc": specialPriceStartDateTimeUtc,
"special_price_end_date_time_utc": specialPriceEndDateTimeUtc,
"customer_enters_price": customerEntersPrice,
"minimum_customer_entered_price": minimumCustomerEnteredPrice,
"maximum_customer_entered_price": maximumCustomerEnteredPrice,
"baseprice_enabled": basepriceEnabled,
"baseprice_amount": basepriceAmount,
"baseprice_base_amount": basepriceBaseAmount,
"has_tier_prices": hasTierPrices,
"has_discounts_applied": hasDiscountsApplied,
"discount_name": discountName,
"discount_namen": discountNamen,
"discount_description": discountDescription,
"discount_Descriptionn": discountDescriptionn,
"discount_percentage": discountPercentage,
"currency": currency,
"currencyn": currencyn,
"weight": weight,
"length": length,
"width": width,
"height": height,
"available_start_date_time_utc": availableStartDateTimeUtc,
"available_end_date_time_utc": availableEndDateTimeUtc,
"display_order": displayOrder,
"published": published,
"deleted": deleted,
"created_on_utc": createdOnUtc.toIso8601String(),
"updated_on_utc": updatedOnUtc.toIso8601String(),
"product_type": productType,
"parent_grouped_product_id": parentGroupedProductId,
"role_ids": List<dynamic>.from(roleIds.map((x) => x)),
"discount_ids": List<dynamic>.from(discountIds.map((x) => x)),
"store_ids": List<dynamic>.from(storeIds.map((x) => x)),
"manufacturer_ids": List<dynamic>.from(manufacturerIds.map((x) => x)),
"reviews": List<dynamic>.from(reviews.map((x) => x)),
"images": List<dynamic>.from(images.map((x) => x.toJson())),
"attributes": List<dynamic>.from(attributes.map((x) => x)),
"specifications": List<dynamic>.from(specifications.map((x) => x.toJson())),
"associated_product_ids": List<dynamic>.from(associatedProductIds.map((x) => x)),
"tags": List<dynamic>.from(tags.map((x) => x)),
"vendor_id": vendorId,
"se_name": seName,
};
}
class Image {
Image({
this.id,
this.position,
this.src,
this.thumb,
this.attachment,
});
int id;
int position;
String src;
String thumb;
String attachment;
factory Image.fromJson(Map<String, dynamic> json) => Image(
id: json["id"],
position: json["position"],
src: json["src"],
thumb: json["thumb"],
attachment: json["attachment"],
);
Map<String, dynamic> toJson() => {
"id": id,
"position": position,
"src": src,
"thumb": thumb,
"attachment": attachment,
};
}
class LocalizedName {
LocalizedName({
this.languageId,
this.localizedName,
});
int languageId;
String localizedName;
factory LocalizedName.fromJson(Map<String, dynamic> json) => LocalizedName(
languageId: json["language_id"],
localizedName: json["localized_name"],
);
Map<String, dynamic> toJson() => {
"language_id": languageId,
"localized_name": localizedName,
};
}
class Specification {
Specification({
this.id,
this.displayOrder,
this.defaultValue,
this.defaultValuen,
this.name,
this.nameN,
});
int id;
int displayOrder;
String defaultValue;
String defaultValuen;
String name;
String nameN;
factory Specification.fromJson(Map<String, dynamic> json) => Specification(
id: json["id"],
displayOrder: json["display_order"],
defaultValue: json["default_value"],
defaultValuen: json["default_valuen"],
name: json["name"],
nameN: json["nameN"],
);
Map<String, dynamic> toJson() => {
"id": id,
"display_order": displayOrder,
"default_value": defaultValue,
"default_valuen": defaultValuen,
"name": name,
"nameN": nameN,
};
}
class EnumValues<T> {
Map<String, T> map;
Map<T, String> reverseMap;
EnumValues(this.map);
Map<T, String> get reverse {
if (reverseMap == null) {
reverseMap = map.map((k, v) => new MapEntry(v, k));
}
return reverseMap;
}
}

@ -40,7 +40,7 @@ class Brand {
dynamic metaDescription;
dynamic metaTitle;
int pageSize;
PageSizeOptions pageSizeOptions;
String pageSizeOptions;
dynamic priceRanges;
bool published;
bool deleted;
@ -60,7 +60,7 @@ class Brand {
metaDescription: json["meta_description"],
metaTitle: json["meta_title"],
pageSize: json["page_size"],
pageSizeOptions: pageSizeOptionsValues.map[json["page_size_options"]],
pageSizeOptions: json["page_size_options"],
priceRanges: json["price_ranges"],
published: json["published"],
deleted: json["deleted"],
@ -81,7 +81,7 @@ class Brand {
"meta_description": metaDescription,
"meta_title": metaTitle,
"page_size": pageSize,
"page_size_options": pageSizeOptionsValues.reverse[pageSizeOptions],
"page_size_options": pageSizeOptions,
"price_ranges": priceRanges,
"published": published,
"deleted": deleted,
@ -135,23 +135,3 @@ class LocalizedName {
"localized_name": localizedName,
};
}
enum PageSizeOptions { THE_2460100 }
final pageSizeOptionsValues = EnumValues({
"24, 60, 100": PageSizeOptions.THE_2460100
});
class EnumValues<T> {
Map<String, T> map;
Map<T, String> reverseMap;
EnumValues(this.map);
Map<T, String> get reverse {
if (reverseMap == null) {
reverseMap = map.map((k, v) => new MapEntry(v, k));
}
return reverseMap;
}
}

@ -0,0 +1,61 @@
// To parse this JSON data, do
//
// final specificationModel = specificationModelFromJson(jsonString);
import 'dart:convert';
SpecificationModel specificationModelFromJson(String str) => SpecificationModel.fromJson(json.decode(str));
String specificationModelToJson(SpecificationModel data) => json.encode(data.toJson());
class SpecificationModel {
SpecificationModel({
this.specification,
});
List<Specification> specification;
factory SpecificationModel.fromJson(Map<String, dynamic> json) => SpecificationModel(
specification: List<Specification>.from(json["specification"].map((x) => Specification.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"specification": List<dynamic>.from(specification.map((x) => x.toJson())),
};
}
class Specification {
Specification({
this.id,
this.displayOrder,
this.defaultValue,
this.defaultValuen,
this.name,
this.nameN,
});
int id;
int displayOrder;
String defaultValue;
String defaultValuen;
String name;
String nameN;
factory Specification.fromJson(Map<String, dynamic> json) => Specification(
id: json["id"],
displayOrder: json["display_order"],
defaultValue: json["default_value"],
defaultValuen: json["default_valuen"],
name: json["name"],
nameN: json["nameN"],
);
Map<String, dynamic> toJson() => {
"id": id,
"display_order": displayOrder,
"default_value": defaultValue,
"default_valuen": defaultValuen,
"name": name,
"nameN": nameN,
};
}

@ -34,7 +34,7 @@ class TopBrand {
String name;
String namen;
List<LocalizedName> localizedNames;
dynamic description;
String description;
int manufacturerTemplateId;
String metaKeywords;
dynamic metaDescription;
@ -54,7 +54,7 @@ class TopBrand {
name: json["name"],
namen: json["namen"],
localizedNames: List<LocalizedName>.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))),
description: json["description"],
description: json["description"] == null ? null : json["description"],
manufacturerTemplateId: json["manufacturer_template_id"],
metaKeywords: json["meta_keywords"],
metaDescription: json["meta_description"],
@ -67,7 +67,7 @@ class TopBrand {
displayOrder: json["display_order"],
createdOnUtc: DateTime.parse(json["created_on_utc"]),
updatedOnUtc: DateTime.parse(json["updated_on_utc"]),
image: Image.fromJson(json["image"]),
image: json["image"] == null ? null : Image.fromJson(json["image"]),
);
Map<String, dynamic> toJson() => {
@ -75,7 +75,7 @@ class TopBrand {
"name": name,
"namen": namen,
"localized_names": List<dynamic>.from(localizedNames.map((x) => x.toJson())),
"description": description,
"description": description == null ? null : description,
"manufacturer_template_id": manufacturerTemplateId,
"meta_keywords": metaKeywords,
"meta_description": metaDescription,
@ -88,7 +88,7 @@ class TopBrand {
"display_order": displayOrder,
"created_on_utc": createdOnUtc.toIso8601String(),
"updated_on_utc": updatedOnUtc.toIso8601String(),
"image": image.toJson(),
"image": image == null ? null : image.toJson(),
};
}

@ -10,6 +10,7 @@ import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart';
import 'package:diplomaticquarterapp/widgets/pharmacy/bottom_nav_pharmacy_bar.dart';
import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart';
import '../offers_categorise_page.dart';
@ -136,7 +137,8 @@ class _LandingPagePharmacyState extends State<LandingPagePharmacy> {
children: [
PharmacyPage(),
PharmacyCategorisePage(),
OffersCategorisePage(),
// OffersCategorisePage(),
WishlistPage(),
PharmacyProfilePage(),
// Container(
// child: Text('text'),

File diff suppressed because it is too large Load Diff

@ -1,12 +1,21 @@
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/widgets/pharmacy/product_tile.dart';
import 'package:flutter/material.dart';
AppSharedPreferences sharedPref = AppSharedPreferences();
var languageID;
class ProductCheckTypeWidget extends StatelessWidget {
final List<dynamic> wishlist;
final bool isTrue;
ProductCheckTypeWidget(this.isTrue, this.wishlist);
void initState() {
getLanguageID();
}
@override
Widget build(BuildContext context) {
return isTrue
@ -18,15 +27,16 @@ class ProductCheckTypeWidget extends StatelessWidget {
Container(
child: isTrue
? productTile(
productName: wishlist[index].product.name,
productName: languageID == 'ar' ? wishlist[index].product.namen : wishlist[index].product.name,
productPrice: wishlist[index].subtotal,
productRate:
double.parse(wishlist[index].subtotalVatRate),
productImage: wishlist[index].product.images[0].src,
showLine: isTrue,
productID: wishlist[index].product.id,
)
: productTile(
productName: wishlist[index].product.name,
productName: languageID == 'ar' ? wishlist[index].product.namen : wishlist[index].product.name,
productPrice: wishlist[index].subtotal,
productRate:
double.parse(wishlist[index].subtotalVatRate),
@ -53,3 +63,8 @@ class ProductCheckTypeWidget extends StatelessWidget {
);
}
}
getLanguageID() async {
languageID = await sharedPref.getString(APP_LANGUAGE);
}

@ -0,0 +1,36 @@
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart';
class CompareList with ChangeNotifier {
List<PharmacyProduct> _product = [];
List<PharmacyProduct> get productListItems => _product;
void addItem(data) {
if (_product.length == 0) {
_product.add(data);
AppToast.showSuccessToast(message: 'You have added a product to the Compare list');
} else {
for (int i = 0; i < _product.length; i++) {
if (_product.length <= 4 && _product[i].id != data.id) {
_product.add(data);
AppToast.showSuccessToast(message: 'You have added a product to the Compare list');
break;
} else if(_product[i].id == data.id){
AppToast.showErrorToast(message: 'the item is already in the list');
} else if(_product.length == 4){
AppToast.showErrorToast(message: 'your compare list is full');
}
}
}
notifyListeners();
}
void deleteItem(data) {
for (int i = 0; i < _product.length; i++) {
if (_product[i].id == data) _product.remove(_product[i]);
}
notifyListeners();
}
}

@ -2,6 +2,11 @@ import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/compare-list.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart';
import 'package:provider/provider.dart';
int counter = 0;
void main() => runApp(ComparePage());
@ -10,6 +15,7 @@ class ComparePage extends StatefulWidget {
_ComparePageState createState() => _ComparePageState();
}
//CompareList compareItems = CompareList();
class _ComparePageState extends State<ComparePage> {
@override
Widget build(BuildContext context) {
@ -24,574 +30,301 @@ class _ComparePageState extends State<ComparePage> {
}
}
compareList() {
return CarouselSlider(
options: CarouselOptions(
height: 800.0, viewportFraction: 0.95, enableInfiniteScroll: false),
items: [1, 2].map((i) {
return Builder(
builder: (BuildContext context) {
return Padding(
padding: const EdgeInsets.only(top: 8),
child: Container(
width: MediaQuery.of(context).size.width,
margin: EdgeInsets.symmetric(horizontal: 10.0),
child: slideDetail(),
),
);
},
);
}).toList(),
);
}
slideDetail() {
return ListView(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
height: 800,
width: 150,
margin: EdgeInsets.symmetric(horizontal: 10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border(
top: BorderSide(width: 0.5, color: Colors.grey),
left: BorderSide(width: 0.5, color: Colors.grey),
right: BorderSide(width: 0.5, color: Colors.grey),
bottom: BorderSide(width: 0.5, color: Colors.grey),
),
color: Colors.white),
child: Padding(
padding: const EdgeInsets.all(8.0),
class compareList extends StatelessWidget {
@override
Widget build(BuildContext context) {
final productItemData = Provider.of<CompareList>(context);
final productItem = productItemData.productListItems;
return productItem.length == 0
? Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
child: Align(
alignment: Alignment.topRight,
child: Icon(FontAwesomeIcons.trashAlt, size: 15)),
),
SizedBox(height: 20,),
Image(
image: AssetImage(
'assets/images/al-habib_onlne_pharmacy_bg.png'),
fit: BoxFit.cover,
width: 100,
height: 60,
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'SAR 999.99',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'ENAD test',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/new-design/empty_box.png',
width: 100,
height: 100,
fit: BoxFit.cover,
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
padding: const EdgeInsets.all(8.0),
child: Text(
'There is no data',
style: TextStyle(fontSize: 30),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
)
],
),
),
)
: CarouselSlider(
options: CarouselOptions(
height: 800.0,
viewportFraction: 0.87,
enableInfiniteScroll: false),
items: productItem.map((i) {
return Builder(
builder: (BuildContext context) {
return Padding(
padding: const EdgeInsets.only(top: 8),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
width: MediaQuery.of(context).size.width,
margin: EdgeInsets.symmetric(horizontal: 10.0),
child: productItem.length != 0
? slideDetail(productItem)
: Container(),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
);
},
);
}).toList(),
);
}
}
class slideDetail extends StatefulWidget {
final List<PharmacyProduct> data;
slideDetail(this.data);
@override
_slideDetailState createState() => _slideDetailState();
}
class _slideDetailState extends State<slideDetail> {
@override
Widget build(BuildContext context) {
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: widget.data.length,
itemBuilder: (BuildContext contx, int index) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
height: 550,
width: 150,
margin: EdgeInsets.symmetric(horizontal: 10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border(
top: BorderSide(width: 0.5, color: Colors.grey),
left: BorderSide(width: 0.5, color: Colors.grey),
right: BorderSide(width: 0.5, color: Colors.grey),
bottom: BorderSide(width: 0.5, color: Colors.grey),
),
color: Colors.white),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
Container(
child: Align(
alignment: Alignment.topRight,
child: IconButton(
icon: Icon(FontAwesomeIcons.trashAlt, size: 15),
onPressed: () {
setState(() {
Provider.of<CompareList>(context, listen: false)
.deleteItem(widget.data[index].id);
});
},
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
SizedBox(
height: 20,
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
Image.network(
widget.data[index].images[0].src.trim(),
fit: BoxFit.cover,
width: 100,
height: 60,
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color: Colors.grey,
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: widget.data[index].name,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: widget.data[index].price.toString(),
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
],
),
),
),
Container(
height: 800,
width: 150,
margin: EdgeInsets.symmetric(horizontal: 10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border(
top: BorderSide(width: 0.5, color: Colors.grey),
left: BorderSide(width: 0.5, color: Colors.grey),
right: BorderSide(width: 0.5, color: Colors.grey),
bottom: BorderSide(width: 0.5, color: Colors.grey),
),
color: Colors.white),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
Container(
child: Align(
alignment: Alignment.topRight,
child: Icon(FontAwesomeIcons.trashAlt, size: 15)),
),
SizedBox(height: 20,),
Image(
image: AssetImage(
'assets/images/al-habib_onlne_pharmacy_bg.png'),
fit: BoxFit.cover,
width: 100,
height: 60,
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'SAR 999.99',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color: Colors.grey,
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'ENAD test',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: widget.data[index].specifications[0].name,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: widget.data[index].specifications[1].name,
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color: Colors.grey,
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: widget.data[index].specifications[2].name,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: widget.data[index].specifications[3].name,
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color: Colors.grey,
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: widget.data[index].specifications[4].name,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'Primary Unit Of Measure',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: widget.data[index].specifications[5].name,
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'Each',
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color: Colors.grey,
),
),
),
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Container(
height: 1.0,
width: 300.0,
color:Colors.grey,),
),
],
],
),
),
),
),
],
),
],
);
],
);
},
);
}
}
String returnString(data) {
for (int i = 0; i < data.length; i++) {
print(data[i]);
// if(data[i] == null){
// if(counter == i){
//
// }
// }
}
return "ENAD HILAL";
}

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:rating_bar/rating_bar.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
void main() => runApp(MyReviewsPage());
@ -11,7 +12,13 @@ class MyReviewsPage extends StatefulWidget {
_MyReviewsPageState createState() => _MyReviewsPageState();
}
var languageID;
class _MyReviewsPageState extends State<MyReviewsPage> {
void initState() {
getLanguageID();
}
@override
Widget build(BuildContext context) {
return BaseView<ReviewViewModel>(
@ -20,25 +27,53 @@ class _MyReviewsPageState extends State<MyReviewsPage> {
appBarTitle: 'Wishlist page',
isShowAppBar: true,
isPharmacy: true,
body: Container(
child: ListView.builder(
itemCount: model.reviewListList.length,
itemBuilder: (BuildContext context, int index) {
return Column(
children: [
Container(
child: reviewDetails(
model.reviewListList[index],
double.parse(model.reviewListList[index].product
.approvedTotalReviews.toString()),
double.parse(model.reviewListList[index].rating.toString()),
body: model.reviewListList.length == 0
? Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/new-design/empty_box.png',
width: 100,
height: 100,
fit: BoxFit.cover,
),
),
),
Divider(height: 1, color: Colors.grey)
],
);
}),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'There is no data',
style: TextStyle(fontSize: 30),
),
)
],
),
),
)
: Container(
child: ListView.builder(
itemCount: model.reviewListList.length,
itemBuilder: (BuildContext context, int index) {
return Column(
children: [
Container(
child: reviewDetails(
model.reviewListList[index],
double.parse(model.reviewListList[index].product
.approvedTotalReviews
.toString()),
double.parse(model.reviewListList[index].rating
.toString()),
),
),
Divider(height: 1, color: Colors.grey)
],
);
}),
),
),
);
}
@ -47,7 +82,7 @@ class _MyReviewsPageState extends State<MyReviewsPage> {
reviewDetails(data, rate, myRate) {
return Container(
child: Padding(
padding: const EdgeInsets.only(bottom: 10.0),
padding: EdgeInsets.only(bottom: 10.0),
child: Container(
height: 200,
width: double.infinity,
@ -59,7 +94,9 @@ reviewDetails(data, rate, myRate) {
Row(
children: [
Container(
margin: EdgeInsets.only(top: 10, left: 10),
margin: languageID == 'ar'
? EdgeInsets.only(top: 10, right: 10)
: EdgeInsets.only(top: 10, left: 10),
child: Image.network(
data.product.images[0].src.trim(),
fit: BoxFit.cover,
@ -74,13 +111,17 @@ reviewDetails(data, rate, myRate) {
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
alignment: languageID == 'ar'
? Alignment.topRight
: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: data.product.name,
text: languageID == 'ar'
? data.product.namen
: data.product.name,
style: TextStyle(
color: Colors.black54,
fontSize: 13,
fontSize: languageID == 'ar' ? 7 : 13,
fontWeight: FontWeight.bold),
),
),
@ -91,7 +132,9 @@ reviewDetails(data, rate, myRate) {
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
alignment: languageID == 'ar'
? Alignment.topRight
: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: data.product.price.toString() +
@ -110,7 +153,9 @@ reviewDetails(data, rate, myRate) {
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
alignment: languageID == 'ar'
? Alignment.topRight
: Alignment.topLeft,
child: RatingBar.readOnly(
initialRating: rate,
size: 15.0,
@ -139,7 +184,9 @@ reviewDetails(data, rate, myRate) {
mainAxisAlignment: MainAxisAlignment.start,
children: [
Container(
padding: EdgeInsets.only(left: 10),
padding: languageID == 'ar'
? EdgeInsets.only(right: 10)
: EdgeInsets.only(left: 10),
child: Text(data.createdOnUtc.toString())),
],
),
@ -150,7 +197,9 @@ reviewDetails(data, rate, myRate) {
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
padding: EdgeInsets.only(left: 60),
padding: languageID == 'ar'
? EdgeInsets.only(right: 60)
: EdgeInsets.only(left: 60),
child: RatingBar.readOnly(
initialRating: myRate,
size: 15.0,
@ -173,7 +222,9 @@ reviewDetails(data, rate, myRate) {
),
Expanded(
child: Container(
padding: EdgeInsets.only(left: 10),
padding: languageID == 'ar'
? EdgeInsets.only(right: 10)
: EdgeInsets.only(left: 10),
child: Text(fixingString(data.reviewText.toString())),
),
),
@ -184,7 +235,7 @@ reviewDetails(data, rate, myRate) {
);
}
fixingString(txt){
fixingString(txt) {
String stringTxt;
String newTxt;
stringTxt = txt.toString();
@ -192,3 +243,7 @@ fixingString(txt){
return newTxt;
}
getLanguageID() async {
languageID = await sharedPref.getString(APP_LANGUAGE);
}

@ -1,7 +1,14 @@
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/pages/login/register-info.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/search_brands_page.dart';
import 'package:diplomaticquarterapp/pages/search_products_page.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/brand_view_model.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
void main() => runApp(ProductBrandsPage());
@ -10,26 +17,43 @@ class ProductBrandsPage extends StatefulWidget {
_ProductBrandsPageState createState() => _ProductBrandsPageState();
}
var languageID;
class _ProductBrandsPageState extends State<ProductBrandsPage> {
void initState() {
getLanguageID();
}
@override
Widget build(BuildContext context) {
return BaseView<BrandsViewModel>(
onModelReady: (model) => model.getTopBrandsData(),
onModelReady: (model) => model.getBrandsData(),
builder: (_, model, wi) => AppScaffold(
appBarTitle: 'Brands page',
isShowAppBar: true,
isPharmacy: true,
isShowDecPage: false,
body: Container(
child: Column(
children: [
Container(
color: Colors.white,
alignment: Alignment.topLeft,
padding: EdgeInsets.only(left: 10.0, top: 10.0),
alignment: languageID == 'ar'?
Alignment.topRight :
Alignment.topLeft,
padding: languageID == 'ar' ?
EdgeInsets.only(
right: 10.0,
top: 10.0
):
EdgeInsets.only(
left: 10.0,
top: 10.0
),
child: Text(
'Top Brands',
TranslationBase.of(context).topBrands,
style: TextStyle(
fontWeight: FontWeight.bold
fontWeight: FontWeight.bold,
),
),
),
@ -43,13 +67,35 @@ class _ProductBrandsPageState extends State<ProductBrandsPage> {
height: 10,
),
Container(
height: 100,
width: double.infinity,
color: Colors.white,
child: IconButton(
icon: Icon(Icons.search),
onPressed: () {
showSearch(context: context, delegate: SearchBar());
height: MediaQuery.of(context).size.height * 0.056,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5.0),
color: Colors.white,
),
child: InkWell(
child: Padding(
padding: EdgeInsets.all(8.0),
child: Row(
//crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Icon(Icons.search, size: 25.0),
SizedBox(
width: 15.0,
),
Texts(
TranslationBase.of(context).searchProductHere,
fontSize: 13,
)
],
),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SearchBrandsPage()),
);
},
),
),
@ -57,25 +103,30 @@ class _ProductBrandsPageState extends State<ProductBrandsPage> {
height: 10,
),
Container(
height: 280,
height: 230,
width: double.infinity,
color: Colors.white,
child: ListView.builder(
itemCount: model.brandsListList.length,
itemBuilder: (BuildContext ctxt, int index) {
return Container(
margin: EdgeInsets.only(top: 50, left: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(model.brandsListList[index].name),
SizedBox(
height: 3,
),
Divider(height: 1, color: Colors.grey)
],
itemBuilder: (BuildContext context, int index) {
return InkWell(
child: Container(
margin: EdgeInsets.only(top: 50, left: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
languageID == 'ar' ? Text(model.brandsListList[index].namen):Text(model.brandsListList[index].name),
SizedBox(
height: 3,
),
Divider(height: 1, color: Colors.grey)
],
),
),
onTap: (){
print("ENAD");
},
);
}),
),
@ -87,96 +138,6 @@ class _ProductBrandsPageState extends State<ProductBrandsPage> {
}
}
//topBrand() {
// return BaseView<BrandsViewModel>(
// onModelReady: (model) => model.getBrandsData(),
// builder: (_, model, wi) => Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.start,
// children: [
// Container(
// padding: EdgeInsets.all(10),
// child: Text(
// 'Top Brands',
// ),
// ),
// Row(
// children: [
// Container(
// margin: EdgeInsets.fromLTRB(10.0, 10.0, 0.0, 0.0),
// child: Container(
// margin: EdgeInsets.only(bottom: 10.0),
// child: Container(
// margin: EdgeInsets.only(bottom: 10.0),
// child: Container(
// child: Container(
// padding: EdgeInsets.symmetric(
// horizontal: 10.0, vertical: 10.0),
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(10),
// border: Border(
// top: BorderSide(width: 1.0, color: Colors.grey),
// left: BorderSide(width: 1.0, color: Colors.grey),
// right: BorderSide(width: 1.0, color: Colors.grey),
// bottom: BorderSide(width: 1.0, color: Colors.grey),
// ),
// color: Colors.white,
// ),
// child: Image(
// image: AssetImage(
// 'assets/images/al-habib_onlne_pharmacy_bg.png'),
// fit: BoxFit.cover,
// width: 60,
// height: 40,
// ),
// ),
// ),
// ),
// ),
// ),
// ],
// ),
// Row(
// children: [
// Container(
// margin: EdgeInsets.fromLTRB(10.0, 10.0, 0.0, 0.0),
// child: Container(
// margin: EdgeInsets.only(bottom: 10.0),
// child: Container(
// margin: EdgeInsets.only(bottom: 10.0),
// child: Container(
// padding: EdgeInsets.only(left: 5),
// child: Container(
// padding: EdgeInsets.symmetric(
// horizontal: 10.0, vertical: 10.0),
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(10),
// border: Border(
// top: BorderSide(width: 1.0, color: Colors.grey),
// left: BorderSide(width: 1.0, color: Colors.grey),
// right: BorderSide(width: 1.0, color: Colors.grey),
// bottom: BorderSide(width: 1.0, color: Colors.grey),
// ),
// color: Colors.white,
// ),
// child: Image(
// image: AssetImage(
// 'assets/images/al-habib_onlne_pharmacy_bg.png'),
// fit: BoxFit.cover,
// width: 60,
// height: 40,
// ),
// ),
// ),
// ),
// ),
// ),
// ],
// ),
// ],
// ),
// );
//}
topBrand() {
return BaseView<BrandsViewModel>(
@ -187,35 +148,40 @@ topBrand() {
model.topBrandsListList.length,
(index) => Column(
children: [
Container(
margin: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 0.0),
InkWell(
child: Container(
margin: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 0.0),
child: Container(
child: Container(
// padding: EdgeInsets.only(left: 5),
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 10.0, vertical: 10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border(
top: BorderSide(width: 1.0, color: Colors.grey),
left: BorderSide(width: 1.0, color: Colors.grey),
right: BorderSide(width: 1.0, color: Colors.grey),
bottom: BorderSide(width: 1.0, color: Colors.grey),
// padding: EdgeInsets.only(left: 5),
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 10.0, vertical: 10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border(
top: BorderSide(width: 1.0, color: Colors.grey),
left: BorderSide(width: 1.0, color: Colors.grey),
right: BorderSide(width: 1.0, color: Colors.grey),
bottom: BorderSide(width: 1.0, color: Colors.grey),
),
color: Colors.white,
),
color: Colors.white,
),
child: Image.network(
model.topBrandsListList[index].image.src.trim(),
fit: BoxFit.cover,
width: 60,
height: 40,
child: model.topBrandsListList[index].image != null ?Image.network(
model.topBrandsListList[index].image.src,
fit: BoxFit.cover,
width: 60,
height: 40,
): Text(model.topBrandsListList[index].name)
),
),
),
),
),
onTap: (){
print("ENAD");
},
),
],
),
@ -282,3 +248,7 @@ class SearchBar extends SearchDelegate<String> {
);
}
}
getLanguageID() async {
languageID = await sharedPref.getString(APP_LANGUAGE);
}

File diff suppressed because it is too large Load Diff

@ -1,6 +1,7 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-preview.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart';
@ -95,13 +96,13 @@ class CartOrderPage extends StatelessWidget {
MainAxisAlignment.spaceBetween,
children: [
Texts(
"Subtotal",
TranslationBase.of(context).subtotal,
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
),
Texts(
"SAR ${(cart.subtotal).toStringAsFixed(2)}",
"${TranslationBase.of(context).sar} ${(cart.subtotal).toStringAsFixed(2)}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
@ -120,13 +121,13 @@ class CartOrderPage extends StatelessWidget {
MainAxisAlignment.spaceBetween,
children: [
Texts(
"VAT (15%)",
"${TranslationBase.of(context).vat}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
),
Texts(
"SAR ${(cart.subtotalVatAmount).toStringAsFixed(2)}",
"${TranslationBase.of(context).sar} ${(cart.subtotalVatAmount).toStringAsFixed(2)}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
@ -151,7 +152,7 @@ class CartOrderPage extends StatelessWidget {
fontWeight: FontWeight.bold,
),
Texts(
"SAR ${(cart.subtotal).toStringAsFixed(2)}",
"${TranslationBase.of(context).sar} ${(cart.subtotal).toStringAsFixed(2)}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.bold,
@ -181,7 +182,9 @@ class CartOrderPage extends StatelessWidget {
: Container(),
bottomSheet: Container(
height: !(model.cartResponse.shoppingCarts == null ||
model.cartResponse.shoppingCarts.length == 0) ? height * 0.15 : 0,
model.cartResponse.shoppingCarts.length == 0)
? height * 0.15
: 0,
color: Colors.white,
child: OrderBottomWidget(model.addresses, height),
),
@ -206,6 +209,8 @@ class _OrderBottomWidgetState extends State<OrderBottomWidget> {
@override
Widget build(BuildContext context) {
ProjectViewModel projectProvider = Provider.of(context);
return Container(
margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
child: Consumer<ShoppingCartResponse>(
@ -238,7 +243,9 @@ class _OrderBottomWidgetState extends State<OrderBottomWidget> {
width: 25.0,
height: widget.height * 0.070,
decoration: new BoxDecoration(
color: !isAgree ? Color(0xffeeeeee) : Colors.green,
color: !isAgree
? Color(0xffeeeeee)
: Colors.green,
shape: BoxShape.circle,
),
child: !isAgree
@ -258,7 +265,8 @@ class _OrderBottomWidgetState extends State<OrderBottomWidget> {
padding: EdgeInsets.symmetric(horizontal: 4),
margin: const EdgeInsets.symmetric(vertical: 4),
child: Texts(
"I agree with the terms of service and I adhere to them unconditionally",
TranslationBase.of(context)
.pharmacyServiceTermsCondition,
fontSize: 13,
color: Colors.grey.shade800,
fontWeight: FontWeight.normal,
@ -267,10 +275,8 @@ class _OrderBottomWidgetState extends State<OrderBottomWidget> {
),
InkWell(
onTap: () => {
Navigator.push(
context,
FadePage(
page: PharmacyTermsConditions()))
Navigator.push(context,
FadePage(page: PharmacyTermsConditions()))
},
child: Container(
child: Icon(
@ -290,39 +296,43 @@ class _OrderBottomWidgetState extends State<OrderBottomWidget> {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
margin: EdgeInsets.symmetric(
horizontal: 0, vertical: 4),
child: Row(
children: [
Texts(
"SAR ${(cart.subtotal).toStringAsFixed(2)}",
fontSize: 14,
fontWeight: FontWeight.bold,
),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 4),
child: Texts(
"(inclusive VAT)",
fontSize: 8,
color: Colors.grey,
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.symmetric(
horizontal: 0, vertical: 0),
child: Row(
children: [
Texts(
"${TranslationBase.of(context).sar} ${(cart.subtotal).toStringAsFixed(2)}",
fontSize:
projectProvider.isArabic ? 12 : 14,
fontWeight: FontWeight.bold,
),
),
],
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 4),
child: Texts(
"${TranslationBase.of(context).inclusiveVat}",
fontSize: 8,
color: Colors.grey,
fontWeight: FontWeight.bold,
),
),
],
),
),
),
Texts(
"${cart.quantityCount} item(s)",
fontSize: 10,
color: Colors.grey,
fontWeight: FontWeight.bold,
),
],
Texts(
"${cart.quantityCount} ${TranslationBase.of(context).items}",
fontSize: 10,
color: Colors.grey,
fontWeight: FontWeight.bold,
),
],
),
),
RaisedButton(
onPressed: isAgree
@ -335,7 +345,7 @@ class _OrderBottomWidgetState extends State<OrderBottomWidget> {
}
: null,
child: new Text(
"CHECK OUT",
"${TranslationBase.of(context).checkOut}",
style: new TextStyle(
color: isAgree
? Colors.white
@ -345,19 +355,9 @@ class _OrderBottomWidgetState extends State<OrderBottomWidget> {
color: Color(0xff005aff),
disabledColor: Color(0xff005aff),
),
/* SecondaryButton(
label: "CHECK OUT",
color: Colors.blueAccent,
textColor: Colors.white,
onTap: (() {
Navigator.push(
context, FadePage(page: OrderPreviewPage(widget.addresses)));
}),
disabled: isAgree ? false : true,
)*/
],
),
)
),
],
)
: Container(),

@ -2,11 +2,13 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/address-select-page.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/payment-method-select-page.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductOrderPreviewItem.dart';
import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
@ -22,7 +24,8 @@ class OrderPreviewPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
PreferredSizeWidget appBarWidget = AppBarWidget("Check out", null, true);
PreferredSizeWidget appBarWidget =
AppBarWidget("${TranslationBase.of(context).checkOut}", null, true);
final mediaQuery = MediaQuery.of(context);
final height = mediaQuery.size.height -
appBarWidget.preferredSize.height -
@ -33,7 +36,7 @@ class OrderPreviewPage extends StatelessWidget {
builder: (_, model, wi) => ChangeNotifierProvider.value(
value: model.paymentCheckoutData,
child: AppScaffold(
title: "Check out",
title: "${TranslationBase.of(context).checkOut}",
isShowAppBar: true,
isShowDecPage: false,
appBarWidget: appBarWidget,
@ -114,13 +117,13 @@ class OrderPreviewPage extends StatelessWidget {
MainAxisAlignment.spaceBetween,
children: [
Texts(
"Subtotal",
"${TranslationBase.of(context).subtotal}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
),
Texts(
"SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}",
"${TranslationBase.of(context).sar} ${(model.cartResponse.subtotal).toStringAsFixed(2)}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
@ -139,13 +142,13 @@ class OrderPreviewPage extends StatelessWidget {
MainAxisAlignment.spaceBetween,
children: [
Texts(
"Shipping",
"${TranslationBase.of(context).shipping}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
),
Texts(
"SAR ${(model.totalAdditionalShippingCharge).toStringAsFixed(2)}",
"${TranslationBase.of(context).sar} ${(model.totalAdditionalShippingCharge).toStringAsFixed(2)}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
@ -164,13 +167,13 @@ class OrderPreviewPage extends StatelessWidget {
MainAxisAlignment.spaceBetween,
children: [
Texts(
"VAT (15%)",
"${TranslationBase.of(context).vat}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
),
Texts(
"SAR ${(model.cartResponse.subtotalVatAmount).toStringAsFixed(2)}",
"${TranslationBase.of(context).sar} ${(model.cartResponse.subtotalVatAmount).toStringAsFixed(2)}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.w500,
@ -195,7 +198,7 @@ class OrderPreviewPage extends StatelessWidget {
fontWeight: FontWeight.bold,
),
Texts(
"SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}",
"${TranslationBase.of(context).sar} ${(model.cartResponse.subtotal).toStringAsFixed(2)}",
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.bold,
@ -215,7 +218,9 @@ class OrderPreviewPage extends StatelessWidget {
),
),
bottomSheet: Container(
height: model.cartResponse.shoppingCarts != null ? height * 0.10 : 0,
height: model.cartResponse.shoppingCarts != null
? height * 0.10
: 0,
color: Colors.white,
child: PaymentBottomWidget(model),
),
@ -238,12 +243,14 @@ class _SelectAddressWidgetState extends State<SelectAddressWidget> {
Addresses address;
_navigateToAddressPage() {
Navigator.push(
context, FadePage(page: AddressSelectPageTest(widget.addresses)))
Navigator.push(context, FadePage(page: PharmacyAddressesPage()))
.then((result) {
address = result;
widget.model.paymentCheckoutData.address = address;
widget.model.getInformationsByAddress();
if (result != null) {
address = result;
widget.model.paymentCheckoutData.address = address;
widget.model.getInformationsByAddress();
}
/* setState(() {
if (result != null) {
address = result;
@ -396,7 +403,7 @@ class _SelectAddressWidgetState extends State<SelectAddressWidget> {
padding: EdgeInsets.symmetric(
vertical: 0, horizontal: 6),
child: Texts(
"SHIP BY:",
"${TranslationBase.of(context).shipBy}",
fontSize: 12,
fontWeight: FontWeight.bold,
color: Colors.black,
@ -562,6 +569,8 @@ class _LakumWidgetState extends State<LakumWidget> {
@override
Widget build(BuildContext context) {
ProjectViewModel projectProvider = Provider.of(context);
return Container(
color: Colors.white,
padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12),
@ -579,7 +588,7 @@ class _LakumWidgetState extends State<LakumWidget> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Texts(
"Lakum Points",
"${TranslationBase.of(context).lakumPoints}",
fontSize: 12,
fontWeight: FontWeight.bold,
),
@ -599,23 +608,29 @@ class _LakumWidgetState extends State<LakumWidget> {
mainAxisAlignment: MainAxisAlignment.end,
children: [
Texts(
"Riyal",
"${TranslationBase.of(context).riyal}",
fontSize: 12,
fontWeight: FontWeight.bold,
),
Container(
margin: EdgeInsets.only(left: 4),
margin: projectProvider.isArabic
? EdgeInsets.only(right: 4)
: EdgeInsets.only(left: 4),
width: 60,
height: 40,
height: 50,
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(
borderSide:
BorderSide(color: Colors.black, width: 0.2),
gapPadding: 0,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
bottomLeft: Radius.circular(8)),
borderRadius: projectProvider.isArabic
? BorderRadius.only(
topRight: Radius.circular(8),
bottomRight: Radius.circular(8))
: BorderRadius.only(
topLeft: Radius.circular(8),
bottomLeft: Radius.circular(8)),
),
disabledBorder: OutlineInputBorder(
borderSide:
@ -670,21 +685,25 @@ class _LakumWidgetState extends State<LakumWidget> {
),
),
Container(
height: 40,
height: 50,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 12),
decoration: new BoxDecoration(
color: Color(0xff3666E0),
shape: BoxShape.rectangle,
borderRadius: BorderRadius.only(
topRight: Radius.circular(6),
bottomRight: Radius.circular(6)),
borderRadius: projectProvider.isArabic
? BorderRadius.only(
topLeft: Radius.circular(6),
bottomLeft: Radius.circular(6))
: BorderRadius.only(
topRight: Radius.circular(6),
bottomRight: Radius.circular(6)),
border: Border.fromBorderSide(BorderSide(
color: Color(0xff3666E0),
width: 0.8,
)),
),
child: Texts(
"USE",
"${TranslationBase.of(context).use}",
fontSize: 12,
color: Colors.white,
fontWeight: FontWeight.bold,
@ -727,7 +746,7 @@ class PaymentBottomWidget extends StatelessWidget {
child: Row(
children: [
Texts(
"SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}",
"${TranslationBase.of(context).sar} ${(model.cartResponse.subtotal).toStringAsFixed(2)}",
fontSize: 14,
fontWeight: FontWeight.bold,
color: Color(0xff929295),
@ -736,7 +755,7 @@ class PaymentBottomWidget extends StatelessWidget {
padding:
const EdgeInsets.symmetric(horizontal: 4),
child: Texts(
"(inclusive VAT)",
"${TranslationBase.of(context).inclusiveVat}",
fontSize: 8,
color: Color(0xff929295),
fontWeight: FontWeight.w600,
@ -746,7 +765,7 @@ class PaymentBottomWidget extends StatelessWidget {
),
),
Texts(
"${model.cartResponse.quantityCount} item(s)",
"${model.cartResponse.quantityCount} ${TranslationBase.of(context).items}",
fontSize: 10,
color: Colors.grey,
fontWeight: FontWeight.bold,
@ -785,7 +804,7 @@ class PaymentBottomWidget extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 16),
child: new Text(
"PROCEED TO PAY",
"${TranslationBase.of(context).proceedPay}",
style: new TextStyle(
color: (paymentData.address != null &&
paymentData.paymentOption != null)

@ -8,12 +8,14 @@ import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-main-page.da
import 'package:diplomaticquarterapp/pages/pharmacies/widgets/BannerPager.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductTileItem.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/widgets/manufacturerItem.dart';
import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/product-brands.dart';
import 'lacum-activitaion-vida-page.dart';
@ -53,7 +55,9 @@ class PharmacyPage extends StatelessWidget {
hPadding: 4,
borderColor: Colors.green,
textColor: Colors.green,
handler: () {},
handler: () =>{
Navigator.push(context,FadePage(page: ProductBrandsPage())),
},
),
],
),
@ -189,7 +193,9 @@ class GridViewButtons extends StatelessWidget {
opacity: 0,
hasColorFilter: false,
child: GridViewCard(TranslationBase.of(context).myPrescriptions,
'assets/images/pharmacy_module/prescription_icon.png', () {}),
'assets/images/pharmacy_module/prescription_icon.png', () {
Navigator.push(context, FadePage(page: PharmacyAddressesPage()));
}),
),
DashboardItem(
imageName: 'pharmacy_module/bg_4.png',

@ -0,0 +1,145 @@
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/brand_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/buttons/button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/input/text_field.dart';
import 'package:diplomaticquarterapp/widgets/others/StarRating.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart';
import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart';
import 'package:flutter/material.dart';
class SearchBrandsPage extends StatefulWidget {
@override
_SearchBrandsPageState createState() => _SearchBrandsPageState();
}
class _SearchBrandsPageState extends State<SearchBrandsPage> {
final textController = TextEditingController();
final _formKey = GlobalKey<FormState>();
String msg = '';
@override
Widget build(BuildContext context) {
return BaseView<BrandsViewModel>(
onModelReady: (model) => model.searchProducts(),
builder: (BuildContext context, model, Widget child) =>
PharmacyAppScaffold(
appBarTitle: 'Search',
isBottomBar: false,
isShowAppBar: true,
backgroundColor: Colors.white,
isShowDecPage: false,
//baseViewModel: model,
body: SingleChildScrollView(
child: Container(
height: SizeConfig.screenHeight,
child: Column(
children: [
Padding(
padding: EdgeInsets.all(8.0),
child: Row(
children: [
Container(
width: MediaQuery.of(context).size.width * 0.79,
child: Form(
key: _formKey,
child: TextFields(
autoFocus: true,
hintText: 'Search',
fontSize: 19.0,
prefixIcon: Icon(Icons.search),
inputAction: TextInputAction.search,
onSaved: (value) {
//searchMedicine(model, context);
},
onSubmit: (value) {
searchMedicine(model, context);
msg = 'No Result Found';
},
controller: textController,
validator: (value) {
if (value.isEmpty) {
return 'please Enter Product Name';
}
return null;
},
),
),
),
SizedBox(
width: 10.0,
),
InkWell(
child: Texts(
'Cancel',
fontSize: 17.0,
fontWeight: FontWeight.w500,
),
onTap: () {
Navigator.pop(context);
},
),
// child: Container(
// child: Button(
// backgroundColor: Colors.green,
// loading: model.state == ViewState.BusyLocal,
// label: 'Search',
// onTap: () {
// searchMedicine(model, context);
// }),
// width: MediaQuery.of(context).size.width * 0.09,
// ),
],
),
),
model.searchList.length == 0
? Container(
child: Text(
'no data' + model.searchList.length.toString()),
)
: Expanded(
child: Container(
child: ListView.builder(
itemCount: model.searchList.length,
itemBuilder: (BuildContext ctx, index) {
return Padding(
padding:EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
child: Text(
model.searchList[index].name,
style: TextStyle(fontSize: 20),
),
),
),
Divider(height: 1, color: Colors.grey)
],),
);
},
),
),
),
],
),
),
),
),
);
}
searchMedicine(model, BuildContext context) {
Utils.hideKeyboard(context);
if (_formKey.currentState.validate())
model.searchProducts(productName: textController.text);
}
}

@ -1,6 +1,7 @@
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/product_detail.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/phramacy-product-detail-page.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
@ -17,7 +18,7 @@ class ProductTileItem extends StatelessWidget {
void productOnClick(BuildContext ctx) {
_saveLastVisitProducts();
Navigator.push(ctx, FadePage(page: ProductDetailScreen(item)));
Navigator.push(ctx, FadePage(page: ProductDetailPage(item)));
}
void _saveLastVisitProducts() async {

@ -4,11 +4,9 @@ import 'package:diplomaticquarterapp/pages/pharmacies/ProductCheckTypeWidget.dar
import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
void main() => runApp(WishlistPage());
class WishlistPage extends StatefulWidget {
@override
_WishlistPageState createState() => _WishlistPageState();
}
@ -23,50 +21,48 @@ class _WishlistPageState extends State<WishlistPage> {
appBarTitle: 'Wishlist page',
isShowAppBar: true,
isPharmacy: true,
body: Container(
// child: ListView.builder(
// itemCount: 3,
// itemBuilder: (BuildContext context, int index) {
// return Column(
// children: [
// Container(
// child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00,),
// ),
// Divider(height: 1, color: Colors.grey)
// ],
// );
// }),
child: Column(
children: [
// Expanded(
// flex: 1,
// child: Container(
// color: Colors.white,
// width: double.infinity,
// height: 30,
// child: IconButton(
// alignment: Alignment.topRight,
// icon: Icon(Icons.art_track),
// color: Colors.blueAccent,
// onPressed: () {
// setState(() {
// isTrue = !isTrue;
// });
// },
// ),
// ),
// ),
Expanded(
flex: 20,
child: Container(
width: double.infinity,
height: MediaQuery.of(context).size.height * 0.85, //250,
child: ProductCheckTypeWidget(isTrue, model.wishListList),
body: model.wishListList.length == 0
? Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/new-design/empty_box.png',
width: 100,
height: 100,
fit: BoxFit.cover,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'There is no data',
style: TextStyle(fontSize: 30),
),
)
],
),
),
)
: Container(
child: Column(
children: [
Expanded(
flex: 20,
child: Container(
width: double.infinity,
height:
MediaQuery.of(context).size.height * 0.85, //250,
child:
ProductCheckTypeWidget(isTrue, model.wishListList),
),
),
],
),
),
),
],
),
),
),
);
}

@ -1,127 +1,82 @@
import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/pickupLocation/PickupLocationFromMap.dart';
import 'package:flutter/material.dart';
import 'package:flutter_html/style.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_place_picker/google_maps_place_picker.dart';
class AddAddressPage extends StatefulWidget {
final Addresses editedAddress;
final Function(PickResult) onPick;
AddAddressPage(this.editedAddress, this.onPick);
@override
_AddAddressState createState() => _AddAddressState();
_AddAddressPageState createState() => _AddAddressPageState();
}
class _AddAddressState extends State<AddAddressPage> {
class _AddAddressPageState extends State<AddAddressPage> {
double _latitude;
double _longitude;
void onMapCreated(controller){
setState(() {
mapController= controller;
});
}
void _getAddressFromLatLng() {}
_onMapTypeButtonPressed(){}
_onAddMarkerButtonPressed(){}
LatLng _initialPosition;
GoogleMapController mapController;
@override
void initState() {
// TODO: implement initState
_initialPosition = LatLng(24.662617030, 46.7334844);
super.initState();
if (widget.editedAddress != null &&
widget.editedAddress.latLong != null &&
widget.editedAddress.latLong != "") {
List<String> latLng = widget.editedAddress.latLong.split(",");
_latitude = double.parse(latLng[0]);
_longitude = double.parse(latLng[1]);
} else {
_getCurrentLocation();
}
}
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
_getCurrentLocation() async {
await Geolocator.getLastKnownPosition().then((value) {
_latitude = value.latitude;
_longitude = value.longitude;
}).catchError((e) {
_longitude = 0;
_latitude = 0;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text(TranslationBase.of(context).addNewAddress, style: TextStyle(color:Colors.white)),
backgroundColor: Colors.green,
),
body: Stack(
children: <Widget> [
GoogleMap(
zoomControlsEnabled: true,
myLocationButtonEnabled: true,
myLocationEnabled: true,
onMapCreated: _onMapCreated,
onCameraMove: (object) {
// widget.currentLat = object.target.latitude;
// widget.currentLong = object.target.longitude;
},
onCameraIdle: _getAddressFromLatLng,
padding: EdgeInsets.only(bottom: 90.0),
initialCameraPosition: CameraPosition(
target: _initialPosition,
zoom: 13.0,
),
),
// Align(
// alignment: Alignment.topRight,
// child: Column(
// children:<Widget> [
// button(_onMapTypeButtonPressed,Icons.map),
// SizedBox(
// height:16.0,
// ),
// button(_onAddMarkerButtonPressed, Icons.add_location)
// ],
// ),
// ),
]
),
bottomSheet: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return AddAddressPage();
}),
);
},
child: Container(
height: 50.0,
color: Colors.green,
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.green,
style: BorderStyle.solid,
width: 1.0
),
color: Colors.green,
borderRadius: BorderRadius.circular(10.0)
),
child: Center(
child: Text(TranslationBase.of(context).confirmLocation,
style: TextStyle(
color: Colors.white,
fontSize: 15.0,
fontWeight: FontWeight.bold,
),
),
),
PreferredSizeWidget appBarWidget = AppBarWidget(
"${TranslationBase.of(context).changeAddress}", null, true);
final mediaQuery = MediaQuery.of(context);
final height = mediaQuery.size.height -
appBarWidget.preferredSize.height -
mediaQuery.padding.top;
return BaseView<PharmacyAddressesViewModel>(
builder: (_, model, wi) => AppScaffold(
appBarTitle: TranslationBase.of(context).changeAddress,
isShowAppBar: true,
isPharmacy: true,
backgroundColor: Colors.white,
appBarWidget: appBarWidget,
body: Container(
height: height * 1,
child: PickupLocationFromMap(
latitude: _latitude,
longitude: _longitude,
isWithAppBar: false,
buttonColor: Color(0xFF5AB145),
buttonLabel: TranslationBase.of(context).save,
onPick: (value) {
widget.onPick(value);
},
),
),
),
);
);
}
// Widget button(Function function, IconData icon){
// return FloatingActionButton(
// onPressed: function,
// materialTapTargetSize: MaterialTapTargetSize.padded,
// backgroundColor: Colors.red,
// child: Icon(
// icon,
// size: 18.0,
// ),);
// }
}

@ -1,378 +1,320 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart';
class PharmacyAddressesPage extends StatefulWidget{
class PharmacyAddressesPage extends StatefulWidget {
@override
_PharmacyAddressesState createState() => _PharmacyAddressesState();
}
class _PharmacyAddressesState extends State<PharmacyAddressesPage>{
String address="";
int selectedRadio;
bool _value = false;
}
AppSharedPreferences sharedPref = AppSharedPreferences();
@override
void initState(){
// WidgetsBinding.instance.addPostFrameCallback((_) => getAllAddress());
class _PharmacyAddressesState extends State<PharmacyAddressesPage> {
super.initState();
selectedRadio=0;
}
setSelectedRadio(int val){
setState(() {
selectedRadio = val;
});
void navigateToAddressPage(
BuildContext ctx, PharmacyAddressesViewModel model, Addresses address) {
Navigator.push(
ctx,
FadePage(
page: AddAddressPage(address, (pickResult) {
model.addEditAddress(pickResult, address);
})));
}
Widget build (BuildContext context){
Widget build(BuildContext context) {
PreferredSizeWidget appBarWidget = AppBarWidget(
"${TranslationBase.of(context).changeAddress}", null, true);
final mediaQuery = MediaQuery.of(context);
final height = mediaQuery.size.height -
appBarWidget.preferredSize.height -
mediaQuery.padding.top;
return BaseView<PharmacyAddressesViewModel>(
onModelReady: (model) => model.getAddress(address),
builder: (_,model, wi )=> AppScaffold(
appBarTitle:TranslationBase.of(context).changeAddress,
baseViewModel: model,
onModelReady: (model) => model.getAddressesList(),
builder: (_, model, wi) => AppScaffold(
appBarTitle: TranslationBase.of(context).changeAddress,
isShowAppBar: true,
isPharmacy:true ,
isPharmacy: true,
baseViewModel: model,
backgroundColor: Colors.white,
appBarWidget: appBarWidget,
body: Container(
child:SingleChildScrollView(
height: height * 0.90,
child: SingleChildScrollView(
child: Column(
children:<Widget>[
ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
physics: ScrollPhysics(),
itemCount: model.address.length,
itemBuilder: (context, index){
return Container(
child: Padding(
padding:EdgeInsets.only(top:10.0, left:5.0, right:5.0, bottom:5.0,),
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children:<Widget> [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children:<Widget> [
InkWell(
onTap: () {
setState(() {
_value = !_value;
});
},
child: Container(
margin: EdgeInsets.only(right: 20),
child: Padding(
padding: const EdgeInsets.all(5.0),
child: _value
? Container(
child: SvgPicture.asset(
'assets/images/pharmacy/check_icon.svg',
height: 25,
width: 25,),
)
: Container(
child: SvgPicture.asset(
'assets/images/pharmacy/check_icon.svg',
height: 23,
width: 23,
color: Colors.transparent,
),
decoration: BoxDecoration(
border: Border.all(
color: Colors.grey,
style: BorderStyle.solid,
width: 1.0
),
color: Colors.transparent,
borderRadius: BorderRadius.circular(50.0)
),
),
),
),
),
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children:<Widget> [
Text('name',
// model.address[0].customers[0].addresses[0].firstName,
style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold,
),
),
SizedBox(
height: 5,),
Expanded(
child: Text(model.address[0].customers[0].addresses[0].address1+ ''+
model.address[0].customers[0].addresses[0].address2+ '' +
model.address[0].customers[0].addresses[0].zipPostalCode,
style: TextStyle(fontSize: 15.0, color: Colors.grey,
),
),
),
SizedBox(
height: 5,),
Row(
children:<Widget> [
Container(
margin: EdgeInsets.only(bottom: 8),
child: SvgPicture.asset(
'assets/images/pharmacy/mobile_number_icon.svg',
height: 13,),
),
Container(
margin: EdgeInsets.only(left: 10, bottom: 8),
child: Text('588888778',
style: TextStyle(fontSize: 15.0,
),
),
),
],
),
SizedBox(
height: 15,),
Row(
children:<Widget> [
Column(
children: <Widget> [
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return AddAddressPage();
}),
);
},
child: Row(
children:<Widget> [
Container(
margin: EdgeInsets.only(right:10, bottom: 15),
child: SvgPicture.asset(
'assets/images/pharmacy/edit_icon.svg',
height: 15,),
),
Container(
margin: EdgeInsets.only(right:5, bottom: 15),
padding: EdgeInsets.only(right: 10.0),
child: Text(TranslationBase.of(context).edit,
style: TextStyle(fontSize: 15.0,
color: Colors.blue,
),
),
decoration: BoxDecoration(
border: Border(
right: BorderSide(
color: Colors.grey,
width: 1.0,
),
),
),
),
],
),
),
],
),
Column(
children: <Widget> [
InkWell(
onTap: () {
// confirmDelete(snapshot.data[index]["id"]);
confirmDelete("address");
},
child: Row(
children:<Widget> [
Container(
margin: EdgeInsets.only(left: 15, right: 10, bottom: 15),
child: SvgPicture.asset(
'assets/images/pharmacy/delete_red_icon.svg',
height: 15,),
),
Container(
margin: EdgeInsets.only(bottom: 15),
child: Text(TranslationBase.of(context).delete,
style: TextStyle(fontSize: 15.0,
color: Colors.redAccent,
),
),
),
],
),
),
],
)
],
),
],
),
SizedBox(
height: 10,
),
],
),
Divider(
color: Colors.grey[350],
height: 20,
thickness: 6,
indent: 0,
endIndent: 0,
),
],
),
),
);
}
),
SizedBox(
height: 10,
),
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return AddAddressPage();
children: <Widget>[
...List.generate(
model.addresses != null ? model.addresses.length : 0,
(index) => AddressItemWidget(
model,
model.addresses[index],
() {
setState(() {
model.setSelectedAddressIndex(index);
});
},
model.selectedAddressIndex == index,
(address) {
navigateToAddressPage(context, model, address);
}),
);
},
child: Container(
margin: EdgeInsets.only(bottom: 100.0),
height: 50.0,
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.green,
style: BorderStyle.solid,
width: 1.0
),
color: Colors.transparent,
borderRadius: BorderRadius.circular(5.0)
),
child: Center(
child: Text(
TranslationBase.of(context).addAddress,
style: TextStyle(
color: Colors.green,
fontWeight: FontWeight.bold,
),
),
),
),
),
Container(
color: Colors.white,
margin: EdgeInsets.all(8),
child: BorderedButton(
TranslationBase.of(context).addAddress,
hasBorder: true,
borderColor: Color(0xFF0fca6d),
textColor: Color(0xFF0fca6d),
fontWeight: FontWeight.bold,
backgroundColor: Colors.white,
fontSize: 14,
vPadding: 12,
hasShadow: true,
handler: () {
navigateToAddressPage(context, model, null);
},
),
),
],
),
),
),
bottomSheet: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return AddAddressPage();
}),
);
},
child: Container(
height: 50.0,
color: Colors.green,
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.green,
style: BorderStyle.solid,
width: 1.0
),
color: Colors.green,
borderRadius: BorderRadius.circular(5.0)
bottomSheet: Container(
height: height * 0.10,
color: Colors.white,
child: Column(
children: [
Divider(
color: Colors.grey.shade300,
height: 1,
thickness: 1,
indent: 0,
endIndent: 0,
),
child: Center(
child: Text(TranslationBase.of(context).confirmAddress,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
Container(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: BorderedButton(
TranslationBase.of(context).confirmAddress,
hasBorder: true,
borderColor: Color(0xFF5AB145),
textColor: Colors.white,
fontWeight: FontWeight.bold,
backgroundColor: Color(0xFF5AB145),
fontSize: 14,
vPadding: 12,
handler: () {
model.saveSelectedAddressLocally(
model.addresses[model.selectedAddressIndex]);
Navigator.pop(context,
model.addresses[model.selectedAddressIndex]);
},
),
),
),
],
),
),
),
);
}
confirmDelete(address){
showDialog(
context: context,
builder: (BuildContext context)=> AlertDialog(
title: Text(TranslationBase.of(context).confirmDeleteMsg,
style: TextStyle(
fontWeight: FontWeight.bold,
),),
content: Text("address"),
actions:[
FlatButton(
child: Text(TranslationBase.of(context).cancel,
style: TextStyle(
color: Colors.red,
fontWeight: FontWeight.bold,
fontSize: 16,
),),
onPressed: (){
Navigator.pop(context);
},
),
FlatButton(
child: Text(TranslationBase.of(context).confirmDelete,
style: TextStyle(
color: Colors.grey,
fontWeight: FontWeight.bold,
fontSize: 16,
),),
onPressed: (){
// http.delete("https://uat.hmgwebservices.com/epharmacy/api/Customers/272843?fields=addresses/$id");
Navigator.push(context,
MaterialPageRoute(builder: (context)=> PharmacyAddressesPage() ));
},
),
],
)
);
}
}
getAllAddress() {
class AddressItemWidget extends StatelessWidget {
final PharmacyAddressesViewModel model;
final Addresses address;
final Function selectAddress;
final bool isSelected;
final Function(Addresses) onTabEditAddress;
}
getConfirmAddress(){
}
getEditAddress(){
}
getDeleteAddress(){
AddressItemWidget(this.model, this.address, this.selectAddress,
this.isSelected, this.onTabEditAddress);
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Padding(
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
InkWell(
onTap: selectAddress,
child: Container(
margin: EdgeInsets.only(left: 16, right: 16),
child: Padding(
padding: const EdgeInsets.all(5.0),
child: Container(
decoration: new BoxDecoration(
color: !isSelected ? Colors.white : Colors.green,
shape: BoxShape.circle,
border: Border.all(
color: Colors.grey,
style: BorderStyle.solid,
width: 1.0),
),
child: Padding(
padding: const EdgeInsets.all(0.0),
child: Icon(
Icons.check,
color: isSelected
? Colors.white
: Colors.transparent,
size: 25,
),
),
),
),
),
),
],
),
Expanded(
child: Container(
child: Container(
margin:
EdgeInsets.symmetric(vertical: 12, horizontal: 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 0),
child: Texts(
"${address.firstName} ${address.lastName}",
fontSize: 14,
fontWeight: FontWeight.bold,
color: Colors.black,
),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: Texts(
"${address.address1} ${address.address2} ${address.address2},, ${address.city}, ${address.country} ${address.zipPostalCode}",
fontSize: 12,
fontWeight: FontWeight.normal,
color: Colors.grey.shade500,
),
),
Row(
children: [
Container(
margin: const EdgeInsets.only(right: 8),
child: Icon(
Icons.phone,
size: 20,
color: Colors.black,
),
),
Texts(
"${address.phoneNumber}",
fontSize: 14,
fontWeight: FontWeight.bold,
color: Colors.grey,
),
],
),
SizedBox(
height: 10,
),
Container(
height: 25,
child: Row(
children: <Widget>[
BorderedButton(
TranslationBase.of(context).edit,
backgroundColor: Colors.transparent,
hasBorder: true,
borderColor: Colors.transparent,
textColor: Color(0x990000FF),
handler: () {
onTabEditAddress(address);
},
icon: Icon(
Icons.edit,
size: 15,
color: Color(0x990000FF),
),
),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 8),
child: SizedBox(
child: Container(
width: 1,
color: Colors.grey.shade400,
),
),
),
BorderedButton(
TranslationBase.of(context).delete,
backgroundColor: Colors.transparent,
hasBorder: true,
borderColor: Colors.transparent,
textColor: Color(0x99FF0000),
handler: () {
ConfirmDialog dialog = new ConfirmDialog(
context: context,
title: "Are you sure want to delete",
confirmMessage:
"${address.address1} ${address.address2}",
okText:
TranslationBase.of(context).delete,
cancelText: TranslationBase.of(context)
.cancel_nocaps,
okFunction: () => {
model
.deleteAddresses(address)
.then((_) {
ConfirmDialog.closeAlertDialog(
context);
AppToast.showErrorToast(
message:
"Address has been deleted");
})
},
cancelFunction: () => {});
dialog.showAlertDialog(context);
},
icon: Icon(
Icons.delete,
size: 15,
color: Color(0x99FF0000),
),
),
],
),
),
],
),
),
),
),
],
),
Divider(
color: Colors.grey.shade200,
height: 10,
thickness: 10,
indent: 0,
endIndent: 0,
),
],
),
),
);
}
}

@ -1,4 +1,5 @@
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/pages/ContactUs/LiveChat/livechat_page.dart';
import 'package:diplomaticquarterapp/pages/ContactUs/findus/findus_page.dart';
@ -18,6 +19,12 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/my_reviews.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/compare.dart';
dynamic languageID ;
class PharmacyProfilePage extends StatefulWidget {
@ -35,7 +42,7 @@ class _ProfilePageState extends State<PharmacyProfilePage> {
String lastName, mobileNo, identificationNo;
int languageId;
_ProfilePageState({this.customerId});
_ProfilePageState({this.customerId });
getLanguageID() async {
languageID = await sharedPref.getString(APP_LANGUAGE);
@ -78,45 +85,40 @@ class _ProfilePageState extends State<PharmacyProfilePage> {
@override
Widget build(BuildContext context) {
return AppScaffold(
appBarTitle: TranslationBase.of(context).myAccount,
isShowAppBar: true,
isPharmacy: true,
body: Container(
child: SingleChildScrollView(
child: Column(
children: <Widget>[
Container(
child: Row(
children: <Widget>[
// Container(
// padding:EdgeInsets.only(top:20.0, left:10.0, right:10.0, bottom:10.0,),
// child: LargeAvatar(
// name: "",
// url: "" ,),
// ),
Row(
children: [
Column(
children: [
Container(
padding:EdgeInsets.only(top:10.0, left:10.0, right:10.0, bottom:15.0,),
child: SvgPicture.asset(
'assets/images/pharmacy/user.svg',
width: 60,
height: 60,
),
),]
return BaseView<OrderModelViewModel>(
onModelReady: (model) => model.getOrder(customerId, page_id),
builder: (_, model, wi) => AppScaffold(
appBarTitle: TranslationBase.of(context).myAccount,
isShowAppBar: true,
isPharmacy: true,
body: Container(
child: SingleChildScrollView(
child: Column(
children: <Widget>[
Container(
child: Row(
children: <Widget>[
Container(
padding: EdgeInsets.only(
top: 20.0,
left: 10.0,
right: 10.0,
bottom: 10.0,
),
child: LargeAvatar(
name: "profile",
url: '',
),
Column(
crossAxisAlignment: CrossAxisAlignment.center,
),
Container(
child: Column(
children: [
Text(
TranslationBase.of(context).welcome,
style: TextStyle(
fontSize: 14.0,
style: TextStyle(fontSize: 14.0,
fontWeight: FontWeight.bold,
color: Colors.grey),
color:Colors.grey
),
),
Text(
languageID == "ar"
@ -220,8 +222,8 @@ class _ProfilePageState extends State<PharmacyProfilePage> {
'assets/images/pharmacy/wishlist_icon.svg',
width: 50,
height: 50,
),
SizedBox(
),SizedBox(
height: 5,
),
Text(
@ -237,13 +239,18 @@ class _ProfilePageState extends State<PharmacyProfilePage> {
),
Expanded(
child: InkWell(
child: Column(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MyReviewsPage()));
},child: Column(
children: <Widget>[
SvgPicture.asset(
'assets/images/pharmacy/review_icon.svg',
width: 50,
height: 50,
),
),
SizedBox(
height: 5,
),
@ -328,7 +335,7 @@ class _ProfilePageState extends State<PharmacyProfilePage> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MyFamily()));
builder: (context) => ComparePage()));
},
child: Row(
children: <Widget>[
@ -432,7 +439,7 @@ class _ProfilePageState extends State<PharmacyProfilePage> {
'assets/images/pharmacy/shipping_addresses_icon.svg',
width: 30,
height: 30,
),
),
SizedBox(
width: 20,
),
@ -609,9 +616,8 @@ class _ProfilePageState extends State<PharmacyProfilePage> {
),
),
);
}
// getUser() async {
// var userData = await sharedPref.getObject(USER_PROFILE);
// if (userData != null) user = AuthenticatedUser.fromJson(userData);
// }
}
}}

@ -14,6 +14,13 @@ class BrandsService extends BaseService {
List<TopBrand> _topBrandsList = List();
List<TopBrand> get topBrandsList => _topBrandsList;
List<Brand> _searchList = List();
List<Brand> get searchList => _searchList;
clearSearchList() {
_searchList.clear();
}
Future getBrands() async {
hasError = false;
await baseAppClient.getPharmacy(GET_BRANDS,
@ -41,4 +48,26 @@ class BrandsService extends BaseService {
super.error = error;
});
}
Future searchProducts({String productName}) async {
RegExp exp = new RegExp(productName.toUpperCase());
hasError = false;
_searchList.clear();
await baseAppClient.getPharmacy(
GET_BRANDS,
onSuccess: (dynamic response, int statusCode) {
response['manufacturer'].forEach((item) {
if(exp.hasMatch(item['name'])){
_searchList.add(Brand.fromJson(item));
}else{
}
});
},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
},
);
}
}

@ -1,38 +1,102 @@
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/Country.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart';
class PharmacyAddressService extends BaseService {
List<Addresses> addresses = List();
CountryData country;
int selectedAddressIndex = 0;
class PharmacyAddressService extends BaseService{
Future getAddresses() async {
var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID);
Map<String, String> queryParams = {'fields': 'addresses'};
hasError = false;
Addresses selectedAddress;
try {
await baseAppClient.get("$GET_CUSTOMERS_ADDRESSES$customerId",
onSuccess: (dynamic response, int statusCode) async {
addresses.clear();
var savedAddress =
await sharedPref.getObject(PHARMACY_SELECTED_ADDRESS);
if (savedAddress != null) {
selectedAddress = Addresses.fromJson(savedAddress);
}
int index = 0;
response['customers'][0]['addresses'].forEach((item) {
Addresses address = Addresses.fromJson(item);
if (selectedAddress != null && selectedAddress.id == item["id"]) {
selectedAddressIndex = index;
}
addresses.add(address);
index++;
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, queryParams: queryParams);
} catch (error) {
throw error;
}
}
Future getCountries(String countryName) async {
hasError = false;
try {
await baseAppClient.get("$PHARMACY_GET_COUNTRY",
onSuccess: (dynamic response, int statusCode) {
// countries.clear();
response['countries'].forEach((item) {
if (CountryData.fromJson(item).name == countryName ||
CountryData.fromJson(item).namen == countryName) {
country = CountryData.fromJson(item);
}
// countries.add(CountryData.fromJson(item));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
});
} catch (error) {
throw error;
}
}
AppSharedPreferences sharedPref = AppSharedPreferences();
AppGlobal appGlobal = new AppGlobal();
AuthenticatedUser authUser = new AuthenticatedUser();
AuthProvider authProvider = new AuthProvider();
Future addCustomerAddress(Addresses address) async {
makeCustomerAddress(address, ADD_CUSTOMER_ADDRESS);
}
List<PharmacyAddressesModel> get address => address;
List<PharmacyAddressesModel> _addressList = List();
List<PharmacyAddressesModel> get reviewList => _addressList;
String url ="";
Future editCustomerAddress(Addresses address) async {
makeCustomerAddress(address, EDIT_CUSTOMER_ADDRESS);
}
Future getAddress(address) async {
print("step 1");
Future deleteCustomerAddress(Addresses address) async {
makeCustomerAddress(address, DELETE_CUSTOMER_ADDRESS);
}
Future makeCustomerAddress(Addresses address, String url) async {
var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID);
hasError = false;
url =GET_ADDRESS+"272843?fields=addresses";
print(url);
await baseAppClient.getPharmacy(url,
onSuccess: (dynamic response, int statusCode) {
_addressList.clear();
response['customers'].forEach((item) {
_addressList.add(PharmacyAddressesModel.fromJson(item));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
});
}}
super.error = "";
Map<String, dynamic> customerObject = Map();
customerObject["addresses"] = [address];
customerObject["id"] = customerId;
customerObject["email"] = address.email;
customerObject["role_ids"] = [3];
Map<String, dynamic> body = Map();
body["customer"] = customerObject;
await baseAppClient.post("$url", onSuccess: (response, statusCode) async {
addresses.clear();
response['customers'][0]['addresses'].forEach((item) {
addresses.add(Addresses.fromJson(item));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
}

@ -1,11 +1,14 @@
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:diplomaticquarterapp/models/pharmacy/Wishlist.dart';
import 'package:diplomaticquarterapp/models/pharmacy/addToCartModel.dart';
import 'package:diplomaticquarterapp/models/pharmacy/locationModel.dart';
import 'package:diplomaticquarterapp/models/pharmacy/productDetailModel.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/models/pharmacy/specification.dart';
class ProductDetailService extends BaseService {
AppSharedPreferences sharedPref = AppSharedPreferences();
bool isLogin = false;
List<ProductDetail> _productDetailList = List();
@ -14,10 +17,20 @@ class ProductDetailService extends BaseService {
List<LocationModel> _productLocationList = List();
List<LocationModel> get productLocationList => _productLocationList;
List<Wishlist> _addToCartModel = List();
List<Wishlist> get addToCartModel => _addToCartModel;
Future getProductReviews() async {
List<Wishlist> _wishListProducts = List();
List<Wishlist> get wishListProducts => _wishListProducts;
List<SpecificationModel> _productSpecification = List();
List<SpecificationModel> get productSpecification => _productSpecification;
Future getProductReviews(productID) async {
hasError = false;
await baseAppClient.getPharmacy(GET_PRODUCT_DETAIL+"1480?fields=reviews",
await baseAppClient.getPharmacy(GET_PRODUCT_DETAIL+productID+"?fields=reviews",
onSuccess: (dynamic response, int statusCode) {
_productDetailList.clear();
response['products'].forEach((item) {
@ -51,11 +64,115 @@ class ProductDetailService extends BaseService {
_productLocationList.clear();
response['PharmList'].forEach((item) {
_productLocationList.add(LocationModel.fromJson(item));
print(_productLocationList);
print(response);
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: request);
}
Future addToCart(quantity, itemID) async {
var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID);
hasError = false;
Map<String, dynamic> request;
request = {
"shopping_cart_item":
{
"quantity": quantity,
"shopping_cart_type": "1",
"product_id": itemID,
"customer_id": customerId,
"language_id": 1
}
};
await baseAppClient.post(GET_SHOPPING_CART,
onSuccess: (dynamic response, int statusCode) {
_addToCartModel.clear();
response['shopping_carts'].forEach((item) {
_addToCartModel.add(Wishlist.fromJson(item));
});
AppToast.showSuccessToast(message: 'You have added a product to the cart');
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
AppToast.showErrorToast(message: 'something went wrong please try again');
}, body: request);
}
Future addToWishlist(itemID) async {
var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID);
hasError = false;
Map<String, dynamic> request;
request = {
"shopping_cart_item":
{
"quantity": 1,
"shopping_cart_type": "Wishlist",
"product_id": itemID,
"customer_id": customerId,
"language_id": 1
}
};
await baseAppClient.post(GET_SHOPPING_CART,
onSuccess: (dynamic response, int statusCode) {
_wishListProducts.clear();
response['shopping_carts'].forEach((item) {
_wishListProducts.add(Wishlist.fromJson(item));
AppToast.showSuccessToast(message: 'You have added a product to the Wishlist');
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
AppToast.showErrorToast(message: 'something went wrong please try again');
}, body: request);
}
Future getWishlistItems() async {
var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID);
hasError = false;
await baseAppClient.getPharmacy(GET_WISHLIST+customerId+"?shopping_cart_type=2",
onSuccess: (dynamic response, int statusCode) {
_wishListProducts.clear();
response['shopping_carts'].forEach((item) {
_wishListProducts.add(Wishlist.fromJson(item));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
});
}
Future delteItemFromWishlist(itemID) async {
var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID);
hasError = false;
await baseAppClient.getPharmacy(DELETE_WISHLIST+customerId+"+&product_id="+itemID+"&cart_type=Wishlist",
onSuccess: (dynamic response, int statusCode) {
_wishListProducts.clear();
response['shopping_carts'].forEach((item) {
_wishListProducts.add(Wishlist.fromJson(item));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
});
}
Future productSpecificationData(itemID) async {
hasError = false;
await baseAppClient.getPharmacy(GET_SPECIFICATION+itemID,
onSuccess: (dynamic response, int statusCode) {
_productSpecification.clear();
response['specification'].forEach((item) {
_productSpecification.add(SpecificationModel.fromJson(item));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
});
}
}

@ -1,19 +1,29 @@
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/pharmacy/reviewModel.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
class ReviewService extends BaseService {
AppSharedPreferences sharedPref = AppSharedPreferences();
AuthenticatedUser authUser = new AuthenticatedUser();
AuthProvider authProvider = new AuthProvider();
bool isLogin = false;
List<Review> _reviewList = List();
List<Review> get reviewList => _reviewList;
Future getReview() async {
var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID);
hasError = false;
await baseAppClient.getPharmacy(GET_REVIEW+"1367368",
await baseAppClient.getPharmacy(GET_REVIEW+customerId,
onSuccess: (dynamic response, int statusCode) {
_reviewList.clear();
response['reviews'].forEach((item) {

@ -55,8 +55,9 @@ class WishListService extends BaseService {
// }
Future getWishlist() async {
var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID);
hasError = false;
await baseAppClient.getPharmacy(GET_WISHLIST+"1367368?shopping_cart_type=2",
await baseAppClient.getPharmacy(GET_WISHLIST+customerId+"?shopping_cart_type=2",
onSuccess: (dynamic response, int statusCode) {
_wishListProducts.clear();
response['shopping_carts'].forEach((item) {

@ -735,7 +735,14 @@ class TranslationBase {
String get orderDetail => localizedValues['orderDetail'][locale.languageCode];
String get subtotal => localizedValues['subtotal'][locale.languageCode];
String get shipping => localizedValues['shipping'][locale.languageCode];
String get shipBy => localizedValues['shipBy'][locale.languageCode];
String get lakumPoints => localizedValues['lakumPoints'][locale.languageCode];
String get use => localizedValues['use'][locale.languageCode];
String get proceedPay => localizedValues['proceedPay'][locale.languageCode];
String get vat => localizedValues['vat'][locale.languageCode];
String get inclusiveVat => localizedValues['inclusiveVat'][locale.languageCode];
String get items => localizedValues['items'][locale.languageCode];
String get checkOut => localizedValues['checkOut'][locale.languageCode];
String get total => localizedValues['total'][locale.languageCode];
String get sar => localizedValues['sar'][locale.languageCode];
String get payOnline => localizedValues['payOnline'][locale.languageCode];
@ -1042,6 +1049,7 @@ class TranslationBase {
localizedValues['termOfService'][locale.languageCode];
String get shoppingCart =>
localizedValues['shoppingCart'][locale.languageCode];
String get pharmacyServiceTermsCondition => localizedValues['pharmacyServiceTermsCondition'][locale.languageCode];
String get referralStatus =>
localizedValues['referralStatus'][locale.languageCode];
@ -1069,6 +1077,18 @@ class TranslationBase {
localizedValues['processDoneSuccessfully'][locale.languageCode];
String get selectHomeHealthCareServices =>
localizedValues['selectHomeHealthCareServices'][locale.languageCode];
String get topBrands => localizedValues['topBrands'][locale.languageCode];
String get notifyMe => localizedValues['notifyMe'][locale.languageCode];
String get specification => localizedValues['specification'][locale.languageCode];
String get details => localizedValues['details'][locale.languageCode];
String get availability => localizedValues['availability'][locale.languageCode];
String get quantity => localizedValues['quantity'][locale.languageCode];
String get quantitySize => localizedValues['quantitySize'][locale.languageCode];
String get addToCart => localizedValues['addToCart'][locale.languageCode];
String get buyNow => localizedValues['buyNow'][locale.languageCode];
String get quantityShortcut => localizedValues['quantityShortcut'][locale.languageCode];
}
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -18,6 +18,7 @@ class BorderedButton extends StatelessWidget {
final double fontSize;
final Widget icon;
final FontWeight fontWeight;
final bool hasShadow;
BorderedButton(
this.text, {
@ -36,6 +37,7 @@ class BorderedButton extends StatelessWidget {
this.fontSize = 0,
this.icon,
this.fontWeight,
this.hasShadow = false,
});
@override
@ -46,14 +48,21 @@ class BorderedButton extends StatelessWidget {
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: backgroundColor ?? Colors.white,
borderRadius: BorderRadius.circular(radius),
border: Border.fromBorderSide(BorderSide(
color: hasBorder ? borderColor : Colors.white,
width: 0.8,
)),
),
shape: BoxShape.rectangle,
color: backgroundColor ?? Colors.white,
borderRadius: BorderRadius.circular(radius),
border: Border.fromBorderSide(BorderSide(
color: hasBorder ? borderColor : Colors.white,
width: 0.8,
)),
boxShadow: [
BoxShadow(
color: !hasShadow ? Colors.transparent : Colors.grey.withOpacity(0.5),
// spreadRadius: 5,
blurRadius: 15.0,
offset: Offset(0.0, 0.75) // changes position of shadow
),
]),
child: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
@ -69,8 +78,11 @@ class BorderedButton extends StatelessWidget {
text,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: fontSize == 0 ? SizeConfig.textMultiplier * 1.6 : fontSize,
fontWeight: fontWeight != null ? fontWeight : FontWeight.normal,
fontSize: fontSize == 0
? SizeConfig.textMultiplier * 1.6
: fontSize,
fontWeight:
fontWeight != null ? fontWeight : FontWeight.normal,
color: textColor ?? Color(0xffc4aa54)),
),
),

@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
class ConfirmDialog {
final BuildContext context;
final title;
final confirmMessage;
final okText;
final cancelText;
@ -14,6 +15,7 @@ class ConfirmDialog {
ConfirmDialog(
{@required this.context,
this.title,
@required this.confirmMessage,
@required this.okText,
@required this.cancelText,
@ -31,7 +33,7 @@ class ConfirmDialog {
// set up the AlertDialog
AlertDialog alert = AlertDialog(
title: Text(TranslationBase.of(context).confirm),
title: title != null ? Text(title) : Text(TranslationBase.of(context).confirm),
content: Text(this.confirmMessage),
actions: [
cancelButton,

@ -0,0 +1,241 @@
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart';
import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart';
import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart';
import 'package:diplomaticquarterapp/widgets/robo-search/search.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import '../../locator.dart';
import 'floating_button_search.dart';
import '../progress_indicator/app_loader_widget.dart';
import 'arrow_back.dart';
import 'network_base_view.dart';
import 'not_auh_page.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/product_detail.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart';
class DetailPageScafold extends StatefulWidget {
final String appBarTitle;
final Widget body;
final Widget bottomSheet;
final bool isLoading;
final bool isShowAppBar;
final bool hasAppBarParam;
final BaseViewModel baseViewModel;
final bool isBottomBar;
final Widget floatingActionButton;
final bool isPharmacy;
final String title;
final String description;
final String image;
final bool isShowDecPage;
final List<String> infoList;
final Color backgroundColor;
final double preferredSize;
final List<Widget> appBarIcons;
final PreferredSizeWidget appBarWidget;
DetailPageScafold(
{@required this.body,
this.appBarTitle = '',
this.isLoading = false,
this.isShowAppBar = false,
this.hasAppBarParam,
this.bottomSheet,
this.baseViewModel,
this.floatingActionButton,
this.isPharmacy = false,
this.title,
this.description,
this.isShowDecPage = true,
this.isBottomBar,
this.backgroundColor,
this.preferredSize = 0.0,
this.appBarIcons,
this.appBarWidget,
this.image,
this.infoList});
@override
_DetailPageScafoldState createState() => _DetailPageScafoldState();
}
class _DetailPageScafoldState extends State<DetailPageScafold> {
AuthenticatedUserObject authenticatedUserObject =
locator<AuthenticatedUserObject>();
@override
Widget build(BuildContext context) {
AppGlobal.context = context;
PreferredSizeWidget appBar;
if (this.widget.appBarWidget == null) {
PreferredSizeWidget appBarWidget = AppBarWidget(
widget.appBarTitle,
widget.appBarIcons,
widget.isShowAppBar,
isPharmacy: widget.isPharmacy,
isShowDecPage: widget.isShowDecPage,
image: widget.image,
);
appBar = widget.preferredSize == 0
? appBarWidget
: PreferredSize(
child: appBarWidget,
preferredSize: Size.fromHeight(widget.preferredSize));
} else {
appBar = this.widget.appBarWidget;
}
return Scaffold(
backgroundColor:
widget.backgroundColor ?? Theme.of(context).scaffoldBackgroundColor,
appBar: appBar,
body: (!Provider.of<ProjectViewModel>(context, listen: false).isLogin &&
widget.isShowDecPage)
? NotAutPage(
title: widget.appBarTitle,
description: widget.description,
infoList: widget.infoList,
)
: widget.baseViewModel != null
? NetworkBaseView(
child: buildBodyWidget(),
baseViewModel: widget.baseViewModel,
)
: buildBodyWidget(),
bottomSheet: widget.bottomSheet,
//floatingActionButton: floatingActionButton ?? floatingActionButton,
// bottomNavigationBar:
// this.isBottomBar == true ? BottomBarSearch() : SizedBox()
// floatingActionButton: FloatingSearchButton(),
);
}
buildAppLoaderWidget(bool isLoading) {
return isLoading ? AppLoaderWidget() : Container();
}
buildBodyWidget() {
// return body; //Stack(children: <Widget>[body, buildAppLoaderWidget(isLoading)]);
return Stack(children: <Widget>[
widget.body, /*FloatingSearchButton()*/
]);
}
}
class AppBarWidget extends StatelessWidget with PreferredSizeWidget {
final AuthenticatedUserObject authenticatedUserObject =
locator<AuthenticatedUserObject>();
final String appBarTitle;
final List<Widget> appBarIcons;
final bool isShowAppBar;
final bool isPharmacy;
final bool isShowDecPage;
final String image;
AppBarWidget(this.appBarTitle, this.appBarIcons, this.isShowAppBar,
{this.isPharmacy = true, this.isShowDecPage = true, this.image});
@override
Widget build(BuildContext context) {
return buildAppBar(context);
}
Widget buildAppBar(BuildContext context) {
return isShowAppBar
? AppBar(
elevation: 0,
backgroundColor:Colors.white,
// isPharmacy ? Colors.green : Theme.of(context).appBarTheme.color,
textTheme: TextTheme(
headline6:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
),
title: Texts(
authenticatedUserObject.isLogin || !isShowDecPage
? appBarTitle.toUpperCase()
: TranslationBase.of(context).serviceInformationTitle,
color: Colors.white,
bold: true,
),
leading: Builder(
builder: (BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap:()=> Navigator.pop(context),
child: Icon(Icons.arrow_back_ios, color: Colors.grey),
);
},
),
centerTitle: true,
actions: <Widget>[
isPharmacy
? IconButton(
icon: Icon(Icons.shopping_cart),
color: Colors.grey,
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CartOrderPage()),
);
// Navigator.of(context)
// .popUntil(ModalRoute.withName('/'));
})
: Container(),
image != null
? InkWell(
onTap: () => Navigator.push(
context,
FadePage(
page: InsuranceUpdate(),
),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
image,
height: SizeConfig.heightMultiplier * 5,
width: SizeConfig.heightMultiplier * 5,
color: Colors.grey,
),
),
)
: IconButton(
icon: Icon(FontAwesomeIcons.ellipsisV),
color: Colors.grey,
onPressed: () {
settingModalBottomSheet(context);
},
),
if (appBarIcons != null) ...appBarIcons
],
)
: Container(
height: 0,
width: 0,
);
}
@override
Size get preferredSize => Size(double.maxFinite, 60);
}

@ -1,4 +1,6 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart';
import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
@ -20,6 +22,7 @@ class productTile extends StatelessWidget {
final String imgs;
final int status;
final Product product;
final dynamic productID;
productTile(
{this.productName,
@ -28,13 +31,15 @@ class productTile extends StatelessWidget {
this.productReviews,
this.qyt,
this.totalPrice,
this.isOrderDetails = true,
this.isOrderDetails = false,
this.productImage,
this.showLine = true,
this.img,
this.imgs,
this.status,
this.product});
this.product,
this.productID,
});
@override
Widget build(BuildContext context) {
@ -128,11 +133,32 @@ class productTile extends StatelessWidget {
flex: 1,
child: Column(
children: [
Icon(FontAwesomeIcons.trashAlt, size: 15),
IconButton(
icon: Icon(
FontAwesomeIcons.trashAlt,
size: 15
),
onPressed: (){
deleteFromWishlistFunction(productID);
},
),
SizedBox(
height: 50,
),
Icon(FontAwesomeIcons.shoppingCart, size: 15),
IconButton(
icon: Icon(
FontAwesomeIcons.shoppingCart,
size: 15
),
onPressed: () async{
await addToCartFunction(1, productID);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CartOrderPage()),
);
},
),
],
),
)
@ -264,106 +290,23 @@ class productTile extends StatelessWidget {
),
),
/*Container(
child: Padding(
padding: EdgeInsets.all(8.0),
child: Row(
children: [
Padding(
padding: EdgeInsets.only(left: 15),
child: Container(
width: 160,
height: 200,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border(
top: BorderSide(width: 0.5, color: Colors.grey),
left: BorderSide(width: 0.5, color: Colors.grey),
right: BorderSide(width: 0.5, color: Colors.grey),
bottom: BorderSide(width: 0.5, color: Colors.grey),
),
color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 2,
),
Container(
child: Image.network(
productImage.trim(),
fit: BoxFit.cover,
width: 80,
height: 70,
),
),
SizedBox(
height: 10,
),
// Container(width: 150,height: 20,color: Colors.green,),
Container(
alignment: Alignment.centerLeft,
child: Column(
children: [
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: productName,
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
),
),
),
),
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text: 'SAR $productPrice',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
),
),
),
),
Container(
alignment: Alignment.topLeft,
margin: EdgeInsets.all(5),
child: Align(
child: RatingBar.readOnly(
initialRating: productRate,
size: 15.0,
filledColor: Colors.yellow[700],
emptyColor: Colors.grey[500],
isHalfAllowed: true,
halfFilledIcon: Icons.star_half,
filledIcon: Icons.star,
emptyIcon: Icons.star,
),
),
),
],
),
),
],
),
),
),
],
),
),
),*/
],
),
);
}
deleteFromWishlistFunction(itemID) async {
ProductDetailViewModel x = new ProductDetailViewModel();
await x.deletWishlistData(itemID);
}
addToCartFunction(quantity, itemID) async {
ProductDetailViewModel x = new ProductDetailViewModel();
await x.addToCartData(quantity, itemID);
}
}

@ -1,6 +1,7 @@
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/others/close_back.dart';
import 'package:flutter/cupertino.dart';
@ -13,24 +14,36 @@ class PickupLocationFromMap extends StatelessWidget {
final Function(PickResult) onPick;
final double latitude;
final double longitude;
final bool isWithAppBar;
final String buttonLabel;
final Color buttonColor;
const PickupLocationFromMap({Key key, this.onPick, this.latitude, this.longitude})
const PickupLocationFromMap(
{Key key,
this.onPick,
this.latitude,
this.longitude,
this.isWithAppBar = true,
this.buttonLabel,
this.buttonColor})
: super(key: key);
@override
Widget build(BuildContext context) {
ProjectViewModel projectViewModel = Provider.of(context);
return Scaffold(
appBar: AppBar(
elevation: 0,
textTheme: TextTheme(
headline6:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
),
title: Text('Location'),
leading: CloseBack(),
centerTitle: true,
),
appBar: isWithAppBar
? AppBar(
elevation: 0,
textTheme: TextTheme(
headline6:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
),
title: Text('Location'),
leading: CloseBack(),
centerTitle: true,
)
: null,
body: PlacePicker(
apiKey: GOOGLE_API_KEY,
enableMyLocationButton: true,
@ -57,17 +70,30 @@ class PickupLocationFromMap extends StatelessWidget {
child: state == SearchingState.Searching
? Center(child: CircularProgressIndicator())
: Container(
margin: EdgeInsets.all(12),
child: SecondaryButton(
color: Colors.grey[800],
margin: EdgeInsets.all(12),
child: BorderedButton(
buttonLabel != null ? buttonLabel : TranslationBase.of(context).next,
textColor: Colors.white,
onTap: () {
fontWeight: FontWeight.bold,
backgroundColor: buttonColor != null ? buttonColor : Colors.grey[800],
fontSize: 14,
vPadding: 12,
radius: 10,
handler: () {
onPick(selectedPlace);
Navigator.of(context).pop();
},
label: TranslationBase.of(context).next,
),
),
/* SecondaryButton(
color: Colors.grey[800],
textColor: Colors.white,
onTap: () {
onPick(selectedPlace);
Navigator.of(context).pop();
},
label: TranslationBase.of(context).next,
),*/
),
);
},
initialPosition: LatLng(latitude, longitude),

Loading…
Cancel
Save