enaklo-flutter/lib/common/api/interceptors/unauthorized_interceptor.dart

41 lines
1.4 KiB
Dart
Raw Normal View History

2025-09-18 10:39:54 +07:00
import 'dart:developer';
import 'package:auto_route/auto_route.dart';
2025-08-27 12:43:25 +07:00
import 'package:dio/dio.dart';
2025-09-18 10:39:54 +07:00
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
2025-08-27 12:43:25 +07:00
2025-09-18 10:39:54 +07:00
import '../../../presentation/router/app_router.gr.dart';
import '../../constant/local_storage_key.dart';
2025-08-27 12:43:25 +07:00
import '../errors/unauthorized_error.dart';
class UnauthorizedInterceptor extends Interceptor {
2025-09-18 10:39:54 +07:00
static final GlobalKey<NavigatorState> navigatorKey =
GlobalKey<NavigatorState>();
2025-08-27 12:43:25 +07:00
@override
2025-09-18 10:39:54 +07:00
void onError(DioException err, ErrorInterceptorHandler handler) async {
2025-08-27 12:43:25 +07:00
if (err.response?.statusCode == 401 ||
err.response?.statusCode == 403 ||
err.response?.statusCode == 419) {
2025-09-18 10:39:54 +07:00
await _handleTokenExpired();
2025-08-27 12:43:25 +07:00
return super.onError(UnauthorizedError(err, null), handler);
}
super.onError(err, handler);
}
2025-09-18 10:39:54 +07:00
Future<void> _handleTokenExpired() async {
// Clear stored token
final prefs = await SharedPreferences.getInstance();
await prefs.remove(LocalStorageKey.token);
await prefs.remove(LocalStorageKey.user);
await prefs.clear(); // Optional: clear all user data
log('handleTokenExpired');
// Navigate to login page
final context = navigatorKey.currentContext;
if (context != null) {
// Option 1: Navigate and remove all previous routes
context.router.replaceAll([LoginRoute()]);
}
}
2025-08-27 12:43:25 +07:00
}