chore : change app archticle
This commit is contained in:
@@ -1,29 +1,31 @@
|
||||
library;
|
||||
|
||||
//other packages
|
||||
export 'package:flutter_localizations/flutter_localizations.dart';
|
||||
export 'package:flutter_map/flutter_map.dart';
|
||||
export 'package:flutter_map_animations/flutter_map_animations.dart';
|
||||
export 'package:flutter_rating_bar/flutter_rating_bar.dart';
|
||||
export 'package:flutter_slidable/flutter_slidable.dart';
|
||||
export 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||
//freezed
|
||||
export 'package:freezed_annotation/freezed_annotation.dart';
|
||||
export 'package:geolocator/geolocator.dart';
|
||||
export 'package:get/get.dart';
|
||||
//di
|
||||
export 'package:get_it/get_it.dart';
|
||||
//local storage
|
||||
export 'package:hive_ce_flutter/hive_flutter.dart';
|
||||
//Map and location
|
||||
export 'package:latlong2/latlong.dart';
|
||||
export 'package:persian_datetime_picker/persian_datetime_picker.dart';
|
||||
export 'package:rasadyar_core/presentation/common/common.dart';
|
||||
export 'package:rasadyar_core/presentation/utils/utils.dart';
|
||||
export 'package:rasadyar_core/presentation/widget/widget.dart';
|
||||
|
||||
//other packages
|
||||
export 'package:flutter_localizations/flutter_localizations.dart';
|
||||
export 'package:flutter_slidable/flutter_slidable.dart';
|
||||
export 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||
export 'package:flutter_rating_bar/flutter_rating_bar.dart';
|
||||
export 'package:persian_datetime_picker/persian_datetime_picker.dart';
|
||||
|
||||
//freezed
|
||||
export 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
//local storage
|
||||
export 'package:hive_ce_flutter/hive_flutter.dart';
|
||||
|
||||
//Map and location
|
||||
export 'package:latlong2/latlong.dart';
|
||||
export 'package:flutter_map/flutter_map.dart';
|
||||
export 'package:geolocator/geolocator.dart';
|
||||
export 'package:flutter_map_animations/flutter_map_animations.dart';
|
||||
|
||||
|
||||
|
||||
|
||||
export 'infrastructure/remote/dio_form_data.dart';
|
||||
//network
|
||||
export 'infrastructure/remote/dio_remote.dart';
|
||||
export 'infrastructure/remote/dio_response.dart';
|
||||
//utils
|
||||
export 'utils/logger_utils.dart';
|
||||
export 'utils/safe_call_utils.dart';
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
|
||||
import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart';
|
||||
import 'package:rasadyar_core/infrastructure/remote/interfaces/i_http_response.dart';
|
||||
import 'package:rasadyar_core/infrastructure/remote/interfaces/i_remote.dart';
|
||||
|
||||
import 'dio_form_data.dart';
|
||||
import 'dio_response.dart';
|
||||
import 'interfaces/i_http_client.dart';
|
||||
|
||||
class DioRemote implements IRemote, IHttpClient {
|
||||
class DioRemote implements IHttpClient {
|
||||
final String baseUrl;
|
||||
late final Dio _dio;
|
||||
|
||||
@@ -24,31 +20,31 @@ class DioRemote implements IRemote, IHttpClient {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> get(
|
||||
String path, {
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.get(
|
||||
Future<DioResponse<T>> get<T>(
|
||||
String path, {
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.get<T>(
|
||||
path,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
return DioResponse<T>(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> post(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.post(
|
||||
Future<DioResponse<T>> post<T>(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.post<T>(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
@@ -56,19 +52,19 @@ class DioRemote implements IRemote, IHttpClient {
|
||||
onSendProgress: onSendProgress,
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
return DioResponse<T>(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> put(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.put(
|
||||
Future<DioResponse<T>> put<T>(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.put<T>(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
@@ -76,51 +72,51 @@ class DioRemote implements IRemote, IHttpClient {
|
||||
onSendProgress: onSendProgress,
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
return DioResponse<T>(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> delete(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
}) async {
|
||||
final response = await _dio.delete(
|
||||
Future<DioResponse<T>> delete<T>(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
}) async {
|
||||
final response = await _dio.delete<T>(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
return DioResponse<T>(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse<Uint8List>> download(
|
||||
String url, {
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
Future<DioResponse<Uint8List>> download<Uint8List>(
|
||||
String url, {
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.get<Uint8List>(
|
||||
url,
|
||||
options: Options(responseType: ResponseType.bytes),
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
return DioResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> upload(
|
||||
String path, {
|
||||
required IFormData formData,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
}) async {
|
||||
final response = await _dio.post(
|
||||
Future<DioResponse<T>> upload<T>(
|
||||
String path, {
|
||||
required IFormData formData,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
}) async {
|
||||
final response = await _dio.post<T>(
|
||||
path,
|
||||
data: (formData as DioFormData).raw,
|
||||
options: Options(headers: headers, contentType: 'multipart/form-data'),
|
||||
onSendProgress: onSendProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
return DioResponse<T>(response);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import 'interfaces/i_http_response.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
|
||||
class DioHttpResponse<T> implements IHttpResponse<T> {
|
||||
class DioResponse<T> implements IHttpResponse<T> {
|
||||
final Response<T> _response;
|
||||
|
||||
DioHttpResponse(this._response);
|
||||
DioResponse(this._response);
|
||||
|
||||
@override
|
||||
T? get data => _response.data;
|
||||
@@ -13,8 +13,7 @@ class DioHttpResponse<T> implements IHttpResponse<T> {
|
||||
int get statusCode => _response.statusCode ?? 0;
|
||||
|
||||
@override
|
||||
Map<String, List<String>> get headers =>
|
||||
_response.headers.map.map((k, v) => MapEntry(k, v));
|
||||
Map<String, dynamic>? get headers => _response.headers.map;
|
||||
|
||||
@override
|
||||
bool get isSuccessful => statusCode >= 200 && statusCode < 300;
|
||||
|
||||
@@ -1,51 +1,54 @@
|
||||
|
||||
import 'dart:typed_data';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:rasadyar_core/infrastructure/remote/dio_form_data.dart';
|
||||
import 'i_http_response.dart';
|
||||
import 'i_form_data.dart';
|
||||
import 'i_http_response.dart';
|
||||
|
||||
abstract class IHttpClient {
|
||||
Future<IHttpResponse> get(
|
||||
Future<void> init();
|
||||
|
||||
Future<IHttpResponse<T>> get<T>(
|
||||
String path, {
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> post(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> put(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
Future<IHttpResponse<T>> post<T>(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> delete(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
});
|
||||
Future<IHttpResponse<T>> put<T>(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse<Uint8List>> download(
|
||||
String url, {
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
Future<IHttpResponse<T>> delete<T>(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> upload(
|
||||
String path, {
|
||||
required IFormData formData,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
});
|
||||
Future<IHttpResponse<T>> download<T>(
|
||||
String url, {
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse<T>> upload<T>(
|
||||
String path, {
|
||||
required IFormData formData,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
abstract class IHttpResponse<T> {
|
||||
T? get data;
|
||||
int get statusCode;
|
||||
Map<String, List<String>> get headers;
|
||||
Map<String, dynamic>? get headers;
|
||||
bool get isSuccessful;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
import 'package:rasadyar_core/data/utils.dart';
|
||||
import 'package:rasadyar_core/presentation/utils/color_utils.dart';
|
||||
|
||||
class ROutlinedElevatedIcon extends StatefulWidget {
|
||||
ROutlinedElevatedIcon({
|
||||
@@ -127,6 +125,5 @@ Color? _getIconColor(BuildContext context) {
|
||||
}
|
||||
return Colors.blue;
|
||||
}).resolve({});
|
||||
fLog(ss);
|
||||
return ss;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rasadyar_core/data/utils.dart';
|
||||
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
6
packages/core/lib/utils/README.md
Normal file
6
packages/core/lib/utils/README.md
Normal file
@@ -0,0 +1,6 @@
|
||||
```markdown
|
||||
در معماری DDD (Domain-Driven Design)، فایلهای utils یا همان ابزارهای کمکی (utility/helpers) معمولاً:
|
||||
|
||||
✅ در هیچ لایهی خاصی قرار نمیگیرند،
|
||||
❗ بلکه بهصورت cross-cutting concerns یا "مسائل متقاطع" در نظر گرفته میشن، چون در همهی لایهها ممکنه استفاده بشن.
|
||||
```
|
||||
71
packages/core/lib/utils/safe_call_utils.dart
Normal file
71
packages/core/lib/utils/safe_call_utils.dart
Normal file
@@ -0,0 +1,71 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
typedef AsyncCallback<T> = Future<T> Function();
|
||||
typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace);
|
||||
typedef VoidCallback = void Function();
|
||||
|
||||
// تعریف دقیق تابع safeCall
|
||||
Future<T?> safeCall<T>({
|
||||
required AsyncCallback<T> call,
|
||||
Function(T result)? onSuccess,
|
||||
ErrorCallback? onError,
|
||||
VoidCallback? onComplete,
|
||||
bool showLoading = false,
|
||||
bool showError = false,
|
||||
bool showSuccess = false,
|
||||
bool showToast = false,
|
||||
bool showSnackBar = false,
|
||||
Function()? onShowLoading,
|
||||
Function()? onHideLoading,
|
||||
Function()? onShowSuccessMessage,
|
||||
Function()? onShowErrorMessage,
|
||||
}) async {
|
||||
try {
|
||||
if (showLoading) {
|
||||
(onShowLoading ?? _defaultShowLoading)();
|
||||
}
|
||||
|
||||
final result = await call();
|
||||
|
||||
if (showSuccess) {
|
||||
(onShowSuccessMessage ?? _defaultShowSuccessMessage)();
|
||||
}
|
||||
|
||||
onSuccess?.call(result);
|
||||
return result; // اضافه کردن بازگشت نتیجه
|
||||
|
||||
} catch (error, stackTrace) {
|
||||
if (showError) {
|
||||
(onShowErrorMessage ?? _defaultShowErrorMessage)();
|
||||
}
|
||||
|
||||
onError?.call(error, stackTrace);
|
||||
if (kDebugMode) {
|
||||
print('safeCall error: $error\n$stackTrace');
|
||||
}
|
||||
|
||||
return null;
|
||||
} finally {
|
||||
if (showLoading) {
|
||||
(onHideLoading ?? _defaultHideLoading)();
|
||||
}
|
||||
|
||||
onComplete?.call();
|
||||
}
|
||||
}
|
||||
|
||||
void _defaultShowLoading() {
|
||||
// پیادهسازی پیشفرض
|
||||
}
|
||||
|
||||
void _defaultHideLoading() {
|
||||
// پیادهسازی پیشفرض
|
||||
}
|
||||
|
||||
void _defaultShowSuccessMessage() {
|
||||
// پیادهسازی پیشفرض
|
||||
}
|
||||
|
||||
void _defaultShowErrorMessage() {
|
||||
// پیادهسازی پیشفرض
|
||||
}
|
||||
Reference in New Issue
Block a user