The Plus gate (#89) renders Terms of use and Privacy policy under its purchase action, because the App Store requires both of a non-consumable. Neither goes anywhere — they are drawn disabled, since a link that looks live and does nothing is the worse of the two failures.
docs/design/07-components.md §7.3 already records the same defect on the About screen: all 8 About/Help rows are onClick={() => {}} stubs in the design, "and none of them appeared in §12". Two of those eight are these.
What changed is the consequence. Before the gate they were absent from a screen nobody could reach; now they sit on the surface a learner reads at the moment they decide to pay, and App Review checks exactly that surface.
Distinct from #166, which is the PrivacyInfo.xcprivacy manifest — a build artifact, not a page a learner can open.
Where this stands
PR #591 built everything except the pages themselves. termsUrl and
privacyUrl are two constants in lib/core/config/support_contact.dart, read
through providers by the paywall, the gate sheet and About. While they are
null the paywall's links are drawn disabled — their absence there is a
store-review failure — and About draws no legal row at all. Setting either
constant makes its link live everywhere at once, which a widget test proves.
What is left is the hosting, and only that: create the two pages, put
their URLs in those constants. Both criteria below are the live behaviour, so
neither can be ticked until they exist.
What is owed
- Two real, hosted URLs. Still owed.
A way to open them — the same one the About screen's rows will use, so this is decided once. Built: LinkOpener, behind one provider.
The gate's links enabled, and the About rows pointed at the same destinations. Built: both read the same two constants.
Acceptance
The Plus gate (#89) renders Terms of use and Privacy policy under its purchase action, because the App Store requires both of a non-consumable. Neither goes anywhere — they are drawn disabled, since a link that looks live and does nothing is the worse of the two failures.
docs/design/07-components.md§7.3 already records the same defect on the About screen: all 8 About/Help rows areonClick={() => {}}stubs in the design, "and none of them appeared in §12". Two of those eight are these.What changed is the consequence. Before the gate they were absent from a screen nobody could reach; now they sit on the surface a learner reads at the moment they decide to pay, and App Review checks exactly that surface.
Distinct from #166, which is the
PrivacyInfo.xcprivacymanifest — a build artifact, not a page a learner can open.Where this stands
PR #591 built everything except the pages themselves.
termsUrlandprivacyUrlare two constants inlib/core/config/support_contact.dart, readthrough providers by the paywall, the gate sheet and About. While they are
null the paywall's links are drawn disabled — their absence there is a
store-review failure — and About draws no legal row at all. Setting either
constant makes its link live everywhere at once, which a widget test proves.
What is left is the hosting, and only that: create the two pages, put
their URLs in those constants. Both criteria below are the live behaviour, so
neither can be ticked until they exist.
What is owed
A way to open them — the same one the About screen's rows will use, so this is decided once.Built:LinkOpener, behind one provider.The gate's links enabled, and the About rows pointed at the same destinations.Built: both read the same two constants.Acceptance