network manager and di added
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:provider/single_child_widget.dart';
|
||||
|
||||
import '../../data/repositories/auth_repository.dart';
|
||||
import '../../data/services/auth_service.dart';
|
||||
import '../../data/services/network_manager.dart';
|
||||
import '../../view_models/auth_view_model.dart';
|
||||
|
||||
List<SingleChildWidget> get providersRemote {
|
||||
return [...cores, ...apiClients, ...repositories, ...viewModels, ...others];
|
||||
}
|
||||
|
||||
List<SingleChildWidget> get cores {
|
||||
return [Provider(create: (context) => NetworkManager())];
|
||||
}
|
||||
|
||||
List<SingleChildWidget> get apiClients {
|
||||
return [
|
||||
Provider(create: (context) => AuthService(networkManager: context.read())),
|
||||
];
|
||||
}
|
||||
|
||||
List<SingleChildWidget> get repositories {
|
||||
return [
|
||||
Provider(create: (context) => AuthRepository(authService: context.read())),
|
||||
];
|
||||
}
|
||||
|
||||
List<SingleChildWidget> get viewModels {
|
||||
return [
|
||||
Provider(
|
||||
create: (context) => AuthViewModel(authRepository: context.read()),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
List<SingleChildWidget> get others {
|
||||
return [];
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
typedef OnError<E> = void Function(E error);
|
||||
|
||||
abstract class Either<E, S> {
|
||||
const Either();
|
||||
|
||||
E? getError();
|
||||
|
||||
S? getSuccess();
|
||||
|
||||
bool isError();
|
||||
|
||||
bool isSuccess();
|
||||
|
||||
void when({
|
||||
required OnError<E> error,
|
||||
required void Function(S success) success,
|
||||
});
|
||||
}
|
||||
|
||||
class Success<E, S> extends Either<E, S> {
|
||||
final S _success;
|
||||
|
||||
const Success(this._success);
|
||||
|
||||
@override
|
||||
E? getError() => null;
|
||||
|
||||
@override
|
||||
S? getSuccess() => _success;
|
||||
|
||||
@override
|
||||
bool isError() => false;
|
||||
|
||||
@override
|
||||
bool isSuccess() => true;
|
||||
|
||||
@override
|
||||
void when({
|
||||
required OnError<E> error,
|
||||
required void Function(S success) success,
|
||||
}) {
|
||||
success(_success);
|
||||
}
|
||||
}
|
||||
|
||||
class Error<E, S> extends Either<E, S> {
|
||||
final E _error;
|
||||
|
||||
const Error(this._error);
|
||||
|
||||
@override
|
||||
E? getError() => _error;
|
||||
|
||||
@override
|
||||
S? getSuccess() => null;
|
||||
|
||||
@override
|
||||
bool isError() => true;
|
||||
|
||||
@override
|
||||
bool isSuccess() => false;
|
||||
|
||||
@override
|
||||
void when({
|
||||
required OnError<E> error,
|
||||
required void Function(S success) success,
|
||||
}) {
|
||||
error(_error);
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,8 @@ import '../services/auth_service.dart';
|
||||
class AuthRepository {
|
||||
final AuthService _authService;
|
||||
|
||||
AuthRepository(this._authService);
|
||||
AuthRepository({required AuthService authService})
|
||||
: _authService = authService;
|
||||
|
||||
Future<Result<UserModel>> login(String email, String password) async {
|
||||
try {
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
import 'network_manager.dart';
|
||||
|
||||
class AuthService {
|
||||
AuthService({required NetworkManager networkManager})
|
||||
: _networkManager = networkManager;
|
||||
|
||||
final NetworkManager _networkManager;
|
||||
|
||||
Future<Map<String, dynamic>> login(String email, String password) async {
|
||||
// شبیهسازی API Call
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
@@ -10,3 +17,20 @@ class AuthService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Future<Result<OnlineGalleryResponse>> getImages(String projectId) async {
|
||||
// try {
|
||||
// final result = await networkManager.makeRequest(
|
||||
// '/api/v1/projects/$projectId/files',
|
||||
// (json) {
|
||||
// Logger().i(json);
|
||||
// return OnlineGalleryResponse.fromJson(json);
|
||||
// },
|
||||
// method: 'GET',
|
||||
// );
|
||||
|
||||
// return Result.ok(result);
|
||||
// } on DioException catch (e) {
|
||||
// return Result.error(e);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class NetworkManager {
|
||||
final Dio mainDio;
|
||||
|
||||
NetworkManager()
|
||||
: mainDio = Dio(
|
||||
BaseOptions(
|
||||
// baseUrl: 'https://stage.cura-bau.de',
|
||||
connectTimeout: const Duration(seconds: 10),
|
||||
receiveTimeout: const Duration(seconds: 10),
|
||||
contentType: 'application/json',
|
||||
headers: {'Accept': 'application/json'},
|
||||
),
|
||||
);
|
||||
|
||||
Future<void> init() async {
|
||||
await addInterceptors();
|
||||
}
|
||||
|
||||
Future<void> addInterceptors() async {
|
||||
final requestInterceptor = InterceptorsWrapper(
|
||||
onRequest: (options, handler) {
|
||||
// TODO: add more
|
||||
return handler.next(options);
|
||||
},
|
||||
);
|
||||
|
||||
mainDio.interceptors.add(requestInterceptor);
|
||||
}
|
||||
|
||||
Future<T> makeRequest<T>(
|
||||
String endpoint,
|
||||
T Function(Map<String, dynamic>) fromJson, {
|
||||
String method = 'GET',
|
||||
FormData? data,
|
||||
}) async {
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
|
||||
Dio dioInstance = mainDio;
|
||||
|
||||
await addInterceptors();
|
||||
|
||||
Future<Response> makeApiCall(String token, String url) async {
|
||||
final headers =
|
||||
token.isEmpty
|
||||
? <String, String>{}
|
||||
: {'Authorization': 'Bearer $token'};
|
||||
switch (method.toUpperCase()) {
|
||||
case 'POST':
|
||||
return await dioInstance.post(
|
||||
url + endpoint,
|
||||
data: data,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
case 'PUT':
|
||||
return await dioInstance.put(
|
||||
url + endpoint,
|
||||
data: data,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
case 'PATCH':
|
||||
return await dioInstance.patch(
|
||||
url + endpoint,
|
||||
data: data,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
case 'DELETE':
|
||||
return await dioInstance.delete(
|
||||
url + endpoint,
|
||||
data: data,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
case 'GET':
|
||||
return await dioInstance.get(
|
||||
url + endpoint,
|
||||
data: data,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
default:
|
||||
return await dioInstance.get(
|
||||
url + endpoint,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
String? bearerToken = prefs.getString('bearer');
|
||||
String? url = prefs.getString('url');
|
||||
Response res = await makeApiCall(bearerToken ?? '', url ?? '');
|
||||
switch (res.statusCode) {
|
||||
case 200:
|
||||
case 201:
|
||||
return fromJson(res.data);
|
||||
case 401:
|
||||
break;
|
||||
case 403:
|
||||
throw Exception('Forbidden: ${res.data['message']}');
|
||||
case 404:
|
||||
throw Exception('Not found: ${res.data['message']}');
|
||||
case 423:
|
||||
throw Exception('Locked: ${res.data['message']}');
|
||||
case 500:
|
||||
throw Exception('Internal server error: ${res.data['message']}');
|
||||
default:
|
||||
throw Exception('Error: ${res.data['message']}');
|
||||
}
|
||||
} on DioException catch (e) {
|
||||
if (e.response?.statusCode == 401) {
|
||||
// await api.refreshToken();
|
||||
String? bearerToken = prefs.getString('bearer');
|
||||
String? url = prefs.getString('url');
|
||||
Response res = await makeApiCall(bearerToken ?? '', url ?? '');
|
||||
|
||||
if (res.statusCode == 200 || res.statusCode == 201) {
|
||||
return fromJson(res.data);
|
||||
}
|
||||
|
||||
throw Exception(e.message ?? 'Error occurred');
|
||||
}
|
||||
} catch (e) {
|
||||
throw Exception(e.toString());
|
||||
}
|
||||
|
||||
throw Exception('Unhandled error occurred');
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,8 @@ import '../data/repositories/auth_repository.dart';
|
||||
class AuthViewModel with ChangeNotifier {
|
||||
final AuthRepository _authRepository;
|
||||
|
||||
AuthViewModel(this._authRepository);
|
||||
AuthViewModel({required AuthRepository authRepository})
|
||||
: _authRepository = authRepository;
|
||||
|
||||
bool _isLoading = false;
|
||||
String? _errorMessage;
|
||||
|
||||
Reference in New Issue
Block a user