Skip to content

feat(auth): add under-16 family guidance flow#3531

Draft
NotThatKindOfDrLiz wants to merge 24 commits into
divinevideo:mainfrom
NotThatKindOfDrLiz:feat/minor-account-review-flow-upstream
Draft

feat(auth): add under-16 family guidance flow#3531
NotThatKindOfDrLiz wants to merge 24 commits into
divinevideo:mainfrom
NotThatKindOfDrLiz:feat/minor-account-review-flow-upstream

Conversation

@NotThatKindOfDrLiz
Copy link
Copy Markdown
Member

@NotThatKindOfDrLiz NotThatKindOfDrLiz commented Apr 28, 2026

Closes #3532

Summary

This PR adds the client-side under-16 family guidance flow and the restricted-account review surfaces that route affected users into it.

What Changed

  • adds a welcome-screen entry point for under-16 family guidance
  • adds the /account-review route family for welcome and moderation entry points
  • adds a fail-closed checking route while authenticated moderation status is loading
  • hard-gates restricted accounts to the allowed review, support, and moderation-message paths
  • adds the public under-13 guidance screen and the restricted under-13 parent-support screen
  • adds the 13-15 parent-consent screen and parent-contact submission screen
  • sets the canonical support email to support@divine.video
  • hosts family, kids, and age-review resources at paths on divine.video (e.g. divine.video/family) instead of separate subdomains
  • fixes the support-email share fallback so the prepared body/instructions are preserved
  • adds localized generic error states, Divine icon/accessibility cleanup, and focused widget/service tests

Product Boundaries In This PR

  • Under 13: parent or guardian must contact Divine support by email.
  • Age 13 to 15: the parent or guardian email path is the supported handoff in this PR.
  • This PR does not add private media upload, moderator tooling in other repos, or new backend review workflows.

Main Files

  • mobile/lib/router/app_router.dart
  • mobile/lib/screens/minor_account_review_screen.dart
  • mobile/lib/screens/minor_account_review_parent_consent_screen.dart
  • mobile/lib/screens/minor_account_review_parent_contact_screen.dart
  • mobile/lib/screens/minor_account_review_under13_support_screen.dart
  • mobile/lib/services/support_email_composer.dart
  • mobile/lib/providers/app_providers.dart
  • mobile/lib/l10n/app_en.arb

Verification

From mobile/:

  • flutter test --no-pub test/services/support_email_composer_test.dart test/services/api_service_test.dart
  • flutter test --no-pub test/screens/minor_account_review_screen_test.dart
  • flutter test --no-pub test/screens/minor_account_review_parent_contact_screen_test.dart
  • flutter test --no-pub test/screens/minor_account_review_parent_consent_screen_test.dart
  • flutter test --no-pub test/screens/minor_account_review_under13_support_screen_test.dart
  • flutter test --no-pub test/router/minor_account_review_router_test.dart
  • flutter analyze lib/services/support_email_composer.dart lib/screens/minor_account_review_parent_consent_screen.dart lib/screens/minor_account_review_under13_support_screen.dart lib/screens/minor_account_review_parent_contact_screen.dart lib/screens/minor_account_review_screen.dart test/services/support_email_composer_test.dart test/services/api_service_test.dart test/screens/minor_account_review_parent_consent_screen_test.dart test/screens/minor_account_review_under13_support_screen_test.dart test/screens/minor_account_review_parent_contact_screen_test.dart test/screens/minor_account_review_screen_test.dart test/router/minor_account_review_router_test.dart

@github-actions

This comment has been minimized.

Comment thread mobile/lib/router/app_router.dart Outdated
Comment thread mobile/lib/router/app_router.dart
Comment thread mobile/lib/providers/app_providers.dart Outdated
Comment thread mobile/lib/screens/minor_account_review_screen.dart Outdated
@github-actions

This comment has been minimized.

@AleyshaRose
Copy link
Copy Markdown

Hey Liz,

I had a question about the reporting process. Do we have an idea of what the reporting process will look like? Would it be coming through relay admin as a user report for "Child" or something similar?

Thanks

@NotThatKindOfDrLiz
Copy link
Copy Markdown
Member Author

Hey Liz,

I had a question about the reporting process. Do we have an idea of what the reporting process will look like? Would it be coming through relay admin as a user report for "Child" or something similar?

Thanks

This is a great support team UX question. How do you want it to work? You get to design it since you're the user of that part of the flow.

@NotThatKindOfDrLiz
Copy link
Copy Markdown
Member Author

Hey Liz,
I had a question about the reporting process. Do we have an idea of what the reporting process will look like? Would it be coming through relay admin as a user report for "Child" or something similar?
Thanks

This is a great support team UX question. How do you want it to work? You get to design it since you're the user of that part of the flow.

And, to be super upfront, currently this PR only covers the mobile behavior after a moderator manually opens a minor-account review case. It does not define the intake/moderator-tool side yet. That's part of what I flagged for @mbradley above. My current assumption is that a user report would land in our moderation queue as something like “possible minor” / “appears under 16,” and then a moderator would decide whether to open the case. Once that happens, the backend would restrict the account, send the moderation DM, and the app would route the user into this review flow. So the report intake UX/tooling is still open design, but the mobile-side behavior after moderator action is what this PR implements. There are a lot of moving parts with this and the divine-mobile repo is only one place that this will need to live.

@AleyshaRose
Copy link
Copy Markdown

Hey Liz,
I had a question about the reporting process. Do we have an idea of what the reporting process will look like? Would it be coming through relay admin as a user report for "Child" or something similar?
Thanks

This is a great support team UX question. How do you want it to work? You get to design it since you're the user of that part of the flow.

And, to be super upfront, currently this PR only covers the mobile behavior after a moderator manually opens a minor-account review case. It does not define the intake/moderator-tool side yet. That's part of what I flagged for @mbradley above. My current assumption is that a user report would land in our moderation queue as something like “possible minor” / “appears under 16,” and then a moderator would decide whether to open the case. Once that happens, the backend would restrict the account, send the moderation DM, and the app would route the user into this review flow. So the report intake UX/tooling is still open design, but the mobile-side behavior after moderator action is what this PR implements. There are a lot of moving parts with this and the divine-mobile repo is only one place that this will need to live.

We can already report user accounts to relay admin so adding a new field wouldn't be too difficult I imagine. But, we will be messaging them using the moderation DM system.

I could see either 1) user report to relay admin comes in and there is a link from the report to the moderation DMs or 2) a new header on moderation for age review where the entire process lives within one space.

Having it all live within moderation probably makes the most sense and keeps things tidy. But I am open to other thoughts and ideas.

@NotThatKindOfDrLiz
Copy link
Copy Markdown
Member Author

NotThatKindOfDrLiz commented Apr 28, 2026

Hey Liz,
I had a question about the reporting process. Do we have an idea of what the reporting process will look like? Would it be coming through relay admin as a user report for "Child" or something similar?
Thanks

This is a great support team UX question. How do you want it to work? You get to design it since you're the user of that part of the flow.

And, to be super upfront, currently this PR only covers the mobile behavior after a moderator manually opens a minor-account review case. It does not define the intake/moderator-tool side yet. That's part of what I flagged for @mbradley above. My current assumption is that a user report would land in our moderation queue as something like “possible minor” / “appears under 16,” and then a moderator would decide whether to open the case. Once that happens, the backend would restrict the account, send the moderation DM, and the app would route the user into this review flow. So the report intake UX/tooling is still open design, but the mobile-side behavior after moderator action is what this PR implements. There are a lot of moving parts with this and the divine-mobile repo is only one place that this will need to live.

We can already report user accounts to relay admin so adding a new field wouldn't be too difficult I imagine. But, we will be messaging them using the moderation DM system.

I could see either 1) user report to relay admin comes in and there is a link from the report to the moderation DMs or 2) a new header on moderation for age review where the entire process lives within one space.

Having it all live within moderation probably makes the most sense and keeps things tidy. But I am open to other thoughts and ideas.

I agree that a one-stop-shop probably makes the most sense here. What's your ideal flow? cc @mbradley (would also welcome UX design thoughts on this from @Chardot)

@rabble rabble force-pushed the feat/minor-account-review-flow-upstream branch from 89e9cce to bd445dd Compare May 6, 2026 15:47
@github-actions

This comment has been minimized.

@NotThatKindOfDrLiz NotThatKindOfDrLiz changed the title feat(moderation): add client-side minor account review flow feat(auth): add under-16 family guidance flow May 10, 2026
@NotThatKindOfDrLiz NotThatKindOfDrLiz force-pushed the feat/minor-account-review-flow-upstream branch from bd445dd to 684791d Compare May 10, 2026 02:55
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@NotThatKindOfDrLiz NotThatKindOfDrLiz force-pushed the feat/minor-account-review-flow-upstream branch from ef50c16 to 3b63aab Compare May 10, 2026 19:12
@github-actions

This comment has been minimized.

@NotThatKindOfDrLiz NotThatKindOfDrLiz force-pushed the feat/minor-account-review-flow-upstream branch from 3b63aab to 695ecd0 Compare May 10, 2026 19:25
@github-actions

This comment has been minimized.

@NotThatKindOfDrLiz NotThatKindOfDrLiz force-pushed the feat/minor-account-review-flow-upstream branch from 695ecd0 to 1968297 Compare May 10, 2026 19:49
@github-actions

This comment has been minimized.

@NotThatKindOfDrLiz NotThatKindOfDrLiz force-pushed the feat/minor-account-review-flow-upstream branch from 1968297 to c3b0aeb Compare May 10, 2026 20:02
@github-actions

This comment has been minimized.

@NotThatKindOfDrLiz NotThatKindOfDrLiz force-pushed the feat/minor-account-review-flow-upstream branch from c3b0aeb to 86c3b4d Compare May 10, 2026 20:30
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@NotThatKindOfDrLiz
Copy link
Copy Markdown
Member Author

Welcome-screen redesign preview is live: https://9450a1e0.openvine-app.pages.dev

What changed on this page:

  • "Divine accounts are for ages 16 and up." — white notice above the buttons
  • "Not 16 yet? That's OK. Here are your choices." — Here are your choices. is VineTheme.vineGreen and taps through to the family-guidance flow
  • Terms-of-service notice flipped from "By selecting an option above…" to "below" to match the new vertical order
  • Sign-in / create-account buttons now sit at the bottom of the column, beneath the terms notice

Caveat: this is the PR preview build, which forces OnboardingMode.open via forceOpenOnboarding = AppConfig.isGhActionsPrPreviewBuild. Tapping Create a new Divine account here skips the invite gate and lands on the create-account screen — that's preview-only behavior, not new.

Branch is also rebased on origin/main so the diff is now scoped to the under-16 review work (78 files instead of the previous 232).

NotThatKindOfDrLiz and others added 23 commits May 16, 2026 15:52
Use support@divine.video as the support contact, and host family,
kids, and age-review resources as paths on divine.video instead of
separate subdomains.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds minorAccountReviewErrorBody, minorAccountReviewCopySupportEmail,
and minorAccountReviewCopyCaseId to the 16 non-English locale ARBs as
English placeholders, matching the established placeholder pattern for
the rest of the minorAccountReview namespace. Unblocks
arb_consistency_test; real translations land in a separate l10n pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reframes the welcome screen so the age expectation is visible above the
sign-in/create-account buttons and the under-16 family-guidance flow is
reachable as an inline link in the same paragraph instead of a separate
text button at the bottom. The terms-of-service notice now references
the buttons "below" since it sits above them.

- adds `authMinAgeNotice` ("Divine accounts are for ages 16 and up.")
- splits the under-16 entry into `authUnder16Prefix` + the tappable
  `authUnder16ChoicesCta`, rendered as a RichText with the CTA in
  `VineTheme.vineGreen` and an inline `TapGestureRecognizer`
- flips `authTermsPrefix` from "above" to "below" to match the new
  layout order
- updates `welcome_screen_test` for the new vertical order and the
  RichText-based CTA tap
- adds the three new keys to the ARB consistency debt list pending the
  next translation pass
…NostrReadyProvider

Rebasing onto origin/main pulled in the Nostr readiness refactor that
deleted isNostrReadyProvider (a bool provider in app_providers.dart) in
favour of nostrSessionProvider / NostrSessionReadiness in
nostr_client_provider.dart. The router gating test still overrode the
removed provider and failed to compile.

Replace the seven `isNostrReadyProvider.overrideWith((ref) => false)`
overrides with a _NotReadyNostrSession notifier yielding
NostrSessionReadiness.identityKnown — the faithful equivalent of the
old "authenticated but Nostr signer not yet ready" window the router
must fail-closed through. Behavior and assertions unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@NotThatKindOfDrLiz NotThatKindOfDrLiz force-pushed the feat/minor-account-review-flow-upstream branch from 3bcb5cd to 90d0ad1 Compare May 16, 2026 21:21
@github-actions

This comment has been minimized.

Design feedback pass on the public under-13 screen and the 13-15
parent-consent screen.

Under-13 screen:
- Headline reworded to "We can't give you an account yet".
- "Why" paragraph moved into its own titled box (white text,
  no longer lost as loose body copy).
- Condensed the original four callout cards to three: "Here's why",
  "What your family can do instead", "When you turn 13".
- Removed the Close button entirely — exit is the app-bar back arrow
  or the OS, since iOS has no sanctioned programmatic-quit API and a
  dead-end button is poor UX / App Store risk.

13-15 parent-consent screen:
- "Why we ask a parent or guardian to be involved" balloon moved
  directly under the headline; the two "A parent or guardian
  should…" sentences now sit inside it after a paragraph gap.
- Balloon paragraph and title rewritten to brand voice.

l10n: removed the now-dead under-13 ComeBack/Honesty/Legal keys from
all 18 ARBs and the stale Honesty/Legal entries from the
arb_consistency_test fallback allowlist; re-added ComeBack for the
new third box; updated remaining values across all 18 locales
(English placeholders, key parity preserved so arb_consistency_test
stays green). Screen test now resolves copy from AppLocalizations
instead of hardcoded English.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

Mobile PR Preview

Preview refreshed for fc9114e

Last refresh: fc9114e at 2026-05-16 23:12:38 UTC (preview run)

Property Value
Preview URL https://d1d403e5.openvine-app.pages.dev
Pages project openvine-app
Preview branch pr-3531
PR branch feat/minor-account-review-flow-upstream
Commit fc9114e

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.

Track minor account review flow rollout

3 participants