57 lines
1.8 KiB
Dart
57 lines
1.8 KiB
Dart
import 'package:dio/dio.dart';
|
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
|
import '../core/cache_manager.dart';
|
|
|
|
class ApiClient {
|
|
late final Dio dio;
|
|
|
|
ApiClient() {
|
|
dio = Dio(BaseOptions(
|
|
baseUrl: dotenv.env['API_BASE_URL'] ?? 'http://10.0.2.2:8000/api',
|
|
connectTimeout: const Duration(seconds: 30),
|
|
receiveTimeout: const Duration(seconds: 30),
|
|
headers: {
|
|
'Accept': 'application/json',
|
|
'Content-Type': 'application/json',
|
|
},
|
|
));
|
|
|
|
dio.interceptors.add(InterceptorsWrapper(
|
|
onRequest: (options, handler) async {
|
|
final token = CacheManager.authBox.get('auth_token');
|
|
|
|
if (token != null && token.isNotEmpty) {
|
|
options.headers['Authorization'] = 'Bearer $token';
|
|
}
|
|
|
|
print('[API Request] ${options.method} ${options.path}');
|
|
print('[API Headers] ${options.headers}');
|
|
return handler.next(options);
|
|
},
|
|
onResponse: (response, handler) {
|
|
print('[API Response] ${response.statusCode} ${response.requestOptions.path}');
|
|
return handler.next(response);
|
|
},
|
|
onError: (DioException e, handler) {
|
|
String errorMessage = 'Terjadi kesalahan';
|
|
|
|
if (e.response != null) {
|
|
print('[API Error] ${e.response?.statusCode} ${e.requestOptions.path}');
|
|
print('[API Error Data] ${e.response?.data}');
|
|
|
|
if (e.response!.data is Map && e.response!.data['message'] != null) {
|
|
errorMessage = e.response!.data['message'];
|
|
}
|
|
} else {
|
|
print('[API Error] Network error: ${e.message}');
|
|
errorMessage = 'Koneksi gagal. Periksa internet Anda.';
|
|
}
|
|
|
|
print('[API Error Message] $errorMessage');
|
|
|
|
return handler.next(e);
|
|
},
|
|
));
|
|
}
|
|
}
|