From 19c1bc16cbc6725463890382365203824b7fd353 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Wed, 13 Mar 2024 15:57:30 -0400 Subject: [PATCH] fix(datetime): wheel picker shows consistently in overlays (#29147) Issue number: resolves #26234 --------- ## What is the current behavior? We use an IntersectionObserver to know when each picker column is visible so we can properly scroll the active option in each column into view. The IO callback passes an array of entries. Up until this PR, we have always grabbed the first entry in the array. The problem is that browsers will sometimes group multiple events into a single array. This means it's possible to have an event with `isIntersecting: false` and then another event with `isIntersecting: true` in the same callback. Since we always grabbed the first event we did not account for the instances where events were coalesced. This resulted in column options sometimes not scrolling into view when presented via an overlay. ## What is the new behavior? - Picker column now grabs the last event in the entries array. This represents the most recent threshold change. ## Does this introduce a breaking change? - [ ] Yes - [x] No ## Other information Dev build: `7.7.5-dev.11710347256.1954cae9` --- .../picker-column-internal/picker-column-internal.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/components/picker-column-internal/picker-column-internal.tsx b/core/src/components/picker-column-internal/picker-column-internal.tsx index 73b8dd34356..401c67c95af 100644 --- a/core/src/components/picker-column-internal/picker-column-internal.tsx +++ b/core/src/components/picker-column-internal/picker-column-internal.tsx @@ -92,7 +92,11 @@ export class PickerColumnInternal implements ComponentInterface { */ componentWillLoad() { const visibleCallback = (entries: IntersectionObserverEntry[]) => { - const ev = entries[0]; + /** + * Browsers will sometimes group multiple IO events into a single callback. + * As a result, we want to grab the last/most recent event in case there are multiple events. + */ + const ev = entries[entries.length - 1]; if (ev.isIntersecting) { const { activeItem, el } = this;