diff --git a/gro_sense/lib/Model/product_details.dart b/gro_sense/lib/Model/product_details.dart new file mode 100644 index 0000000..95ce430 --- /dev/null +++ b/gro_sense/lib/Model/product_details.dart @@ -0,0 +1,14 @@ +import 'dart:ui'; +import 'package:gro_sense/model/user_model.dart'; + +class addprod{ + String? productName; + DateTime? expiryDate; + + addprod(this.productName,this.expiryDate); + + Map toMap() => { + "productName" : productName, + "expiryDate" : expiryDate, + }; +} diff --git a/gro_sense/lib/Model/user_model.dart b/gro_sense/lib/Model/user_model.dart index 6dd70ab..a677620 100644 --- a/gro_sense/lib/Model/user_model.dart +++ b/gro_sense/lib/Model/user_model.dart @@ -1,3 +1,4 @@ +import 'package:gro_sense/model/product_details.dart'; class UserModel { String? uid; String? email; @@ -13,10 +14,9 @@ class UserModel { email: map['email'], firstName: map['firstName'], secondName: map['secondName'], - emailVerified: map['emailVerified'] + emailVerified: map['emailVerified'], ); } - // sending data to our server Map toMap() { return { @@ -24,7 +24,19 @@ class UserModel { 'email': email, 'firstName': firstName, 'secondName': secondName, - 'emailVerified': emailVerified + 'emailVerified': emailVerified, + }; + } + + +} +mixin Userclass implements addprod { + + List addproduct = []; +//send data to database + Map toMap() { + return { + 'addprod': addprod, }; } } \ No newline at end of file diff --git a/gro_sense/lib/screens/add_product.dart b/gro_sense/lib/screens/add_product.dart new file mode 100644 index 0000000..44b259c --- /dev/null +++ b/gro_sense/lib/screens/add_product.dart @@ -0,0 +1,271 @@ +import 'dart:ffi'; +import 'dart:io'; +import 'package:flutter/services.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:gro_sense/Model/product_details.dart'; +import 'package:gro_sense/model/user_model.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:gro_sense/screens/dashboard.dart'; +import 'package:intl/intl.dart'; +import 'package:gro_sense/screens/screen_login.dart'; +import 'package:gro_sense/screens/home_screen.dart'; +import 'package:flutter/material.dart'; +import 'edit_profile_screen.dart'; + +class AddaProductScreen extends StatefulWidget { + const AddaProductScreen({Key? key}) : super(key: key); + + @override + _AddaProductScreenState createState() => _AddaProductScreenState(); + +} + +class _AddaProductScreenState extends State +{ + final _formKey = GlobalKey(); + final auth = FirebaseAuth.instance; + final productNameEditingController = new TextEditingController(); + final expirydateEditingController = new TextEditingController(); + final numberofDaysReminderEditingController = new TextEditingController(); + bool onoroff = false; + var defaultoption = 'Reminders Off'; + DateTime? pickedDate; + int? numberofdaysreminder; + DateTime? reminderdate; + + void toggleSwitch(bool value) + { + + if(onoroff == false) + { + setState(() { + onoroff = true; + defaultoption = 'Reminders On'; + }); + print('Reminders On'); + } + else + { + setState(() { + onoroff = false; + defaultoption = 'Reminders Off'; + }); + print('Reminders Off'); + } + } + + @override + void initState() { + expirydateEditingController.text = ""; + super.initState(); + } + + @override + Widget build(BuildContext context) + { + //Product Name Field + final productNameField= TextFormField + ( + autofocus: false, + controller: productNameEditingController, + keyboardType: TextInputType.text, + validator: (value) { + if(value!.isEmpty) + { + return ("Please enter a product name"); + } + return null; + }, + onSaved: (value) { + productNameEditingController.text = value!; + }, + textInputAction: TextInputAction.next, + decoration: InputDecoration( + prefixIcon: Icon(Icons.account_circle_sharp), + contentPadding: EdgeInsets.fromLTRB(20, 15, 20, 15), + hintText: "Product Name", + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + ); + + + //No of Days before Expiry - Reminder + final numberofDaysReminder= TextFormField + ( + autofocus: false, + controller: numberofDaysReminderEditingController, + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly + ], + textInputAction: TextInputAction.next,// Only numbers can be entered + onSaved: (value) { + numberofDaysReminderEditingController.text = value!;}, + validator: (value) { + if(value!.isEmpty) + { + return ("Please enter a value"); + } + return null; + }, + decoration: InputDecoration( + prefixIcon: Icon(Icons.account_circle_sharp), + contentPadding: EdgeInsets.fromLTRB(20, 20, 20, 20), + hintText: "No of days for Reminder", + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + + ), + ), + ); + + + final submitButton = Material( + elevation: 5, + borderRadius: BorderRadius.circular(500), + color: Colors.green[400], + child: MaterialButton( + padding: EdgeInsets.fromLTRB(20, 15, 20, 15), + minWidth: MediaQuery + .of(context) + .size + .width, + onPressed: () { + addDataUp(); + }, + child: Text( + "Submit", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, color: Colors.white, fontWeight: FontWeight.bold, decorationThickness: 40), + ), + ), + ); + + return Scaffold( + appBar: AppBar( + title: Text('Add a Product'), + elevation: 0, + leading: IconButton( + icon: Icon(Icons.arrow_back, color: Colors.white), + onPressed: () { + // passing this to our root + Navigator.of(context).pushReplacement( + MaterialPageRoute(builder: (context) => DashBoardScreen())); + }, + ), + ), + body: Container + ( + width: double.infinity, + height: double.infinity, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/logo.png"), + colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.3), BlendMode.dstATop), + fit: BoxFit.cover, + ), + ), + child: SingleChildScrollView( + child: Container( + color: Colors.transparent, + child: Padding( + padding: const EdgeInsets.all(36.0), + child: Form( + key: _formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children:[ + SizedBox(height: 20,), + productNameField, + SizedBox(height: 20), + TextField( + controller: expirydateEditingController, //editing controller of this TextField + decoration: InputDecoration( + icon: Icon(Icons.calendar_today), //icon of text field + labelText: "Enter Date" //label text of field + ), + readOnly: true, //set it true, so that user will not able to edit text + onTap: () async { + pickedDate = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime.now(), //DateTime.now() - not to allow to choose before today. + lastDate: DateTime(2101), + ); + if(pickedDate != null ){ + print(pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000 + + // numberofdaysreminder = int.tryParse(numberofDaysReminderEditingController.text); + + //you can implement different kind of Date Format here according to your requirement + // reminderdate = pickedDate?.subtract(Duration(days:- numberofdaysreminder!)); + }else{ + print("Date is not selected"); + } + setState(() { + String formattedDate = DateFormat('yyyy-MM-dd').format(pickedDate!); + print(formattedDate); //formatted date output using intl package => 2021-03-16 + expirydateEditingController.text = formattedDate; //set output date to TextField value. + }); + }, + ), + Transform.scale(scale: 2), + Switch + ( + value: onoroff, + onChanged: toggleSwitch, + activeColor: Colors.green, + activeTrackColor: Colors.lightGreenAccent[100], + inactiveThumbColor: Colors.grey[800], + inactiveTrackColor: Colors.grey[500], + ), + SizedBox(height: 1), + Text('$defaultoption', + style: TextStyle(fontSize: 20),), + SizedBox(height: 20), + if (onoroff == true)... + [ + SizedBox(height: 20), + numberofDaysReminder, + ], + SizedBox(height: 30), + submitButton, + ]), + ), + ), + ), + ), + ), + ); + }//Widget Build + + void addDataUp() async { + Fluttertoast.showToast(msg: "Adding Products Successful"); + Navigator.of(context).pushReplacement( + MaterialPageRoute(builder: (context) => DashBoardScreen())) + .then((value) => {saveResultToFirebase()}); + } + + saveResultToFirebase() async { + User? currentUser = FirebaseAuth.instance.currentUser; + addprod addPro; + + addPro = addprod(productNameEditingController.text, pickedDate); + // print(pickedDate); + await FirebaseFirestore.instance + .collection("users") + .doc(currentUser!.uid) + .update({ + "Add Product": FieldValue.arrayUnion([addPro.toMap()]) + + }); + } + +} //MAIN CLASS END \ No newline at end of file diff --git a/gro_sense/lib/screens/dashboard.dart b/gro_sense/lib/screens/dashboard.dart index ec5595d..ef580b4 100644 --- a/gro_sense/lib/screens/dashboard.dart +++ b/gro_sense/lib/screens/dashboard.dart @@ -1,5 +1,6 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; +import 'package:gro_sense/screens/add_product.dart'; import 'edit_profile_screen.dart'; @@ -25,7 +26,10 @@ class _DashBoardScreenState extends State { elevation: 5.0, icon: const Icon(Icons.add), label: const Text('Add'), - onPressed: () {}, + onPressed: () { + Navigator.of(context).pushReplacement( + MaterialPageRoute(builder: (context) => AddaProductScreen())); + }, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, diff --git a/gro_sense/lib/screens/edit_profile_screen.dart b/gro_sense/lib/screens/edit_profile_screen.dart index 947c519..297e99c 100644 --- a/gro_sense/lib/screens/edit_profile_screen.dart +++ b/gro_sense/lib/screens/edit_profile_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gro_sense/screens/dashboard.dart'; import 'package:gro_sense/screens/screen_login.dart'; +import 'package:gro_sense/screens/dashboard.dart'; class EditProfileScreen extends StatelessWidget{ @@ -9,6 +10,14 @@ Widget build(BuildContext context){ return Scaffold( appBar: AppBar( title: Text('Settings'), + leading: IconButton( + icon: Icon(Icons.arrow_back, color: Colors.white), + onPressed: () { + // passing this to our root + Navigator.of(context).pushReplacement( + MaterialPageRoute(builder: (context) => DashBoardScreen())); + }, + ), ), body: Container( child: Drawer( @@ -35,6 +44,7 @@ Widget build(BuildContext context){ onTap: (){ Navigator.of(context).pushReplacement( MaterialPageRoute(builder: (context) => LoginScreen())); + },), ], ) diff --git a/gro_sense/lib/screens/registration_screen.dart b/gro_sense/lib/screens/registration_screen.dart index 7494bb4..f17ebf9 100644 --- a/gro_sense/lib/screens/registration_screen.dart +++ b/gro_sense/lib/screens/registration_screen.dart @@ -6,7 +6,8 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:gro_sense/screens/screen_login.dart'; - +import 'package:gro_sense/screens/screen_login.dart'; +import 'package:gro_sense/screens/add_product.dart'; class RegistrationScreen extends StatefulWidget { const RegistrationScreen({Key? key}) : super(key: key); @@ -319,7 +320,7 @@ class _RegistrationScreenState extends State { postDetailsToFirestore() async { // calling our firestore // calling our user model - // sedning these values + // sending these values FirebaseFirestore firebaseFirestore = FirebaseFirestore.instance; User? user = _auth.currentUser; diff --git a/gro_sense/lib/screens/screen_login.dart b/gro_sense/lib/screens/screen_login.dart index a707626..4e712de 100644 --- a/gro_sense/lib/screens/screen_login.dart +++ b/gro_sense/lib/screens/screen_login.dart @@ -11,6 +11,8 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:gro_sense/screens/reset_password_screen.dart'; +import 'package:gro_sense/screens/add_product.dart'; + class LoginScreen extends StatefulWidget { const LoginScreen({Key? key}) : super(key: key); diff --git a/gro_sense/pubspec.lock b/gro_sense/pubspec.lock index 93fdfb7..e522362 100644 --- a/gro_sense/pubspec.lock +++ b/gro_sense/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" async: dependency: transitive description: @@ -42,21 +49,21 @@ packages: name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "2.5.4" + version: "3.1.18" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "5.5.7" + version: "5.5.8" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "2.6.16" + version: "2.6.17" collection: dependency: transitive description: @@ -78,6 +85,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" + dbus: + dependency: transitive + description: + name: dbus + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.5" fake_async: dependency: transitive description: @@ -85,48 +99,83 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.2" firebase_auth: dependency: "direct main" description: name: firebase_auth url: "https://pub.dartlang.org" source: hosted - version: "3.3.19" + version: "3.3.20" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "6.2.7" + version: "6.2.8" firebase_auth_web: dependency: transitive description: name: firebase_auth_web url: "https://pub.dartlang.org" source: hosted - version: "3.3.16" + version: "3.3.17" firebase_core: dependency: "direct main" description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.17.1" + version: "1.18.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.4.1" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" + version: "1.6.5" + firebase_storage: + dependency: "direct main" + description: + name: firebase_storage + url: "https://pub.dartlang.org" + source: hosted + version: "10.2.18" + firebase_storage_platform_interface: + dependency: transitive + description: + name: firebase_storage_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.8" + firebase_storage_web: + dependency: transitive + description: + name: firebase_storage_web + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.17" flutter: dependency: "direct main" description: flutter @@ -160,6 +209,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.6.0+2" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "9.6.1" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.0" flutter_secure_storage: dependency: "direct main" description: @@ -246,7 +316,7 @@ packages: name: google_sign_in_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.2.0" google_sign_in_web: dependency: transitive description: @@ -269,7 +339,7 @@ packages: source: hosted version: "4.0.1" intl: - dependency: transitive + dependency: "direct main" description: name: intl url: "https://pub.dartlang.org" @@ -317,6 +387,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" plugin_platform_interface: dependency: transitive description: @@ -324,6 +408,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" provider: dependency: "direct main" description: @@ -385,6 +476,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.9" + timezone: + dependency: "direct main" + description: + name: timezone + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.0" twitter_login: dependency: "direct main" description: @@ -406,6 +504,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+1" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.0" sdks: - dart: ">=2.17.0-0 <3.0.0" + dart: ">=2.17.0 <3.0.0" flutter: ">=2.8.0" diff --git a/gro_sense/pubspec.yaml b/gro_sense/pubspec.yaml index 0889d83..aee9c78 100644 --- a/gro_sense/pubspec.yaml +++ b/gro_sense/pubspec.yaml @@ -21,12 +21,16 @@ environment: sdk: ">=2.12.0 <3.0.0" dependencies: - cloud_firestore: ^2.5.1 + cloud_firestore: ^3.1.18 firebase_auth: ^3.1.0 firebase_core: ^1.6.0 google_sign_in: ^5.0.3 + firebase_storage: ^10.2.18 flutter: sdk: flutter + intl: ^0.17.0 + flutter_local_notifications: ^9.3.2 + timezone: ^0.8.0 fluttertoast: ^8.0.8 provider: ^5.0.0 flutter_facebook_auth: ^3.5.1 @@ -43,6 +47,7 @@ dev_dependencies: + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec