HopSpotFrontend/lib/services/api_interceptor.dart

71 lines
2.1 KiB
Dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:pvt15/main.dart';
import 'package:pvt15/pages/google_sign_in_page.dart';
import 'auth/auth_service.dart';
class AuthInterceptor implements InterceptorContract {
final AuthService authService;
AuthInterceptor({required this.authService});
@override
Future<BaseRequest> interceptRequest({required BaseRequest request}) async {
final String? accessToken = await authService.getAccessToken();
if (accessToken != null && request is http.Request) {
request.headers['Authorization'] = 'Bearer $accessToken';
}
return request;
}
@override
Future<BaseResponse> interceptResponse({
required BaseResponse response,
}) async {
var refreshToken = await authService.getRefreshToken();
if (response.statusCode == 403 && refreshToken != null) {
final refreshedTokens = await authService.refreshAccessToken();
if (refreshedTokens != null) {
final originalRequest = response.request as http.Request;
final newAccessToken = refreshedTokens['accessToken'];
final newRequest =
http.Request(originalRequest.method, originalRequest.url)
..headers.addAll(originalRequest.headers)
..headers['Authorization'] =
'Bearer $newAccessToken'; // Använd det nya tokenet
final client = http.Client();
try {
final newResponse = await client.send(newRequest);
final streamedResponse = await http.Response.fromStream(newResponse);
return streamedResponse
as BaseResponse; // Viktigt att returnera det nya svaret
} finally {
client.close();
}
} else {
navigatorKey.currentState?.pushAndRemoveUntil(
MaterialPageRoute(builder: (_) => const GoogleSignInPage()),
(route) => false,
);
}
}
return response;
}
@override
FutureOr<bool> shouldInterceptRequest() {
return true;
}
@override
FutureOr<bool> shouldInterceptResponse() {
return true;
}
}