Mojito ME: initial React Native implementation - #1
Merged
Merged
Conversation
Ports the Mojito Wallet and Onboarding Demo designs into an Expo + NativeWind app, built as a shared component library rather than per-screen markup. Layout — one file per component - src/ui/ holds 43 components, one per file, with index.tsx as a re-export barrel. The directory listing is the inventory, so "check whether it already exists before building it" is something a contributor can actually do. - src/screens/ and src/onboarding/screens/ are one screen per file. - src/onboarding/ui/ holds the onboarding-only components on the same basis. - Shared prop types, lockout constants and chart maths sit in small named modules (types.ts, context.ts, style.ts, chart.ts) rather than a grab bag. Architecture - src/theme.js converts the designs' oklch palette to sRGB once and feeds both the runtime and tailwind.config.js, so there is a single source of colour. - One useLoop hook backs every animation; TokenPicker serves Send, Swap and Bridge; SuccessScreen serves all three terminal states. Security-relevant decisions - The recovery phrase is never rendered until revealed. CSS blur has no RN equivalent (expo-blur is a flat tint on Android), and a blurred word is still in the view tree, so hidden cells render a fixed-width mask instead. - Android applies FLAG_SECURE while the phrase is on screen; iOS cannot block screenshots, so it detects them and warns instead of claiming protection. - The bridge makes an unroutable pair unrepresentable: Mintlayer is always one endpoint, and only the counterparty is selectable. Repo setup: MIT licence, security policy with PGP key, CI running test + types + lint, issue/PR templates, code of conduct.
erubboli
force-pushed
the
feat/initial-mobile-ui
branch
from
August 22, 2026 19:54
41b443c to
43ed4cc
Compare
anyxem
approved these changes
Aug 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Initial React Native implementation of Mojito ME, ported from the Mojito Wallet and
Onboarding Demo designs.
mainis an empty root commit, so this PR's diff is the entire codebase — reviewing it hererather than pushing straight to
main.What's in it
Architecture
src/theme.jsconverts the designs' oklch palette to sRGB once and feeds both the runtimeand
tailwind.config.js— one source of colour, no literals in screens.src/uiis the shared library. Screens compose it rather than re-implementing surfaces:TokenPickerserves Send/Swap/Bridge identically,SuccessScreenserves all three terminalstates, one
useLoopbacks every animation.src/onboardingowns the flow and its own nav stack.Decisions worth reviewing
Seed phrase is never rendered until revealed. CSS blur has no RN equivalent —
expo-blurdegrades to a flat tint on Android, and even a real blur leaves the words in the view tree for
accessibility services. Hidden cells render a fixed-width mask instead (fixed width so word length
doesn't leak). Verified via
uiautomator: the dump shows only••••••.Screenshot protection is honest per platform. Android gets
FLAG_SECURE(verified — the screencaptures black, and releases on unmount). iOS can't block screenshots, so it detects them and warns
rather than displaying a claim it can't keep.
The bridge can't express an unroutable pair. Mintlayer is always one endpoint; only the
counterparty is selectable.
Ethereum → Arbitrumis unrepresentable, not validated after the fact.Deliberate simplifications carry a
ponytail:comment naming the ceiling and the upgrade path.Not done
No backend, no chain connectivity, no key management — all data is fixtures, cryptography is
mocked, and the README says so prominently. Still unbuilt: Address book, QR scanner, Notifications,
Activity, Connected dApps, Manage networks, Edit profile, DEX Trades/Depth, NFTs/DeFi tabs.
There is no UI test suite — only a unit test for the colour conversion. Worth adding; a green
typecheck has missed real runtime breakage here (a modal that swallowed every touch typechecked and
bundled fine).
Verification
npm run check(theme test +tsc --noEmit+eslint .) passes, Android bundle builds, and theflow was exercised on an Android 15 emulator: onboarding end-to-end, entropy capture, bridge picker,
success states.
Follow-ups for a reviewer to confirm
conduct@mintlayer.orginCODE_OF_CONDUCT.mdis unverified — I inferred it.security@mintlayer.organd its PGP key are confirmed.SECURITY.mdwill need updating.