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>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9909d9b4c1
commit
4d8414c96b
@@ -0,0 +1,120 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('Back swipe dismiss interrupted by route push', (tester) async {
|
||||
// final scaffoldKey = GlobalKey();
|
||||
|
||||
await tester.pumpWidget(
|
||||
GetCupertinoApp(
|
||||
popGesture: true,
|
||||
home: CupertinoPageScaffold(
|
||||
// key: scaffoldKey,
|
||||
child: Center(
|
||||
child: CupertinoButton(
|
||||
onPressed: () {
|
||||
Get.to(() => const CupertinoPageScaffold(
|
||||
child: Center(child: Text('route')),
|
||||
));
|
||||
},
|
||||
child: const Text('push'),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// Check the basic iOS back-swipe dismiss transition. Dragging the pushed
|
||||
// route halfway across the screen will trigger the iOS dismiss animation
|
||||
|
||||
await tester.tap(find.text('push'));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('route'), findsOneWidget);
|
||||
expect(find.text('push'), findsNothing);
|
||||
|
||||
var gesture = await tester.startGesture(const Offset(5, 300));
|
||||
await gesture.moveBy(const Offset(400, 0));
|
||||
await gesture.up();
|
||||
await tester.pump();
|
||||
expect(
|
||||
// The 'route' route has been dragged to the right, halfway across
|
||||
// the screen
|
||||
tester.getTopLeft(find.ancestor(
|
||||
of: find.text('route'),
|
||||
matching: find.byType(CupertinoPageScaffold))),
|
||||
const Offset(400, 0),
|
||||
);
|
||||
expect(
|
||||
// The 'push' route is sliding in from the left.
|
||||
tester
|
||||
.getTopLeft(find.ancestor(
|
||||
of: find.text('push'),
|
||||
matching: find.byType(CupertinoPageScaffold)))
|
||||
.dx,
|
||||
0,
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('push'), findsOneWidget);
|
||||
expect(
|
||||
tester.getTopLeft(find.ancestor(
|
||||
of: find.text('push'), matching: find.byType(CupertinoPageScaffold))),
|
||||
Offset.zero,
|
||||
);
|
||||
expect(find.text('route'), findsNothing);
|
||||
|
||||
// Run the dismiss animation 60%, which exposes the route "push" button,
|
||||
// and then press the button.
|
||||
|
||||
await tester.tap(find.text('push'));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('route'), findsOneWidget);
|
||||
expect(find.text('push'), findsNothing);
|
||||
|
||||
gesture = await tester.startGesture(const Offset(5, 300));
|
||||
await gesture.moveBy(const Offset(400, 0)); // Drag halfway.
|
||||
await gesture.up();
|
||||
// Trigger the snapping animation.
|
||||
// Since the back swipe drag was brought to >=50% of the screen, it will
|
||||
// self snap to finish the pop transition as the gesture is lifted.
|
||||
//
|
||||
// This drag drop animation is 400ms when dropped exactly halfway
|
||||
// (800 / [pixel distance remaining], see
|
||||
// _CupertinoBackGestureController.dragEnd). It follows a curve that is very
|
||||
// steep initially.
|
||||
await tester.pump();
|
||||
expect(
|
||||
tester.getTopLeft(find.ancestor(
|
||||
of: find.text('route'),
|
||||
matching: find.byType(CupertinoPageScaffold))),
|
||||
const Offset(400, 0),
|
||||
);
|
||||
// Let the dismissing snapping animation go 60%.
|
||||
await tester.pump(const Duration(milliseconds: 240));
|
||||
expect(
|
||||
tester
|
||||
.getTopLeft(find.ancestor(
|
||||
of: find.text('route'),
|
||||
matching: find.byType(CupertinoPageScaffold)))
|
||||
.dx,
|
||||
moreOrLessEquals(798, epsilon: 1),
|
||||
);
|
||||
|
||||
// Use the navigator to push a route instead of tapping the 'push' button.
|
||||
// The topmost route (the one that's animating away), ignores input while
|
||||
// the pop is underway because route.navigator.userGestureInProgress.
|
||||
Get.to(() => const CupertinoPageScaffold(
|
||||
child: Center(child: Text('route')),
|
||||
));
|
||||
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('route'), findsOneWidget);
|
||||
expect(find.text('push'), findsNothing);
|
||||
expect(
|
||||
tester
|
||||
.state<NavigatorState>(find.byType(Navigator))
|
||||
.userGestureInProgress,
|
||||
false,
|
||||
);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user