Skip to content

Commit 9f2034f

Browse files
committed
login one done
1 parent 94d5c17 commit 9f2034f

28 files changed

+805
-4
lines changed

lib/di/dependency_injection.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'package:flutter_uikit/services/abstract/i_otp_service.dart';
2+
import 'package:flutter_uikit/services/mock/mock_otp_service.dart';
3+
import 'package:flutter_uikit/services/real/real_otp_service.dart';
4+
import 'package:flutter_uikit/services/restclient.dart';
5+
6+
enum Flavor { MOCK, PRO }
7+
8+
//Simple DI
9+
class Injector {
10+
static final Injector _singleton = new Injector._internal();
11+
static Flavor _flavor;
12+
13+
static void configure(Flavor flavor) async {
14+
_flavor = flavor;
15+
}
16+
17+
factory Injector() => _singleton;
18+
19+
Injector._internal();
20+
21+
IOTPService get otpService {
22+
switch (_flavor) {
23+
case Flavor.MOCK:
24+
return MockOTPService();
25+
default:
26+
return OTPService(new RestClient());
27+
}
28+
}
29+
}

lib/inherited/login_provider.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import 'package:flutter/material.dart';
2+
3+
class LoginProvider extends InheritedWidget {
4+
final Function validationErrorCallback;
5+
final Widget child;
6+
7+
LoginProvider({this.validationErrorCallback, this.child})
8+
: super(child: child);
9+
10+
static LoginProvider of(BuildContext context) =>
11+
context.inheritFromWidgetOfExactType(LoginProvider);
12+
13+
@override
14+
bool updateShouldNotify(LoginProvider oldWidget) =>
15+
validationErrorCallback != oldWidget.validationErrorCallback;
16+
}

lib/logic/bloc/login_bloc.dart

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import 'dart:async';
2+
import 'package:flutter_uikit/logic/viewmodel/user_login_view_model.dart';
3+
import 'package:flutter_uikit/model/fetch_process.dart';
4+
import 'package:rxdart/rxdart.dart';
5+
6+
class LoginBloc {
7+
final otpController = StreamController<UserLoginViewModel>();
8+
final loginController = StreamController<UserLoginViewModel>();
9+
final apiController = BehaviorSubject<FetchProcess>();
10+
final otpResendController = StreamController<bool>();
11+
final otpResultController = BehaviorSubject<bool>();
12+
Sink<UserLoginViewModel> get otpSink => otpController.sink;
13+
Sink<UserLoginViewModel> get loginSink => otpController.sink;
14+
Sink<bool> get resendOtpSink => otpResendController.sink;
15+
Stream<bool> get otpResult => otpResultController.stream;
16+
Stream<FetchProcess> get apiResult => apiController.stream;
17+
18+
LoginBloc() {
19+
otpController.stream.listen(apiCall);
20+
otpResendController.stream.listen(resendOtp);
21+
loginController.stream.listen(apiCall);
22+
}
23+
24+
void apiCall(UserLoginViewModel userLogin) async {
25+
FetchProcess process = new FetchProcess(loading: true);
26+
//for progress loading
27+
apiController.add(process);
28+
if (userLogin.otp == null) {
29+
process.type = ApiType.performOTP;
30+
await userLogin.getOtp(userLogin.phonenumber);
31+
otpResultController.add(userLogin.otpResult);
32+
} else {
33+
process.type = ApiType.performLogin;
34+
await userLogin.performLogin(userLogin);
35+
}
36+
37+
process.loading = false;
38+
process.response = userLogin.apiResult;
39+
//for error dialog
40+
apiController.add(process);
41+
userLogin = null;
42+
}
43+
44+
void resendOtp(bool flag) {
45+
otpResultController.add(false);
46+
}
47+
48+
void dispose() {
49+
otpController.close();
50+
otpResendController.close();
51+
apiController.close();
52+
otpResultController.close();
53+
loginController.close();
54+
}
55+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import 'dart:async';
2+
3+
import 'package:flutter_uikit/di/dependency_injection.dart';
4+
import 'package:flutter_uikit/model/login.dart';
5+
import 'package:flutter_uikit/model/otp.dart';
6+
import 'package:flutter_uikit/services/abstract/i_otp_service.dart';
7+
import 'package:flutter_uikit/services/network_service_response.dart';
8+
import 'package:meta/meta.dart';
9+
10+
class UserLoginViewModel {
11+
String phonenumber;
12+
String otp;
13+
bool otpResult = false;
14+
NetworkServiceResponse apiResult;
15+
IOTPService otpRepo = new Injector().otpService;
16+
17+
//for otp
18+
UserLoginViewModel({@required this.phonenumber});
19+
20+
//for login
21+
UserLoginViewModel.withOTP({@required this.phonenumber, @required this.otp});
22+
23+
Future<Null> getOtp(String phoneNumber) async {
24+
NetworkServiceResponse<CreateOTPResponse> result =
25+
await otpRepo.createOTP(phoneNumber);
26+
this.otpResult = result.success;
27+
this.apiResult = result;
28+
}
29+
30+
Future<Null> performLogin(UserLoginViewModel userLogin) async {
31+
NetworkServiceResponse<OTPResponse> result =
32+
await otpRepo.fetchOTPLoginResponse(
33+
Login(phonenumber: userLogin.phonenumber, otp: userLogin.otp));
34+
this.apiResult = result;
35+
}
36+
}

lib/main.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_uikit/di/dependency_injection.dart';
23
import 'package:flutter_uikit/myapp.dart';
34

45
void main() {
6+
Injector.configure(Flavor.MOCK);
57
runApp(MyApp());
68
}

lib/model/fetch_process.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:flutter_uikit/services/network_service_response.dart';
2+
3+
enum ApiType { performOTP, performLogin, getProductInfo }
4+
5+
class FetchProcess<T> {
6+
ApiType type;
7+
bool loading;
8+
NetworkServiceResponse<T> response;
9+
10+
FetchProcess({this.loading, this.response, this.type});
11+
}

lib/model/login.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Login {
2+
String phonenumber;
3+
String otp;
4+
5+
Login({this.phonenumber, this.otp});
6+
7+
Map<String, dynamic> toJson() => {
8+
'phonenumber': phonenumber,
9+
'otp': otp,
10+
};
11+
}

lib/model/otp.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'package:flutter/material.dart';
2+
3+
class CreateOTPResponse {
4+
String status;
5+
CreateOTPResponse({this.status});
6+
7+
CreateOTPResponse.fromJson(Map<String, dynamic> json)
8+
: status = json['status'];
9+
}
10+
11+
class OTPResponse {
12+
String status;
13+
OTPData data;
14+
OTPResponse({this.status, this.data});
15+
16+
OTPResponse.fromJson(Map<String, dynamic> json)
17+
: status = json['status'],
18+
data = OTPData.fromJson(json['data']);
19+
}
20+
21+
class OTPData {
22+
final String authToken;
23+
final String userId;
24+
const OTPData({@required this.authToken, @required this.userId});
25+
26+
OTPData.fromJson(Map<String, dynamic> json)
27+
: authToken = json['authToken'],
28+
userId = json['userId'];
29+
}

lib/myapp.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_uikit/ui/page/home_page.dart';
3+
import 'package:flutter_uikit/ui/page/login/login_page.dart';
34
import 'package:flutter_uikit/ui/page/notfound/notfound_page.dart';
45
import 'package:flutter_uikit/ui/page/profile/profile_one_page.dart';
56
import 'package:flutter_uikit/ui/page/settings/settings_one_page.dart';
@@ -24,6 +25,7 @@ class MyApp extends StatelessWidget {
2425
UIData.notFoundRoute: (BuildContext context) => NotFoundPage(),
2526
UIData.settingsOneRoute: (BuildContext context) => SettingsOnePage(),
2627
UIData.shoppingOneRoute: (BuildContext context) => ShoppingOnePage(),
28+
UIData.loginOneRoute: (BuildContext context) => LoginPage(),
2729
},
2830
);
2931

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'dart:async';
2+
3+
import 'package:flutter_uikit/model/login.dart';
4+
import 'package:flutter_uikit/model/otp.dart';
5+
import 'package:flutter_uikit/services/network_service_response.dart';
6+
7+
abstract class IOTPService {
8+
Future<NetworkServiceResponse<CreateOTPResponse>> createOTP(
9+
String phoneNumber);
10+
Future<NetworkServiceResponse<OTPResponse>> fetchOTPLoginResponse(
11+
Login userLogin);
12+
}

0 commit comments

Comments
 (0)