feat: implement core architecture, design system, localization, and trip features for both driver and rider apps.
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import '../data/models/trip_model.dart';
|
||||
|
||||
/// هل هذه الحالة نهائية (لا انتقالات منها)?
|
||||
bool isTerminalStatus(String status) {
|
||||
return status == 'cancelled' || status == 'no_drivers' || status == 'expired' || status == 'paid';
|
||||
}
|
||||
|
||||
/// حالة TripBloc الموحدة.
|
||||
class TripState extends Equatable {
|
||||
final TripRequestStatus requestStatus;
|
||||
final TripModel? trip;
|
||||
final String? driverName;
|
||||
final String? vehicleMake;
|
||||
final String? vehicleModel;
|
||||
final String? vehiclePlate;
|
||||
final String? vehicleColor;
|
||||
final double? driverLat;
|
||||
final double? driverLng;
|
||||
final double? driverHeading;
|
||||
final String? error;
|
||||
final bool rated;
|
||||
|
||||
const TripState({
|
||||
this.requestStatus = TripRequestStatus.idle,
|
||||
this.trip,
|
||||
this.driverName,
|
||||
this.vehicleMake,
|
||||
this.vehicleModel,
|
||||
this.vehiclePlate,
|
||||
this.vehicleColor,
|
||||
this.driverLat,
|
||||
this.driverLng,
|
||||
this.driverHeading,
|
||||
this.error,
|
||||
this.rated = false,
|
||||
});
|
||||
|
||||
TripState copyWith({
|
||||
TripRequestStatus? requestStatus,
|
||||
TripModel? trip,
|
||||
String? driverName,
|
||||
String? vehicleMake,
|
||||
String? vehicleModel,
|
||||
String? vehiclePlate,
|
||||
String? vehicleColor,
|
||||
double? driverLat,
|
||||
double? driverLng,
|
||||
double? driverHeading,
|
||||
String? error,
|
||||
bool? rated,
|
||||
bool clearError = false,
|
||||
bool clearDriver = false,
|
||||
}) {
|
||||
return TripState(
|
||||
requestStatus: requestStatus ?? this.requestStatus,
|
||||
trip: trip ?? this.trip,
|
||||
driverName: clearDriver ? null : (driverName ?? this.driverName),
|
||||
vehicleMake: clearDriver ? null : (vehicleMake ?? this.vehicleMake),
|
||||
vehicleModel: clearDriver ? null : (vehicleModel ?? this.vehicleModel),
|
||||
vehiclePlate: clearDriver ? null : (vehiclePlate ?? this.vehiclePlate),
|
||||
vehicleColor: clearDriver ? null : (vehicleColor ?? this.vehicleColor),
|
||||
driverLat: driverLat ?? this.driverLat,
|
||||
driverLng: driverLng ?? this.driverLng,
|
||||
driverHeading: driverHeading ?? this.driverHeading,
|
||||
error: clearError ? null : (error ?? this.error),
|
||||
rated: rated ?? this.rated,
|
||||
);
|
||||
}
|
||||
|
||||
/// هل هناك رحلة نشطة (ليست idle ولا terminal)?
|
||||
bool get hasActiveTrip =>
|
||||
trip != null &&
|
||||
requestStatus != TripRequestStatus.idle &&
|
||||
!isTerminalStatus(trip!.status);
|
||||
|
||||
/// هل يمكن إلغاء الرحلة حالياً?
|
||||
bool get canCancel {
|
||||
if (trip == null) return false;
|
||||
return ['searching', 'assigned', 'driver_arriving', 'driver_arrived']
|
||||
.contains(trip!.status);
|
||||
}
|
||||
|
||||
/// هل يمكن للمستخدم ركوب الرحلة (اكتملت)?
|
||||
bool get isCompleted => trip?.status == 'completed' || trip?.status == 'paid';
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
requestStatus,
|
||||
trip,
|
||||
driverName,
|
||||
vehicleMake,
|
||||
vehicleModel,
|
||||
vehiclePlate,
|
||||
vehicleColor,
|
||||
driverLat,
|
||||
driverLng,
|
||||
driverHeading,
|
||||
error,
|
||||
rated,
|
||||
];
|
||||
}
|
||||
|
||||
enum TripRequestStatus {
|
||||
idle,
|
||||
loading,
|
||||
searching,
|
||||
active, // assigned → in_progress
|
||||
completed,
|
||||
error,
|
||||
}
|
||||
Reference in New Issue
Block a user