@@ -13,6 +13,7 @@ import BogButton from "@/components/BogButton/BogButton";
1313import { CancelRideModal } from "../CancelRideModal" ;
1414import { getStudentStatusChipStyle } from "../RideCard" ;
1515import styles from "./styles.module.css" ;
16+ import { useRouteUpdates } from "@/components/NotificationProvider/useRouteUpdates" ;
1617
1718const CANCELLABLE_STATUSES = new Set ( [ "Requested" , "Scheduled" ] ) ;
1819
@@ -190,57 +191,67 @@ export default function RideDetailPage({
190191 } , [ params ] ) ;
191192
192193 // Fetch route data
193- useEffect ( ( ) => {
194+ const fetchRoute = useCallback ( async ( ) => {
194195 if ( ! routeId || sessionStatus !== "authenticated" || ! session ?. user ?. userId )
195196 return ;
196197
197- const fetchRoute = async ( ) => {
198- try {
199- const res = await fetch ( `/api/routes/${ routeId } ` ) ;
200-
201- if ( ! res . ok ) {
202- if ( res . status === 404 ) {
203- throw new Error ( "Route not found" ) ;
204- } else if ( res . status === 403 ) {
205- throw new Error ( "You do not have access to this route" ) ;
206- }
207- throw new Error ( "Failed to fetch route" ) ;
208- }
198+ try {
199+ const res = await fetch ( `/api/routes/${ routeId } ` ) ;
209200
210- const routeData : RouteData = await res . json ( ) ;
211-
212- if ( session . user . type === "Student" ) {
213- const studentId = getStudentId ( routeData . student ) ;
214- if ( studentId !== session . user . userId ) {
215- throw new Error ( "You are not the student for this route" ) ;
216- }
217- } else if ( session . user . type === "Driver" ) {
218- const driverId = getDriverId ( routeData . driver ) ;
219- if ( driverId !== session . user . userId ) {
220- router . push ( "/rides" ) ;
221- return ;
222- }
223- } else {
224- throw new Error ( "Unauthorized" ) ;
201+ if ( ! res . ok ) {
202+ if ( res . status === 404 ) {
203+ throw new Error ( "Route not found" ) ;
204+ } else if ( res . status === 403 ) {
205+ throw new Error ( "You do not have access to this route" ) ;
225206 }
207+ throw new Error ( "Failed to fetch route" ) ;
208+ }
226209
227- setRoute ( routeData ) ;
228- setError ( null ) ;
210+ const routeData : RouteData = await res . json ( ) ;
229211
230- // Determine if chat is eligible (ride is today)
231- const chatEligible = isToday ( routeData . scheduledPickupTime ) ;
232- setIsChatEligible ( chatEligible ) ;
233- } catch ( e ) {
234- setError ( e instanceof Error ? e . message : "Failed to fetch route" ) ;
235- setRoute ( null ) ;
236- } finally {
237- setLoading ( false ) ;
212+ if ( session . user . type === "Student" ) {
213+ const studentId = getStudentId ( routeData . student ) ;
214+ if ( studentId !== session . user . userId ) {
215+ throw new Error ( "You are not the student for this route" ) ;
216+ }
217+ } else if ( session . user . type === "Driver" ) {
218+ const driverId = getDriverId ( routeData . driver ) ;
219+ if ( driverId !== session . user . userId ) {
220+ router . push ( "/rides" ) ;
221+ return ;
222+ }
223+ } else {
224+ throw new Error ( "Unauthorized" ) ;
238225 }
239- } ;
240226
241- fetchRoute ( ) ;
227+ setRoute ( routeData ) ;
228+ setError ( null ) ;
229+
230+ // Determine if chat is eligible (ride is today)
231+ const chatEligible = isToday ( routeData . scheduledPickupTime ) ;
232+ setIsChatEligible ( chatEligible ) ;
233+ } catch ( e ) {
234+ setError ( e instanceof Error ? e . message : "Failed to fetch route" ) ;
235+ setRoute ( null ) ;
236+ } finally {
237+ setLoading ( false ) ;
238+ }
242239 } , [ routeId , session , sessionStatus , router ] ) ;
243240
241+ useEffect ( ( ) => {
242+ // This effect starts an asynchronous API request.
243+ // eslint-disable-next-line react-hooks/set-state-in-effect
244+ void fetchRoute ( ) ;
245+ } , [ fetchRoute ] ) ;
246+
247+ // Refetch when this route changes elsewhere (status, driver, cancellation).
248+ useRouteUpdates (
249+ ( ) => {
250+ void fetchRoute ( ) ;
251+ } ,
252+ { routeId } ,
253+ ) ;
254+
244255 // Fetch locations
245256 useEffect ( ( ) => {
246257 if ( ! route ) return ;
0 commit comments