Skip to content

v2.9.4

Choose a tag to compare

@igorzheludkov igorzheludkov released this 25 Aug 19:42
· 73 commits to main since this release

Modal-sheet coordinates are corrected, not guessed

A Stack.Screen with presentation:'modal' is presented by UIKit inset from the top of the window, and React Native's layout system never sees that inset — measureInWindow, measure and measureLayout all report a y short by it. Measured on device (iPhone Air, RN 0.83/Fabric): a switch whose pixels sit at y=443.7pt reported y=375.7pt. Every frame on such a screen was wrong by one constant, so a tap aimed with a reported coordinate landed rows above the target — and read as a correct tap in the pixel diff.

The inset is now derived from the sheet's own measured height (viewportHeight - sheetHeight), not assumed from the safe area. It self-cancels where there is nothing to fix, adapts to a detented half sheet, and leaves a centred iPad-style sheet alone rather than shifting it on an invented number. Applied in get_screen_state, get_screen_layout, inspect_at_point, measure, tap's fiber strategy and swipe's scroll probe, so they keep agreeing with each other and with a screenshot. get_screen_state names the correction and its size when it applies.

tap's viewport probe now reads the app root instead of the first measurement starting at x=0 — inside a sheet that sized the sheet and reported every element on it as "below-viewport".

Switches and checkboxes are targetable

A Switch carries no onPress, so it appeared in no branch of the fiber walk and the only way to flip one was to guess an x off a screenshot. get_screen_state now lists switches with their value ([switch:ON] / [switch:OFF]), and tap(testID=…) / tap(component="Switch") resolves them. Identity is the component, not the handler — an app can render <Switch value={x} /> with no onValueChange and drive it from a gesture-handler row.

tap reads the value back after the gesture and returns switch.before / switch.after / switch.changed. A pixel diff is identical for a correct toggle and one that flipped the neighbouring row, so this is the only signal that tells them apart.

get_request_details stops re-dumping the request

Narrowing with query still printed the full request headers — including a ~1.5KB bearer token — and the whole GraphQL query text, on every call. A query now renders only the queried body; include:"request" | "response" | "both" overrides. Credential headers (authorization, cookie, x-api-key, …) print as scheme + length; verbose:true shows the value.

redux_dispatch takes a batch

action accepts an array, dispatched in order against the same store in one round trip, with returnPath read once at the end. Restoring a settings slice was 17 sequential calls.

No more false "Disconnected" banner

"Disconnected. Showing cached data" is printed only on measured evidence — an absent socket. A stale execution context or a gap in recorded CDP traffic are inferences that survive a perfectly healthy app; they now report "status unknown for this read" and point at ensure_connection, rather than prompting a scan_metro that throws away the app's navigation stack, auth and in-memory caches.