onError method

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

Called when an exception was occurred during the request.

Implementation

@override
Future<void> onError(
  DioError err,
  ErrorInterceptorHandler handler,
) async {
  if (err.response?.statusCode! == 401) {
    try {
      final token = await pref.readRefreshToken();

      if (token.isNotEmpty) {
        instance.options.headers['X-API-KEY'] =
            err.requestOptions.headers['X-API-KEY'];

        final resp = await instance.post(
          '/account-auth/refresh-token',
          data: {
            'refresh_token': token,
          },
        );

        final data = resp.data;

        await handelData(data, pref);

        final accessToken = data['access_token'];

        err.requestOptions.headers['Authorization'] = 'Bearer $accessToken';

        final opts = Options(
          method: err.requestOptions.method,
          headers: err.requestOptions.headers,
        );

        instance.options.baseUrl = err.requestOptions.baseUrl;

        final cloneResponse = await instance.request(
          err.requestOptions.path,
          options: opts,
          data: err.requestOptions.data,
          queryParameters: err.requestOptions.queryParameters,
        );

        return handler.resolve(cloneResponse);
      }
    } catch (e) {
      e as DioError;
      if (e.response?.statusCode == 401) {
        await pref.deleteRefreshToken();
        await pref.deleteToken();
      }
    }
  }
  super.onError(err, handler);
}