admin 26-5-2

This commit is contained in:
Hamza-Ayed
2026-05-02 15:16:30 +03:00
parent 5fc160e374
commit 0d9fab31bd
21 changed files with 1636 additions and 260 deletions

View File

@@ -9,39 +9,60 @@ import '../../constant/style.dart';
class MyElevatedButton extends StatelessWidget {
final String title;
final VoidCallback onPressed;
final Color kolor;
final int vibrateDuration;
final Color? kolor;
final IconData? icon;
const MyElevatedButton({
Key? key,
required this.title,
required this.onPressed,
this.kolor = AppColor.primaryColor,
this.vibrateDuration = 100,
this.kolor,
this.icon,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return ElevatedButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(kolor),
return Container(
width: double.infinity,
height: 56,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: (kolor ?? AppColor.accent).withOpacity(0.3),
blurRadius: 12,
offset: const Offset(0, 4),
),
],
),
onPressed: () async {
// Handle haptic feedback for both iOS and Android
if (Platform.isIOS) {
HapticFeedback.selectionClick();
} else {
// Vibration.vibrate(duration: 100);
// Vibrate.vibrateWithPauses(pauses);
}
// Ensure the onPressed callback is called after haptic feedback
onPressed();
},
child: Text(
title,
textAlign: TextAlign.center,
style: AppStyle.title.copyWith(color: AppColor.secondaryColor),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: kolor ?? AppColor.accent,
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
elevation: 0,
),
onPressed: () {
HapticFeedback.lightImpact();
onPressed();
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (icon != null) ...[
Icon(icon, size: 20),
const SizedBox(width: 8),
],
Text(
title,
style: AppStyle.title.copyWith(color: Colors.white),
),
],
),
),
);
}
}

View File

@@ -9,40 +9,50 @@ class MyScafolld extends StatelessWidget {
super.key,
required this.title,
required this.body,
this.action = const Icon(
Icons.clear,
color: AppColor.secondaryColor,
),
this.action,
required this.isleading,
});
final String title;
final List<Widget> body;
final Widget action;
final Widget? action;
final bool isleading;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.secondaryColor,
backgroundColor: AppColor.bg,
appBar: AppBar(
backgroundColor: AppColor.secondaryColor,
backgroundColor: AppColor.bg,
elevation: 0,
leadingWidth: 70,
leading: isleading
? IconButton(
onPressed: () {
Get.back();
},
icon: const Icon(
Icons.arrow_back_ios_new,
color: AppColor.primaryColor,
? Center(
child: Container(
margin: const EdgeInsets.only(right: 16),
decoration: BoxDecoration(
color: AppColor.surfaceElevated,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColor.divider),
),
child: IconButton(
onPressed: () => Get.back(),
icon: const Icon(
Icons.arrow_back_ios_new_rounded,
color: AppColor.textPrimary,
size: 18,
),
),
),
)
: const SizedBox(),
actions: [action],
: null,
actions: [
if (action != null) action!,
const SizedBox(width: 16),
],
title: Text(
title,
style: AppStyle.title.copyWith(fontSize: 30),
style: AppStyle.headTitle,
),
),
body: SafeArea(child: Stack(children: body)));

View File

@@ -3,6 +3,7 @@ import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import '../../constant/colors.dart';
import '../../constant/style.dart';
class MyTextForm extends StatelessWidget {
const MyTextForm({
@@ -11,55 +12,66 @@ class MyTextForm extends StatelessWidget {
required this.label,
required this.hint,
required this.type,
this.prefixIcon,
});
final TextEditingController controller;
final String label, hint;
final TextInputType type;
final IconData? prefixIcon;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(bottom: 10),
child: SizedBox(
width: Get.width * .8,
child: TextFormField(
keyboardType: type,
cursorColor: AppColor.accentColor,
controller: controller,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: AppColor.primaryColor,
width: 2.0,
),
borderRadius: BorderRadius.circular(10),
),
focusColor: AppColor.accentColor,
fillColor: AppColor.accentColor,
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(12))),
labelText: label.tr,
hintText: hint.tr,
padding: const EdgeInsets.only(bottom: 16),
child: TextFormField(
keyboardType: type,
style: AppStyle.body,
cursorColor: AppColor.accent,
controller: controller,
decoration: InputDecoration(
filled: true,
fillColor: AppColor.surface,
prefixIcon: prefixIcon != null
? Icon(prefixIcon, color: AppColor.textSecondary, size: 20)
: null,
contentPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 18),
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: AppColor.divider),
borderRadius: BorderRadius.circular(16),
),
validator: (value) {
if (value!.isEmpty) {
return 'Please enter $label.'.tr;
}
if (type == TextInputType.emailAddress) {
if (!value.contains('@')) {
return 'Please enter a valid email.'.tr;
}
} else if (type == TextInputType.phone) {
if (value.length != 10) {
return 'Please enter a valid phone number.'.tr;
}
}
return null;
},
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(color: AppColor.accent, width: 2),
borderRadius: BorderRadius.circular(16),
),
errorBorder: OutlineInputBorder(
borderSide: const BorderSide(color: AppColor.danger),
borderRadius: BorderRadius.circular(16),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: const BorderSide(color: AppColor.danger, width: 2),
borderRadius: BorderRadius.circular(16),
),
labelText: label.tr,
labelStyle: AppStyle.subtitle,
hintText: hint.tr,
hintStyle: AppStyle.caption,
),
validator: (value) {
if (value == null || value.isEmpty) {
return '${'Please enter'.tr} ${label.tr}';
}
if (type == TextInputType.emailAddress) {
if (!GetUtils.isEmail(value)) {
return 'Please enter a valid email.'.tr;
}
}
return null;
},
),
);
}
}

View File

@@ -42,104 +42,70 @@ class MyDialog extends GetxController {
sigmaX: DialogConfig.blurStrength,
sigmaY: DialogConfig.blurStrength,
),
child: Theme(
data: ThemeData.light().copyWith(
dialogBackgroundColor: CupertinoColors.systemBackground,
child: AlertDialog(
backgroundColor: AppColor.surfaceElevated,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)),
title: Text(
title,
textAlign: TextAlign.center,
style: AppStyle.headTitle,
),
child: CupertinoAlertDialog(
title: Column(
content: midTitle != null
? Text(
midTitle,
textAlign: TextAlign.center,
style: AppStyle.subtitle,
)
: null,
actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
actions: [
Row(
children: [
Text(
title,
style: AppStyle.title.copyWith(
fontSize: 20,
fontWeight: FontWeight.w700,
letterSpacing: -0.5,
color: AppColor.primaryColor,
Expanded(
child: TextButton(
onPressed: () => Get.back(),
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
side: const BorderSide(color: AppColor.divider),
),
),
child: Text('Cancel'.tr, style: AppStyle.subtitle),
),
),
const SizedBox(height: 8),
],
),
content: Column(
children: [
CupertinoButton(
padding: const EdgeInsets.all(8),
onPressed: () async {
HapticFeedback.selectionClick();
// await textToSpeechController.speakText(title);
// await textToSpeechController.speakText(midTitle!);
},
child: Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color:
AppColor.primaryColor.withAlpha(26), // 0.1 opacity
borderRadius: BorderRadius.circular(8),
),
child: Icon(
CupertinoIcons.speaker_2_fill,
color: AppColor.primaryColor,
size: 24,
const SizedBox(width: 12),
Expanded(
child: ElevatedButton(
onPressed: () {
HapticFeedback.mediumImpact();
onPressed();
},
style: ElevatedButton.styleFrom(
backgroundColor: AppColor.accent,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
elevation: 0,
),
child: Text('OK'.tr, style: AppStyle.title.copyWith(color: Colors.white)),
),
),
const SizedBox(height: 8),
Text(
midTitle!,
style: AppStyle.title.copyWith(
fontSize: 16,
height: 1.3,
color: Colors.black87,
),
textAlign: TextAlign.center,
),
],
),
actions: [
CupertinoDialogAction(
onPressed: () {
HapticFeedback.lightImpact();
Get.back();
},
child: Text(
'Cancel'.tr,
style: TextStyle(
color: AppColor.redColor,
fontWeight: FontWeight.w600,
fontSize: 17,
),
),
),
CupertinoDialogAction(
onPressed: () {
HapticFeedback.mediumImpact();
onPressed();
},
child: Text(
'OK'.tr,
style: TextStyle(
color: AppColor.greenColor,
fontWeight: FontWeight.w600,
fontSize: 17,
),
),
),
],
),
],
),
),
),
barrierDismissible: true,
barrierColor: Colors.black.withAlpha(102), // 0.4 opacity
barrierColor: Colors.black54,
);
}
}
class MyDialogContent extends GetxController {
void getDialog(String title, Widget? content, VoidCallback onPressed) {
// final textToSpeechController = Get.put(TextToSpeechController());
HapticFeedback.mediumImpact();
Get.dialog(
@@ -157,87 +123,61 @@ class MyDialogContent extends GetxController {
sigmaX: DialogConfig.blurStrength,
sigmaY: DialogConfig.blurStrength,
),
child: Theme(
data: ThemeData.light().copyWith(
dialogBackgroundColor: CupertinoColors.systemBackground,
child: AlertDialog(
backgroundColor: AppColor.surfaceElevated,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)),
title: Text(
title,
textAlign: TextAlign.center,
style: AppStyle.headTitle,
),
child: CupertinoAlertDialog(
title: Column(
content: content != null
? SingleChildScrollView(child: content)
: null,
actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
actions: [
Row(
children: [
Text(
title,
style: AppStyle.title.copyWith(
fontSize: 20,
fontWeight: FontWeight.w700,
letterSpacing: -0.5,
color: AppColor.primaryColor,
Expanded(
child: TextButton(
onPressed: () => Get.back(),
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
side: const BorderSide(color: AppColor.divider),
),
),
child: Text('Cancel'.tr, style: AppStyle.subtitle),
),
),
const SizedBox(width: 12),
Expanded(
child: ElevatedButton(
onPressed: () {
HapticFeedback.mediumImpact();
onPressed();
},
style: ElevatedButton.styleFrom(
backgroundColor: AppColor.accent,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
elevation: 0,
),
child: Text('OK'.tr, style: AppStyle.title.copyWith(color: Colors.white)),
),
),
const SizedBox(height: 8),
],
),
content: Column(
children: [
CupertinoButton(
padding: const EdgeInsets.all(8),
onPressed: () async {
HapticFeedback.selectionClick();
// await textToSpeechController.speakText(title);
},
child: Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color:
AppColor.primaryColor.withAlpha(26), // 0.1 opacity
borderRadius: BorderRadius.circular(8),
),
child: Icon(
CupertinoIcons.headphones,
color: AppColor.primaryColor,
size: 24,
),
),
),
const SizedBox(height: 12),
content!,
],
),
actions: [
CupertinoDialogAction(
onPressed: () {
HapticFeedback.lightImpact();
Get.back();
},
child: Text(
'Cancel',
style: TextStyle(
color: AppColor.redColor,
fontWeight: FontWeight.w600,
fontSize: 17,
),
),
),
CupertinoDialogAction(
onPressed: () {
HapticFeedback.mediumImpact();
onPressed();
},
child: Text(
'OK'.tr,
style: TextStyle(
color: AppColor.greenColor,
fontWeight: FontWeight.w600,
fontSize: 17,
),
),
),
],
),
],
),
),
),
barrierDismissible: true,
barrierColor: Colors.black.withAlpha(102), // 0.4 opacity
barrierColor: Colors.black54,
);
}
}