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 interceptRequest({required BaseRequest request}) async { print("Intercepting request: ${request.url}"); final String? accessToken = await authService.getAccessToken(); if (accessToken != null && request is http.Request) { request.headers['Authorization'] = 'Bearer $accessToken'; print("Added Bearer token to request: ${request.headers}"); } return request; } @override Future interceptResponse({required BaseResponse response}) async { print("Intercepting response: ${response.statusCode}"); var refreshToken = await authService.getRefreshToken(); if (response.statusCode == 403 && refreshToken != null) { print("Attempting to refresh token"); final refreshedTokens = await authService.refreshAccessToken(); if (refreshedTokens != null) { print("Token refreshed successfully. Retrying original request."); 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 { print("Failed to refresh token. Logging out user."); // Här kan du navigera användaren till GoogleSignInPage. navigatorKey.currentState?.pushAndRemoveUntil( MaterialPageRoute(builder: (_) => const GoogleSignInPage()), (route) => false, ); } } return response; } @override FutureOr shouldInterceptRequest() { return true; } @override FutureOr shouldInterceptResponse() { return true; } } /*// Exempel på hur du kan använda AuthClient i din kod: Future fetchData(AuthService authService) async { final AuthClient client = AuthClient(authService: authService); final response = await client.get(Uri.parse('https://dinbackend.com/api/protected')); return response; } // Exempel på hur du kan använda AuthClientWithErrorHandling med felhantering: Future fetchDataWithErrorHandling(AuthService authService) async { final AuthClientWithErrorHandling client = AuthClientWithErrorHandling(authService: authService); final response = await client.get(Uri.parse('https://dinbackend.com/api/protected')); return response; } */