GeezerVison is showing github.com — Move main to Vega OS 2.0 and remove FlashList by khuatkdev · Pull Request #29 · AmazonAppDev/vega-scrolling-sample
Conversation
khuatkdev
commented
Nov 10, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
Summary
Moves main to Vega OS 2.0 and removes FlashList, matching the branch layout of the other Vega samples.
- Builds on Merge release-rn-83 into main and document branches #27 (
release-rn-83 merged into main), and merges the release-rn-83 Vega OS 1.2 change so later merges from release-rn-83 stay clean.
- Sets
[os.version] min and target to 2.0 in manifest.toml.
- Removes FlashList (grid, row, list switch, props and demo video). Its system bundle needs
react-native-kepler-2, which Vega OS 2 does not ship, so the app exited at launch.
- Fixes pagination after an empty or short page, the card memo image check,
selectionStrategy in two demos, and the grid size. Adds unit tests for them.
- README: Branches table (
main Vega OS 2.0, release-rn-83 Vega OS 1.2, release-rn-0.72 RN 0.72), Vega SDK 2.0 note, and the vega run-app commands from docs(README): use current Vega CLI commands (vega virtual-device start, vega run-app) #26.
package.json scripts use build-vega. THIRD-PARTY-NOTICES regenerated.
Dependencies: removes @amazon-devices/shopify__flash-list and adds recyclerlistview 4.2.1, which vega-carousel loads at runtime. The lockfile resolves from public npm only.
Please merge #27 first, then this PR, both with "Create a merge commit" (not squash), so future merges from release-rn-83 stay clean.
Testing
- Clean install from public npm with Vega SDK 2.0: doctor, lint, test (17 tests), type check and build all pass. On the current
main, doctor and build fail because [os.version] is missing.
- Ran on a Vega OS 2 virtual device: all seven tabs open and scroll, the grid reaches its last row, select and back work, no crashes.
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Based on Kevin O's approved CR-286446486 ArbitraryDiff:
- Upgrade runtime to react_native_kepler_4 (manifest.toml)
- Upgrade all deps: RN 0.83, react 19.2, kepler-ui-components ~3.1,
vega-carousel ~1.0, kepler-cli-platform ~0.22
- Halve all hardcoded pixel values for DIP (960x540 canvas on 1080p)
- Remove V1 carousel components (kepler-ui-components V1 unsupported on RN83)
- Update README with V2 carousel API docs and DIP section
manifest.toml: Add [needs.module] declaration for
react_native_kepler_4 runtime — required by SDK validator.
package-lock.json: Regenerated with correct resolved versions
from npm install (node 22, --legacy-peer-deps).
Add PixelUtils.ts (from KeplerTools-CoreUtils pattern) which scales
1080p UX values to dp using PixelRatio and the device's actual screen
height. This is future-proof across different device resolutions.
- manifest.toml: [os.version] min = target = 1.2, and the
/com.amazon.vega.os@IVega_1_2 module in [needs], as the reference
samples declare it for Vega OS 1.2.
- README: say which OS this branch targets and point Vega OS 2.0
users to main.
- manifest.toml: [os.version] min = target = 2.0 (was 1.2 from
release-rn-83) and drop the /com.amazon.vega.os@IVega_1_2 need, as
the reference samples do on main. Vega SDK 2.0 refuses to build
without [os.version].
- README: drop release-rn-83's Vega OS 1.2 note.
- Remove FlashList: its grid and row, the list switch, the FlashList-only
card props and key extractors, and the demo video. On Vega OS 2.x the
FlashList system bundle pulls in react-native-kepler-2, which the OS
does not ship, so the app exited at launch.
- Declare recyclerlistview: vega-carousel imports it at runtime but lists
it only as a devDependency; FlashList used to bring it in.
- package-lock.json: only the two dependency changes (npm uninstall /
npm install from the base lockfile); every entry resolves from
registry.npmjs.org.
- README: Carousel-only list sections and the Vega OS 2.0 / SDK 2.0
requirement.
- Pagination: stop after an empty or a short page (new
setPaginationHasMore reducer), de-duplicate requests by the row length
they were made from (lastRequestedPage -> lastRequestedOffset), and
restore that offset after a failed request so a later focus retries.
- Card memo comparators compare the image URL at the resolution the card
renders, not a fixed '300' entry; DEFAULT_IMAGE_RESOLUTION is unused
and removed.
- VerticalScrollable and HeterogeneousItemViewScrollable honor their
selectionStrategy prop (default 'anchored').
- The grid carousel fills its tab container instead of the whole screen.
- Docs pointer from CarouselCardRow to the README's pagination section.
- Unit tests: paginationThunks (including a focus that arrives while a
request is in flight), cardMemo and carouselProps (demo props and grid
size) each fail with their fix reverted. rowData (no empty rows) and
noFlashList are regression guards for earlier changes.
- README: the Branches table now gives each branch's Vega OS (main
2.0, release-rn-83 1.2, release-rn-0.72 not set), a "Check the
branch first" note
for Vega SDK 2.0, vega CLI commands, and pagination and focus sections
that match the code, including how a short page ends a row.
carousel-demo README: the app renders the V2 carousel only.
- package.json: build scripts use react-native build-vega; perfTest uses
vega exec perf with the app's component id.
- THIRD-PARTY-NOTICES regenerated from the dependency tree installed
from registry.npmjs.org.
- vega run-app only launches the app when it is given the component
id; without it the command installs the VPKG and stops. Use the same
lines as PR #26: the component id, -d VirtualDevice or -d <DSN>, and
the Vega Virtual Device (VVD) name in the VPKG list.
- Branches heads-up: only main and release-rn-83 set [os.version];
release-rn-0.72 does not.
Target Vega OS 1.2 on release-rn-83
|
|
@@ -0,0 +1,10 @@ |
|
|
import {Dimensions, PixelRatio} from 'react-native';
|
|
|
|
|
|
const SCREEN_DP = Dimensions.get('window');
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Question: scaleUxToDp reads Dimensions.get('window') once at import, and SCREEN_DIMENSION in constants.ts does the same. Is it intentional to keep two separate sources of screen size, or should they share one? The one-time read is fine on TV, I'm just wondering if it's worth a short comment saying so.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a good point. It makes sense to share one. I'll make this update.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
SCREEN_DIMENSION in constants.ts now reuses the window size that
scaleUxToDp reads, so the app has one source of screen size. A comment
says the one-time read at import is intentional: the TV window size is
fixed for the app's lifetime. PixelUtils imports nothing from the app,
so this adds no import cycle. No value changes.
Uh oh!
There was an error while loading. Please reload this page.
Assignees
No one assigned
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|