Skip to content

Commit 2ec0cf1

Browse files
Clément VALENTINclaude
andcommitted
fix(web): sync OfferSelector state on page navigation
Simplify the effect that syncs selector dropdowns with the selected offer. Previously, tracking lastSyncedOfferId in state caused sync issues when navigating away and back to the Dashboard - the energy provider would not appear without a manual page refresh. Now the selectors are always synchronized when selectedOffer becomes available, ensuring proper display after page navigation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 96120b7 commit 2ec0cf1

File tree

1 file changed

+15
-22
lines changed

1 file changed

+15
-22
lines changed

apps/web/src/components/OfferSelector.tsx

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -95,32 +95,25 @@ export default function OfferSelector({
9595
return allOffers.find(o => o.id === selectedOfferId) || null
9696
}, [selectedOfferId, allOffers])
9797

98-
// Initialize/sync selectors from selected offer
99-
// This effect handles two cases:
100-
// 1. Initial mount with a selectedOfferId - wait for offers to load then sync
101-
// 2. selectedOfferId prop changes externally - sync to new offer
102-
// We track which offer we've synced to avoid interfering with manual user selection
103-
const [lastSyncedOfferId, setLastSyncedOfferId] = useState<string | null | undefined>(undefined)
104-
98+
// Sync selectors when selectedOffer changes (after data is loaded)
99+
// This handles:
100+
// 1. Initial mount - wait for offers to load, then sync
101+
// 2. Page navigation (back to Dashboard) - offers reload, sync when ready
102+
// 3. External offer change - sync immediately
105103
useEffect(() => {
106104
if (selectedOffer) {
107-
// We have a valid offer - sync the selectors if not already synced to this offer
108-
if (lastSyncedOfferId !== selectedOffer.id) {
109-
setSelectedProviderId(selectedOffer.provider_id)
110-
setSelectedOfferType(selectedOffer.offer_type)
111-
setLastSyncedOfferId(selectedOffer.id)
112-
}
105+
// Always sync when selectedOffer is available
106+
// This ensures selectors are populated after page navigation
107+
setSelectedProviderId(selectedOffer.provider_id)
108+
setSelectedOfferType(selectedOffer.offer_type)
113109
} else if (selectedOfferId === null || selectedOfferId === undefined) {
114-
// Offer was cleared externally - reset selectors
115-
if (lastSyncedOfferId !== null) {
116-
setSelectedProviderId(null)
117-
setSelectedOfferType(null)
118-
setLastSyncedOfferId(null)
119-
}
110+
// Offer was cleared - reset selectors
111+
setSelectedProviderId(null)
112+
setSelectedOfferType(null)
120113
}
121-
// Note: when selectedOfferId is set but selectedOffer is null (offers loading),
122-
// we wait - the effect will re-run when offers finish loading
123-
}, [selectedOffer, selectedOfferId, lastSyncedOfferId])
114+
// When selectedOfferId is set but offers not loaded yet, wait
115+
// The effect re-runs when allOffers populates and selectedOffer becomes non-null
116+
}, [selectedOffer, selectedOfferId])
124117

125118
// Reset offer type when provider changes
126119
const handleProviderChange = (providerId: string | null) => {

0 commit comments

Comments
 (0)