Dashboard
-
Welcome back! Here's what's happening today.
+
Hello, welcome back! Here's what's happening today.
diff --git a/apps/edr-passenger-web/backoffice/src/types/edr.ts b/apps/edr-passenger-web/backoffice/src/types/edr.ts
index 91bdea160..cc8f8639b 100644
--- a/apps/edr-passenger-web/backoffice/src/types/edr.ts
+++ b/apps/edr-passenger-web/backoffice/src/types/edr.ts
@@ -1 +1,442 @@
-import { Passenger } from '@edr/types';\n\n// Enhanced Booking Types\nexport interface Booking {\n id: string;\n bookingRef: string;\n passengerId: string;\n passenger?: Passenger.IPassenger;\n scheduleId: string;\n status: 'DRAFT' | 'PENDING_PAYMENT' | 'CONFIRMED' | 'CANCELLED' | 'COMPLETED' | 'NO_SHOW' | 'REFUNDED';\n currency: string;\n totalMinor: number;\n adultCount: number;\n childCount: number;\n displayCurrency?: string;\n displayTotalMinor?: number;\n bookingType: string;\n contactEmail?: string;\n contactPhone?: string;\n source: string;\n promoCode?: string;\n paidAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// Station Types\nexport interface Station {\n id: string;\n code: string;\n name: string;\n city: string;\n countryCode?: string;\n isOperational: boolean;\n timezone: string;\n lat: number;\n lng: number;\n createdAt: string;\n}\n\n// Train Types\nexport interface Train {\n id: string;\n number: string;\n name: string;\n operatorId: string;\n operatorName?: string;\n description?: string;\n isActive: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n// Coach Types\nexport interface Coach {\n id: string;\n coachNumber: string;\n label: string;\n seatClassId: string;\n coachType?: string;\n mode: string;\n seatArrangement?: string;\n bedArrangement?: string;\n amenities?: any;\n totalUnits: number;\n isActive: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n// Schedule Types\nexport interface TrainSchedule {\n id: string;\n trainId: string;\n routeId?: string;\n originStationId: string;\n destinationStationId: string;\n departureAt: string;\n arrivalAt: string;\n durationMinutes: number;\n status: 'SCHEDULED' | 'BOARDING' | 'EN_ROUTE' | 'ARRIVED' | 'CANCELLED' | 'DELAYED';\n stopsCount: number;\n reservedCount: number;\n onTimePercent: number;\n carbonRating: string;\n notes?: string;\n train?: Train;\n originStation?: Station;\n destinationStation?: Station;\n}\n\n// Route Types\nexport interface Route {\n id: string;\n code: string;\n name: string;\n description?: string;\n effectiveFrom: string;\n effectiveUntil?: string;\n active: boolean;\n createdAt: string;\n stops?: RouteStop[];\n fareRules?: RouteFareRule[];\n}\n\nexport interface RouteStop {\n id: string;\n routeId: string;\n stationId: string;\n sequence: number;\n distanceKm?: number;\n createdAt: string;\n}\n\nexport interface RouteFareRule {\n id: string;\n routeId: string;\n seatClassId: string;\n passengerCategory: 'ADULT' | 'CHILD';\n baseFareMinor: number;\n discountPercent?: number;\n taxPercent?: number;\n surchargeMinor?: number;\n currency: string;\n validFrom: string;\n validUntil?: string;\n createdAt: string;\n}\n\n// Seat Types\nexport interface Seat {\n id: string;\n coachId: string;\n row: number;\n col: string;\n label: string;\n seatNumber?: string;\n kind: 'STANDARD' | 'PREMIUM' | 'ACCESSIBLE';\n status: 'AVAILABLE' | 'HELD' | 'BOOKED' | 'BLOCKED';\n heldUntil?: string;\n isWindow: boolean;\n isAisle: boolean;\n bedPosition?: string;\n premiumFeeMinor: number;\n eligibility?: string;\n}\n\nexport interface SeatClass {\n id: string;\n name: string;\n description?: string;\n basePrice: number;\n isActive: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n// Payment Types\nexport interface PaymentIntent {\n id: string;\n bookingId: string;\n amountMinor: number;\n currency: string;\n method: 'TELEBIRR' | 'CBE_BIRR' | 'EBIRR' | 'CARD' | 'WALLET' | 'WAAFI';\n provider?: string;\n status: 'REQUIRES_ACTION' | 'PROCESSING' | 'SUCCEEDED' | 'FAILED' | 'CANCELLED' | 'REFUNDED';\n providerRef?: string;\n merchantOrderId?: string;\n providerOrderId?: string;\n providerTxnId?: string;\n paidAt?: string;\n refundedAt?: string;\n failureCode?: string;\n failureMessage?: string;\n expiresAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// Agent Types\nexport interface Agent {\n id: string;\n userId: string;\n agentCode: string;\n stationId?: string;\n commissionRate: number;\n active: boolean;\n createdAt: string;\n user?: any;\n}\n\nexport interface AgentShift {\n id: string;\n agentId: string;\n openedAt: string;\n closedAt?: string;\n openingBalance: number;\n closingBalance?: number;\n reconciled: boolean;\n notes?: string;\n}\n\n// Loyalty Types\nexport interface LoyaltyAccount {\n id: string;\n passengerId: string;\n pointsBalance: number;\n lifetimePoints: number;\n tier: 'BRONZE' | 'SILVER' | 'GOLD' | 'PLATINUM';\n tierUpdatedAt?: string;\n updatedAt: string;\n}\n\nexport interface LoyaltyReward {\n id: string;\n accountId: string;\n title: string;\n costPoints: number;\n available: boolean;\n description?: string;\n}\n\n// Wallet Types\nexport interface WalletAccount {\n id: string;\n passengerId: string;\n balanceMinor: number;\n status: string;\n holdMinor: number;\n currency: string;\n updatedAt: string;\n}\n\n// Notification Types\nexport interface NotificationTemplate {\n id: string;\n code: string;\n channel: string;\n subject?: string;\n bodyTemplate: string;\n active: boolean;\n createdAt: string;\n}\n\n// Promotion Types\nexport interface Promotion {\n id: string;\n title: string;\n subtitle?: string;\n code: string;\n percentOff?: number;\n amountOffMinor?: number;\n validUntil: string;\n ctaLabel?: string;\n deepLink?: string;\n active: boolean;\n createdAt: string;\n}\n\n// Support Types\nexport interface SupportConversation {\n id: string;\n userId: string;\n assignedAgentId?: string;\n status: 'OPEN' | 'RESOLVED' | 'CLOSED';\n createdAt: string;\n messages?: SupportMessage[];\n}\n\nexport interface SupportMessage {\n id: string;\n conversationId: string;\n sender: 'USER' | 'BOT' | 'AGENT';\n text: string;\n attachments?: any;\n createdAt: string;\n}\n\n// Fraud Types\nexport interface FraudAlert {\n id: string;\n userId: string;\n eventType: string;\n triggeredRules: string[];\n context: any;\n severity: string;\n acknowledged: boolean;\n createdAt: string;\n}\n\nexport interface FraudRule {\n id: string;\n type: string;\n enabled: boolean;\n threshold: number;\n config?: any;\n createdAt: string;\n updatedAt: string;\n}\n\n// Audit Types\nexport interface AuditLog {\n id: string;\n userId?: string;\n action: string;\n entityType: string;\n entityId?: string;\n oldData?: any;\n newData?: any;\n ipAddress?: string;\n userAgent?: string;\n createdAt: string;\n}\n\n// Dashboard Types\nexport interface DashboardStats {\n totalBookings: number;\n totalRevenue: number;\n totalPassengers: number;\n activeTrips: number;\n bookingsToday: number;\n revenueToday: number;\n occupancyRate: number;\n averageTicketPrice: number;\n cancellationRate: number;\n onTimePerformance: number;\n}\n\nexport interface RevenueData {\n date: string;\n revenue: number;\n bookings: number;\n}\n\n// Filter Types\nexport interface BookingFilters {\n status?: string;\n dateFrom?: string;\n dateTo?: string;\n search?: string;\n source?: string;\n paymentStatus?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface PassengerFilters {\n search?: string;\n verified?: boolean;\n nationality?: string;\n registrationDateFrom?: string;\n registrationDateTo?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface PaymentFilters {\n status?: string;\n method?: string;\n dateFrom?: string;\n dateTo?: string;\n amountFrom?: number;\n amountTo?: number;\n page?: number;\n pageSize?: number;\n}\n\n// Live Tracking Types\nexport interface TripLiveStatus {\n id: string;\n scheduleId: string;\n state: string;\n currentLocationLabel?: string;\n progressPercent: number;\n delayMinutes: number;\n currentSpeedKph?: number;\n platformLabel?: string;\n updatedAt: string;\n}\n\nexport interface StationCrowdSignal {\n id: string;\n stationId: string;\n level: string;\n label: string;\n statusLabel: string;\n confidence?: number;\n observedAt?: string;\n updatedAt: string;\n}\n\n// Food & Dining Types\nexport interface MenuCategory {\n id: string;\n name: string;\n}\n\nexport interface MenuItem {\n id: string;\n scheduleId: string;\n categoryId: string;\n name: string;\n priceMinor: number;\n currency: string;\n available: boolean;\n availableUntil?: string;\n}\n\nexport interface FoodOrder {\n id: string;\n bookingId: string;\n status: 'PENDING' | 'PREPARING' | 'READY' | 'DELIVERED' | 'CANCELLED';\n totalMinor: number;\n currency: string;\n specialInstructions?: string;\n estimatedReadyAt?: string;\n createdAt: string;\n}\n\n// Verifayda Types\nexport interface VerifaydaVerification {\n id: string;\n bookingId?: string;\n nationalId: string;\n requestPayload: any;\n responsePayload?: any;\n verified: boolean;\n failureReason?: string;\n verifiedAt?: string;\n createdAt: string;\n}\n\n// Admin User Types\nexport interface AdminUser {\n id: string;\n email: string;\n fullName: string;\n role: 'ADMIN' | 'AGENT' | 'SUPERVISOR' | 'STAFF';\n active: boolean;\n lastLoginAt?: string;\n createdAt: string;\n}\n
\ No newline at end of file
+import { Passenger } from '@edr/types';
+
+// Enhanced Booking Types
+export interface Booking {
+ id: string;
+ bookingRef: string;
+ passengerId: string;
+ passenger?: Passenger.IPassenger;
+ scheduleId: string;
+ status: 'DRAFT' | 'PENDING_PAYMENT' | 'CONFIRMED' | 'CANCELLED' | 'COMPLETED' | 'NO_SHOW' | 'REFUNDED';
+ currency: string;
+ totalMinor: number;
+ adultCount: number;
+ childCount: number;
+ displayCurrency?: string;
+ displayTotalMinor?: number;
+ bookingType: string;
+ contactEmail?: string;
+ contactPhone?: string;
+ source: string;
+ promoCode?: string;
+ paidAt?: string;
+ createdAt: string;
+ updatedAt: string;
+}
+
+// Station Types
+export interface Station {
+ id: string;
+ code: string;
+ name: string;
+ city: string;
+ countryCode?: string;
+ isOperational: boolean;
+ timezone: string;
+ lat: number;
+ lng: number;
+ createdAt: string;
+}
+
+// Train Types
+export interface Train {
+ id: string;
+ number: string;
+ name: string;
+ operatorId: string;
+ operatorName?: string;
+ description?: string;
+ isActive: boolean;
+ createdAt: string;
+ updatedAt: string;
+}
+
+// Coach Types
+export interface Coach {
+ id: string;
+ coachNumber: string;
+ label: string;
+ seatClassId: string;
+ coachType?: string;
+ mode: string;
+ seatArrangement?: string;
+ bedArrangement?: string;
+ amenities?: any;
+ totalUnits: number;
+ isActive: boolean;
+ createdAt: string;
+ updatedAt: string;
+}
+
+// Schedule Types
+export interface TrainSchedule {
+ id: string;
+ trainId: string;
+ routeId?: string;
+ originStationId: string;
+ destinationStationId: string;
+ departureAt: string;
+ arrivalAt: string;
+ durationMinutes: number;
+ status: 'SCHEDULED' | 'BOARDING' | 'EN_ROUTE' | 'ARRIVED' | 'CANCELLED' | 'DELAYED';
+ stopsCount: number;
+ reservedCount: number;
+ onTimePercent: number;
+ carbonRating: string;
+ notes?: string;
+ train?: Train;
+ originStation?: Station;
+ destinationStation?: Station;
+}
+
+// Route Types
+export interface Route {
+ id: string;
+ code: string;
+ name: string;
+ description?: string;
+ effectiveFrom: string;
+ effectiveUntil?: string;
+ active: boolean;
+ createdAt: string;
+ stops?: RouteStop[];
+ fareRules?: RouteFareRule[];
+}
+
+export interface RouteStop {
+ id: string;
+ routeId: string;
+ stationId: string;
+ sequence: number;
+ distanceKm?: number;
+ createdAt: string;
+}
+
+export interface RouteFareRule {
+ id: string;
+ routeId: string;
+ seatClassId: string;
+ passengerCategory: 'ADULT' | 'CHILD';
+ baseFareMinor: number;
+ discountPercent?: number;
+ taxPercent?: number;
+ surchargeMinor?: number;
+ currency: string;
+ validFrom: string;
+ validUntil?: string;
+ createdAt: string;
+}
+
+// Seat Types
+export interface Seat {
+ id: string;
+ coachId: string;
+ row: number;
+ col: string;
+ label: string;
+ seatNumber?: string;
+ kind: 'STANDARD' | 'PREMIUM' | 'ACCESSIBLE';
+ status: 'AVAILABLE' | 'HELD' | 'BOOKED' | 'BLOCKED';
+ heldUntil?: string;
+ isWindow: boolean;
+ isAisle: boolean;
+ bedPosition?: string;
+ premiumFeeMinor: number;
+ eligibility?: string;
+}
+
+export interface SeatClass {
+ id: string;
+ name: string;
+ description?: string;
+ basePrice: number;
+ isActive: boolean;
+ createdAt: string;
+ updatedAt: string;
+}
+
+// Payment Types
+export interface PaymentIntent {
+ id: string;
+ bookingId: string;
+ amountMinor: number;
+ currency: string;
+ method: 'TELEBIRR' | 'CBE_BIRR' | 'EBIRR' | 'CARD' | 'WALLET' | 'WAAFI';
+ provider?: string;
+ status: 'REQUIRES_ACTION' | 'PROCESSING' | 'SUCCEEDED' | 'FAILED' | 'CANCELLED' | 'REFUNDED';
+ providerRef?: string;
+ merchantOrderId?: string;
+ providerOrderId?: string;
+ providerTxnId?: string;
+ paidAt?: string;
+ refundedAt?: string;
+ failureCode?: string;
+ failureMessage?: string;
+ expiresAt?: string;
+ createdAt: string;
+ updatedAt: string;
+}
+
+// Agent Types
+export interface Agent {
+ id: string;
+ userId: string;
+ agentCode: string;
+ stationId?: string;
+ commissionRate: number;
+ active: boolean;
+ createdAt: string;
+ user?: any;
+}
+
+export interface AgentShift {
+ id: string;
+ agentId: string;
+ openedAt: string;
+ closedAt?: string;
+ openingBalance: number;
+ closingBalance?: number;
+ reconciled: boolean;
+ notes?: string;
+}
+
+// Loyalty Types
+export interface LoyaltyAccount {
+ id: string;
+ passengerId: string;
+ pointsBalance: number;
+ lifetimePoints: number;
+ tier: 'BRONZE' | 'SILVER' | 'GOLD' | 'PLATINUM';
+ tierUpdatedAt?: string;
+ updatedAt: string;
+}
+
+export interface LoyaltyReward {
+ id: string;
+ accountId: string;
+ title: string;
+ costPoints: number;
+ available: boolean;
+ description?: string;
+}
+
+// Wallet Types
+export interface WalletAccount {
+ id: string;
+ passengerId: string;
+ balanceMinor: number;
+ status: string;
+ holdMinor: number;
+ currency: string;
+ updatedAt: string;
+}
+
+// Notification Types
+export interface NotificationTemplate {
+ id: string;
+ code: string;
+ channel: string;
+ subject?: string;
+ bodyTemplate: string;
+ active: boolean;
+ createdAt: string;
+}
+
+// Promotion Types
+export interface Promotion {
+ id: string;
+ title: string;
+ subtitle?: string;
+ code: string;
+ percentOff?: number;
+ amountOffMinor?: number;
+ validUntil: string;
+ ctaLabel?: string;
+ deepLink?: string;
+ active: boolean;
+ createdAt: string;
+}
+
+// Support Types
+export interface SupportConversation {
+ id: string;
+ userId: string;
+ assignedAgentId?: string;
+ status: 'OPEN' | 'RESOLVED' | 'CLOSED';
+ createdAt: string;
+ messages?: SupportMessage[];
+}
+
+export interface SupportMessage {
+ id: string;
+ conversationId: string;
+ sender: 'USER' | 'BOT' | 'AGENT';
+ text: string;
+ attachments?: any;
+ createdAt: string;
+}
+
+// Fraud Types
+export interface FraudAlert {
+ id: string;
+ userId: string;
+ eventType: string;
+ triggeredRules: string[];
+ context: any;
+ severity: string;
+ acknowledged: boolean;
+ createdAt: string;
+}
+
+export interface FraudRule {
+ id: string;
+ type: string;
+ enabled: boolean;
+ threshold: number;
+ config?: any;
+ createdAt: string;
+ updatedAt: string;
+}
+
+// Audit Types
+export interface AuditLog {
+ id: string;
+ userId?: string;
+ action: string;
+ entityType: string;
+ entityId?: string;
+ oldData?: any;
+ newData?: any;
+ ipAddress?: string;
+ userAgent?: string;
+ createdAt: string;
+}
+
+// Dashboard Types
+export interface DashboardStats {
+ totalBookings: number;
+ totalRevenue: number;
+ totalPassengers: number;
+ activeTrips: number;
+ bookingsToday: number;
+ revenueToday: number;
+ occupancyRate: number;
+ averageTicketPrice: number;
+ cancellationRate: number;
+ onTimePerformance: number;
+}
+
+export interface RevenueData {
+ date: string;
+ revenue: number;
+ bookings: number;
+}
+
+// Filter Types
+export interface BookingFilters {
+ status?: string;
+ dateFrom?: string;
+ dateTo?: string;
+ search?: string;
+ source?: string;
+ paymentStatus?: string;
+ page?: number;
+ pageSize?: number;
+}
+
+export interface PassengerFilters {
+ search?: string;
+ verified?: boolean;
+ nationality?: string;
+ registrationDateFrom?: string;
+ registrationDateTo?: string;
+ page?: number;
+ pageSize?: number;
+}
+
+export interface PaymentFilters {
+ status?: string;
+ method?: string;
+ dateFrom?: string;
+ dateTo?: string;
+ amountFrom?: number;
+ amountTo?: number;
+ page?: number;
+ pageSize?: number;
+}
+
+// Live Tracking Types
+export interface TripLiveStatus {
+ id: string;
+ scheduleId: string;
+ state: string;
+ currentLocationLabel?: string;
+ progressPercent: number;
+ delayMinutes: number;
+ currentSpeedKph?: number;
+ platformLabel?: string;
+ updatedAt: string;
+}
+
+export interface StationCrowdSignal {
+ id: string;
+ stationId: string;
+ level: string;
+ label: string;
+ statusLabel: string;
+ confidence?: number;
+ observedAt?: string;
+ updatedAt: string;
+}
+
+// Food & Dining Types
+export interface MenuCategory {
+ id: string;
+ name: string;
+}
+
+export interface MenuItem {
+ id: string;
+ scheduleId: string;
+ categoryId: string;
+ name: string;
+ priceMinor: number;
+ currency: string;
+ available: boolean;
+ availableUntil?: string;
+}
+
+export interface FoodOrder {
+ id: string;
+ bookingId: string;
+ status: 'PENDING' | 'PREPARING' | 'READY' | 'DELIVERED' | 'CANCELLED';
+ totalMinor: number;
+ currency: string;
+ specialInstructions?: string;
+ estimatedReadyAt?: string;
+ createdAt: string;
+}
+
+// Verifayda Types
+export interface VerifaydaVerification {
+ id: string;
+ bookingId?: string;
+ nationalId: string;
+ requestPayload: any;
+ responsePayload?: any;
+ verified: boolean;
+ failureReason?: string;
+ verifiedAt?: string;
+ createdAt: string;
+}
+
+// Admin User Types
+export interface AdminUser {
+ id: string;
+ email: string;
+ fullName: string;
+ role: 'ADMIN' | 'AGENT' | 'SUPERVISOR' | 'STAFF';
+ active: boolean;
+ lastLoginAt?: string;
+ createdAt: string;
+}
diff --git a/apps/edr-passenger-web/portal/src/components/schedules/ScheduleForm.tsx b/apps/edr-passenger-web/portal/src/components/schedules/ScheduleForm.tsx
deleted file mode 100644
index 7174c3197..000000000
--- a/apps/edr-passenger-web/portal/src/components/schedules/ScheduleForm.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import { FormEvent, useState } from "react";
-import { Button, FormField } from "@edr/ui-common";
-
-export interface ScheduleFormPayload {
- trainCode: string;
- originStationId: string;
- destinationStationId: string;
- departureTime: string;
- arrivalTime: string;
- basePrice: number;
-}
-
-export interface ScheduleFormProps {
- onSubmit: (payload: ScheduleFormPayload) => void;
- isSubmitting?: boolean;
-}
-
-const ScheduleForm = ({ onSubmit, isSubmitting }: ScheduleFormProps) => {
- const [trainCode, setTrainCode] = useState("");
- const [originStationId, setOriginStationId] = useState("");
- const [destinationStationId, setDestinationStationId] = useState("");
- const [departureTime, setDepartureTime] = useState("");
- const [arrivalTime, setArrivalTime] = useState("");
- const [basePrice, setBasePrice] = useState("0");
-
- const handleSubmit = (event: FormEvent
) => {
- event.preventDefault();
- onSubmit({
- trainCode,
- originStationId,
- destinationStationId,
- departureTime,
- arrivalTime,
- basePrice: Number(basePrice),
- });
- };
-
- return (
-
- );
-};
-
-export default ScheduleForm;
diff --git a/apps/edr-passenger-web/portal/src/components/schedules/ScheduleTable.tsx b/apps/edr-passenger-web/portal/src/components/schedules/ScheduleTable.tsx
deleted file mode 100644
index 420372a53..000000000
--- a/apps/edr-passenger-web/portal/src/components/schedules/ScheduleTable.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import type { Passenger } from "@edr/types";
-import { Table, type TableColumn } from "@edr/ui-common";
-
-export interface ScheduleTableProps {
- schedules: Passenger.ISchedule[];
-}
-
-const columns: TableColumn[] = [
- { key: "trainCode", header: "Train" },
- { key: "status", header: "Status" },
- {
- key: "departureTime",
- header: "Departure",
- render: (row) => new Date(row.departureTime).toLocaleString(),
- },
- {
- key: "arrivalTime",
- header: "Arrival",
- render: (row) => new Date(row.arrivalTime).toLocaleString(),
- },
- {
- key: "basePrice",
- header: "Base price",
- render: (row) => row.basePrice.toFixed(2),
- },
-];
-
-const ScheduleTable = ({ schedules }: ScheduleTableProps) => (
- row.id}
- emptyMessage="No schedules yet"
- />
-);
-
-export default ScheduleTable;
diff --git a/apps/edr-passenger-web/portal/src/components/seats/SeatSelector.tsx b/apps/edr-passenger-web/portal/src/components/seats/SeatSelector.tsx
deleted file mode 100644
index 38af99fcd..000000000
--- a/apps/edr-passenger-web/portal/src/components/seats/SeatSelector.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import clsx from "clsx";
-import type { Passenger } from "@edr/types";
-
-export interface SeatSelectorProps {
- seats: Passenger.ISeat[];
- selectedSeatId?: string;
- onSelect: (seatId: string) => void;
-}
-
-const SeatSelector = ({
- seats,
- selectedSeatId,
- onSelect,
-}: SeatSelectorProps) => (
-
- {seats.map((seat) => {
- const isAvailable = seat.status === "AVAILABLE";
- const isSelected = seat.id === selectedSeatId;
- return (
-
- );
- })}
-
-);
-
-export default SeatSelector;
diff --git a/apps/edr-passenger-web/portal/src/components/tickets/TicketForm.tsx b/apps/edr-passenger-web/portal/src/components/tickets/TicketForm.tsx
deleted file mode 100644
index c717030bb..000000000
--- a/apps/edr-passenger-web/portal/src/components/tickets/TicketForm.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import { FormEvent, useState } from "react";
-import { Button, FormField } from "@edr/ui-common";
-
-import type { CreateTicketPayload } from "../../services/tickets.service";
-
-export interface TicketFormProps {
- onSubmit: (payload: CreateTicketPayload) => void;
- isSubmitting?: boolean;
-}
-
-const TicketForm = ({ onSubmit, isSubmitting }: TicketFormProps) => {
- const [reference, setReference] = useState("");
- const [passengerId, setPassengerId] = useState("");
- const [scheduleId, setScheduleId] = useState("");
- const [seatId, setSeatId] = useState("");
- const [pricePaid, setPricePaid] = useState("0");
-
- const handleSubmit = (event: FormEvent) => {
- event.preventDefault();
- onSubmit({
- reference,
- passengerId,
- scheduleId,
- seatId,
- pricePaid: Number(pricePaid),
- issuedAt: new Date().toISOString(),
- });
- };
-
- return (
-
- );
-};
-
-export default TicketForm;
diff --git a/apps/edr-passenger-web/portal/src/components/tickets/TicketTable.tsx b/apps/edr-passenger-web/portal/src/components/tickets/TicketTable.tsx
deleted file mode 100644
index eddc72a8d..000000000
--- a/apps/edr-passenger-web/portal/src/components/tickets/TicketTable.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import type { Passenger } from "@edr/types";
-import { Table, type TableColumn } from "@edr/ui-common";
-
-export interface TicketTableProps {
- tickets: Passenger.ITicket[];
-}
-
-const columns: TableColumn[] = [
- { key: "reference", header: "Reference" },
- { key: "passengerId", header: "Passenger" },
- { key: "status", header: "Status" },
- {
- key: "issuedAt",
- header: "Issued",
- render: (row) => new Date(row.issuedAt).toLocaleString(),
- },
- {
- key: "pricePaid",
- header: "Price",
- render: (row) => row.pricePaid.toFixed(2),
- },
-];
-
-const TicketTable = ({ tickets }: TicketTableProps) => (
- row.id}
- emptyMessage="No tickets yet"
- />
-);
-
-export default TicketTable;
diff --git a/apps/edr-passenger-web/portal/src/hooks/useSchedules.ts b/apps/edr-passenger-web/portal/src/hooks/useSchedules.ts
deleted file mode 100644
index e4fc7c2f7..000000000
--- a/apps/edr-passenger-web/portal/src/hooks/useSchedules.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { useQuery } from "@tanstack/react-query";
-
-import { schedulesService } from "../services/schedules.service";
-
-export const useSchedules = () =>
- useQuery({
- queryKey: ["schedules"],
- queryFn: schedulesService.list,
- });
-
-export const useSchedule = (id: string) =>
- useQuery({
- queryKey: ["schedules", id],
- queryFn: () => schedulesService.get(id),
- enabled: Boolean(id),
- });
diff --git a/apps/edr-passenger-web/portal/src/hooks/useStations.ts b/apps/edr-passenger-web/portal/src/hooks/useStations.ts
deleted file mode 100644
index 23b4040a0..000000000
--- a/apps/edr-passenger-web/portal/src/hooks/useStations.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { useQuery } from "@tanstack/react-query";
-
-import { stationsService } from "../services/stations.service";
-
-export const useStations = () =>
- useQuery({
- queryKey: ["stations"],
- queryFn: stationsService.list,
- });
diff --git a/apps/edr-passenger-web/portal/src/hooks/useTickets.ts b/apps/edr-passenger-web/portal/src/hooks/useTickets.ts
deleted file mode 100644
index f5fc84884..000000000
--- a/apps/edr-passenger-web/portal/src/hooks/useTickets.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { useQuery } from "@tanstack/react-query";
-
-import { ticketsService } from "../services/tickets.service";
-
-export const useTickets = () =>
- useQuery({
- queryKey: ["tickets"],
- queryFn: ticketsService.list,
- });
-
-export const useTicket = (id: string) =>
- useQuery({
- queryKey: ["tickets", id],
- queryFn: () => ticketsService.get(id),
- enabled: Boolean(id),
- });
diff --git a/apps/edr-passenger-web/portal/src/services/schedules.service.ts b/apps/edr-passenger-web/portal/src/services/schedules.service.ts
deleted file mode 100644
index 1b65bdc4b..000000000
--- a/apps/edr-passenger-web/portal/src/services/schedules.service.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import type { Passenger } from "@edr/types";
-
-import { api } from "../utils/api";
-
-export const schedulesService = {
- list: async (): Promise => {
- const { data } = await api.get("/schedules");
- return data.data;
- },
- get: async (id: string): Promise => {
- const { data } = await api.get(`/schedules/${id}`);
- return data.data;
- },
-};
diff --git a/apps/edr-passenger-web/portal/src/services/stations.service.ts b/apps/edr-passenger-web/portal/src/services/stations.service.ts
deleted file mode 100644
index 20010954a..000000000
--- a/apps/edr-passenger-web/portal/src/services/stations.service.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-// import type { IStation } from "../types";
-import { api } from "../utils/api";
-import type { Passenger } from "@edr/types";
-
-export const stationsService = {
- list: async (): Promise => {
- const { data } = await api.get("/stations");
- return data.data;
- },
- get: async (id: string): Promise => {
- const { data } = await api.get(`/stations/${id}`);
- return data.data;
- },
-};
diff --git a/apps/edr-passenger-web/portal/src/services/tickets.service.ts b/apps/edr-passenger-web/portal/src/services/tickets.service.ts
deleted file mode 100644
index 4a6c7ac85..000000000
--- a/apps/edr-passenger-web/portal/src/services/tickets.service.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import type { Passenger, PaginatedResponse } from "@edr/types";
-
-import { api } from "../utils/api";
-
-export interface CreateTicketPayload {
- reference: string;
- passengerId: string;
- scheduleId: string;
- seatId: string;
- pricePaid: number;
- issuedAt: string;
-}
-
-export const ticketsService = {
- list: async (): Promise> => {
- const { data } = await api.get("/tickets");
- return data.data;
- },
- get: async (id: string): Promise => {
- const { data } = await api.get(`/tickets/${id}`);
- return data.data;
- },
- create: async (payload: CreateTicketPayload): Promise => {
- const { data } = await api.post("/tickets", payload);
- return data.data;
- },
- cancel: async (id: string): Promise => {
- await api.delete(`/tickets/${id}`);
- },
-};