diff --git a/.code-review-graph/graph.db b/.code-review-graph/graph.db new file mode 100644 index 0000000..d443a0b Binary files /dev/null and b/.code-review-graph/graph.db differ diff --git a/client/src/pages/TeslaTripPlanner.tsx b/client/src/pages/TeslaTripPlanner.tsx index 8ed4982..e013fd2 100644 --- a/client/src/pages/TeslaTripPlanner.tsx +++ b/client/src/pages/TeslaTripPlanner.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { toast } from 'sonner'; import { MapContainer, TileLayer, Marker, Polyline, Popup, useMap } from 'react-leaflet'; -import { useTesla, startTeslaConnect, disconnectTesla, sendToTeslaNav, wakeTesla, loginOwner, mintOwnerPairCode, redeemOwnerPairCode, type TeslaActiveRoute } from '../lib/tesla'; +import { useTesla, startTeslaConnect, disconnectTesla, sendToTeslaNav, wakeTesla, loginOwner, mintOwnerPairCode, redeemOwnerPairCode, fetchTeslaStatus, type TeslaActiveRoute } from '../lib/tesla'; import { isMockEnabled, getMockScenario, setMockScenario, resetMockDrive } from '../lib/teslaMock'; import { detectInCar } from '../lib/incar'; import { computeBatteryPlan, type BatteryAtStop, type BatteryRisk } from '../lib/batteryPlan'; @@ -2452,16 +2452,28 @@ export default function TeslaTripPlanner() { teslaStatus={tesla.status} teslaState={tesla.state} onConnectTesla={async () => { + // Pending action that runs after owner-login succeeds. Re-checks + // the server: if a Tesla token is already stored (e.g. the user + // OAuthed on their desktop and just paired this device), we skip + // the Tesla OAuth round-trip entirely. + const connectIfNeeded = async () => { + const fresh = await fetchTeslaStatus(); + if (fresh.connected) { + await tesla.refreshStatus(); + toast.success('Tesla connected', { + description: 'Carried over from your other device — ready to go.', + }); + return; + } + try { await startTeslaConnect(); } + catch { toast.error('Could not start Tesla OAuth'); } + }; if (tesla.owner?.required && !tesla.owner.authenticated) { - ownerLoginThenRef.current = async () => { - try { await startTeslaConnect(); } - catch { toast.error('Could not start Tesla OAuth'); } - }; + ownerLoginThenRef.current = connectIfNeeded; setOwnerLoginOpen(true); return; } - try { await startTeslaConnect(); } - catch { toast.error('Could not start Tesla OAuth'); } + await connectIfNeeded(); }} onDisconnectTesla={async () => { await disconnectTesla();