Files
syncrow-web/lib/services/api/http_interceptor.dart
2025-06-12 15:33:32 +03:00

88 lines
3.0 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:syncrow_web/pages/auth/model/token.dart';
import 'package:syncrow_web/services/api/network_exception.dart';
import 'package:syncrow_web/utils/constants/api_const.dart';
import 'package:syncrow_web/utils/snack_bar.dart';
class HTTPInterceptor extends InterceptorsWrapper {
List<String> headerExclusionList = [];
List<String> headerExclusionListOfAddedParameters = [
ApiEndpoints.login,
ApiEndpoints.getRegion,
ApiEndpoints.sendOtp
];
@override
Future<void> onResponse(
Response response, ResponseInterceptorHandler handler) async {
if (await validateResponse(response)) {
super.onResponse(response, handler);
} else {
handler.reject(DioException(
requestOptions: response.requestOptions, response: response));
}
}
@override
Future<void> onRequest(
RequestOptions options, RequestInterceptorHandler handler) async {
const storage = FlutterSecureStorage();
final token = await storage.read(key: Token.loginAccessTokenKey);
if (checkHeaderExclusionListOfAddedParameters(options.path)) {
options.headers
.putIfAbsent(HttpHeaders.authorizationHeader, () => 'Bearer $token');
}
// options.headers['Authorization'] = 'Bearer ${'${token!}123'}';
super.onRequest(options, handler);
}
@override
Future<void> onError(
DioException err, ErrorInterceptorHandler handler) async {
final failure = ServerFailure.fromDioError(err);
if (failure.toString().isNotEmpty) {
CustomSnackBar.displaySnackBar(failure.toString());
}
const storage = FlutterSecureStorage();
final token = await storage.read(key: Token.loginAccessTokenKey);
if (err.response?.statusCode == 401 && token != null) {
// await AuthCubit.get(NavigationService.navigatorKey.currentContext!).logout();
}
super.onError(err, handler);
}
/// Validates the response and returns true if it is successful (status code 2xx).
Future<bool> validateResponse(Response response) async {
if (response.statusCode != null) {
if (response.statusCode! >= 200 && response.statusCode! < 300) {
// If the response status code is within the successful range (2xx),
// return true indicating a successful response.
return true;
} else {
// If the response status code is not within the successful range (2xx),
// return false indicating an unsuccessful response.
return false;
}
} else {
// If the response status code is null, return false indicating an unsuccessful response.
return false;
}
}
bool checkHeaderExclusionListOfAddedParameters(String path) {
var shouldAddHeader = true;
for (final urlConstant in headerExclusionListOfAddedParameters) {
if (path.contains(urlConstant)) {
shouldAddHeader = false;
}
}
return shouldAddHeader;
}
}