diff --git a/lib/src/resources/user_api_provider.dart b/lib/src/resources/user_api_provider.dart index 32fbe0c..9a3d489 100644 --- a/lib/src/resources/user_api_provider.dart +++ b/lib/src/resources/user_api_provider.dart @@ -60,7 +60,7 @@ class UserApiProvider { } Future fetchUserById(String id) async { - final jwt = loginManager.getToken(); + final jwt = await loginManager.getToken(); try { final responseBody = await this.cache.fetch("$baseUrlCore/user/id/$id", headers: { @@ -72,4 +72,20 @@ class UserApiProvider { throw e; } } + + Future updateUser(String firstName, String lastName) async { + final jwt = await loginManager.getToken(); + final user = await loginManager.getUser(); + final finalFirstName = firstName != "" ? firstName : user != null ? user.firstName : ""; + final finalLastName = lastName != "" ? lastName : user != null ? user.lastName : ""; + await http.patch("$baseUrlCore/user", + headers: { + HttpHeaders.contentTypeHeader: "application/json", + HttpHeaders.authorizationHeader: "Bearer $jwt" + }, + body: jsonEncode({ + "first_name": finalFirstName, + "last_name": finalLastName, + })); + } } diff --git a/lib/src/services/login_manager.dart b/lib/src/services/login_manager.dart index 920b194..6a0b878 100644 --- a/lib/src/services/login_manager.dart +++ b/lib/src/services/login_manager.dart @@ -1,5 +1,8 @@ import "dart:async"; +import "dart:convert"; +import "../models/user_model.dart"; import "../resources/login_api_provider.dart"; +import "../resources/user_api_provider.dart"; import 'package:shared_preferences/shared_preferences.dart'; @@ -15,6 +18,12 @@ class LoginManager { return token; } + Future getUser() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final userString = prefs.getString("user"); + return userString != null ? jsonDecode(userString) : null; + } + // Throws error status code if it occurs Future initAuthentication(String phoneNumber) async { try { @@ -32,6 +41,19 @@ class LoginManager { await loginApiProvider.verifyOtp(otp, this.nonce, this.clientid); SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString("token", jwt); + // Parse jwt to get userid + final parts = jwt.split('.'); + if (parts.length != 3) { + throw Exception('invalid token'); + } + final payload = utf8.decode(base64Url.decode(parts[1])); + final payloadMap = json.decode(payload); + final userId = payloadMap['userid']; + // Get user data + final userApiProvider = UserApiProvider(); + final user = + await userApiProvider.fetchUserById(userId); + await prefs.setString("user", jsonEncode(user)); return jwt; } catch (e) { throw e; diff --git a/lib/src/services/register_manager.dart b/lib/src/services/register_manager.dart deleted file mode 100644 index 0e96a98..0000000 --- a/lib/src/services/register_manager.dart +++ /dev/null @@ -1,23 +0,0 @@ -import "dart:async"; -import "../resources/login_api_provider.dart"; -import "../resources/user_api_provider.dart"; - -class RegisterManager { - final loginApiProvider = LoginApiProvider(); - final userApiProvider = UserApiProvider(); - String nonce; - - // Throws error status code if it occurs - Future initAuthentication(String phoneNumber) async { - try { - final nonce = await loginApiProvider.initAuthentication(phoneNumber); - this.nonce = nonce; - } catch (e) { - throw e; - } - } - - Future registerUser(String firstName, String lastName, String phoneNumber, String otp) async { - await userApiProvider.registerUser(firstName, lastName, phoneNumber, otp, this.nonce); - } -} diff --git a/lib/src/ui/login/welcome.dart b/lib/src/ui/login/welcome.dart index 71cdaca..d68115a 100644 --- a/lib/src/ui/login/welcome.dart +++ b/lib/src/ui/login/welcome.dart @@ -49,9 +49,14 @@ class Welcome extends StatelessWidget { builder = (BuildContext _) => OtpPage(buttonCallback: (String otp) async { final authToken = await loginManager.processOtp(otp); + final user = await loginManager.getUser(); await ConversationManager.init(authToken); - Navigator.of(context).pushReplacementNamed("/home"); + if (user.firstName == "" && user.lastName == "") { + Navigator.pushNamed(context, 'welcome/register'); + } else { + Navigator.of(context).pushReplacementNamed("/home"); + } }); break; default: diff --git a/lib/src/ui/login/widgets/register_page.dart b/lib/src/ui/login/widgets/register_page.dart index 3352141..8207106 100644 --- a/lib/src/ui/login/widgets/register_page.dart +++ b/lib/src/ui/login/widgets/register_page.dart @@ -5,7 +5,6 @@ import "../../widgets/text_button.dart"; import "../../../services/login_manager.dart"; import "../../../resources/user_api_provider.dart"; -import "phone_input.dart"; import "input.dart"; class RegisterPage extends StatefulWidget { @@ -20,7 +19,6 @@ class RegisterPage extends StatefulWidget { class _RegisterPageState extends State { final String phoneSvg = "assets/phoneno.svg"; - final phoneController = TextEditingController(); final firstNameController = TextEditingController(); final lastNameController = TextEditingController(); @@ -28,7 +26,6 @@ class _RegisterPageState extends State { @override void dispose() { - phoneController.dispose(); firstNameController.dispose(); lastNameController.dispose(); super.dispose(); @@ -69,9 +66,6 @@ class _RegisterPageState extends State { child: Input( controller: lastNameController, hintText: "Last name")), - Padding( - padding: EdgeInsets.only(top: 10.0), - child: PhoneInput(controller: phoneController)), ]) ]))), Padding( @@ -81,14 +75,11 @@ class _RegisterPageState extends State { onClickCallback: () async { final firstName = firstNameController.text; final lastName = lastNameController.text; - final phoneNumber = "+65${phoneController.text}"; // Creating the new user - await userApiProvider.registerUser( - firstName, lastName, phoneNumber); - await widget.loginManager - .initAuthentication("+65$phoneNumber"); - Navigator.pushNamed(context, 'welcome/otp'); + await userApiProvider.updateUser( + firstName, lastName); + Navigator.of(context).pushReplacementNamed("/home"); })), ])); }