- validateJellyseerrSession: hit the authenticated /auth/me endpoint instead
of the public /status, and only report "expired" on 401/403. Transient
failures (offline, 5xx) are treated as valid so a flaky network no longer
logs the user out. The helper no longer mutates persisted state.
- SearchPage: clear the stale "connected" state via clearAllJellyseerData on
an expired session, gate the Discover validation effect behind isFocused,
cancel in-flight validation on unmount, and reset the connect prompt when
the tab loses focus so it can show again.
- settings.tv (seerr): sync the local server-URL field with settings so a
late-arriving stored/plugin-locked URL isn't shown stale or overwritten.
- useJellyseerr: add setJellyseerrUser/updateSettings to clearAllJellyseerData
deps to avoid a stale closure.
- TVJellyseerrSearchResults: scale poster/avatar dimensions and use the
scaled vertical padding (per review).
- translations: drop manual sv.json keys (Crowdin syncs from en.json).
Claude-Session: https://claude.ai/code/session_016Hhu5DruGLPhdP4LAoy1Xd
The filter badges are the first row in the results ScrollView; their
focus-scale animation and shadow extended above the ScrollView's top
edge and got clipped. Add paddingTop to the content container.
Claude-Session: https://claude.ai/code/session_016Hhu5DruGLPhdP4LAoy1Xd
The TV search/discover page had three competing left-edge paddings:
the Library/Discover badges used HORIZONTAL_PADDING (60), the Jellyseerr
discover sections used SCALE_PADDING (20), while the rest of the app
(home rows, library sections, loading skeleton) uses
sizes.padding.horizontal. This left the filter badges visibly
misaligned with the content grid below them.
Unify the badges and the Jellyseerr discover/search sections onto
sizes.padding.horizontal so the filter row, section headers, and posters
share one edge — consistent with the home and library screens.
Claude-Session: https://claude.ai/code/session_016Hhu5DruGLPhdP4LAoy1Xd
- Match the loading skeleton to TVSearchSection's scaled layout (poster
width, item gap, edge padding, heading, poster radius) so placeholders
line up with the real content.
- Move the native search field up ~50px (drop marginTop).
- Remove the downward focus guide that re-captured upward focus, so
pressing up from the native search now reaches the tab bar.
Add a local `tv-search` Expo module that hosts SwiftUI's `.searchable`
in a UIHostingController (adapted from expo-tvos-search, minus its native
results grid). It emits typed text to React Native so the existing search
pipeline and custom TV results grid are reused. Handles the RN-tvOS remote
gesture release needed for keyboard input on device.
Wire it into TVSearchPage as a sticky header above the scrollable results,
with a TVFocusGuideView bridge so focus can move from the tab bar into the
native search field.
Render titled option groups as nested Menu submenus instead of flat
Pickers, and convert the Discover filters from ContextMenu to Menu.
Keeps single-tap-to-open behavior (ContextMenu requires a long press
and reads as a context menu) while giving the nicer nested grouping.
Native Button no longer renders RN <Text> children in SDK 55; use the
label prop. Wrap both buttons in a single Host + HStack with a trailing
Spacer so they sit flush-left with no centering inset.