0.20.23 ships `additionalVerificationMethods` on the generated
ConfigRegion type, so the client-side AgeAssuranceConfigRegion
intersection and AgeAssuranceVerificationMethod alias are no longer
needed. Read the field directly off the generated type and type the
debug config as AppBskyAgeassuranceDefs.Config.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Model only the methods permitted *in addition to* the always-supported
KWS flow, rather than a full method list. This prevents a region from
being configured as device-only, which would lock out web and any
platform without the native age API.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rename getAssuredAgeFromDeviceSignals to getAgeAssuranceDataFromDeviceSignals
and return an object instead of a bare number, leaving room to derive more
rule-engine inputs from the native response (declared vs. guardian-declared,
parental controls, platform verification status) as the rules grow.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Persist on-device age signals client-side as a map keyed by
country[-region] string, so multiple regions can each retain their own
grant. Reads resolve to the user's current region via mergedGeolocation
(react-query `select` for the hook, a shared helper for the out-of-band
path), so a grant captured in one region never unlocks another.
- AgeAssuranceDeviceSignals is now a region-keyed map
- setDeviceSignalsForRegion merges a region's signals into the map
- useDeviceSignalsQuery select-resolves to the current region; cache
keeps the full map for the writer + persistence
- getAssuredAgeFromDeviceSignals takes the already-resolved signals
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Device assurance can't be verified server-side (the OS gives only age
bounds, no signed attestation), so it's persisted client-side only. Bind
each cached grant to the region it was captured in so a TX grant can't
unlock another region.
- Add AgeAssuranceDeviceSignals (signals + originRegion); store the
region-tagged record in the persisted cache instead of the raw response
- getAssuredAgeFromDeviceSignals now requires the current region to match
the capture region
- Gate the native age request to native platforms (web returns a
misleading default); web/new-device/declined falls back to KWS
- TX allows ['device', 'kws'] so the fallback path is real
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wire the expo-age-range device signals (already plumbed) into the age
assurance access decision, gated per-region.
- Model verificationMethods on region config (AgeAssuranceConfigRegion)
and add a debug US/TX region permitting the 'device' method
- Add region accessors + getAssuredAgeFromDeviceSignals in util
- Surface deviceSignals through the AA context and feed lowerBound in as
assuredAge, matching the existing IfAssuredOverAge rules
- NoAccessScreen "Verify now" now prompts the OS in device regions and
falls back to the KWS dialog when unavailable/insufficient
- Keep useDeviceSignalsQuery disabled so we never prompt on load; restore
from the persisted cache only
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* Age Assurance V2
* Tighten up test
* Add todos for sdk migration
* Align RQ versions
* Use useEffect for side effect
* Improve effects, memoize
* Standarize on birthdate
* Copy feedback
* Copilot
* Add support link
* Reove double ..
* Cleanup
* Remove redirect dialog
* Cleanup todos, add comments
* Update splash in main template too
* Mock some stuff
* Exhaustive checks
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
* Exhaustive checks
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
* Small fix to bday handling
* Add comment
* onboarding style tweak
sneaking this in sorry!
* rm unreachable breaks
* Put useIntentHandler back on web
* Remove misleading success set
* Align on birthdate
---------
Co-authored-by: Samuel Newman <mozzius@protonmail.com>