fix : add cancel Token

This commit is contained in:
2025-06-23 10:42:29 +03:30
parent ec0e344e47
commit 1e3614ed58
10 changed files with 140 additions and 88 deletions

View File

@@ -1,7 +1,32 @@
import 'package:flutter/foundation.dart';
import '../../core.dart';
class ApiHandler {
static bool _isRefreshing = false;
static bool _isRedirecting = false;
static CancelToken globalCancelToken = CancelToken();
static Future<void> reset() async {
_isRefreshing = false;
_isRedirecting = false;
globalCancelToken = CancelToken();
}
// متد جدید برای کنسل کردن همه درخواست‌ها
static void cancelAllRequests(String reason) {
if (!globalCancelToken.isCancelled) {
globalCancelToken.cancel(reason);
}
// CancelToken جدید بساز برای درخواست‌های بعدی
globalCancelToken = CancelToken();
}
static bool get isRefreshing => _isRefreshing;
static set isRefreshing(bool val) => _isRefreshing = val;
static bool get isRedirecting => _isRedirecting;
static set isRedirecting(bool val) => _isRedirecting = val;
}
typedef AppAsyncCallback<T> = Future<T> Function();
typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace);
typedef VoidCallback = void Function();
@@ -9,7 +34,6 @@ typedef VoidCallback = void Function();
/// this is global safe call function
/// A utility function to safely cal l an asynchronous function with error
/// handling and optional loading, success, and error messages.
///
Future<void> gSafeCall<T>({
required AppAsyncCallback<T> call,
Function(T result)? onSuccess,
@@ -20,62 +44,26 @@ Future<void> gSafeCall<T>({
bool showSuccess = false,
bool showToast = false,
bool showSnackBar = false,
bool retryOnAuthError = false,
Function()? onTokenRefresh,
Function()? onShowLoading,
Function()? onHideLoading,
Function()? onShowSuccessMessage,
Function()? onShowErrorMessage,
}) async {
try {
if (showLoading) {
(onShowLoading ?? _defaultShowLoading)();
}
if (showLoading) (onShowLoading ?? _defaultShowLoading)();
final result = await call();
if (showSuccess) {
(onShowSuccessMessage ?? _defaultShowSuccessMessage)();
}
if (showSuccess) (onShowSuccessMessage ?? _defaultShowSuccessMessage)();
onSuccess?.call(result);
} catch (error, stackTrace) {
if (retryOnAuthError && isTokenExpiredError(error)) {
try {
await onTokenRefresh?.call();
final retryResult = await call();
if (showSuccess) {
(onShowSuccessMessage ?? _defaultShowSuccessMessage)();
}
onSuccess?.call(retryResult);
return;
} catch (retryError, retryStackTrace) {
if (showError) {
(onShowErrorMessage ?? _defaultShowErrorMessage)();
}
onError?.call(retryError, retryStackTrace);
if (kDebugMode) {
print('safeCall retry error: $retryError\n$retryStackTrace');
}
}
} else {
if (showError) {
(onShowErrorMessage ?? _defaultShowErrorMessage)();
}
onError?.call(error, stackTrace);
if (kDebugMode) {
print('safeCall error: $error\n$stackTrace');
}
}
if (showError) (onShowErrorMessage ?? _defaultShowErrorMessage)();
onError?.call(error, stackTrace);
} finally {
if (showLoading) {
(onHideLoading ?? _defaultHideLoading)();
}
if (showLoading) (onHideLoading ?? _defaultHideLoading)();
onComplete?.call();
}
}
void _defaultShowLoading() {
// پیاده‌سازی پیش‌فرض
}