diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3188734fd455cdf3c4bd457c5c56b743cb3e88c0..bd7c7ac794e243617ba915d343ecdf653d42ec53 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.food_app"> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:label="food_app" android:name="${applicationName}" diff --git a/lib/auth/sign_in.dart b/lib/auth/sign_in.dart index 0c5e64d8f80f1893fc1bbfc288f3103b583b2991..47de5bd8649b5092654cdfa7c50f8e76e4360714 100644 --- a/lib/auth/sign_in.dart +++ b/lib/auth/sign_in.dart @@ -2,7 +2,9 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_signin_button/flutter_signin_button.dart'; import 'package:flutter_signin_button/button_view.dart'; +import 'package:food_app/providers/user_provider.dart'; import 'package:google_sign_in/google_sign_in.dart'; +import 'package:provider/provider.dart'; import '../screens/home_screens/home_screen.dart'; @@ -12,12 +14,12 @@ class SignIn extends StatefulWidget { } class _SignInState extends State<SignIn> { + UserProvider userProvider; Future<void> _googleSignUp() async { try { final GoogleSignIn _googleSignIn = GoogleSignIn( scopes: [ 'email', - 'https://www.googleapis.com/auth/contacts.readonly', ], ); final FirebaseAuth _auth = FirebaseAuth.instance; @@ -32,7 +34,13 @@ class _SignInState extends State<SignIn> { ); final User user = (await _auth.signInWithCredential(credential)).user; - print("signed in " + user.displayName); + // print("signed in " + user.displayName); + userProvider.addUserData( + currentUser: user, + userEmail: user.email, + userImage: user.photoURL, + userName: user.displayName, + ); return user; } catch (e) { @@ -42,6 +50,7 @@ class _SignInState extends State<SignIn> { @override Widget build(BuildContext context) { + userProvider = Provider.of<UserProvider>(context); return Scaffold( body: Container( height: double.infinity, diff --git a/lib/main.dart b/lib/main.dart index 7632266c7e6b8c6993cd3ed83d5e393f65f3cba2..f41db38da74d895cb57189cbbdc4066a1cca8c35 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:food_app/auth/sign_in.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:food_app/config/colors.dart'; import 'package:food_app/providers/product_provider.dart'; +import 'package:food_app/providers/user_provider.dart'; import 'package:food_app/screens/home_screens/home_screen.dart'; import 'package:provider/provider.dart'; @@ -17,8 +18,15 @@ class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { - return ChangeNotifierProvider<ProductProvider>( - create: (context) => ProductProvider(), + return MultiProvider( + providers: [ + ChangeNotifierProvider<ProductProvider>( + create: (context) => ProductProvider(), + ), + ChangeNotifierProvider<UserProvider>( + create: (context) => UserProvider(), + ) + ], child: MaterialApp( theme: ThemeData( primaryColor: primaryColor, diff --git a/lib/providers/product_provider.dart b/lib/providers/product_provider.dart index 6af7397856080e7a92bcbd0c61a863133b6f264c..e325b9707343d9d7ce0df63a779a601cf02c324c 100644 --- a/lib/providers/product_provider.dart +++ b/lib/providers/product_provider.dart @@ -1,22 +1,31 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter/cupertino.dart'; import 'package:food_app/models/product_model.dart'; class ProductProvider with ChangeNotifier { - List<ProductModel> herbsProductList = []; ProductModel productModel; + List<ProductModel> search = []; + productModels(QueryDocumentSnapshot element) { + productModel = ProductModel( + productImage: element.get("productImage"), + productName: element.get("productName"), + productPrice: element.get("productPrice"), + ); + search.add(productModel); + } + +// Display Herbs Drawer + List<ProductModel> herbsProductList = []; + fetchHerbsProductData() async { List<ProductModel> newList = []; QuerySnapshot value = await FirebaseFirestore.instance.collection("HerbsProduct ").get(); value.docs.forEach( (element) { - productModel = ProductModel( - productImage: element.get("productImage"), - productName: element.get("productName"), - productPrice: element.get("productPrice"), - ); + productModels(element); newList.add(productModel); }, ); @@ -28,6 +37,7 @@ class ProductProvider with ChangeNotifier { return herbsProductList; } +// Display Fresh Drawer List<ProductModel> freshProductList = []; fetchFreshProductData() async { @@ -38,11 +48,7 @@ class ProductProvider with ChangeNotifier { value.docs.forEach( (element) { - productModel = ProductModel( - productImage: element.get("productImage"), - productName: element.get("productName"), - productPrice: element.get("productPrice"), - ); + productModels(element); newList.add(productModel); }, ); @@ -54,6 +60,7 @@ class ProductProvider with ChangeNotifier { return freshProductList; } +// Display Root Drawer List<ProductModel> rootProductList = []; fetchRootProductData() async { @@ -65,11 +72,7 @@ class ProductProvider with ChangeNotifier { value.docs.forEach( (element) { - productModel = ProductModel( - productImage: element.get("productImage"), - productName: element.get("productName"), - productPrice: element.get("productPrice"), - ); + productModels(element); newList.add(productModel); }, ); @@ -80,4 +83,11 @@ class ProductProvider with ChangeNotifier { List<ProductModel> get getRootProductDataList { return rootProductList; } + + + + // Search Return + List<ProductModel> get getAllProductSearch { + return search; + } } diff --git a/lib/providers/user_provider.dart b/lib/providers/user_provider.dart new file mode 100644 index 0000000000000000000000000000000000000000..91a05841b3af4005248bfd823ffd72b8137aa008 --- /dev/null +++ b/lib/providers/user_provider.dart @@ -0,0 +1,16 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/cupertino.dart'; + +class UserProvider with ChangeNotifier { + void addUserData({User currentUser, String userName,String userEmail,String userImage,}) async { + await FirebaseFirestore.instance.collection("usersData").doc(currentUser.uid).set( + { + "userName":userName, + "userEmail":userEmail, + "userImage":userImage, + "userUId":currentUser.uid, + }, + ); + } +} diff --git a/lib/screens/home_screens/home_screen.dart b/lib/screens/home_screens/home_screen.dart index 799ab1db7eee0e4bb38f2c03b6001cb199cad3a6..bb39cb809c2339e9117b37ed4bc77e4814dca51e 100644 --- a/lib/screens/home_screens/home_screen.dart +++ b/lib/screens/home_screens/home_screen.dart @@ -27,9 +27,20 @@ class _HomeScreenState extends State<HomeScreen> { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('Herbs Seasonings'), - Text( - 'view all', - style: TextStyle(color: Colors.grey), + GestureDetector( + onTap: (){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => Search( + search: productProvider.getHerbsProductDataList, + ), + ), + ); + }, + child: Text( + 'view all', + style: TextStyle(color: Colors.grey), + ), ), ], ), @@ -76,9 +87,20 @@ class _HomeScreenState extends State<HomeScreen> { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('Fresh Fruits'), - Text( - 'view all', - style: TextStyle(color: Colors.grey), + GestureDetector( + onTap: (){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => Search( + search: productProvider.getFreshProductDataList, + ), + ), + ); + }, + child: Text( + 'view all', + style: TextStyle(color: Colors.grey), + ), ), ], ), @@ -122,9 +144,20 @@ class _HomeScreenState extends State<HomeScreen> { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('Root Vegetable'), - Text( - 'view all', - style: TextStyle(color: Colors.grey), + GestureDetector( + onTap: (){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => Search( + search: productProvider.getRootProductDataList, + ), + ), + ); + }, + child: Text( + 'view all', + style: TextStyle(color: Colors.grey), + ), ), ], ), @@ -187,7 +220,9 @@ class _HomeScreenState extends State<HomeScreen> { onPressed: () { Navigator.of(context).push( MaterialPageRoute( - builder: (context) => Search(), + builder: (context) => Search( + search: productProvider.getAllProductSearch, + ), ), ); }, diff --git a/lib/screens/home_screens/single_product.dart b/lib/screens/home_screens/single_product.dart index cd7604a2ceddf002d45029de67caf9c592d98465..d323660a625b131c095e68ffcfbd17997f8f0654 100644 --- a/lib/screens/home_screens/single_product.dart +++ b/lib/screens/home_screens/single_product.dart @@ -50,7 +50,7 @@ class SingleProduct extends StatelessWidget { fontWeight: FontWeight.bold, ), ), - Text('$productPrice\$/50 Gram', + Text('\$$productPrice/50 Gram', style: TextStyle( color: Colors.grey, )), @@ -66,11 +66,51 @@ class SingleProduct extends StatelessWidget { decoration: BoxDecoration( border: Border.all(color: Colors.grey), + borderRadius: BorderRadius.circular(8), ), + child: Row(children: [ + Expanded(child: Text( + '50 Gram', + style: TextStyle(fontSize: 11), + )), + Center( + child: Icon( + Icons.arrow_drop_down, + size: 20, color: Colors.yellow, + ), + ) + ],), ), - ) + ), + SizedBox( + width: 5, + ), + Container( + height: 25, + width: 50, + decoration: BoxDecoration( + border: Border.all(color: Colors.grey), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.remove, + size: 15, color: Color(0xffd0b84c)), + Text( + '1', + style: TextStyle( + color: Color(0xffd0b84c), + fontWeight: FontWeight.bold, + ), + ), + Icon(Icons.add, + size: 15, color: Color(0xffd0b84c) + ), + ],), + ), ], - ) + ), ], ))) ], diff --git a/lib/screens/search/search.dart b/lib/screens/search/search.dart index 05760a96e988b19f5bbccd5a936f5e8602e4b74c..d99983a78432d7e2fabe0e570e66e46701af6761 100644 --- a/lib/screens/search/search.dart +++ b/lib/screens/search/search.dart @@ -1,9 +1,96 @@ import 'package:flutter/material.dart'; +import 'package:food_app/config/colors.dart'; +import 'package:food_app/models/product_model.dart'; import 'package:food_app/widgets/single_item.dart'; -class Search extends StatelessWidget { +enum SigninCharacter { lowToHigh, highToLow, alphabetically } + +class Search extends StatefulWidget { + final List<ProductModel> search; + Search({this.search}); + @override + _SearchState createState() => _SearchState(); +} + +class _SearchState extends State<Search> { + String query = ""; + + SigninCharacter _character = SigninCharacter.alphabetically; + + searchItem(String query) { + List<ProductModel> searhFood = widget.search.where((element) { + return element.productName.toLowerCase().contains(query); + }).toList(); + return searhFood; + } + @override Widget build(BuildContext context) { + List<ProductModel> _searchItem = searchItem(query); + void bottomShet() => showModalBottomSheet( + context: context, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), + builder: (context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: <Widget>[ + ListTile( + title: new Text( + 'Sort By', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + RadioListTile( + value: SigninCharacter.lowToHigh, + groupValue: _character, + title: Text("Price - Low to High"), + onChanged: (vav) { + setState(() { + _character = vav; + }); + Navigator.of(context).pop(); + }), + RadioListTile( + value: SigninCharacter.highToLow, + groupValue: _character, + title: Text("Price - High to Low"), + onChanged: (vav) { + setState(() { + _character = vav; + }); + Navigator.of(context).pop(); + }), + RadioListTile( + value: SigninCharacter.alphabetically, + groupValue: _character, + title: Text("Price - Alphabetically"), + onChanged: (vav) { + setState(() { + _character = vav; + }); + Navigator.of(context).pop(); + }, + ), + Container( + height: 46, + margin: EdgeInsets.symmetric(vertical: 20, horizontal: 20), + width: double.infinity, + child: MaterialButton( + child: Text("Submit"), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + color: primaryColor, + onPressed: () {}, + ), + ) + ], + ); + }); return Scaffold( appBar: AppBar( title: Text("Search"), @@ -23,6 +110,11 @@ class Search extends StatelessWidget { height: 52, margin: EdgeInsets.symmetric(horizontal: 20), child: TextField( + onChanged: (value) { + setState(() { + query = value; + }); + }, decoration: InputDecoration( border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), @@ -38,18 +130,16 @@ class Search extends StatelessWidget { SizedBox( height: 10, ), - SingleItem( - isBool: false, - ), - SingleItem( - isBool: false, - ), - SingleItem( - isBool: false, - ), - SingleItem( - isBool: false, - ), + Column( + children: _searchItem.map((data) { + return SingleItem( + isBool: false, + productImage: data.productImage, + productName: data.productName, + productPrice: data.productPrice, + ); + }).toList(), + ) ], ), ); diff --git a/lib/widgets/single_item.dart b/lib/widgets/single_item.dart index b2dd45401717db32dd93dc10c55aab8f5a5d2b5e..4cd232ead1a39d56cff0ca6069befb23738dcd3e 100644 --- a/lib/widgets/single_item.dart +++ b/lib/widgets/single_item.dart @@ -4,7 +4,10 @@ import 'package:food_app/screens/search/search.dart'; class SingleItem extends StatelessWidget { bool isBool = false; - SingleItem({this.isBool}); + String productImage; + String productName; + int productPrice; + SingleItem({this.isBool,this.productImage,this.productName,this.productPrice}); @override Widget build(BuildContext context) { return Column( @@ -18,7 +21,7 @@ class SingleItem extends StatelessWidget { height: 100, child: Center( child: Image.network( - "https://purepng.com/public/uploads/large/purepng.com-pepermintpeperminthybrid-mintperennial-plantmint-14115270742872fda0.png"), + productImage), ), ), ), @@ -34,12 +37,12 @@ class SingleItem extends StatelessWidget { Column( children: [ Text( - "productName", + productName, style: TextStyle( color: textColor, fontWeight: FontWeight.bold), ), Text( - "50\$", + "$productPrice\$", style: TextStyle( color: textColor, fontWeight: FontWeight.bold,