onError method

  1. @override
void onError(
  1. DioError err,
  2. ErrorInterceptorHandler handler
)

Called when an exception was occurred during the request.

Implementation

@override
void onError(DioError err, ErrorInterceptorHandler handler) async {
  debugPrint(
    "❌ ERROR [${err.response?.statusCode}] => ${err.requestOptions.uri} \n"
    "BODY: ${err.response?.data}",
  );

  if (err.response?.statusCode == 401 && refreshToken != null) {
    try {
      // Attempt to refresh the token
      final newTokenData = await refreshToken!.call();
      final newAccessToken = newTokenData['access_token'] ?? '';

      if (newAccessToken.isNotEmpty) {
        await saveToken?.call(newAccessToken);

        // Clone the original request with new token
        final options = err.requestOptions;
        options.headers['Authorization'] = 'Bearer $newAccessToken';

        final response = await Dio().fetch(
          options,
        ); // لا تعيّن requestOptions على dio.options
        return handler.resolve(response);
      }
    } catch (e) {
      debugPrint("❌ Token refresh failed: $e");
      return handler.reject(
        DioError(
          requestOptions: err.requestOptions,
          error: e,
          type: DioErrorType.badResponse,
        ),
      );
    }
  }

  handler.next(err);
}