feat : auth package
This commit is contained in:
@@ -11,6 +11,13 @@ 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';
|
||||
@@ -19,3 +26,4 @@ export 'package:flutter_map_animations/flutter_map_animations.dart';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:logger/logger.dart';
|
||||
import 'package:rasadyar_core/infrastructure/di/di.dart';
|
||||
import 'package:rasadyar_core/injection/di.dart';
|
||||
|
||||
void iLog(dynamic message) {
|
||||
if(kDebugMode){
|
||||
di.get<Logger>().i(message.toString());
|
||||
diCore.get<Logger>().i(message.toString());
|
||||
}
|
||||
}
|
||||
|
||||
void eLog(dynamic message) {
|
||||
if(kDebugMode){
|
||||
di.get<Logger>().e(message.toString());
|
||||
diCore.get<Logger>().e(message.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void dLog(dynamic message) {
|
||||
if(kDebugMode){
|
||||
di.get<Logger>().d(message.toString());
|
||||
diCore.get<Logger>().d(message.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void fLog(dynamic message){
|
||||
if(kDebugMode){
|
||||
di.get<Logger>().f(message.toString());
|
||||
diCore.get<Logger>().f(message.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void tLog(dynamic message) {
|
||||
if(kDebugMode){
|
||||
di.get<Logger>().t(message.toString());
|
||||
diCore.get<Logger>().t(message.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
import 'package:hive_ce_flutter/hive_flutter.dart';
|
||||
|
||||
import 'i_local_storage.dart';
|
||||
|
||||
class HiveLocalStorage implements ILocalStorage {
|
||||
HiveLocalStorage() {
|
||||
Hive.initFlutter();
|
||||
}
|
||||
|
||||
final Map<String, Box> _boxes = {};
|
||||
|
||||
@override
|
||||
Future init() async => await Hive.initFlutter();
|
||||
|
||||
@override
|
||||
Future<void> openBox<T>(String boxName) async {
|
||||
if (!_boxes.containsKey(boxName)) {
|
||||
final box = await Hive.openBox<T>(boxName);
|
||||
_boxes[boxName] = box;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> delete(String boxName, String key) async {
|
||||
Box<dynamic>? box = await getBox(boxName);
|
||||
await box.delete(key);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<T?> read<T>(String boxName, String key) async {
|
||||
Box? box = await getBox(boxName);
|
||||
return box.get(key) as T?;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> save(String boxName, String key, value) async {
|
||||
Box<dynamic>? box = await getBox(boxName);
|
||||
await box.put(key, value);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> add(String boxName, value) async {
|
||||
Box<dynamic>? box = await getBox(boxName);
|
||||
await box.add(value);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> addAll(String boxName, Iterable values) async {
|
||||
Box<dynamic>? box = await getBox(boxName);
|
||||
await box.addAll(values);
|
||||
}
|
||||
|
||||
Future<Box<T>> getBox<T>(String boxName) async {
|
||||
final box = _boxes[boxName];
|
||||
if (box is Box<T>) {
|
||||
return box;
|
||||
} else {
|
||||
throw Exception('Box $boxName is not of expected type $T');
|
||||
}
|
||||
}
|
||||
}
|
||||
11
packages/core/lib/infrastructure/local/i_local_storage.dart
Normal file
11
packages/core/lib/infrastructure/local/i_local_storage.dart
Normal file
@@ -0,0 +1,11 @@
|
||||
abstract class ILocalStorage<E>{
|
||||
Future<void> init();
|
||||
Future<void> openBox<T>(String boxName);
|
||||
Future<void> save(String boxName, String key, dynamic value);
|
||||
Future<T?> read<T>(String boxName, String key);
|
||||
Future<void> delete(String boxName, String key);
|
||||
|
||||
Future<void> add(String boxName, E value);
|
||||
Future<void> addAll(String boxName, Iterable<E> values);
|
||||
|
||||
}
|
||||
23
packages/core/lib/infrastructure/remote/dio_form_data.dart
Normal file
23
packages/core/lib/infrastructure/remote/dio_form_data.dart
Normal file
@@ -0,0 +1,23 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'interfaces/i_form_data.dart';
|
||||
|
||||
class DioFormData implements IFormData {
|
||||
final FormData _formData = FormData();
|
||||
|
||||
@override
|
||||
void addFile(String field, Uint8List bytes, String filename) {
|
||||
_formData.files.add(MapEntry(
|
||||
field,
|
||||
MultipartFile.fromBytes(bytes, filename: filename),
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
void addField(String key, String value) {
|
||||
_formData.fields.add(MapEntry(key, value));
|
||||
}
|
||||
|
||||
FormData get raw => _formData;
|
||||
}
|
||||
126
packages/core/lib/infrastructure/remote/dio_remote.dart
Normal file
126
packages/core/lib/infrastructure/remote/dio_remote.dart
Normal file
@@ -0,0 +1,126 @@
|
||||
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 {
|
||||
final String baseUrl;
|
||||
late final Dio _dio;
|
||||
|
||||
DioRemote(this.baseUrl);
|
||||
|
||||
@override
|
||||
Future<void> init() async {
|
||||
final dio = Dio(BaseOptions(baseUrl: baseUrl));
|
||||
dio.interceptors.add(PrettyDioLogger());
|
||||
_dio = dio;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> get(
|
||||
String path, {
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.get(
|
||||
path,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(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(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
onSendProgress: onSendProgress,
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(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(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
onSendProgress: onSendProgress,
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> delete(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
}) async {
|
||||
final response = await _dio.delete(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse<Uint8List>> download(
|
||||
String url, {
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.get<Uint8List>(
|
||||
url,
|
||||
options: Options(responseType: ResponseType.bytes),
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> upload(
|
||||
String path, {
|
||||
required IFormData formData,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
}) async {
|
||||
final response = await _dio.post(
|
||||
path,
|
||||
data: (formData as DioFormData).raw,
|
||||
options: Options(headers: headers, contentType: 'multipart/form-data'),
|
||||
onSendProgress: onSendProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
}
|
||||
21
packages/core/lib/infrastructure/remote/dio_response.dart
Normal file
21
packages/core/lib/infrastructure/remote/dio_response.dart
Normal file
@@ -0,0 +1,21 @@
|
||||
import 'interfaces/i_http_response.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
|
||||
class DioHttpResponse<T> implements IHttpResponse<T> {
|
||||
final Response<T> _response;
|
||||
|
||||
DioHttpResponse(this._response);
|
||||
|
||||
@override
|
||||
T? get data => _response.data;
|
||||
|
||||
@override
|
||||
int get statusCode => _response.statusCode ?? 0;
|
||||
|
||||
@override
|
||||
Map<String, List<String>> get headers =>
|
||||
_response.headers.map.map((k, v) => MapEntry(k, v));
|
||||
|
||||
@override
|
||||
bool get isSuccessful => statusCode >= 200 && statusCode < 300;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
abstract class IFormData{
|
||||
void addFile(String field, Uint8List bytes, String filename);
|
||||
void addField(String key, String value);
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
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';
|
||||
|
||||
abstract class IHttpClient {
|
||||
Future<IHttpResponse> get(
|
||||
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> delete(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
});
|
||||
|
||||
Future<IHttpResponse<Uint8List>> download(
|
||||
String url, {
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> upload(
|
||||
String path, {
|
||||
required IFormData formData,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
abstract class IHttpResponse<T> {
|
||||
T? get data;
|
||||
int get statusCode;
|
||||
Map<String, List<String>> get headers;
|
||||
bool get isSuccessful;
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
abstract class IRemote<T>{
|
||||
Future<T> init();
|
||||
}
|
||||
|
||||
@@ -193,6 +193,22 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
dio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dio
|
||||
sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.8.0+1"
|
||||
dio_web_adapter:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dio_web_adapter
|
||||
sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -797,6 +813,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.1"
|
||||
pretty_dio_logger:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: pretty_dio_logger
|
||||
sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
proj4dart:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
@@ -26,8 +26,8 @@ dependencies:
|
||||
rxdart: ^0.28.0
|
||||
|
||||
## local storage
|
||||
hive_ce: ^2.10.1
|
||||
hive_ce_flutter: ^2.2.0
|
||||
hive_ce: ^2.11.1
|
||||
hive_ce_flutter: ^2.3.0
|
||||
|
||||
##code generation
|
||||
freezed_annotation: ^3.0.0
|
||||
@@ -58,7 +58,11 @@ dependencies:
|
||||
#location
|
||||
latlong2: ^0.9.1
|
||||
geolocator: ^14.0.0
|
||||
#network
|
||||
dio: ^5.8.0+1
|
||||
|
||||
#networkLogger
|
||||
pretty_dio_logger: ^1.4.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
@@ -66,7 +70,7 @@ dev_dependencies:
|
||||
flutter_lints: ^5.0.0
|
||||
##code generation
|
||||
build_runner: ^2.4.15
|
||||
hive_ce_generator: ^1.8.2
|
||||
hive_ce_generator: ^1.9.1
|
||||
freezed: ^3.0.3
|
||||
json_serializable: ^6.9.4
|
||||
|
||||
@@ -75,5 +79,7 @@ dev_dependencies:
|
||||
get_test: ^4.0.1
|
||||
|
||||
|
||||
|
||||
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
Reference in New Issue
Block a user