4
2
Fork 0

Revised register flow.

pull/55/head
UnicodingUnicorn 2019-06-30 09:26:11 +08:00
parent a175b08180
commit a68cb347e0
5 changed files with 48 additions and 37 deletions

View File

@ -60,7 +60,7 @@ class UserApiProvider {
}
Future<User> 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<void> 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,
}));
}
}

View File

@ -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<User> 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<void> 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;

View File

@ -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<void> initAuthentication(String phoneNumber) async {
try {
final nonce = await loginApiProvider.initAuthentication(phoneNumber);
this.nonce = nonce;
} catch (e) {
throw e;
}
}
Future<void> registerUser(String firstName, String lastName, String phoneNumber, String otp) async {
await userApiProvider.registerUser(firstName, lastName, phoneNumber, otp, this.nonce);
}
}

View File

@ -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:

View File

@ -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<RegisterPage> {
final String phoneSvg = "assets/phoneno.svg";
final phoneController = TextEditingController();
final firstNameController = TextEditingController();
final lastNameController = TextEditingController();
@ -28,7 +26,6 @@ class _RegisterPageState extends State<RegisterPage> {
@override
void dispose() {
phoneController.dispose();
firstNameController.dispose();
lastNameController.dispose();
super.dispose();
@ -69,9 +66,6 @@ class _RegisterPageState extends State<RegisterPage> {
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<RegisterPage> {
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");
})),
]));
}