Skip to content

Commit eb22c33

Browse files
author
Wilker Oliveira
committed
load user data after login
1 parent 51b3edb commit eb22c33

13 files changed

+146
-53
lines changed

lib/generated/i18n.dart

+5-1
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ class S {
207207
}
208208

209209
String get cards {
210-
return Intl.message("Cartão", name: 'cards');
210+
return Intl.message("Cartões", name: 'cards');
211211
}
212212

213213
String get account {
@@ -218,6 +218,10 @@ class S {
218218
return Intl.message("Usuário", name: 'user');
219219
}
220220

221+
String get logout {
222+
return Intl.message("Sair", name: 'logout');
223+
}
224+
221225

222226
}
223227

lib/generated/messages_all.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ class $pt_BR extends MessageLookupByLibrary {
5858
"user_not_registered" : MessageLookupByLibrary.simpleMessage("Usuário não cadastrado! Registre-se primeiro."),
5959
"login_cancelled_by_user" : MessageLookupByLibrary.simpleMessage("Login cancelado pelo usuário!"),
6060
"login_title" : MessageLookupByLibrary.simpleMessage("Login"),
61-
"cards" : MessageLookupByLibrary.simpleMessage("Cartão"),
61+
"cards" : MessageLookupByLibrary.simpleMessage("Cartões"),
6262
"account" : MessageLookupByLibrary.simpleMessage("Conta"),
6363
"user" : MessageLookupByLibrary.simpleMessage("Usuário"),
64+
"logout" : MessageLookupByLibrary.simpleMessage("Sair"),
6465

6566
};
6667
}
@@ -119,6 +120,7 @@ class $en_US extends MessageLookupByLibrary {
119120
"cards" : MessageLookupByLibrary.simpleMessage("Cards"),
120121
"account" : MessageLookupByLibrary.simpleMessage("Account"),
121122
"user" : MessageLookupByLibrary.simpleMessage("User"),
123+
"logout" : MessageLookupByLibrary.simpleMessage("Logout"),
122124

123125
};
124126
}

lib/provider_setup.dart

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:bank_cards/src/models/user.dart';
12
import 'package:bank_cards/src/repository/login/login_repository.dart';
23
import 'package:provider/provider.dart';
34
import 'package:bank_cards/src/repository/card/invoice_card_repository.dart';
@@ -34,4 +35,9 @@ List<SingleChildCloneableWidget> dependentServices = [
3435
)
3536
];
3637

37-
List<SingleChildCloneableWidget> uiConsumableProviders = [];
38+
List<SingleChildCloneableWidget> uiConsumableProviders = [
39+
StreamProvider<User>(
40+
builder: (context) =>
41+
Provider.of<LoginRepository>(context, listen: false).currentUser,
42+
),
43+
];

lib/src/repository/login/login_repository.dart

+35-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:async';
2+
13
import 'package:bank_cards/src/exceptions/exception_messages.dart';
24
import 'package:bank_cards/src/exceptions/login_exception.dart';
35
import 'package:bank_cards/src/models/user.dart';
@@ -11,6 +13,10 @@ import 'package:google_sign_in/google_sign_in.dart';
1113
class LoginRepository extends BaseRepository {
1214
LoginRepository();
1315

16+
StreamController<User> _loginController = StreamController<User>();
17+
18+
Stream<User> get currentUser => _loginController.stream;
19+
1420
Future<FirebaseUser> loginWithFacebook() async {
1521
//New version, but this new version has an issue
1622
// final facebookLoginResult =
@@ -50,7 +56,7 @@ class LoginRepository extends BaseRepository {
5056

5157
final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
5258
final GoogleSignInAuthentication googleSignInAuthentication =
53-
await googleSignInAccount.authentication;
59+
await googleSignInAccount.authentication;
5460

5561
try {
5662
return await LoginService.signInWithGoogle(googleSignInAuthentication);
@@ -87,17 +93,33 @@ class LoginRepository extends BaseRepository {
8793
} else {
8894
print("User already exist");
8995
}
96+
97+
this._loginController.add(user);
98+
}
99+
100+
Future<User> getUser(String uid) async {
101+
try {
102+
User current = await LoginService.getUser(uid);
103+
104+
this._loginController.add(current);
105+
106+
return current;
107+
} on Exception catch (ex) {
108+
print(ex);
109+
throw new LoginException.withCode(null, ExceptionMessages.error);
110+
}
90111
}
91112

92113
Future<User> signIn(String email, String password) async {
93114
try {
94115
String uid = await LoginService.signIn(email, password);
95116

96117
if (uid != null) {
97-
return await LoginService.getUser(uid);
118+
return this.getUser(uid);
98119
}
99120
} on PlatformException catch (ex) {
100-
if (ex.code == "ERROR_WRONG_PASSWORD"|| ex.code == "ERROR_USER_NOT_FOUND") {
121+
if (ex.code == "ERROR_WRONG_PASSWORD" ||
122+
ex.code == "ERROR_USER_NOT_FOUND") {
101123
throw new LoginException.withCode(
102124
null, ExceptionMessages.invalidEmailOrPassword);
103125
} else {
@@ -107,4 +129,14 @@ class LoginRepository extends BaseRepository {
107129

108130
throw LoginException.withCode(null, ExceptionMessages.userNotRegistered);
109131
}
132+
133+
Future<void> logout() async {
134+
await LoginService.signOut();
135+
}
136+
137+
void dispose() {
138+
if (this._loginController != null && !this._loginController.isClosed) {
139+
this._loginController.close();
140+
}
141+
}
110142
}

lib/src/router.dart

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:bank_cards/src/ui/screens/login/login_screen.dart';
12
import 'package:bank_cards/src/ui/screens/login/register_screen.dart';
23
import 'package:bank_cards/src/ui/screens/splash_screen.dart';
34
import 'package:flutter/material.dart';
@@ -15,6 +16,7 @@ class Router {
1516
static const CARD_MONTHLY_CLOSED_INVOICE = "card_monthly_closed_invoice";
1617
static const String SPLASH = "splash";
1718
static const String SIGN_UP = "sign_up";
19+
static const String SIGN_IN = "sign_in";
1820

1921
static Route<dynamic> generateRoute(RouteSettings settings) {
2022
switch (settings.name) {
@@ -35,6 +37,8 @@ class Router {
3537
return MaterialPageRoute(builder: (_) => SplashScreen());
3638
case SIGN_UP:
3739
return MaterialPageRoute(builder: (_) => RegisterScreen());
40+
case SIGN_IN:
41+
return MaterialPageRoute(builder: (_) => LoginScreen());
3842
default:
3943
return MaterialPageRoute(
4044
builder: (_) => Scaffold(

lib/src/ui/screens/home/user_screen.dart

+40-17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
import 'package:bank_cards/generated/i18n.dart';
2+
import 'package:bank_cards/src/models/user.dart';
3+
import 'package:bank_cards/src/router.dart';
14
import 'package:bank_cards/src/ui/resources/decorations.dart';
5+
import 'package:bank_cards/src/ui/screens/base/base_widget.dart';
6+
import 'package:bank_cards/src/ui/widgets/common/buttons.dart';
7+
import 'package:bank_cards/src/viewmodel/user_viewmodel.dart';
28
import 'package:flutter/material.dart';
9+
import 'package:provider/provider.dart';
310

411
class UserPage extends StatefulWidget {
512
@override
@@ -9,26 +16,42 @@ class UserPage extends StatefulWidget {
916
class _UserPageState extends State<UserPage> {
1017
@override
1118
Widget build(BuildContext context) {
12-
return Container(
13-
decoration: BoxDecoration(
14-
gradient: Decorations.gradientDecoration(),
15-
),
16-
child: Column(
17-
children: <Widget>[
18-
Card(
19-
color: Colors.transparent,
20-
child: Container(
19+
return BaseWidget<UserViewModel>(
20+
model: UserViewModel(loginRepository: Provider.of(context)),
21+
onModelReady: (model) async {},
22+
builder: (mainContext, model, child) => Container(
23+
decoration: BoxDecoration(
24+
gradient: Decorations.gradientDecoration(),
25+
),
26+
child: Column(
27+
children: <Widget>[
28+
Card(
2129
color: Colors.transparent,
22-
padding: EdgeInsets.all(10.0),
23-
height: 100.0,
24-
width: MediaQuery.of(context).size.width,
25-
child: Text(
26-
'User Data',
27-
textAlign: TextAlign.left,
30+
child: Container(
31+
color: Colors.transparent,
32+
padding: EdgeInsets.all(10.0),
33+
height: 100.0,
34+
width: MediaQuery.of(context).size.width,
35+
child: Text(
36+
'User Name: ' + Provider.of<User>(context).firstName,
37+
textAlign: TextAlign.left,
38+
),
39+
),
40+
),
41+
Padding(
42+
padding: EdgeInsets.only(top: 16),
43+
child: Buttons.defaultButton(
44+
context,
45+
model,
46+
S.of(context).logout,
47+
(context, model) async {
48+
await model.logout();
49+
Navigator.pushNamed(context, Router.SIGN_IN, arguments: null);
50+
},
2851
),
2952
),
30-
),
31-
],
53+
],
54+
),
3255
),
3356
);
3457
}

lib/src/ui/screens/login/login_screen.dart

+10-10
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ class _LoginScreenState extends State<LoginScreen>
3333

3434
@override
3535
void initState() {
36-
// TODO: implement initState
3736
super.initState();
3837

3938
_emailFocus = FocusNode();
@@ -117,7 +116,8 @@ class _LoginScreenState extends State<LoginScreen>
117116
children: <Widget>[
118117
GestureDetector(
119118
onTap: () async {
120-
_checkLogin(model, await model.loginWithGoogle());
119+
await model.loginWithGoogle();
120+
_checkLogin(model);
121121
},
122122
child: new Container(
123123
width: Dimens.button_alt_login_width,
@@ -136,7 +136,8 @@ class _LoginScreenState extends State<LoginScreen>
136136
),
137137
GestureDetector(
138138
onTap: () async {
139-
_checkLogin(model, await model.loginWithFacebook());
139+
await model.loginWithFacebook();
140+
_checkLogin(model);
140141
},
141142
child: new Container(
142143
width: Dimens.button_alt_login_width,
@@ -193,10 +194,9 @@ class _LoginScreenState extends State<LoginScreen>
193194
);
194195
}
195196

196-
void _checkLogin(LoginViewModel model, User user) {
197-
if (model.isError) {
198-
AlertDialogs.showErrorDialog(
199-
context, S.of(context).login_title, model.errorMessage);
197+
void _checkLogin(LoginViewModel model) {
198+
if (!model.isError) {
199+
Navigator.pushNamed(context, Router.HOME, arguments: null);
200200
}
201201
}
202202

@@ -312,7 +312,8 @@ class _LoginScreenState extends State<LoginScreen>
312312
_signIn(LoginViewModel model) async {
313313
if (_formKey.currentState.validate()) {
314314
_formKey.currentState.save();
315-
User user = await model.signIn(currentUser);
315+
316+
await model.signIn(currentUser);
316317

317318
if (model.isError) {
318319
AlertDialogs.showErrorDialog(
@@ -322,8 +323,7 @@ class _LoginScreenState extends State<LoginScreen>
322323
AlertDialogs.showInfoDialog(
323324
context, S.of(context).info_title, model.errorMessage);
324325
} else {
325-
AlertDialogs.showSuccessDialog(
326-
context, S.of(context).success_title, user.nickName, () {});
326+
_checkLogin(model);
327327
}
328328
}
329329
}

lib/src/ui/widgets/common/buttons.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:bank_cards/src/ui/resources/custom_colors.dart';
12
import 'package:bank_cards/src/ui/resources/dimens.dart';
23
import 'package:bank_cards/src/ui/resources/styles.dart';
34
import 'package:bank_cards/src/viewmodel/base/base_viewmodel.dart';
@@ -16,7 +17,7 @@ class Buttons {
1617
textButton,
1718
style: defaultTextStyle(),
1819
),
19-
color: Colors.green,
20+
color: CustomColors.login_button_background,
2021
elevation: 4.0,
2122
splashColor: Colors.blue,
2223
onPressed: () {

lib/src/viewmodel/login_viewmodel.dart

+3-11
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,21 @@ class LoginViewModel extends BaseViewModel {
1111
this._loginRepository = LoginRepository();
1212
}
1313

14-
Future<User> signIn(User user) async {
15-
14+
Future<void> signIn(User user) async {
1615
setState(ViewState.Busy);
1716

1817
try {
19-
2018
this.error = false;
2119
this.customErrorMessage = null;
2220

23-
User currentUser =
24-
await this._loginRepository.signIn(user.email, user.password);
25-
26-
return currentUser;
21+
await this._loginRepository.signIn(user.email, user.password);
2722
} on LoginException catch (ex) {
2823
super.error = true;
2924
super.customErrorMessage = ex.status;
30-
return null;
3125
} catch (ex) {
3226
super.error = true;
3327
super.customErrorMessage = null;
34-
return null;
35-
}
36-
finally{
28+
} finally {
3729
setState(ViewState.Idle);
3830
}
3931
}

lib/src/viewmodel/splash_viewmodel.dart

+1-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@ class SplashViewModel extends BaseViewModel {
1515
await this._loginRepository.getCurrentFirebaseUser();
1616

1717
if (fireBaseUser != null) {
18-
User user = new User(
19-
firstName: fireBaseUser.displayName,
20-
userID: fireBaseUser.uid,
21-
email: fireBaseUser.email ?? '',
22-
profilePictureURL: fireBaseUser.photoUrl ?? '',
23-
);
18+
User user = await this._loginRepository.getUser(fireBaseUser.uid);
2419

2520
this.error = false;
2621

lib/src/viewmodel/user_viewmodel.dart

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import 'package:bank_cards/src/exceptions/custom_exception.dart';
2+
import 'package:bank_cards/src/repository/login/login_repository.dart';
3+
import 'package:bank_cards/src/viewmodel/base/base_viewmodel.dart';
4+
import 'package:flutter/foundation.dart';
5+
6+
class UserViewModel extends BaseViewModel {
7+
LoginRepository loginRepository;
8+
9+
UserViewModel({@required this.loginRepository});
10+
11+
Future<void> logout() async {
12+
13+
setState(ViewState.Busy);
14+
15+
try {
16+
17+
super.error = false;
18+
super.customErrorMessage = null;
19+
20+
await loginRepository.logout();
21+
22+
} on CustomException catch (ex) {
23+
super.error = false;
24+
super.customErrorMessage = ex.status;
25+
} catch (ex) {
26+
super.error = true;
27+
super.customErrorMessage = null;
28+
}finally{
29+
setState(ViewState.Idle);
30+
}
31+
}
32+
}

res/string/string_en_US.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@
4646
"login_title": "Login",
4747
"cards": "Cards",
4848
"account": "Account",
49-
"user": "User"
49+
"user": "User",
50+
"logout": "Logout"
5051
}

0 commit comments

Comments
 (0)