- GeminiService (integrations/gemini, @Global): extractDocument (OCR fields) + faceMatch; graceful if no GEMINI_API_KEY - documents: face-match now real via Gemini; POST /admin/documents/:id/ocr extracts fields for CS auto-fill - roles: PATCH /admin/users/:id/role (admin) + POST /platform/users/role (bootstrap via x-platform-secret) - config: gemini + platform.secret; .env.example entries Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
55 lines
1.9 KiB
Dart
Executable File
55 lines
1.9 KiB
Dart
Executable File
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:sefer_driver/controller/auth/onboarding_controller.dart';
|
|
import 'package:sefer_driver/onbording_page.dart'; // تأكد من مسار الـ Widgets الداخلية
|
|
import 'package:sefer_driver/views/widgets/elevated_btn.dart';
|
|
|
|
class OnBoardingPage extends StatelessWidget {
|
|
const OnBoardingPage({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// حقن الكونترولر مرة واحدة
|
|
final OnBoardingControllerImp controller =
|
|
Get.put(OnBoardingControllerImp());
|
|
|
|
return Scaffold(
|
|
backgroundColor: Colors.white, // خلفية بيضاء ثابتة لمنع الرمش
|
|
body: SafeArea(
|
|
child: Column(
|
|
children: [
|
|
// مساحة علوية مرنة
|
|
const Spacer(flex: 1),
|
|
|
|
// منطقة العرض الرئيسية (Slider)
|
|
SizedBox(
|
|
height: Get.height *
|
|
0.6, // تقليل الارتفاع قليلاً لتناسب الشاشات المختلفة
|
|
child: const CustomSliderOnBoarding(),
|
|
),
|
|
|
|
// منطقة النقاط (Dots)
|
|
const SizedBox(height: 20),
|
|
const CustomDotControllerOnBoarding(),
|
|
|
|
// مساحة سفلية
|
|
const Spacer(flex: 2),
|
|
|
|
// زر المتابعة
|
|
Padding(
|
|
padding: const EdgeInsets.only(bottom: 30.0),
|
|
child: GetBuilder<OnBoardingControllerImp>(
|
|
builder: (controller) => MyElevatedButton(
|
|
title: controller.isLastPage ? "Start".tr : "Next".tr,
|
|
onPressed: () => controller.next(),
|
|
// width: Get.width * 0.8, // عرض ثابت للزر
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|