Skip to content

Commit 10303e3

Browse files
Алексей ЗенковАлексей Зенков
Алексей Зенков
authored and
Алексей Зенков
committed
dio intergation
1 parent 70c2e51 commit 10303e3

File tree

5 files changed

+158
-51
lines changed

5 files changed

+158
-51
lines changed

example/ios/Podfile.lock

+13
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
11
PODS:
2+
- connectivity (0.0.1):
3+
- Flutter
4+
- Reachability
25
- Flutter (1.0.0)
6+
- Reachability (3.2)
37
- shared_preferences (0.0.1):
48
- Flutter
59

610
DEPENDENCIES:
11+
- connectivity (from `.symlinks/plugins/connectivity/ios`)
712
- Flutter (from `Flutter`)
813
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
914

15+
SPEC REPOS:
16+
trunk:
17+
- Reachability
18+
1019
EXTERNAL SOURCES:
20+
connectivity:
21+
:path: ".symlinks/plugins/connectivity/ios"
1122
Flutter:
1223
:path: Flutter
1324
shared_preferences:
1425
:path: ".symlinks/plugins/shared_preferences/ios"
1526

1627
SPEC CHECKSUMS:
28+
connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467
1729
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
30+
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
1831
shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
1932

2033
PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c

example/lib/main.dart

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:example/model/cityItem.dart';
33
import 'package:flutter/material.dart';
44
import 'package:nsg_data/authorize/nsgPhoneLoginPage.dart';
55
import 'package:nsg_data/authorize/nsgPhoneLoginParams.dart';
6+
import 'package:nsg_data/nsgDataApiError.dart';
67
import 'package:nsg_data/nsg_data_client.dart';
78
import 'package:nsg_data/nsg_data_provider.dart';
89
import 'package:nsg_data/nsg_data_request.dart';
@@ -105,7 +106,15 @@ class _MainScreenState extends State<MainScreen> {
105106
NsgDataClient.client.registerDataItem(CardItem(), remoteProvider: provider);
106107
NsgDataClient.client.registerDataItem(CityItem(), remoteProvider: provider);
107108

108-
await provider.connect();
109+
var result = await provider.connect();
110+
NsgApiError error;
111+
bool res;
112+
result.fold((e) => error = e, (v) => res = v);
113+
if (result.isLeft) {
114+
print(error);
115+
} else {
116+
print(res);
117+
}
109118

110119
if (provider.isAnonymous) {
111120
NsgPhoneLoginParams.defaultParams.loginSuccessful = loginSuccessful;

lib/authorize/nsgPhoneLoginPage.dart

+19-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'dart:async';
2+
import 'package:either_option/either_option.dart';
23
import 'package:flutter/material.dart';
34
import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
45
import 'package:nsg_data/authorize/nsgPhoneLoginParams.dart';
56
import 'package:nsg_data/authorize/nsgPhoneLoginVerificationPage.dart';
7+
import 'package:nsg_data/nsgDataApiError.dart';
68

79
import '../nsg_data_provider.dart';
810

@@ -277,10 +279,25 @@ class _NsgPhoneLoginWidgetState extends State<NsgPhoneLoginWidget> {
277279

278280
///Get captcha from server
279281
Future<Image> _loadCaptureImage() async {
280-
return await widget.provider.getCaptcha();
282+
var response = await widget.provider.getCaptcha();
283+
Image image;
284+
response.fold((error) => {}, (data) => image = data);
285+
if (response.isLeft) {
286+
//Загрузить картинку-ошибку в случае невозможности получения капчи с сервера
287+
//image = ...
288+
}
289+
return image;
281290
}
282291

283-
void checkRequestSMSanswer(BuildContext context, int answerCode) {
292+
void checkRequestSMSanswer(
293+
BuildContext context, Either<NsgApiError, bool> response) {
294+
var answerCode = 0;
295+
response.fold((error) {
296+
answerCode = error.code;
297+
if (answerCode == null || answerCode == 0) {
298+
answerCode = 5000;
299+
}
300+
}, (v) => {answerCode = 0});
284301
if (answerCode == 0) {
285302
setState(() {
286303
//currentStage = _NsgPhoneLoginWidgetState.stageVerification;

lib/authorize/nsgPhoneLoginVerificationPage.dart

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import 'dart:async';
22

3+
import 'package:dio/dio.dart';
4+
import 'package:either_option/either_option.dart';
35
import 'package:flutter/material.dart';
6+
import 'package:nsg_data/nsgDataApiError.dart';
47
import 'package:nsg_data/nsg_data_provider.dart';
58

69
import 'nsgPhoneLoginParams.dart';
@@ -233,16 +236,14 @@ class _NsgPhoneLoginVerificationState
233236
});
234237
}
235238

236-
void checkLoginResult(BuildContext context, int statusCode) {
237-
if (statusCode == 0) {
238-
print('sucessful login.');
239-
Navigator.pop(context, true);
240-
} else {
241-
var needEnterCaptcha = (statusCode != 40300);
239+
void checkLoginResult(
240+
BuildContext context, Either<NsgApiError, bool> status) {
241+
status.fold((error) {
242+
var needEnterCaptcha = (error.code != 40300);
242243
var errorMessage =
243-
widget.widgetParams.errorMessageByStatusCode(statusCode);
244+
widget.widgetParams.errorMessageByStatusCode(error.code);
244245
showError(context, errorMessage, needEnterCaptcha);
245-
}
246+
}, (b) => Navigator.pop(context, true));
246247
}
247248

248249
Future showError(

lib/nsg_data_provider.dart

+107-40
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:convert';
2+
import 'dart:typed_data';
23
import 'dart:ui';
34

45
import 'package:connectivity/connectivity.dart';
@@ -70,7 +71,6 @@ class NsgDataProvider extends GetxController {
7071
} else if (method == 'POST') {
7172
response = await _dio.post(url, data: params);
7273
}
73-
7474
if (debug) {
7575
print('HTTP STATUS: ${response.statusCode}');
7676
print(response.data);
@@ -88,6 +88,52 @@ class NsgDataProvider extends GetxController {
8888
}
8989
}
9090

91+
Future<Either<NsgApiError, Image>> imageRequest({
92+
final String function,
93+
final Map<String, dynamic> params,
94+
final Map<String, String> headers,
95+
final String url,
96+
final int timeout = 15000,
97+
final bool debug = false,
98+
final String method = 'GET',
99+
}) async {
100+
final _dio = Dio(BaseOptions(
101+
headers: headers,
102+
method: method,
103+
responseType: ResponseType.json,
104+
contentType: 'application/json',
105+
connectTimeout: timeout,
106+
receiveTimeout: timeout,
107+
));
108+
109+
Response<Uint8List> response;
110+
111+
try {
112+
if (method == 'GET') {
113+
response = await _dio.get<Uint8List>(url,
114+
queryParameters: params,
115+
options: Options(responseType: ResponseType.bytes));
116+
} else if (method == 'POST') {
117+
response = await _dio.post<Uint8List>(url,
118+
data: params, options: Options(responseType: ResponseType.bytes));
119+
}
120+
if (debug) {
121+
print('HTTP STATUS: ${response.statusCode}');
122+
//print(response.data);
123+
}
124+
125+
return Right(Image.memory(response.data));
126+
} on DioError catch (e) {
127+
print('dio error. function: $function, error: ${e.error ??= ''}');
128+
return Left(NsgApiError(
129+
code: 1, message: 'Internet connection error', errorType: e.type));
130+
} catch (e) {
131+
print(2);
132+
print('network error. function: $function, error: $e');
133+
return Left(NsgApiError(code: 0, message: '$e'));
134+
}
135+
}
136+
91137
Future<bool> internetConnected() async {
92138
return await Connectivity().checkConnectivity() != ConnectivityResult.none;
93139
}
@@ -101,90 +147,111 @@ class NsgDataProvider extends GetxController {
101147
return result;
102148
} else {
103149
var result = await _checkToken();
104-
result.fold((error) async {
150+
151+
result.fold((error) {
105152
if (error.errorType == null) {
106-
if (error.code == 401) {
107-
var result = await _anonymousLogin();
108-
return result;
153+
if (error.code != 401) {
154+
return Left(error);
109155
}
156+
} else {
110157
return Left(error);
111158
}
112-
return Left(error);
113159
}, (b) {
114160
return Right(true);
115161
});
162+
result = await _anonymousLogin();
163+
return result;
116164
}
117165
}
118166
return Right(true);
119167
}
120168

121-
Future<Image> getCaptcha() async {
122-
var response = await http
169+
Future<Either<NsgApiError, Image>> getCaptcha() async {
170+
var response = await imageRequest(
171+
debug: isDebug,
172+
function: 'GetCaptcha',
173+
url: '${serverUri}/${authorizationApi}/GetCaptcha',
174+
method: 'GET',
175+
headers: _getAuthorizationHeader());
176+
177+
return response.fold((error) => Left(error), (data) {
178+
return Right(data);
179+
});
180+
181+
/*var response = await http
123182
.get('${serverUri}/${authorizationApi}/GetCaptcha',
124183
headers: _getAuthorizationHeader())
125184
.catchError((e) {
126185
return;
127186
});
128187
if (response.statusCode == 200) {
129-
return Image.memory(response.bodyBytes);
188+
return;
130189
} else {
131190
return null;
132-
}
191+
}*/
133192
}
134193

135-
Future<int> phoneLoginRequestSMS(
194+
Future<Either<NsgApiError, bool>> phoneLoginRequestSMS(
136195
String phoneNumber, String securityCode) async {
137196
this.phoneNumber = phoneNumber;
138197
var login = NsgPhoneLoginModel();
139198
login.phoneNumber = phoneNumber;
140199
login.securityCode = securityCode;
141200
var s = login.toJson();
142201

143-
var response = await http
144-
.post('${serverUri}/${authorizationApi}/PhoneLoginRequestSMS',
145-
headers: _getAuthorizationHeader(), body: s)
146-
.catchError((e) {
147-
return 1;
148-
});
149-
if (response.statusCode == 200) {
150-
var loginResponse = NsgLoginResponse.fromJson(
151-
json.decode(response.body) as Map<String, dynamic>);
202+
var response = await baseRequest(
203+
debug: isDebug,
204+
function: 'PhoneLoginRequestSMS',
205+
headers: _getAuthorizationHeader(),
206+
url: '${serverUri}/${authorizationApi}/PhoneLoginRequestSMS',
207+
method: 'POST',
208+
params: s);
209+
210+
return response.fold((error) => Left(error), (data) {
211+
var loginResponse = NsgLoginResponse.fromJson(data);
152212
if (loginResponse.errorCode == 0) {
153213
smsRequestedTime = DateTime.now();
214+
return Right(true);
215+
} else {
216+
return Left(NsgApiError(
217+
code: loginResponse.errorCode, message: 'Error sms request'));
154218
}
155-
return loginResponse.errorCode ?? 5000;
156-
}
157-
return 6000;
219+
});
158220
}
159221

160-
Future<int> phoneLogin(String phoneNumber, String securityCode) async {
222+
Future<Either<NsgApiError, bool>> phoneLogin(
223+
String phoneNumber, String securityCode) async {
161224
this.phoneNumber = phoneNumber;
162225
var login = NsgPhoneLoginModel();
163226
login.phoneNumber = phoneNumber;
164227
login.securityCode = securityCode;
165228
var s = login.toJson();
166229

167-
var response = await http
168-
.post('${serverUri}/${authorizationApi}/PhoneLogin',
169-
headers: _getAuthorizationHeader(), body: s)
170-
.catchError((e) {
171-
return 1;
172-
});
173-
if (response.statusCode == 200) {
174-
var loginResponse = NsgLoginResponse.fromJson(
175-
json.decode(response.body) as Map<String, dynamic>);
230+
var response = await baseRequest(
231+
debug: isDebug,
232+
function: 'PhoneLogin',
233+
headers: _getAuthorizationHeader(),
234+
url: '${serverUri}/${authorizationApi}/PhoneLogin',
235+
method: 'POST',
236+
params: s);
237+
238+
Left<NsgApiError, bool> left;
239+
response.fold((e) => left = Left<NsgApiError, bool>(e), (data) {
240+
var loginResponse = NsgLoginResponse.fromJson(data);
176241
if (loginResponse.errorCode == 0) {
177242
token = loginResponse.token;
178243
isAnonymous = loginResponse.isAnonymous;
179-
if (!isAnonymous) {
180-
if (name == '' || name == null) name = authorizationApi;
181-
var _prefs = await SharedPreferences.getInstance();
182-
await _prefs.setString(name, token);
183-
}
244+
} else {
245+
left = Left<NsgApiError, bool>(NsgApiError(
246+
code: loginResponse.errorCode, message: 'Error sms request'));
184247
}
185-
return loginResponse.errorCode ?? 5000;
248+
});
249+
if (response.isRight && !isAnonymous) {
250+
if (name == '' || name == null) name = authorizationApi;
251+
var _prefs = await SharedPreferences.getInstance();
252+
await _prefs.setString(name, token);
186253
}
187-
return 6000;
254+
return response.fold((e) => left, (data) => Right(true));
188255
}
189256

190257
Future logout() async {

0 commit comments

Comments
 (0)