feat: Gemini AI (doc OCR + face match) + role-assignment endpoints
- 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>
This commit is contained in:
+54
@@ -0,0 +1,54 @@
|
||||
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, // عرض ثابت للزر
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user