fix: token

This commit is contained in:
efrilm 2025-08-17 14:34:52 +07:00
parent 7d24b3296d
commit d3543149f2
8 changed files with 34 additions and 18 deletions

View File

@ -2,10 +2,8 @@ import 'package:awesome_dio_interceptor/awesome_dio_interceptor.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:injectable/injectable.dart'; import 'package:injectable/injectable.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../env.dart'; import '../../env.dart';
import '../constant/local_storage_key.dart';
import 'api_failure.dart'; import 'api_failure.dart';
import 'errors/bad_network_error.dart'; import 'errors/bad_network_error.dart';
import 'errors/bad_request_error.dart'; import 'errors/bad_request_error.dart';
@ -24,16 +22,11 @@ import 'interceptors/unauthorized_interceptor.dart';
class ApiClient { class ApiClient {
final Dio _dio; final Dio _dio;
final Env _env; final Env _env;
final SharedPreferences _preferences;
ApiClient(this._dio, this._env, this._preferences) { ApiClient(this._dio, this._env) {
_dio.options.baseUrl = _env.baseUrl; _dio.options.baseUrl = _env.baseUrl;
_dio.options.validateStatus = (status) => status! < 500; _dio.options.validateStatus = (status) => status! < 500;
_dio.options.connectTimeout = const Duration(seconds: 20); _dio.options.connectTimeout = const Duration(seconds: 20);
_dio.options.headers = {
'authorization':
'Bearer ${_preferences.getString(LocalStorageKey.token)}',
};
_dio.interceptors.add(BadNetworkErrorInterceptor()); _dio.interceptors.add(BadNetworkErrorInterceptor());
_dio.interceptors.add(BadRequestErrorInterceptor()); _dio.interceptors.add(BadRequestErrorInterceptor());
_dio.interceptors.add(InternalServerErrorInterceptor()); _dio.interceptors.add(InternalServerErrorInterceptor());

View File

@ -1,4 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../injection.dart';
import '../constant/local_storage_key.dart';
void dismissKeyboard(BuildContext context) { void dismissKeyboard(BuildContext context) {
final currentFocus = FocusScope.of(context); final currentFocus = FocusScope.of(context);
@ -6,3 +10,10 @@ void dismissKeyboard(BuildContext context) {
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
} }
} }
Map<String, dynamic> getAuthorizationHeader() {
return {
'Authorization':
'Bearer ${getIt<SharedPreferences>().getString(LocalStorageKey.token)}',
};
}

View File

@ -6,6 +6,7 @@ import 'package:injectable/injectable.dart';
import '../../../common/api/api_client.dart'; import '../../../common/api/api_client.dart';
import '../../../common/api/api_failure.dart'; import '../../../common/api/api_failure.dart';
import '../../../common/extension/extension.dart'; import '../../../common/extension/extension.dart';
import '../../../common/function/app_function.dart';
import '../../../common/url/api_path.dart'; import '../../../common/url/api_path.dart';
import '../../../domain/analytic/analytic.dart'; import '../../../domain/analytic/analytic.dart';
import '../analytic_dtos.dart'; import '../analytic_dtos.dart';
@ -28,6 +29,7 @@ class AnalyticRemoteDataProvider {
'date_from': dateFrom.toServerDate, 'date_from': dateFrom.toServerDate,
'date_to': dateTo.toServerDate, 'date_to': dateTo.toServerDate,
}, },
headers: getAuthorizationHeader(),
); );
if (response.data['data'] == null) { if (response.data['data'] == null) {

View File

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:injectable/injectable.dart'; import 'package:injectable/injectable.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@ -10,6 +11,7 @@ import '../auth_dtos.dart';
@injectable @injectable
class AuthLocalDataProvider { class AuthLocalDataProvider {
final SharedPreferences _sharedPreferences; final SharedPreferences _sharedPreferences;
final String _logName = 'AuthLocalDataProvider';
AuthLocalDataProvider(this._sharedPreferences); AuthLocalDataProvider(this._sharedPreferences);
@ -48,7 +50,11 @@ class AuthLocalDataProvider {
} }
Future<void> deleteAllAuth() async { Future<void> deleteAllAuth() async {
await _sharedPreferences.remove(LocalStorageKey.token); try {
await _sharedPreferences.remove(LocalStorageKey.user); await _sharedPreferences.remove(LocalStorageKey.token);
await _sharedPreferences.remove(LocalStorageKey.user);
} catch (e) {
log('deleteAllAuthError', name: _logName, error: e);
}
} }
} }

View File

@ -6,6 +6,7 @@ import 'package:data_channel/data_channel.dart';
import '../../../common/api/api_client.dart'; import '../../../common/api/api_client.dart';
import '../../../common/api/api_failure.dart'; import '../../../common/api/api_failure.dart';
import '../../../common/function/app_function.dart';
import '../../../common/url/api_path.dart'; import '../../../common/url/api_path.dart';
import '../../../domain/auth/auth.dart'; import '../../../domain/auth/auth.dart';
import '../auth_dtos.dart'; import '../auth_dtos.dart';
@ -45,7 +46,7 @@ class AuthRemoteDataProvider {
Future<DC<AuthFailure, Unit>> logout() async { Future<DC<AuthFailure, Unit>> logout() async {
try { try {
await _apiClient.post(ApiPath.logout); await _apiClient.post(ApiPath.logout, headers: getAuthorizationHeader());
return DC.data(unit); return DC.data(unit);
} on ApiFailure catch (e, s) { } on ApiFailure catch (e, s) {
log('login', name: _logName, error: e, stackTrace: s); log('login', name: _logName, error: e, stackTrace: s);

View File

@ -5,6 +5,7 @@ import 'package:injectable/injectable.dart';
import '../../../common/api/api_client.dart'; import '../../../common/api/api_client.dart';
import '../../../common/api/api_failure.dart'; import '../../../common/api/api_failure.dart';
import '../../../common/function/app_function.dart';
import '../../../common/url/api_path.dart'; import '../../../common/url/api_path.dart';
import '../../../domain/category/category.dart'; import '../../../domain/category/category.dart';
import '../category_dtos.dart'; import '../category_dtos.dart';
@ -25,6 +26,7 @@ class CategoryRemoteDataProvider {
final response = await _apiClient.get( final response = await _apiClient.get(
ApiPath.category, ApiPath.category,
params: {'page': page, 'limit': limit, 'is_active': isActive}, params: {'page': page, 'limit': limit, 'is_active': isActive},
headers: getAuthorizationHeader(),
); );
if (response.data['data'] == null) { if (response.data['data'] == null) {

View File

@ -5,6 +5,7 @@ import 'package:injectable/injectable.dart';
import '../../../common/api/api_client.dart'; import '../../../common/api/api_client.dart';
import '../../../common/api/api_failure.dart'; import '../../../common/api/api_failure.dart';
import '../../../common/function/app_function.dart';
import '../../../common/url/api_path.dart'; import '../../../common/url/api_path.dart';
import '../../../domain/product/product.dart'; import '../../../domain/product/product.dart';
import '../product_dtos.dart'; import '../product_dtos.dart';
@ -33,7 +34,11 @@ class ProductRemoteDataProvider {
params['search'] = search; params['search'] = search;
} }
final response = await _apiClient.get(ApiPath.product, params: params); final response = await _apiClient.get(
ApiPath.product,
params: params,
headers: getAuthorizationHeader(),
);
if (response.data['data'] == null) { if (response.data['data'] == null) {
return DC.error(ProductFailure.empty()); return DC.error(ProductFailure.empty());

View File

@ -100,14 +100,10 @@ extension GetItInjectableX on _i174.GetIt {
gh.factory<_i991.AuthLocalDataProvider>( gh.factory<_i991.AuthLocalDataProvider>(
() => _i991.AuthLocalDataProvider(gh<_i460.SharedPreferences>()), () => _i991.AuthLocalDataProvider(gh<_i460.SharedPreferences>()),
); );
gh.factory<_i6.Env>(() => _i6.ProdEnv(), registerFor: {_prod});
gh.lazySingleton<_i115.ApiClient>( gh.lazySingleton<_i115.ApiClient>(
() => _i115.ApiClient( () => _i115.ApiClient(gh<_i361.Dio>(), gh<_i6.Env>()),
gh<_i361.Dio>(),
gh<_i6.Env>(),
gh<_i460.SharedPreferences>(),
),
); );
gh.factory<_i6.Env>(() => _i6.ProdEnv(), registerFor: {_prod});
gh.factory<_i17.AuthRemoteDataProvider>( gh.factory<_i17.AuthRemoteDataProvider>(
() => _i17.AuthRemoteDataProvider(gh<_i115.ApiClient>()), () => _i17.AuthRemoteDataProvider(gh<_i115.ApiClient>()),
); );