Files
intaleq_driver/lib/views/home/my_wallet/card_wallet_widget.dart
2025-09-01 19:04:50 +03:00

300 lines
11 KiB
Dart
Executable File

import 'dart:ui';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import '../../../constant/box_name.dart';
import '../../../constant/colors.dart';
import '../../../constant/style.dart';
import '../../../controller/home/payment/captain_wallet_controller.dart';
import '../../../controller/home/payment/paymob_payout.dart';
import '../../../main.dart';
import '../../widgets/elevated_btn.dart';
import '../../widgets/my_textField.dart';
// تذكير: ستحتاج إلى إضافة حزمة flutter_svg إلى ملف pubspec.yaml
// dependencies:
// flutter_svg: ^2.0.7
/// بطاقة المحفظة بتصميم سوري فاخر مستوحى من فن الأرابيسك والفسيفساء
class CardSeferWalletDriver extends StatelessWidget {
const CardSeferWalletDriver({super.key});
// SVG لنقشة أرابيسك هندسية لاستخدامها كخلفية
final String arabesquePattern = '''
<svg width="100%" height="100%" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="arabesque" patternUnits="userSpaceOnUse" width="50" height="50" patternTransform="scale(1.2)">
<g fill="#E7C582" fill-opacity="0.1">
<path d="M25 0 L35.35 9.65 L50 25 L35.35 40.35 L25 50 L14.65 40.35 L0 25 L14.65 9.65 Z"/>
<path d="M50 0 L60.35 9.65 L75 25 L60.35 40.35 L50 50 L39.65 40.35 L25 25 L39.65 9.65 Z"/>
<path d="M0 50 L9.65 39.65 L25 25 L9.65 10.35 L0 0 L-9.65 10.35 L-25 25 L-9.65 39.65 Z"/>
</g>
</pattern>
</defs>
<rect width="100%" height="100%" fill="url(#arabesque)"/>
</svg>
''';
@override
Widget build(BuildContext context) {
return Center(
child: GetBuilder<CaptainWalletController>(
builder: (captainWalletController) {
return GestureDetector(
onTap: () => _showCashOutDialog(context, captainWalletController),
child: Container(
width: Get.width * 0.9,
height: Get.height * 0.25,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(28),
boxShadow: [
BoxShadow(
color: const Color(0xFF003C43).withOpacity(0.5),
blurRadius: 25,
spreadRadius: -5,
offset: const Offset(0, 10),
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(28),
child: Stack(
children: [
// الخلفية الرئيسية
Container(color: const Color(0xFF003C43)),
// طبقة النقشة
SvgPicture.string(arabesquePattern, fit: BoxFit.cover),
// طبقة التأثير الزجاجي (Glassmorphism)
BackdropFilter(
filter: ImageFilter.blur(sigmaX: 2.0, sigmaY: 2.0),
child: Container(color: Colors.black.withOpacity(0.1)),
),
// محتوى البطاقة
_buildCardContent(captainWalletController),
],
),
),
),
);
},
),
);
}
Widget _buildCardContent(CaptainWalletController captainWalletController) {
return Padding(
padding: const EdgeInsets.fromLTRB(24, 20, 24, 20),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'رصيد انطلق',
style: AppStyle.headTitle.copyWith(
fontFamily: 'Amiri', // خط يوحي بالفخامة
color: Colors.white,
fontSize: 26,
fontWeight: FontWeight.bold,
),
),
// أيقونة شريحة البطاقة
const Icon(Icons.sim_card_outlined,
color: Color(0xFFE7C582), size: 30),
],
),
Column(
children: [
Text(
'الرصيد الحالي'.tr,
style: AppStyle.title.copyWith(
color: Colors.white.withOpacity(0.7),
fontSize: 16,
),
),
const SizedBox(height: 4),
// استخدام AnimatedSwitcher لإضافة حركة عند تحديث الرصيد
AnimatedSwitcher(
duration: const Duration(milliseconds: 500),
transitionBuilder: (child, animation) {
return FadeTransition(opacity: animation, child: child);
},
child: Text(
'${captainWalletController.totalAmountVisa} ${'ل.س'.tr}',
key:
ValueKey<String>(captainWalletController.totalAmountVisa),
style: AppStyle.headTitle2.copyWith(
color: const Color(0xFFE7C582), // Antique Gold
fontSize: 40,
fontWeight: FontWeight.w900,
),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
box.read(BoxName.nameDriver).toString().split(' ')[0],
style: AppStyle.title.copyWith(
color: Colors.white.withOpacity(0.9),
fontSize: 16,
letterSpacing: 0.5,
),
),
Text(
"سحب الرصيد".tr,
style: AppStyle.title.copyWith(
color: Colors.white.withOpacity(0.9),
fontSize: 16,
),
),
],
),
],
),
);
}
void _showCashOutDialog(
BuildContext context, CaptainWalletController captainWalletController) {
double minAmount = 20.0; // الحد الأدنى للسحب
if (double.parse(captainWalletController.totalAmountVisa) >= minAmount) {
Get.defaultDialog(
barrierDismissible: false,
title: 'هل تريد سحب أرباحك؟'.tr,
titleStyle: AppStyle.title
.copyWith(fontSize: 18, fontWeight: FontWeight.bold),
content: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Icon(Icons.account_balance_wallet,
color: AppColor.primaryColor, size: 30),
const SizedBox(height: 15),
Text(
'${'رصيدك الإجمالي:'.tr} ${captainWalletController.totalAmountVisa} ${'ل.س'.tr}',
style: AppStyle.title.copyWith(fontSize: 16),
),
const SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'طريقة الدفع:'.tr,
style: AppStyle.title.copyWith(fontSize: 16),
),
const SizedBox(width: 10),
const MyDropDownSyria(),
],
),
const SizedBox(height: 20),
Form(
key: captainWalletController.formKey,
child: MyTextForm(
controller: captainWalletController.phoneWallet,
label: "أدخل رقم محفظتك".tr,
hint: "مثال: 0912345678".tr,
type: TextInputType.phone,
),
),
],
),
confirm: MyElevatedButton(
title: 'تأكيد'.tr,
onPressed: () async {
if (captainWalletController.formKey.currentState!.validate()) {
Get.back();
String amountAfterFee =
(double.parse(captainWalletController.totalAmountVisa) - 5)
.toStringAsFixed(0);
await Get.put(PaymobPayout()).payToWalletDriverAll(
amountAfterFee,
Get.find<SyrianPayoutController>().dropdownValue.toString(),
captainWalletController.phoneWallet.text.toString(),
);
}
},
kolor: AppColor.greenColor,
),
cancel: MyElevatedButton(
title: 'إلغاء'.tr,
onPressed: () {
Get.back();
},
kolor: AppColor.redColor,
));
} else {
showCupertinoDialog(
context: context,
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text("تنبيه".tr),
content: Text(
'${'المبلغ في محفظتك أقل من الحد الأدنى للسحب وهو'.tr} $minAmount ${'ل.س'.tr}',
),
actions: <Widget>[
CupertinoDialogAction(
isDefaultAction: true,
child: Text("موافق".tr),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
}
}
}
// هذا الكود من الملف الأصلي وهو ضروري لعمل الحوار
class MyDropDownSyria extends StatelessWidget {
const MyDropDownSyria({super.key});
@override
Widget build(BuildContext context) {
Get.put(SyrianPayoutController());
return GetBuilder<SyrianPayoutController>(builder: (controller) {
return DropdownButton<String>(
value: controller.dropdownValue,
icon: const Icon(Icons.arrow_drop_down),
elevation: 16,
style: const TextStyle(color: Colors.deepPurple, fontSize: 16),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (String? newValue) {
controller.changeValue(newValue);
},
items: <String>['syriatel', 'mtn']
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value.tr),
);
}).toList(),
);
});
}
}
// هذا المتحكم ضروري لعمل القائمة المنسدلة
class SyrianPayoutController extends GetxController {
String dropdownValue = 'syriatel';
void changeValue(String? newValue) {
if (newValue != null) {
dropdownValue = newValue;
update();
}
}
}