From 075a57278f2538d46118a8407a23b07b72c3b0b1 Mon Sep 17 00:00:00 2001 From: Finn Date: Fri, 10 May 2019 12:43:45 +0100 Subject: [PATCH] added changes to login model and start of receipt --- README.md | 7 ++- .../apifunctions/request_login_api.dart | 5 +- .../apifunctions/submit_receipt_api.dart | 47 +++++++++++++++ lib/common/functions/save_current_login.dart | 10 +--- lib/common/functions/save_logout.dart | 1 - lib/common/widgets/basic_drawer.dart | 9 ++- lib/model/json/login_model.dart | 12 +--- lib/pages/receipt_page.dart | 57 ++++++------------- pubspec.lock | 52 ++++++++++------- pubspec.yaml | 1 + 10 files changed, 122 insertions(+), 79 deletions(-) create mode 100644 lib/common/apifunctions/submit_receipt_api.dart diff --git a/README.md b/README.md index f56480d..1076a1c 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,9 @@ flutter build apk -t lib/main_dev.dart ## Links and Things https://github.com/putraxor/flutter-login-ui -https://github.com/pbirdsall/medium_splash_tokenauth \ No newline at end of file +https://github.com/pbirdsall/medium_splash_tokenauth + +## How to debug code +// debug +import 'package:flutter/foundation.dart'; +debugPrint('$foo'); \ No newline at end of file diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 25c4926..36ae376 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -7,6 +7,7 @@ import 'package:local_spend/common/functions/save_current_login.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/model/json/login_model.dart'; import 'package:local_spend/config.dart'; +// debug import 'package:flutter/foundation.dart'; Future requestLoginAPI( @@ -32,14 +33,14 @@ Future requestLoginAPI( final responseJson = json.decode(response.body); var user = new LoginModel.fromJson(responseJson); - saveCurrentLogin(responseJson); + saveCurrentLogin(responseJson, body["email"]); Navigator.of(context).pushReplacementNamed('/HomePage'); return LoginModel.fromJson(responseJson); } else { final responseJson = json.decode(response.body); - saveCurrentLogin(responseJson); + saveCurrentLogin(responseJson, body["email"]); showDialogSingleButton( context, "Unable to Login", diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart new file mode 100644 index 0000000..92a13c8 --- /dev/null +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -0,0 +1,47 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:local_spend/common/functions/save_current_login.dart'; +import 'package:local_spend/common/functions/show_dialog_single_button.dart'; +import 'package:local_spend/model/json/login_model.dart'; +import 'package:local_spend/config.dart'; +// debug +import 'package:flutter/foundation.dart'; + +Future submitReceiptAPI( + BuildContext context, String amount, String time) async { + //var apiUrl = ConfigWrapper.of(context).apiKey; + final url = "https://dev.peartrade.org/api/login"; + + Map body = { + 'transaction_value': amount, + 'purchase_time': time, + }; + + debugPrint('$body'); + + final response = await http.post( + url, + body: json.encode(body), + ); + + debugPrint(response.body); + + if (response.statusCode == 200) { + final responseJson = json.decode(response.body); + + return LoginModel.fromJson(responseJson); + } else { + final responseJson = json.decode(response.body); + + + showDialogSingleButton( + context, + "Unable to Submit Receipt", + "You may have supplied an invalid 'Email' / 'Password' combination. Please try again or email an administrator.", + "OK"); + return null; + } +} diff --git a/lib/common/functions/save_current_login.dart b/lib/common/functions/save_current_login.dart index 91c6989..5800c10 100644 --- a/lib/common/functions/save_current_login.dart +++ b/lib/common/functions/save_current_login.dart @@ -1,7 +1,7 @@ import 'package:local_spend/model/json/login_model.dart'; import 'package:shared_preferences/shared_preferences.dart'; -saveCurrentLogin(Map responseJson) async { +saveCurrentLogin(Map responseJson, loginEmail) async { SharedPreferences preferences = await SharedPreferences.getInstance(); var user; @@ -13,12 +13,9 @@ saveCurrentLogin(Map responseJson) async { var token = (responseJson != null && responseJson.isNotEmpty) ? LoginModel.fromJson(responseJson).token : ""; - var email = (responseJson != null && responseJson.isNotEmpty) - ? LoginModel.fromJson(responseJson).email + var email = (loginEmail != null) + ? loginEmail : ""; - var pk = (responseJson != null && responseJson.isNotEmpty) - ? LoginModel.fromJson(responseJson).userId - : 0; await preferences.setString( 'LastUser', (user != null && user.length > 0) ? user : ""); @@ -26,5 +23,4 @@ saveCurrentLogin(Map responseJson) async { 'LastToken', (token != null && token.length > 0) ? token : ""); await preferences.setString( 'LastEmail', (email != null && email.length > 0) ? email : ""); - await preferences.setInt('LastUserId', (pk != null && pk > 0) ? pk : 0); } diff --git a/lib/common/functions/save_logout.dart b/lib/common/functions/save_logout.dart index 73779ea..ecd54fa 100644 --- a/lib/common/functions/save_logout.dart +++ b/lib/common/functions/save_logout.dart @@ -6,5 +6,4 @@ saveLogout() async { await preferences.setString('LastUser', ""); await preferences.setString('LastToken', ""); await preferences.setString('LastEmail', ""); - await preferences.setInt('LastUserId', 0); } diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart index 384f693..9852e7f 100644 --- a/lib/common/widgets/basic_drawer.dart +++ b/lib/common/widgets/basic_drawer.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/request_logout_api.dart'; +import 'package:local_spend/common/functions/get_token.dart'; +// debug +import 'package:flutter/foundation.dart'; class BasicDrawer extends StatefulWidget { @override @@ -8,6 +11,9 @@ class BasicDrawer extends StatefulWidget { } class _BasicDrawerState extends State { + var token; + // TODO: add getter with getToken to check logged in + @override Widget build(BuildContext context) { return Drawer( @@ -21,9 +27,10 @@ class _BasicDrawerState extends State { style: TextStyle(color: Colors.black, fontSize: 20.0), ), onTap: () { - requestLogoutAPI(context); + debugPrint('$token'); Navigator.of(context).pushNamed('/ReceiptPage'); }, + // enabled: token != null && token.isNotEmpty, ), ListTile( title: Text( diff --git a/lib/model/json/login_model.dart b/lib/model/json/login_model.dart index 68ccc1f..f47a15d 100644 --- a/lib/model/json/login_model.dart +++ b/lib/model/json/login_model.dart @@ -1,21 +1,15 @@ class LoginModel { final String userName; final String token; - final String email; - final int userId; - LoginModel(this.userName, this.token, this.email, this.userId); + LoginModel(this.userName, this.token); LoginModel.fromJson(Map json) - : userName = json['name'], - token = json['token'], - email = json['email'], - userId = json['pk']; + : userName = json['display_name'], + token = json['session_key']; Map toJson() => { 'name': userName, 'token': token, - 'email': email, - 'pk': userId, }; } diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 24df346..cd9371e 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -2,12 +2,13 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:local_spend/common/apifunctions/request_login_api.dart'; +import 'package:local_spend/common/apifunctions/submit_receipt_api.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; const URL = "https://flutter.io/"; @@ -19,9 +20,12 @@ class ReceiptPage extends StatefulWidget { } class ReceiptPageState extends State { - final TextEditingController _emailController = TextEditingController(); - final TextEditingController _passwordController = TextEditingController(); - String _welcomeString = ""; + final TextEditingController _timeController = TextEditingController(); + final TextEditingController _amountController = TextEditingController(); + final TextEditingController _essentialController = TextEditingController(); + final TextEditingController _recurringController = TextEditingController(); + final TextEditingController _typeController = TextEditingController(); + final TextEditingController _orgController = TextEditingController(); Future launchURL(String url) async { if (await canLaunch(url)) { @@ -38,7 +42,7 @@ class ReceiptPageState extends State { @override void initState() { super.initState(); - _saveCurrentRoute("/LoginPage"); + _saveCurrentRoute("/ReceiptPageState"); } _saveCurrentRoute(String lastRoute) async { @@ -62,7 +66,7 @@ class ReceiptPageState extends State { drawer: BasicDrawer(), appBar: AppBar( title: Text( - "LOGIN", + "Submit Receipt", style: TextStyle( fontSize: 30.0, color: Colors.black, @@ -83,37 +87,12 @@ class ReceiptPageState extends State { child: Padding( padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), child: Text( - "Local Loop", - style: TextStyle(fontSize: 40.0, color: Colors.black), + "Required Fields in bold", + style: TextStyle(fontSize: 20.0, color: Colors.black), ), )), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 78.0), - child: RichText( - text: TextSpan( - children: [ - TextSpan( - text: - 'This is the logon page.', - style: new TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - TextSpan( - text: - ' It is currently in development.', - style: new TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - ], - ), - ), - ), Text( - "Email", + "Time of Transaction", style: TextStyle( fontSize: 18.0, color: Colors.black, @@ -123,7 +102,7 @@ class ReceiptPageState extends State { Padding( padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), child: TextField( - controller: _emailController, + controller: _timeController, decoration: InputDecoration( hintText: "Use your login email", ), @@ -137,7 +116,7 @@ class ReceiptPageState extends State { Padding( padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), child: Text( - "Password", + "Amount", style: TextStyle( fontSize: 18.0, color: Colors.black, @@ -148,7 +127,7 @@ class ReceiptPageState extends State { Padding( padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), child: TextField( - controller: _passwordController, + controller: _amountController, decoration: InputDecoration( hintText: 'Your password, keep it secret, keep it safe.', ), @@ -167,8 +146,8 @@ class ReceiptPageState extends State { child: RaisedButton( onPressed: () { SystemChannels.textInput.invokeMethod('TextInput.hide'); - requestLoginAPI(context, _emailController.text, - _passwordController.text); + submitReceiptAPI(context, _amountController.text, + _timeController.text); }, child: Text("LOGIN", style: diff --git a/pubspec.lock b/pubspec.lock index ebf82ae..c04c54c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "0.36.2" + version: "0.36.3" args: dependency: transitive description: @@ -21,7 +21,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0" boolean_selector: dependency: transitive description: @@ -42,14 +42,14 @@ packages: name: build_config url: "https://pub.dartlang.org" source: hosted - version: "0.3.2" + version: "0.4.0" build_daemon: dependency: transitive description: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "0.5.0" + version: "0.6.0" build_resolvers: dependency: transitive description: @@ -63,28 +63,28 @@ packages: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.3.3" + version: "1.4.0" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "3.0.3" + version: "3.0.5" built_collection: dependency: transitive description: name: built_collection url: "https://pub.dartlang.org" source: hosted - version: "4.2.0" + version: "4.2.1" built_value: dependency: transitive description: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "6.4.0" + version: "6.5.0" charcode: dependency: transitive description: @@ -141,6 +141,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.7" + datetime_picker_formfield: + dependency: "direct main" + description: + name: datetime_picker_formfield + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.8" fixnum: dependency: transitive description: @@ -164,7 +171,7 @@ packages: name: front_end url: "https://pub.dartlang.org" source: hosted - version: "0.1.17" + version: "0.1.18" glob: dependency: transitive description: @@ -207,6 +214,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.3" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.8" io: dependency: transitive description: @@ -234,14 +248,14 @@ packages: name: json_serializable url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.2.2" kernel: dependency: transitive description: name: kernel url: "https://pub.dartlang.org" source: hosted - version: "0.3.17" + version: "0.3.18" logging: dependency: transitive description: @@ -255,7 +269,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.3+1" + version: "0.12.5" meta: dependency: transitive description: @@ -297,7 +311,7 @@ packages: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "1.5.0" pool: dependency: transitive description: @@ -325,7 +339,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.2" shared_preferences: dependency: "direct main" description: @@ -365,7 +379,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.4" + version: "1.5.5" stack_trace: dependency: transitive description: @@ -379,14 +393,14 @@ packages: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "1.6.8" + version: "2.0.0" stream_transform: dependency: transitive description: name: stream_transform url: "https://pub.dartlang.org" source: hosted - version: "0.0.16+1" + version: "0.0.19" string_scanner: dependency: transitive description: @@ -407,7 +421,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.2" + version: "0.2.4" timing: dependency: transitive description: @@ -458,5 +472,5 @@ packages: source: hosted version: "2.1.15" sdks: - dart: ">=2.1.1 <3.0.0" + dart: ">=2.3.0-dev.0.1 <3.0.0" flutter: ">=0.1.4 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index eb5480f..e4f4376 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: url_launcher: ^3.0.3 json_annotation : ^2.2.0 http: ^0.12.0+2 + datetime_picker_formfield: ^0.1.8 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons.