diff --git a/apps/edr-passenger-web/backoffice/src/app/dashboard/page.tsx b/apps/edr-passenger-web/backoffice/src/app/dashboard/page.tsx index 6a91b5e12..88c4d5881 100644 --- a/apps/edr-passenger-web/backoffice/src/app/dashboard/page.tsx +++ b/apps/edr-passenger-web/backoffice/src/app/dashboard/page.tsx @@ -28,6 +28,7 @@ export default function DashboardPage() { const recentBookings = Array.isArray(recentBookingsData) ? recentBookingsData : recentBookingsData?.items || recentBookingsData?.data || []; + : recentBookingsData?.items || recentBookingsData?.data || []; const columns = [ { key: 'reference', label: 'Reference', render: (item: any) => item.bookingRef || item.reference }, @@ -49,7 +50,7 @@ export default function DashboardPage() {

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 ( -
- setTrainCode(e.target.value)} - required - /> - setOriginStationId(e.target.value)} - required - /> - setDestinationStationId(e.target.value)} - required - /> - setDepartureTime(e.target.value)} - required - /> - setArrivalTime(e.target.value)} - required - /> - setBasePrice(e.target.value)} - min="0" - /> - - - ); -}; - -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 ( -
- setReference(e.target.value)} - required - /> - setPassengerId(e.target.value)} - required - /> - setScheduleId(e.target.value)} - required - /> - setSeatId(e.target.value)} - required - /> - setPricePaid(e.target.value)} - min="0" - /> - - - ); -}; - -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}`); - }, -};