feat : sale out of Province

This commit is contained in:
2025-06-21 17:01:37 +03:30
parent fc4295e532
commit 656b5f0d87
28 changed files with 1270 additions and 489 deletions

View File

@@ -39,9 +39,13 @@ export 'infrastructure/remote/dio_form_data.dart';
export 'infrastructure/remote/dio_remote.dart';
export 'infrastructure/remote/dio_response.dart';
export 'injection/di.dart';
///image picker
export 'package:image_picker/image_picker.dart';
//utils
export 'utils/logger_utils.dart';
export 'utils/safe_call_utils.dart';
export 'utils/network/network.dart';
export 'utils/date_time_utils.dart';
export 'utils/num_utils.dart';
export 'utils/map_utils.dart';

View File

@@ -0,0 +1,8 @@
import 'dart:convert';
import 'dart:io';
Future<String> convertImageToBase64(String imagePath) async {
final bytes = await File(imagePath).readAsBytes();
String base64String = base64Encode(bytes);
return base64String;
}

View File

@@ -1,3 +1,4 @@
export 'color_utils.dart';
export 'color_utils.dart';
export 'data_time_utils.dart';
export 'image_utils.dart';
export 'list_extensions.dart';
export 'data_time_utils.dart';

View File

@@ -20,7 +20,6 @@ class DraggableBottomSheet2 extends GetView<DraggableBottomSheetController> {
return ObxValue((data) {
return Stack(
children: [
// پس‌زمینه تیره
Positioned.fill(
child: GestureDetector(
onTap: () {},

View File

@@ -26,6 +26,7 @@ class RTextField extends StatefulWidget {
final RTextFieldVariant variant;
final bool filled;
final Color? filledColor;
final Color? borderColor;
final bool showCounter;
final bool isDense;
final TextInputType? keyboardType;
@@ -67,6 +68,7 @@ class RTextField extends StatefulWidget {
this.validator,
this.onChanged,
this.onSubmitted,
this.borderColor,
});
@@ -82,7 +84,7 @@ class RTextField extends StatefulWidget {
_noBorder || _passwordNoBorder ? InputBorder.none : OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: AppColor.lightGreyDarkActive,
color: borderColor ?? AppColor.lightGreyDarkActive,
width: 1,
),
);

View File

@@ -134,6 +134,7 @@ class _OverlayDropdownState<T> extends State<OverlayDropdownWidget<T>> {
_isOpen.value
? CupertinoIcons.chevron_up
: CupertinoIcons.chevron_down,
size: 14,
),
],
),

View File

@@ -1,10 +1,38 @@
import 'package:intl/intl.dart';
import 'package:persian_datetime_picker/persian_datetime_picker.dart';
extension xDateTime on String{
extension XDateTime on String{
get toDateTime => DateTime.parse(this);
get formattedJalaliDate{
final dateTime = DateTime.parse(this);
final jalaliDate = Jalali.fromDateTime(dateTime);
return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}";
}
}
get formattedJalaliDateYHMS {
final dateTime = DateTime.parse(this);
final jalaliDate = Jalali.fromDateTime(dateTime);
return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')} - ${jalaliDate.hour.toString().padLeft(2, '0')}:${jalaliDate.minute.toString().padLeft(2, '0')}";
}
get formattedYHMS{
return DateFormat('yyyy-MM-dd HH:mm:ss').format(toDateTime);
}
}
extension XDateTime2 on DateTime{
get formattedJalaliDate{
final jalaliDate = Jalali.fromDateTime(this);
return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}";
}
get formattedYHMS{
return DateFormat('yyyy-MM-dd HH:mm:ss').format(this);
}
}

View File

@@ -8,6 +8,7 @@ Map<String, dynamic> buildQueryParams({
int? pageSize,
DateTime? fromDate,
DateTime? toDate,
String? role,
}) {
final params = <String, dynamic>{};
@@ -40,5 +41,9 @@ Map<String, dynamic> buildQueryParams({
params['page_size'] = pageSize;
}
if(role != null && role.isNotEmpty) {
params['role'] = role;
}
return params;
}

View File

@@ -0,0 +1,2 @@
export 'resource.dart';
export 'safe_call_utils.dart';

View File

@@ -0,0 +1,46 @@
enum Status {
initial,
loading,
success,
error,
empty,
}
class Resource<T> {
final Status status;
final T? data;
final String? message;
const Resource._({
required this.status,
this.data,
this.message,
});
const Resource.initial() : this._(status: Status.initial);
const Resource.loading() : this._(status: Status.loading);
const Resource.success(T data) : this._(status: Status.success, data: data);
const Resource.error(String message) : this._(status: Status.error, message: message);
const Resource.empty() : this._(status: Status.empty);
bool get isInitial => status == Status.initial;
bool get isLoading => status == Status.loading;
bool get isSuccess => status == Status.success;
bool get isError => status == Status.error;
bool get isEmpty => status == Status.empty;
@override
String toString() {
return 'Resource{status: $status, data: $data, message: $message}';
}
}

View File

@@ -1,6 +1,6 @@
import 'package:flutter/foundation.dart';
import '../core.dart';
import '../../core.dart';
typedef AppAsyncCallback<T> = Future<T> Function();
typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace);