Skip to content

feat: add native Market pager headers and stabilize lists - #99

Merged
huhuanming merged 14 commits into
mainfrom
codex/ok-62871-native-list-avatar-background
Sep 12, 2026
Merged

huhuanming merged 14 commits into
mainfrom
codex/ok-62871-native-list-avatar-background

Conversation

@huhuanming

@huhuanming huhuanming commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

3.0.123 follow-up

This branch intentionally keeps the existing iOS Image request-supersession guard in the same published commit chain and adds the Android Market pagination-anchor repair; no commit was bypassed or rewritten.

  • Android NativeList: detect Market-only pagination append transitions, capture the actual first visible row key and decorated top immediately before forced relayout, then restore that anchor after DiffUtil completion
  • iOS Image: guard view writes against superseded requests (existing branch commit retained as requested)
  • publish all 39 native packages as unified version 3.0.123 through the official package-publish workflow

Validation and publication

  • NativeList Jest: 6 suites / 70 tests passed
  • NativeList typecheck: passed
  • Image Jest: 1 suite / 16 tests passed
  • Image typecheck: passed
  • JDK 17 :onekeyfe_react-native-native-list:compileDebugKotlin: passed
  • official publish workflow: https://github.com/OneKeyHQ/app-modules/actions/runs/34676571964 — success
  • official registry: 39/39 packages exist at 3.0.123 and all latest tags resolve to 3.0.123
  • app-monorepo PR #13350 consumed 3.0.123, rebuilt Android successfully, and produced runtime anchor/logger/frame evidence on its dedicated AVD

Summary

  • add opt-in native primary tabs and a horizontally scrollable Stocks subheader to CollapsiblePagerView on iOS and Android
  • drive primary text colors and the short underline continuously from native pager progress
  • continuously center the Android native tab row on interpolated pager progress instead of jumping at rounded page boundaries
  • coordinate header vertical drags, horizontal subheader ownership, and press cancellation after directional drags
  • finish the Android nested native gesture lifecycle when a horizontal header child consumes ACTION_UP, so later React Native banner/filter/time taps remain responsive
  • lay out the Android native tab indicator directly, keeping its initial width correct before the first pager transition

Validation

  • yarn workspace @onekeyfe/react-native-pager-view test — 2/2 passed
  • yarn workspace @onekeyfe/react-native-pager-view typecheck — passed
  • yarn workspace @onekeyfe/react-native-pager-view prepare — passed
  • JDK 17 :react-native-pager-view:compileDebugKotlin from app-monorepo — passed
  • Android runtime: 6 recorded and 8 unrecorded Stocks/Robinhood pager round trips — no crash, blank screen, or host rebuild
  • Android runtime: frame-by-frame contact sheet confirms continuous tab-row and underline movement through pager progress
  • Android runtime: tapping Robinhood and Stocks still selects the exact item and recenters the row
  • Android runtime: horizontal Stocks subheader drag followed by banner/filter/time light taps — passed
  • Android runtime: vertical and horizontal drags cancel presses and preserve gesture ownership — passed
  • Android runtime: Market/DeFi return retains the same native host and Market state — passed
  • all 39 publishable package versions and exact internal dependencies resolve to 3.0.123
  • git diff --check — passed

The repository root has no prepare script; the package-level prepare command above is the applicable build check. Package lint remains blocked by the repository's existing ESLint 9 / legacy config mismatch.

App-level Android screenshots, screen recordings, lifecycle logs, and frame-timeline evidence are tracked in app-monorepo PR #13350.

Issue: OK-62871

@huhuanming huhuanming changed the title fix(native-list): remove default image fallback background fix(native-list): align image fallback, section index, and iOS reorder Sep 11, 2026
Comment thread native-views/react-native-pager-view/ios/RNCCollapsiblePagerViewComponentView.mm Outdated
Comment thread native-views/react-native-pager-view/src/CollapsiblePagerView.tsx
@huhuanming huhuanming changed the title fix(native-list): align image fallback, section index, and iOS reorder feat: add native Market pager headers and stabilize lists Sep 11, 2026
Comment thread native-views/react-native-pager-view/src/CollapsiblePagerView.tsx
huhuanming and others added 4 commits September 12, 2026 12:57
SDWebImage assigns `image` from inside its own completion, which runs before
HybridOneKeyImage's generation guard and never re-checks whether the view still
belongs to the request that started the load. Fabric recycles a single
OneKeyImage UIView across unrelated images, so a superseded completion could
repaint a slot that already shows a different one — a device avatar painted with
a token logo, a network logo painted with an account avatar. Because
lastRequestSignature already matched the new request, no later scheduleLoad ever
repainted it back, and the 3.0.118 synchronous memory-cache path made it
permanent by returning before any corrective SDWebImage request was issued.

Take the set-image step back via sd_internalSetImageWithURL's setImageBlock and
route every write through a generation-guarded applyDisplayedImage, so the
non-nil writers collapse to a single guarded entry point. This matches the
Android path, which already assigns the drawable inside its own guard.

Using setImageBlock rather than SDWebImageAvoidAutoSetImage keeps the rest of
SDWebImage's behaviour unchanged: the completion stays gated on `finished`
(the flag would have delivered progressive partial frames through a callback
signature that cannot observe it) and sd_setNeedsLayout still runs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@huhuanming
huhuanming merged commit eb16ce8 into main Sep 12, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants