Files
tripz-llc/dashboards/admin/lib/views/auth/register_page.dart
T
Hamza-AyedandClaude Opus 5 4d8414c96b feat: استيراد كود سيرو إلى تريبز (سيرو @ecfe7568) — بلا تعديل
قرار المالك 2026-07-27: باك إند سيرو PHP هو المعتمد، وتطبيقاته المجرّبة
ميدانياً تحل محل إعادة البناء المؤرشفة. سيرو نفسه لم يُمسّ.

الخريطة:
  backend · payment_server · loction_server · ride_server ·
  passenger_server · docker · dashboard · stress_test  → الجذر
  siro_rider  → apps/rider          siro_driver  → apps/driver
  siro_admin  → dashboards/admin    siro_service → dashboards/service
  android_bot → apps/android_bot    socialBot    → apps/socialBot

نُسخ المتعقَّب في git سيرو فقط عبر `git archive` (3,198 ملفاً / ~169 م.ب)
لا `cp -r` — فاستُثنيت مخلفات البناء تلقائياً. بلا أي تعديل محتوى عمداً:
كل ما يلي يصير فرقاً مقروءاً مقابل المصدر.

لم يُستورد وسببه: siromove.com (الموقع التسويقي يبقى marketing/ في تريبز،
سيرو فيه 8 ملفات) · docs و planning (تريبز له docs/ الخاص) · deploy.sh
(ليس نشراً على سيرفر بل `git add . && git push origin --all` — فخّ في
مستودع آخر) · transit_dashboard (بانتظار قرار مصير backend-transit و
dashboards/transit-web).

⚠️ لا يبني بعد — ثلاثة نواقص متوقعة ومقصودة:
1. `.env` و `lib/env/env.g.dart` غير متعقَّبين في سيرو (أسرار لكل مستأجر):
   كل تطبيق فلاتر يحتاج .env خاصاً ثم توليد env.g.dart بـ build_runner.
2. إعدادات Firebase (9 ملفات google-services.json و GoogleService-Info.plist)
   يستبعدها .gitignore تريبز — ولكل مستأجر مشروع Firebase خاص أصلاً.
3. apps/driver في سيرو يشير إلى `../../Intaleq/packages/get` خارج المستودع →
   يجب ضمّ الحزم داخله أسوة بـ apps/rider.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 05:14:13 +03:00

158 lines
6.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:siro_admin/controller/auth/register_controller.dart';
class _C {
static const bg = Color(0xFF0A0D14);
static const card = Color(0xFF161D2E);
static const accent = Color(0xFF00E5FF);
static const textPrimary = Color(0xFFE8F0FE);
static const textSec = Color(0xFF7A8BAA);
static const inputBg = Color(0xFF0C1120);
}
class AdminRegisterPage extends StatelessWidget {
const AdminRegisterPage({super.key});
@override
Widget build(BuildContext context) {
final controller = Get.put(AdminRegisterController());
return Scaffold(
backgroundColor: _C.bg,
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
leading: IconButton(
icon: const Icon(Icons.arrow_back_ios, color: _C.textPrimary),
onPressed: () => Get.back(),
),
),
body: SafeArea(
child: Center(
child: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 28),
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 440),
child: Form(
key: controller.formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.admin_panel_settings, size: 80, color: _C.accent),
const SizedBox(height: 24),
const Text(
'تسجيل مشرف جديد',
style: TextStyle(
color: _C.textPrimary,
fontSize: 26,
fontWeight: FontWeight.w800,
),
),
const SizedBox(height: 8),
const Text(
'أدخل بياناتك لتقديم طلب الإشراف',
style: TextStyle(color: _C.textSec, fontSize: 14),
),
const SizedBox(height: 40),
Container(
padding: const EdgeInsets.all(28),
decoration: BoxDecoration(
color: _C.card,
borderRadius: BorderRadius.circular(24),
border: Border.all(color: _C.accent.withOpacity(0.18), width: 1.2),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_buildLabel('الاسم الكامل', Icons.person),
const SizedBox(height: 10),
_buildTextField(
controller: controller.nameCtrl,
hint: 'أحمد محمود',
icon: Icons.person_outline,
),
const SizedBox(height: 20),
_buildLabel('رقم الهاتف', Icons.phone_android),
const SizedBox(height: 10),
_buildTextField(
controller: controller.phoneCtrl,
hint: '07XXXXXXXX',
keyboardType: TextInputType.phone,
icon: Icons.phone_outlined,
),
const SizedBox(height: 20),
_buildLabel('كلمة المرور', Icons.lock_outline),
const SizedBox(height: 10),
_buildTextField(
controller: controller.passCtrl,
hint: '••••••••',
obscureText: true,
icon: Icons.lock_outline,
),
const SizedBox(height: 40),
Obx(() => MaterialButton(
onPressed: controller.isLoading.value ? null : () => controller.register(),
color: _C.accent,
height: 55,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
child: controller.isLoading.value
? const CircularProgressIndicator(color: _C.bg)
: const Text(
'تقديم الطلب',
style: TextStyle(color: _C.bg, fontSize: 18, fontWeight: FontWeight.bold),
),
)),
],
),
),
],
),
),
),
),
),
),
);
}
Widget _buildLabel(String text, IconData icon) {
return Row(
children: [
Icon(icon, color: _C.accent, size: 16),
const SizedBox(width: 8),
Text(
text,
style: const TextStyle(color: _C.textSec, fontSize: 13, fontWeight: FontWeight.w600),
),
],
);
}
Widget _buildTextField({
required TextEditingController controller,
required String hint,
required IconData icon,
bool obscureText = false,
TextInputType keyboardType = TextInputType.text,
}) {
return TextFormField(
controller: controller,
obscureText: obscureText,
keyboardType: keyboardType,
style: const TextStyle(color: _C.textPrimary, fontSize: 16),
decoration: InputDecoration(
hintText: hint,
hintStyle: const TextStyle(color: _C.textSec),
filled: true,
fillColor: _C.inputBg,
prefixIcon: Icon(icon, color: _C.textSec),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(14), borderSide: BorderSide.none),
focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(14), borderSide: const BorderSide(color: _C.accent, width: 1.5)),
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
),
validator: (val) => (val == null || val.isEmpty) ? 'هذا الحقل مطلوب' : null,
);
}
}