Skip to content

WIP: Version 670 - clean2#29122

Open
chrisnojima-zoom wants to merge 90 commits into
masterfrom
nojima/HOTPOT-next-670-clean-2
Open

WIP: Version 670 - clean2#29122
chrisnojima-zoom wants to merge 90 commits into
masterfrom
nojima/HOTPOT-next-670-clean-2

Conversation

@chrisnojima-zoom
Copy link
Copy Markdown
Contributor

No description provided.

@chrisnojima-zoom
Copy link
Copy Markdown
Contributor Author

Replaces #28898 . squashed to help git

chrisnojima and others added 30 commits May 22, 2026 08:53
…ds (#29233)

Three fixes for Hermes heap exhaustion in the iOS simulator:

1. FlatList windowSize=3: the default windowSize=21 kept ~262 message
   components simultaneously mounted, filling Hermes old-gen with ~340MB of
   live JS objects that GC couldn't collect. windowSize=3 limits concurrent
   mounted components to ~51. Confirmed: heap now plateaus at ~724MB with GC
   collecting successfully instead of crashing at 354MB allocated.

2. SDWebImage cache cap: expo-image's SDWebImage backend keeps decoded bitmaps
   in a memory cache. The iOS simulator never sends memory warnings, so the
   cache grew unbounded across 400-500 loaded messages. Capped at 100MB via
   ExpoImage.configureCache at startup. Confirmed: js_externalBytes stayed
   under 1.2MB throughout.

3. CoreMedia thread gating: useVideoPlayer and useAudioPlayer each spawn a
   CoreMedia pipeline. Previously called unconditionally for every message in
   the list; now gated behind user interaction (or autoPlay for Giphy).
* update plan

* fix iOS chat send: list jumps behind keyboard when sending with keyboard open

When the keyboard is open, KeyboardChatScrollView sets contentOffset.y = -(K-I)
via contentInset.top. Three issues caused the list to shift on send:
1. scrollToBottom scrolled to offset=0 instead of -(K-I)
2. maintainVisibleContentPosition autoscrollToTopThreshold=1 fired (-(K-I) <= 1)
   and scrolled to y=0, stripping the keyboard offset
3. MPV's per-insertion offset adjustment added message_height to contentOffset,
   creating a gap between the newest message and the input area

Fix: compute the correct keyboard-aware offset in scrollToBottom, disable MPV
entirely when the keyboard is visible (new messages appear naturally at the
contentInset boundary), and add a layout-effect safety net that re-scrolls to
bottom when new messages arrive while the keyboard is open.
Add useTypedNavigation('routeName') in util/typed-navigation.tsx that returns
NativeStackNavigationProp<RootParamList, RouteName>, giving real typing for
setParams/setOptions derived from the global route definitions rather than
local duplicated ParamList types that could drift. Remove 12 local *ParamList
type definitions and all the as-unknown-as / single-as casts they required.
* use global fill abs

* fix lint and use plain rn animated instead of reanimated

* handle recycle
* cleanup

* mass simplify

* remove prettier

* lint

* WIP
* remove fsextra, json5, rimraf

* remove whydid you and scan

* feedback . delete assets to skill

* pr skill
* bump deps (#29243)

* better version skill

* clean lock

* handle prerelease to release
* chat: remove opacity hack from LegendList; rely on its built-in readyToRender

LegendList already hides content (opacity 0) while bootstrapping the initial
scroll position and reveals it once settled. Our outer opacity/didFirstLoad
gate was redundant and introduced a race where onLoad could be missed
(e.g. on first inbox load in Electron), leaving the list permanently hidden.

Drop didFirstLoad state and the style-opacity override entirely; keep onLoad
only for markInitiallyLoadedThreadAsRead.

* dont show cards if not loaded yet

* minheight for top message. handle reations on bottom row not scrolling

* patch legends to not fire resize immediately

* use onStartReached

* remove patch and use onEndReached

* local prettier files
* shared cleanup

* fix slow device page load (#29246)

* fix: key/fetch_private hangs 60s on stale connections, blocking devices screen

sync_secret.go and per_user_key.go both set RetryCount:5 on their APIArgs
but left InitialTimeout at zero. In doRetry, when InitialTimeout==0 and
RetryCount>0, the per-attempt timeout falls back to cli.cli.Timeout which
is HTTPDefaultTimeout (60s). A stale keep-alive TCP connection in Go's HTTP
pool causes the first attempt to silently hang for the full 60s before the
OS detects the dead connection. Worst case with 5 retries: 5 minutes, which
is why the devices screen appears to never load.

Fix: add InitialTimeout:HTTPRetryInitialTimeout (1s) and the standard
RetryMultiplier to both sites. A stale connection now fails fast, and the
retry gets a fresh connection and succeeds in a few seconds.

* fix typo

* use NewRetryAPIArg
* docs: add border() helper + style analysis skill design spec

* feat: add Kb.Styles.border() helper

* feat: add style analysis script (extract + analyze phases)

* feat: add keybase-style-analysis skill and implementation plan

* refactor: apply Kb.Styles.border() in chat/audio and chat/conversation

* refactor: apply Kb.Styles.border() in devices and provision

* refactor: apply Kb.Styles.border() in chat/emoji-picker and common-adapters

* refactor: apply Kb.Styles.border() in teams

* docs: remove border helper plan and spec docs

* WIP

* feat: add topDivider, roundedBottom, textEllipsis, paddingH/V, marginH/V, size helpers

* feat: add gap detection for topDivider, roundedBottom, textEllipsis, paddingH/V, marginH/V, size

* refactor: apply Kb.Styles.topDivider()

* refactor: apply Kb.Styles.roundedBottom()

* refactor: apply Kb.Styles.textEllipsis

* refactor: apply Kb.Styles.paddingH()

* refactor: apply Kb.Styles.paddingV()

* refactor: apply Kb.Styles.marginH()

* fix: exclude string margin values from marginH gap detector

* refactor: apply Kb.Styles.marginV()

* refactor: apply Kb.Styles.marginV() at remaining wrapper.tsx site

* fix: widen size() to accept percentage strings; exclude undefined from size gap detector

* refactor: apply Kb.Styles.size()

* fix: add new style helpers to Styles mock in confirm.test.tsx

* WIP

* WIP

* WIP

* WIP

* WIP

* fix LegendList deadlock when cached thread data arrives before onLayout (#29249)

* fix LegendList deadlock when cached thread data arrives before onLayout

When initialScrollAtEnd=true and a cached RPC response arrives before
LegendList's ResizeObserver fires, handleInitialScrollDataChange returns
early (queuedInitialLayout=false), leaving didFinishInitialScroll=false
permanently and rendering nothing. Gate data delivery with a rAF so
layout always fires before data arrives.

* fix lint: derive layoutReady from key comparison, avoid synchronous setState in effect
* better fix for resize observer, still needed

* remove resizeobserver

* unused

* done

* delete unused

* fix showDevTools

* update skill

* try and fix selected race

* WIP

* WIP

* WIP

* address copilot pr feedback

- fix wrapperRef type to MeasureRef (matches Box2 expectation), cast to Element inside effect
- fix get-copilot-feedback.sh to match Copilot bot login name
- fix playwright SKILL.md snippet to declare mainPage variable
* add e2e test ID constants

* add Playwright E2E infrastructure

* add testID attributes to key app components

* add Playwright smoke tests for all 8 app sections

* add Maestro iOS e2e test flows

* add Playwright critical flow tests

* fix unused browser variable in e2e test files

* gitignore playwright test-results and report dirs

* fix connect.ts to find main app by URL not tab index

* reduce all e2e timeouts to 3s

* fix all 9 smoke tests passing: correct testIDs and .first() for mounted duplicates

- chat/inbox: rename data-testid to match chat-inbox-list constant
- chat/inbox/row: use CHAT_INBOX_ROW constant; ClickableBox2 desktop now renders data-testid
- teams/main: add testID to outer Box2 (Kb.List testID is native-only)
- smoke tests: add .first() for crypto/devices/git where all tabs stay mounted

* move playwright output to shared/tests/results/

* add test:e2e:report script to open HTML report

* use @/ imports in e2e tests instead of relative paths

* use @/ imports for test-ids in component files

* add KB_SMOKE_USER guard, fix chat send test, fix devices row testID

- connect.ts: require KB_SMOKE_USER env var; verify logged-in user matches before running any test
- chat-send-message: find KB_SMOKE_USER's inbox row, assert it's first (most recent), fix message list testID
- list-area/index.tsx: use CHAT_MESSAGE_LIST constant (was hardcoded "message-list" vs "chat-message-list")
- devices/row.tsx: wrap ListItem in Box2 with DEVICES_ROW testID
- devices-view flow: 10s timeout for device rows (async load)

* fix teams-browse: add TEAMS_ROW testID and ClickableBox desktop testID support

* max out playwright report options: retries, trace on failure, json output, test steps

* fix e2e test screenshots and teams stale state

- add KB_E2E_TEST env var: skips menubar widget + devtools windows so
  CDP connection only sees the main app window; fixes screenshots
  capturing the wrong window
- add start-hot-e2e script (KB_ENABLE_REMOTE_DEBUG=1 KB_E2E_TEST=1)
- refactor tests to use a worker-scoped page fixture (helpers/fixtures.ts)
  so Playwright's screenshot machinery targets the correct page
- fix navigateToTeams: double-click tab to pop to root when stale state
  leaves the tab inside a team detail page
- simplify connect.ts now that menubar window is suppressed

* add iOS Maestro e2e tests: all 8 tabs smoke + 5 flows with report output

- add testID to native chat inbox Box2 (chat-inbox-list), TextInput (chat-input),
  and crypto subnav container (crypto-input) so Maestro can find them on iOS
- add smoke tests for all missing tabs: people, crypto, devices, git (via More tab)
- update smoke-all-tabs.yaml to cover all 8 tabs including More section
- update chat-send-message flow to use KB_SMOKE_USER env var and text-based send
- add test:e2e:ios:all script and junit report output (--format junit) to all ios scripts

* add Maestro workspace config.yaml for subdirectory flow discovery

* fix empty thread after user switch: don't invalidate gen on StrictMode remount

StrictMode double-invokes effects (mount → cleanup → remount). The cleanup
was always incrementing threadLoadGenerationRef, which marked the first
getThreadNonblock RPC as stale. The second RPC then received no content from
the daemon (it deduplicates concurrent requests). Guard the increment behind
a check that the conversation id actually changed, using currentIDRef which
useLayoutEffect keeps up to date.

* fix iOS smoke tests: one screen per test, self-resetting navigation

- replace smoke-all-tabs with 8 individual smoke tests (one screen each)
- setup.yaml runs first to land on People from any starting state
- use Teams pivot (safe from More settings list) to avoid Chat/Files ambiguity
- add E2E mount logs to all 8 tested screens for debugging
- add Maestro workspace config with 60s flow timeout

* add test ids

* remove debug E2E mount logging from screen components

* use exampleuser in connect.ts comment instead of real username

* switch iOS e2e report to HTML-DETAILED with debug output and screenshots on failure

* fix ios report output filename to include .html extension

* add screenshots and custom HTML report to iOS smoke tests

- takeScreenshot in each smoke test now saves to tests/results/ios-debug/
- generate-ios-report.mts builds a self-contained HTML report with embedded screenshots
- yarn test:e2e:ios:smoke clears stale debug output, runs maestro, then generates report
- add optional backButton at start of smoke-devices and smoke-teams to handle case where previous test's back-navigation hadn't completed

* add visual diff comparison to iOS smoke test report

Each run saves previous screenshots to ios-prev/ before running,
then the HTML report shows a before/after drag slider for each screen.
Pixel diff % (using pngjs) is shown as a badge — blue (<1%), yellow (<5%), red (≥5%).
yarn test:e2e:ios:save-baseline pins the current run as the comparison baseline.

* add electron report, fix slider lag, stable baseline management

Slider: pointer events + rAF + CSS custom props (no more getBoundingClientRect on every move)

iOS baseline: test scripts no longer auto-update ios-prev/; only
yarn test:e2e:ios:save-baseline touches it so comparisons stay stable

Electron report: generate-electron-report.mts reads Playwright results.json,
shows same grid/slider format; yarn test:e2e:electron:save-baseline pins baseline,
yarn test:e2e:electron:report opens the report

Enable screenshot:on in Playwright config so each test captures a screenshot

* fix slider: prevent browser image drag hijacking pointer events

preventDefault on mousedown + dragstart handler stops the browser from
entering native drag mode (which changed the cursor to a globe and
killed mousemove events after a few pixels). Use window-level
mousemove/mouseup so dragging outside the element continues to track.

* add expand-to-overlay for image comparison in both reports

Hovering any card shows a ⤢ button. Clicking it opens a full-screen overlay:
- Compare cards: large before/after drag slider (85vh, same UX as inline)
- Solo screenshots: full-size image view
Click backdrop or press Escape to close.

* address PR feedback: fix testID cross-platform, e2e lint and report

- Forward testID to native branches in ClickableBox and ScrollView
- Remove wrapping Box2 in left-nav; testID now on ScrollView directly
- Align native chat inbox row and message list testIDs with constants
- Fix Maestro escape-to-tabs: replace unsupported tapOn timeout with runFlow/when pattern
- Fix electron report to read screenshot from path when body is absent
- Remove redundant fixture screenshot; use playwright screenshot: on
- Fix lint: no-empty-pattern in fixtures, CommandStatus type, unnecessary nullish coalescing
- Exclude tests/results from ESLint to prevent formatter crash

* address PR feedback: testIDs, HTML escaping, lint fixes

- Forward testID in SwipeConvActions using constant instead of hardcoded "inboxRow"
- Update Maestro flows and perf tooling for renamed testIDs (inboxRow→chat-inbox-row, messageList→chat-message-list, inbox-list→chat-inbox-list, message-list→chat-message-list)
- Prevent React DOM warning: extract testID from passThroughProps before spreading onto <div> in ClickableBox
- Add HTML escaping for error messages and labels in iOS/Electron report generators
- Fix no-empty-pattern lint: replace {} destructuring with _fixtures param in fixture
- Rename T import to TestIDs in input.tsx to avoid confusion with types alias
- Add comment on pngjs transitive dependency usage

* fix jest: exclude playwright e2e tests; fix thread load invalidation on unmount

- Exclude tests/e2e/electron from Jest's testPathIgnorePatterns so Playwright tests don't run under Jest
- Add mountedRef to track true unmount vs StrictMode cleanup in ConversationThreadLoadStatusProvider; isThreadLoadCurrent() now returns false after genuine unmount while still avoiding the StrictMode double-increment issue

* fix playwright fixture: restore {} destructuring required by playwright's static analysis

* add comment explaining why {} destructuring is required in playwright fixture

* remove duplicate testID from inner Box2; outer SwipeConvActions wrapper already has it

* speed up perf tests: replace Maestro swipes with idb for settle-free rapid scrolling

* restore NUM_RUNS default to 3 for median collection

* WIP
* teams in common on profile page

* tsc
* iOS e2e report: show all screenshots and add baseline comparison

- Fix screenshot naming in crypto-subtabs.yaml (drop flow- prefix so report generator matches them)
- Show one card per screenshot instead of only the last; filter out setup flow
- Add baseline comparison slider (matching Electron report) and yarn test:e2e:ios:save-baseline script

* wip: branch state

* plan: never wrap in Box2 just for testID

* crypto e2e: move testID to existing elements, no new wrapper boxes

- Add testID prop to KeyboardAvoidingView2 (mobile) and DragAndDrop (desktop)
- Remove the extra Box2 wrappers added solely to carry testID

* fix css, decouple from testid

* restore original Box2 wrappers inside DragAndDrop IO components

* bring back non log rn-start2 alternative

* WIP

* WIP

* WIP
#29258)

* update deps. gh 3. electorn now wants safe storeage, so disabling that

* clarify use-mock-keychain comment: covers all keychain-backed Chromium features

* update deps: expo 56.0.7, @legendapp/list 3.0.0 (stable); fix semver script
* sectionlist: make renderItem optional, bake in renderSectionHeader delegation

* sectionlist: remove Omit<SectionType, renderItem> hacks

* sectionlist: remove renderSectionHeader delegation boilerplate from info-panel callers

* sectionlist: fix test optional chaining after renderItem became optional

* ignore docs
- Delete TeamWithPopup (unused everywhere)
- Delete timeline-marker.meta.tsx (single color constant, inlined)
- Move TimelineMarker to system-git-push/ (only caller)
- Move PlatformIcon to profile/ (only callers are in profile/)
- Remove BottomSheetModal/Backdrop/ScrollView from index (only used
  internally in popup/, not via Kb.*)
- Remove ProfileCard from index (wired internally, never imported
  externally)
- Box2Animated removed; callers use createAnimatedComponent(Kb.Box2)
  or Animated.createAnimatedComponent(Kb.Box2) locally
- Remove dead ReAnimated={} export from index
- Remove duplicate ConnectedNameWithIcon alias (same as NameWithIcon)
- box.tsx: import Reanimated from ./reanimated instead of directly
  from react-native-reanimated
* devices: clean up structure and organization

* skills: move simplify-ui-section to repo skill

* devices: simplify ui section — extract icon type helper, merge stylesheets, rename context

* devices: fold rpc.tsx into common.tsx, flatten getDeviceIconType signature, dedupe icon logic

* devices: fix getIcon fallback to be type-aware, use object-literal pattern

* skill: add Box2 props and gap guidance to simplify-ui-section

Documents which style properties can be lifted into Box2 props (purely
structural, no visual change) and how to use gap/gapStart/gapEnd to
replace per-child margins (slight visual change — must be validated with
user before applying). Also relaxes the hard-line no-visual-changes rule
to allow validated visual changes with explicit user sign-off.

* common-adapters: add ClickableBox3 (Box2 + click props), migrate devices/

- Extract box2ClassNames() from Box2 desktop branch into shared helper
- Export box2SharedProps from box.tsx
- ClickableBox3Props = Box2Props & {onClick?, onLongPress?, hitSlop?}
- CB3 desktop: box2ClassNames + clickable-box2 CSS class
- CB3 mobile: box2SharedProps + Pressable
- Migrate devices/ CB1/CB2 → CB3, eliminate inner Box2 wrappers
- Simplify mobileAddHeader style (flex/position props move to CB3 props)
- Add plans/clickablebox3.md migration plan with per-directory checklist
- Add/update migrate-clickable-box skill for CB3 migration

* plans: mark CB3 implementation and devices/ pilot as done

* common-adapters: move ClickableBox3 impl into box.tsx

* WIP

* devices: fix TLF list overflow in revoke screen

Replace fixed-height virtualized List with ScrollView so long TLF names that wrap to multiple lines don't overlap adjacent rows.

* devices: simplify UI — remove redundant wrappers, move HeaderTitle to common
* update ui skill

* simplify-ui-section skill: add iteration loop after implementation

Adds Step 6 directing the model to re-read and re-analyze files after
each implementation pass, stopping only when a full pass yields no
meaningful findings. Also updates the flowchart to show the loop.

* provision: lazy-require expo-camera to fix Electron crash

expo-camera uses native code that crashes on Electron at import time.
Move the require inside the mobile-only component body so it never
evaluates on desktop.

* migrate CB/CB2 → CB3: git, incoming-share, signup, provision, people, settings

* fix settings-item CB3: add fullWidth to prevent alignSelf:center shrinking list rows

* fix ClickableBox3: forward missing props to both desktop and mobile

Desktop: onMouseDown/Leave/Move/Up, onContextMenu, title, tooltip/data-tooltip.
Mobile: onLayout, collapsable, pointerEvents.

* WIP

* cb3 2 (#29263)

* migrate CB/CB2 → CB3: profile

* migrate CB/CB2 → CB3: tracker, menubar, app, router-v2

* clean up iconContainer: remove redundant clickable/flexBoxColumn, fold in icon size

* update skill

* add onMouseEnter to Box2Props and forward it in ClickableBox3 desktop

* fix lint: suppress consistent-type-imports for expo-camera require cast

* skill
* metro: block non-source folders from file watcher

* deps: bump expo and related packages
* clickablebox 3 - teams (#29265)

* clickablebox 3 - team-building (#29265)

* clickablebox 3 - fs (#29265)

* only pick up the folders from shared

* fix profile dropdown button full-width regression on mobile (#29265)

* fix fs sort button content-sizing regression on desktop (#29265)

* fix fs path-item header and destination-picker full-width regression on mobile (#29265)

* update migrate-clickable-box skill with fullWidth gotchas (#29265)

* cb3 5 (#29267)

* migrate shared/chat/ ClickableBox/CB2 → CB3

* migrate shared/common-adapters/ ClickableBox/CB2 → CB3

* complete ClickableBox3 migration: remove legacy CB1/CB2 exports

* WIP

* fixes

* Fix info panel tabs: natural width, centered text, divider spans full tab width

* WIP

* fix prove-your dialog items to be full width

Without fullWidth={true}, ClickableBox3 gets alignSelf:center applied,
centering each provider row instead of spanning the modal width.

* fix CardListItem body text centering: add fullWidth to body Box2

Nested Box2 direction="vertical" without fullWidth gets box2_centered
(align-self:center) applied, horizontally centering it within its
column flex parent. Fixed across all CardListItem callers and in
list-item.tsx's body wrapper.

* remove ChoiceList/RichButton, replace usages with ListItem Card

* remove ClickableBox/ClickableBox2 and migration plan — all usages migrated to ClickableBox3

* mass clean (#29268)

* simplify-ui: git/ — remove redundant wrappers, dead styles/comments, normalize patterns

* simplify-ui: devices/ — deduplicate icon logic, extract constants, replace style props

* simplify-ui: wallets/ — rename Container, extract shared styles, remove redundant props

* simplify-ui: tracker/ — fix hover-opacity typo, dedup utilities, rename Container, replace flexShrink props

* simplify-ui: settings/ — remove redundant wrappers, move styles to props, clean dead code

* simplify-ui: crypto/ — inline IIFEs, merge imports, clean up style props and names

* simplify-ui: teams/ — merge styles, fix functions-as-values, extract string constants, remove wrappers

* simplify-ui: signup/ — extract shared input width, fix prop shorthands, remove dead code

* simplify-ui: people/ — remove identity maps, dead code, inline wrappers, move style props

* simplify-ui: profile/ — remove dead code, dedup styles, replace Kb shims, noShrink props

* address PR feedback: safe nav in async callback, fix avatar overlay positioning, restore .tsx extension

* simplify-ui: full codebase pass — rename Containers, remove dead code, move style props

Ran simplify-ui-section skill across all UI directories via parallel subagents:
chat/, common-adapters/, fs/, login/, provision/, team-building/, unlock-folders/,
menubar/, pinentry/, incoming-share/, deeplinks/, router-v2/, and revisits of
profile/, people/, signup/, crypto/, teams/, settings/, tracker/, wallets/,
devices/, git/.

* fix back button hover area: remove inline-block and size(14) from iconContainer

The 14×14px fixed size caused the hover highlight to appear only in the
upper-left corner while the icon extended beyond it. The container now
sizes naturally around the icon with padding defining the hit area.

* fix Checkbox centering: add alignSelf=flex-start to ClickableBox3

* WIP

* fix iOS e2e: restore testID on mobile crypto nav rows

The RichButton→ListItem migration dropped testID; wrap ListItem in Box2 to carry it.
* Add e2e screen tests for Electron desktop

- Test coverage for: chat, crypto, devices, files, git, people/profile, settings (all subpages), teams (browse + inner tabs)
- Add testIDs to nav tabs (tab-bar.desktop.tsx), settings subpages, teams body/tabs, files TLF rows, profile page
- Fixture reloads page at worker start to clear stale state
- navigateToTeams uses force:true to bypass WebkitAppRegion:drag blocking the Teams nav tab when a team detail is open
- teams-inner tests use text-based selectors to avoid dependency on testIDs that require app rebuild

* Fix skipped e2e desktop tests for files navigation and git rows

- Add GIT_REPO_ROW testID to git row component (was defined but never applied)
- Remove test.fixme guards from files folder navigation tests (KBFS UI works without mount)
- Fix files folder navigation assertions to use filter textbox instead of files-browser testID (nav stack keeps root screen mounted/hidden, causing strict mode violations)
- Remove conditional skip from git repo row test

* Add iOS Maestro flows for files navigation and git, add e2e skill

- Add files-folders.yaml: tap each TLF type row, verify back button appears (confirms subfolder navigation), navigate back to root
- Add git.yaml: navigate via More → Git, verify git-repo-list renders, conditional screenshot if rows present
- Update branch scripts to run files-folders + git flows on both platforms
- Add keybase-e2e-tests skill capturing two-harness structure, testID rules, iOS nav patterns, and Playwright gotchas
- Update plans/flow-test.md to reference skill and track progress on buckets 12 and 13

* Bucket 2: crypto output tests (Electron all 4, iOS encrypt+sign)

- Add CRYPTO_OUTPUT testID to CryptoOutput success-state Box2 in output.tsx
- crypto-outputs.test.ts: type text in each tab, auto-run triggers, verify output renders
  - Decrypt: encrypts first then feeds ciphertext to decrypt input
  - Verify: signs first then feeds signed text to verify input
  - Scope CRYPTO_OUTPUT query to tab container (TabRouter mounts all tabs simultaneously)
  - Use .last() for textbox selection (encrypt tab has two: recipients + main input)
- crypto-outputs.yaml (iOS): encrypt and sign outputs; decrypt/verify need clipboard support
- Update branch scripts and plan

* Bucket 3: chat conversation view iOS flow

- chat-conversation.yaml: open first inbox row, verify message list renders, navigate back
- Desktop tests already existed and pass
- Update branch scripts and plan

* Buckets 5+6: settings subpages iOS flow (About, Advanced, Display, Notifications, Feedback)

- settings-subpages.yaml: navigate More → each settings page, verify testID renders, back
- Desktop tests already exist and pass (9 tests: Advanced, About, Backup, Chat, Display,
  Feedback, Files, Notifications, Screen Protector)
- Password modal skipped (needs Account settings navigation + no testID)
- Update branch scripts and plan; note Bucket 6 partially covered by existing iOS flows

* Buckets 9 + 11: team detail tabs and people/profile iOS flows

- teams-inner.yaml: open first team, navigate Members/Settings/Bots/Channels tabs
- people-profile.yaml: People feed renders; profile via conditional username tap in feed
- Desktop tests already existed and pass (6 tests)
- Update branch scripts and plan

* Buckets 6+8: device detail test + settings subpages Bucket 6 iOS

- Add DEVICE_PAGE testID to device-page.tsx + test-ids.ts
- device-detail.test.ts: click first device row, verify device-page renders
- device-detail.yaml: More → Devices → tap row → verify device-page
- Extend settings-subpages.yaml with Chat, Files, Backup (Bucket 6 iOS items)
- Update branch scripts and plan

* Bucket 10: team member page test

- Add TEAMS_MEMBER_PAGE testID to member/index.new.tsx + test-ids.ts
- team-member.test.ts: click smoke user's username in member list, verify page renders
- team-member.yaml: iOS equivalent using KB_SMOKE_USER env var
- Update branch scripts and plan

* Fix crypto-outputs and settings-subpages iOS e2e tests

crypto-outputs: tapOn text "Encrypt" was hitting the nav header title
instead of the button. Added testID support to ButtonProps/ButtonNative
and CRYPTO_RUN_BUTTON testID to InputActionsBar. Encrypt/sign output is a
modal sheet with Cancel (not backButton), so navigation updated to
Cancel + backButton. Added scrollUntilVisible for Crypto since the More
screen retains scroll position across test runs.

settings-subpages: "About" and "Notifications" require scrolling (in a
separate section below the Settings list). Added scrollUntilVisible for
both. Reordered items top-to-bottom to minimize needed scrolls. Fixed
settings-files testID missing from the mobile render path.

escape-to-tabs: added swipe DOWN at end to reset scroll position at the
start of each flow, preventing stale More screen scroll state from
breaking subsequent flows.

* Plumb testIDs through ListItem and StillCommon instead of wrapper boxes

Rather than wrapping components in an extra Box2 just to attach a testID,
add testID support to ListItem (passed to ClickableBox3) and StillCommon
(passed to ListItem). Remove the wrapper boxes in tlf-type.tsx and
teams/team/index.tsx. Move TEAMS_BODY testID to the SectionList.

* Use KeyboardStickyView for crypto input action bars on iOS (#29270)

* Use KeyboardStickyView for crypto input action bars on iOS

Replaces KeyboardAvoidingView2 with KeyboardStickyView (react-native-keyboard-controller) for the bottom action bar on all four crypto input pages (encrypt, decrypt, sign, verify). The sticky view uses Reanimated to track keyboard height frame-by-frame on the UI thread, eliminating the layout-recalculation lag that caused the bar to trail the keyboard animation.

* try codegraph

* Address Copilot PR feedback on e2e desktop tests

- Skip own-profile test when KB_SMOKE_USER is unset
- Use NAV_TAB_CHAT/NAV_TAB_FILES testID constants instead of text= selectors
- Use NAV_TAB_CHAT constant in fixtures.ts waitFor (was hard-coded string)
- Update flow-test.md and PERF-TESTING.md script names: electron→desktop

* Address second round of Copilot PR feedback

- Wire testID as data-testid in ButtonDesktop
- git repo row test: wait for rows with timeout instead of instant count check
- teams members tab: assert on TEAMS_MEMBER_LIST testID instead of brittle text
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