Skip to content

Commit

Permalink
Merge commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Thesmader committed Apr 26, 2020
2 parents 92f6097 + 8f6cce6 commit c78766b
Show file tree
Hide file tree
Showing 16 changed files with 525 additions and 114 deletions.
2 changes: 1 addition & 1 deletion gogrocy/lib/core/enums/viewstate.dart
Original file line number Diff line number Diff line change
@@ -1 +1 @@
enum ViewState { Idle, Busy }
enum ViewState { Idle, Busy, Intermediate }
44 changes: 44 additions & 0 deletions gogrocy/lib/core/models/Address.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
class Address {
String recipent;
String address_id;
String city;
String contact;
String country;
String is_primary;
String locality;
String state;
String user_id;
String zip;

Address({this.recipent, this.address_id, this.city, this.contact, this.country, this.is_primary, this.locality, this.state, this.user_id, this.zip});

factory Address.fromJson(Map<String, dynamic> json) {
return Address(
recipent: json['recipent'],
address_id: json['address_id'],
city: json['city'],
contact: json['contact'],
country: json['country'],
is_primary: json['is_primary'],
locality: json['locality'],
state: json['state'],
user_id: json['user_id'],
zip: json['zip'],
);
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['recipent'] = this.recipent;
data['address_id'] = this.address_id;
data['city'] = this.city;
data['contact'] = this.contact;
data['country'] = this.country;
data['is_primary'] = this.is_primary;
data['locality'] = this.locality;
data['state'] = this.state;
data['user_id'] = this.user_id;
data['zip'] = this.zip;
return data;
}
}
20 changes: 20 additions & 0 deletions gogrocy/lib/core/models/cart_edit.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class CartEdit {
String message;
bool success;

CartEdit({this.message, this.success});

factory CartEdit.fromJson(Map<String, dynamic> json) {
return CartEdit(
message: json['message'],
success: json['success'],
);
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['message'] = this.message;
data['success'] = this.success;
return data;
}
}
49 changes: 48 additions & 1 deletion gogrocy/lib/core/services/api.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:gogrocy/core/models/Address.dart';
import 'package:gogrocy/core/models/cart_edit.dart';
import 'package:gogrocy/core/models/cart_list.dart';
import 'package:gogrocy/core/models/product.dart';
import 'package:gogrocy/core/models/signup_model.dart';
Expand All @@ -22,6 +24,8 @@ const String signUp = baseUrl + "signup";
const String verifyUser = baseUrl + "verifyUser";
const String addAddress = baseUrl + "add_address";
const String cartList = baseUrl + 'getCartItems';
const String editCart=baseUrl+ "add_to_cart";
const String getAddress=baseUrl+"getAddress";

class Apis {
final SharedPrefsService _sharedPrefsService = locator<SharedPrefsService>();
Expand Down Expand Up @@ -126,6 +130,26 @@ class Apis {
}
}


Future<CartEdit> editCartList(
{@required String product_id, @required String quantity}) async {
Map<String,String>body={
"product_id":product_id,
"quantity":quantity
};
String jwt=await _sharedPrefsService.getJWT();
var client = new http.Client();
bool connectionState = await checkStatus();
if (connectionState) //TODO: Add a proper else return
{
var response = await client.post(editCart, headers: {
'Authorization': 'Bearer $jwt',
},body: body);
return CartEdit.fromJson(json.decode(response.body));
} else
(print("Network failure"));
}

Future<List<Product>> getAllProducts() async {
var client = new http.Client();
bool connectionState = await checkStatus();
Expand All @@ -144,15 +168,38 @@ class Apis {
}
}

Future<List<Address>> getAddresses() async{
var client = new http.Client();
bool connectionState = await checkStatus();
String jwt=await _sharedPrefsService.getJWT();
if (connectionState) //TODO: Add a proper else return
{
var address = List<Address>();
var response = await client.post(getAddress, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer $jwt',
});
var parsed = json.decode(response.body) as List<dynamic>;
for (var product in parsed) {
address.add(Address.fromJson(product));
}
return address;
} else
(print("Network failure"));
}


Future<cart_list> getCartList() async {
var client = new http.Client();
bool connectionState = await checkStatus();
String jwt=await _sharedPrefsService.getJWT();
if (connectionState) //TODO: Add a proper else return
{
var response = await client.post(cartList, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer $TOKEN',
'Authorization': 'Bearer $jwt',
});
return cart_list.fromJson(json.decode(response.body));
} else
Expand Down
2 changes: 1 addition & 1 deletion gogrocy/lib/core/services/bottom_appbar_provider.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';

class BottomNavBarProvider with ChangeNotifier{
int _currentIndex=0;
int _currentIndex=1;

get currentIndex=> _currentIndex;

Expand Down
1 change: 1 addition & 0 deletions gogrocy/lib/core/services/checkout_button_callback.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
typedef void CheckoutButtonPressed();
22 changes: 22 additions & 0 deletions gogrocy/lib/core/services/shared_prefs.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import 'package:gogrocy/core/models/Address.dart';
import 'package:gogrocy/service_locator.dart';
import 'package:shared_preferences/shared_preferences.dart';

import 'api.dart';

class SharedPrefsService {

Future<bool> setJWT(String s) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString("jwt", s);
Expand Down Expand Up @@ -30,4 +35,21 @@ class SharedPrefsService {
return prefs.getString('cart');
}

Future<bool> setCity(String s)async{
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString("city", s);
}

Future<String> getCity() async{
final Apis apis = locator<Apis>();
final SharedPreferences prefs = await SharedPreferences.getInstance();
String city=prefs.getString("city");
if(city==null){
List<Address> address=await apis.getAddresses();
setCity(address[0].city);
return address[0].city;
}
else return city;
}

}
29 changes: 27 additions & 2 deletions gogrocy/lib/core/viewModels/cart_view_model.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:gogrocy/core/enums/viewstate.dart';
import 'package:gogrocy/core/models/cart_edit.dart';
import 'package:gogrocy/core/models/cart_list.dart';
import 'package:gogrocy/core/services/api.dart';
import 'package:gogrocy/core/viewModels/base_model.dart';
Expand All @@ -8,11 +9,35 @@ class CartViewModel extends BaseModel{
Apis _apis=locator<Apis>();

cart_list cartList;
cart_list intermediateCartList;
CartEdit cartEditResponse;

Future getCartList() async{
Future getCartList({String product_id, String quantity}) async{

if(product_id==null){
print("First time API called");
setState(ViewState.Busy);
cartList=await _apis.getCartList();
setState(ViewState.Idle);
}
if(product_id!=null){
print("Updating API calledUpdating API calledUpdating API calledUpdating API calledUpdating API called");
intermediateCartList=cartList;
setState(ViewState.Intermediate);
print("Updating API calledUpdating API calledUpdating API calledUpdating API calledUpdating API called");
cartEditResponse=await _apis.editCartList(product_id: product_id, quantity: quantity);
cartList=await _apis.getCartList();
setState(ViewState.Idle);

}

}

Future editCartList(String product_id, String quantity) async{
setState(ViewState.Busy);
cartList=await _apis.getCartList();
await _apis.editCartList(product_id: product_id, quantity: quantity);
setState(ViewState.Idle);

}

}
132 changes: 126 additions & 6 deletions gogrocy/lib/ui/views/cart/cart.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,137 @@
import 'package:flutter/material.dart';
import 'package:gogrocy/ui/views/cart/cart_header.dart';
import 'package:gogrocy/core/enums/viewstate.dart';
import 'package:gogrocy/core/viewModels/cart_view_model.dart';
import 'package:gogrocy/ui/views/base_view.dart';
import 'package:gogrocy/ui/views/cart/cart_bill.dart';
import 'package:gogrocy/ui/views/cart/cart_list.dart';
import 'package:flutter/material.dart';
import 'package:gogrocy/core/enums/viewstate.dart';
import 'package:gogrocy/core/models/cart_list.dart';
import 'package:gogrocy/core/services/checkout_button_callback.dart';
import 'package:gogrocy/core/viewModels/cart_view_model.dart';
import 'package:gogrocy/ui/shared/colors.dart' as colors;
import 'package:gogrocy/ui/shared/constants.dart' as constants;

typedef void CheckoutButtonPressed();

class Cart extends StatelessWidget {
ScrollController scrollController=new ScrollController();

@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
CartHeader(),
CartList()
],
body: BaseView<CartViewModel>(
onModelReady: (model) {
model.getCartList(product_id: null, quantity: null);
},
builder: (context, model, child) {
if (model.state == ViewState.Busy)
return Center(child: CircularProgressIndicator());
else if (model.state == ViewState.Intermediate) {
return ListView(
shrinkWrap: true,
controller: scrollController,
children: <Widget>[
CartHeader(model: model.cartList,checkoutButtonPressed: (){scrollController.animateTo(scrollController.position.maxScrollExtent, duration: Duration(milliseconds: 500), curve: Curves.easeIn);print("Callback succeeds");},),
CartList(model, model.intermediateCartList),
CartBill(model.cartList,),
SizedBox(height: 50,),

],
);
} else
return ListView(
shrinkWrap: true,
controller: scrollController,
children: <Widget>[
CartHeader(model:model.cartList,checkoutButtonPressed:(){scrollController.animateTo(scrollController.position.maxScrollExtent, duration: Duration(milliseconds: 500), curve: Curves.easeIn);print("Callback succeeds");}),
CartList(model, model.cartList),
CartBill(model.cartList),
SizedBox(height: 50,),

],
);
},
),
);
}
}

class CartHeader extends StatelessWidget {

cart_list model;
CheckoutButtonPressed checkoutButtonPressed;

CartHeader({this.model,this.checkoutButtonPressed});

@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Image(image: AssetImage('assets/images/cart_background.png')),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
IntrinsicHeight(
child: Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 20.0,
color: colors.CART_HEADER_COLOR,
),
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text("Your Cart",
style: TextStyle(fontFamily: 'Gilroy',fontSize: 32.0,fontWeight: FontWeight.bold, color: colors.CART_HEADER_COLOR),),
Text("Grand Total Rs"+model.sum.toString(),
style: TextStyle(fontFamily: 'Gilroy',fontSize: 14.0,fontWeight: FontWeight.w600, color: colors.CART_HEADER_COLOR),),

],
),
)
],
),
),
),
Padding(
padding: const EdgeInsets.only(left: 28.0,top: 12),
child: RawMaterialButton(
elevation: 0.0,
focusElevation: 1,
focusColor: colors.CART_BUTTON_BACKGROUND,
onPressed: () {
checkoutButtonPressed();
},
fillColor: colors.CART_BUTTON_BACKGROUND,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(3),
),
child: SizedBox(
width: constants.CartConfig.checkoutButtonWidth,
height: constants.CartConfig.checkoutButtonHeight,
child: Center(
child: Text(
'Checkout Now',
style: TextStyle(
color: colors.CART_BUTTON_TEXT,
fontSize: 13.0,
fontWeight: FontWeight.bold),
),
),
),
),
)
],
)
],
);
}
}

Loading

0 comments on commit c78766b

Please sign in to comment.