Summary
The standalone face-verification intro flow currently lives inside a monolithic screens/IntroScreen.jsx that also houses deprecated local-native flow components (Intro, IntroReVerification). The standalone AppRouter reaches back into the main package index to import FaceVerificationIntro, dragging in all that dead code. This bounty extracts the standalone intro into its own file at standalone/screens/IntroScreen.jsx, deletes the deprecated native components, and improves the UX so that first-time users and reverifying users see distinct, purpose-built screens rather than the same generic two-screen sequence.
Desired behavior (acceptance criteria)
standalone/AppRouter.jsx imports the intro screen from standalone/screens/ — not from faceVerification/index.js.
- The new standalone intro file has no
isFVFlow check anywhere — it is always the FV-flow context.
- First-time users (
isReverify === false) see the existing two-screen sequence (Overview → Action) with behaviour unchanged.
- Reverifying users (
isReverify === true) skip the Overview screen and land directly on the action screen.
- The reverify action screen includes the Wallet Linked box showing the wallet address and "Last verified: {date}" (not "Valid until").
- The reverify action screen shows both consent checkboxes — "I'm over 18" and the GoodDollar-only consent — and both are required before "Verify Me" is enabled.
- Confirming on the reverify screen triggers FaceVerification immediately (no additional intermediate screen).
Intro, IntroReVerification, and WalletDeletedPopupText are removed from screens/IntroScreen.jsx; WalletDeletedPopupText moves with the standalone components that use it.
screens/IntroScreen.jsx is deleted and FaceVerificationIntro is removed from faceVerification/index.js.
- Styles used only by standalone components are defined in the new file; none remain in the deleted original.
Scope
In scope
- New file
src/components/faceVerification/standalone/screens/IntroScreen.jsx — migrated and improved standalone intro (contains IntroFVFlowOverview, IntroFVFlowAction, routing wrapper, WarningBlock, WalletDeletedPopupText, shortenWalletAddress, own getStylesFromProps).
standalone/AppRouter.jsx — rewire intro import.
standalone/index.js — add export for new intro screen.
src/components/faceVerification/screens/IntroScreen.jsx — delete Intro, IntroReVerification, migrated standalone components, and the IntroScreen wrapper; delete file when empty.
src/components/faceVerification/index.js — remove FaceVerificationIntro export.
IntroFVFlowAction reverify branch — add Wallet Linked box with "Last verified" date; remove !isReverify guard on over-18 checkbox; update button disabled condition.
- Thread
lastAuthenticated (formatted) and walletAddress into the action screen.
- Add/update tests for the new standalone intro.
Out of scope
- Any changes to
FaceVerification (the camera/scan screen), FaceVerificationError, or other standalone screens.
- Analytics event taxonomy.
- Backend, contracts, or SDK changes.
- Any redesign of
IntroFVFlowOverview beyond what is needed for the migration.
Starting points
src/components/faceVerification/screens/IntroScreen.jsx:208 — IntroFVFlowOverview: migrate verbatim; no logic changes for new-user path.
src/components/faceVerification/screens/IntroScreen.jsx:313 — IntroFVFlowAction: migrate + add reverify wallet block, remove !isReverify guard (line 368), update disabled (line 389).
src/components/faceVerification/screens/IntroScreen.jsx:412 — IntroFVFlow: migrate + add isReverify routing guard to skip Overview; drop isFVFlow check entirely.
src/components/faceVerification/screens/IntroScreen.jsx:439 — IntroScreen wrapper: contains gate hooks (useDisposingState, useFVLoginInfoCheck, camera permission logic) and lastAuthenticated / walletAddress — these must be preserved in the new standalone screen.
src/components/faceVerification/standalone/screens/FVFlowSuccess.jsx — reference pattern: own withStyles, consumes FVFlowContext, no isFVFlow checks.
src/components/faceVerification/standalone/AppRouter.jsx:5 — single-line import change.
src/components/faceVerification/__tests__/IntroScreen.jsx — existing snapshot test to update or replace.
Definition of Done
How to test
# Install
yarn install
# Lint
yarn lint src/components/faceVerification/
# Test (update snapshots on first run)
yarn test --testPathPattern=IntroScreen -u
# Manual QA — start dev server
yarn start
# Path A (new user): wallet with lastAuthenticated == 0
# → Overview screen visible → "Get Started" → Action screen → both checkboxes → FV starts
# Path B (reverify): wallet with lastAuthenticated != 0
# → Overview NOT shown → Action with Wallet Linked box ("Last verified: {date}")
# → over-18 + GD consent both required → "Verify Me" → FV starts immediately
Contribution guidelines: https://github.com/GoodDollar/GoodDAPP/blob/master/CONTRIBUTING.md
For questions, use the Builders Telegram channel or comment on this issue.
Summary
The standalone face-verification intro flow currently lives inside a monolithic
screens/IntroScreen.jsxthat also houses deprecated local-native flow components (Intro,IntroReVerification). The standaloneAppRouterreaches back into the main package index to importFaceVerificationIntro, dragging in all that dead code. This bounty extracts the standalone intro into its own file atstandalone/screens/IntroScreen.jsx, deletes the deprecated native components, and improves the UX so that first-time users and reverifying users see distinct, purpose-built screens rather than the same generic two-screen sequence.Desired behavior (acceptance criteria)
standalone/AppRouter.jsximports the intro screen fromstandalone/screens/— not fromfaceVerification/index.js.isFVFlowcheck anywhere — it is always the FV-flow context.isReverify === false) see the existing two-screen sequence (Overview → Action) with behaviour unchanged.isReverify === true) skip the Overview screen and land directly on the action screen.Intro,IntroReVerification, andWalletDeletedPopupTextare removed fromscreens/IntroScreen.jsx;WalletDeletedPopupTextmoves with the standalone components that use it.screens/IntroScreen.jsxis deleted andFaceVerificationIntrois removed fromfaceVerification/index.js.Scope
In scope
src/components/faceVerification/standalone/screens/IntroScreen.jsx— migrated and improved standalone intro (containsIntroFVFlowOverview,IntroFVFlowAction, routing wrapper,WarningBlock,WalletDeletedPopupText,shortenWalletAddress, owngetStylesFromProps).standalone/AppRouter.jsx— rewire intro import.standalone/index.js— add export for new intro screen.src/components/faceVerification/screens/IntroScreen.jsx— deleteIntro,IntroReVerification, migrated standalone components, and theIntroScreenwrapper; delete file when empty.src/components/faceVerification/index.js— removeFaceVerificationIntroexport.IntroFVFlowActionreverify branch — add Wallet Linked box with "Last verified" date; remove!isReverifyguard on over-18 checkbox; update buttondisabledcondition.lastAuthenticated(formatted) andwalletAddressinto the action screen.Out of scope
FaceVerification(the camera/scan screen),FaceVerificationError, or other standalone screens.IntroFVFlowOverviewbeyond what is needed for the migration.Starting points
src/components/faceVerification/screens/IntroScreen.jsx:208—IntroFVFlowOverview: migrate verbatim; no logic changes for new-user path.src/components/faceVerification/screens/IntroScreen.jsx:313—IntroFVFlowAction: migrate + add reverify wallet block, remove!isReverifyguard (line 368), updatedisabled(line 389).src/components/faceVerification/screens/IntroScreen.jsx:412—IntroFVFlow: migrate + addisReverifyrouting guard to skip Overview; dropisFVFlowcheck entirely.src/components/faceVerification/screens/IntroScreen.jsx:439—IntroScreenwrapper: contains gate hooks (useDisposingState,useFVLoginInfoCheck, camera permission logic) andlastAuthenticated/walletAddress— these must be preserved in the new standalone screen.src/components/faceVerification/standalone/screens/FVFlowSuccess.jsx— reference pattern: ownwithStyles, consumesFVFlowContext, noisFVFlowchecks.src/components/faceVerification/standalone/AppRouter.jsx:5— single-line import change.src/components/faceVerification/__tests__/IntroScreen.jsx— existing snapshot test to update or replace.Definition of Done
standalone/screens/IntroScreen.jsxcreated; noisFVFlowreferences; contains all migrated + improved standalone intro logic.standalone/AppRouter.jsximports intro fromstandalone/screens/(not fromfaceVerification/index.js).IntroFVFlowskipsIntroFVFlowOverviewwhenisReverify === true."Last verified: {date}"(moment.unix(lastAuthenticated.toNumber()).format('l'); zero-value fallback present).disableduntil both checkboxes ticked.useDisposingState,useFVLoginInfoCheck) and camera permission logic present in the new standalone screen.screens/IntroScreen.jsxdeleted;FaceVerificationIntroremoved fromfaceVerification/index.js.yarn lintandyarn testpass; snapshot regenerated; at least one test coversisReverify === truepath.How to test