@burnt-labs/expo-satya-attest 3.3.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/PUBLISHING.md +8 -5
- package/README.md +54 -27
- package/android/build.gradle +2 -2
- package/android/src/main/jniLibs/arm64-v8a/libsatya_ffi.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libsatya_ffi.so +0 -0
- package/android/src/main/jniLibs/x86_64/libsatya_ffi.so +0 -0
- package/build/components/providerAttest/ProviderAttestModal.d.ts.map +1 -1
- package/build/components/providerAttest/ProviderAttestModal.js +3 -1
- package/build/components/providerAttest/ProviderAttestModal.js.map +1 -1
- package/build/components/providerAttest/SessionIdRow.d.ts +14 -0
- package/build/components/providerAttest/SessionIdRow.d.ts.map +1 -0
- package/build/components/providerAttest/SessionIdRow.js +47 -0
- package/build/components/providerAttest/SessionIdRow.js.map +1 -0
- package/build/components/providerAttest/clipboardSupport.d.ts +18 -0
- package/build/components/providerAttest/clipboardSupport.d.ts.map +1 -0
- package/build/components/providerAttest/clipboardSupport.js +44 -0
- package/build/components/providerAttest/clipboardSupport.js.map +1 -0
- package/build/components/providerAttest/styles.d.ts +30 -0
- package/build/components/providerAttest/styles.d.ts.map +1 -1
- package/build/components/providerAttest/styles.js +25 -1
- package/build/components/providerAttest/styles.js.map +1 -1
- package/build/components/providerAttest/teels/useTeelsProviderFlow.d.ts.map +1 -1
- package/build/components/providerAttest/teels/useTeelsProviderFlow.js +75 -5
- package/build/components/providerAttest/teels/useTeelsProviderFlow.js.map +1 -1
- package/build/components/providerAttest/types.d.ts +31 -0
- package/build/components/providerAttest/types.d.ts.map +1 -1
- package/build/components/providerAttest/types.js.map +1 -1
- package/build/components/providerAttest/useCompositeCaptureController.d.ts +6 -1
- package/build/components/providerAttest/useCompositeCaptureController.d.ts.map +1 -1
- package/build/components/providerAttest/useCompositeCaptureController.js +13 -1
- package/build/components/providerAttest/useCompositeCaptureController.js.map +1 -1
- package/build/components/providerAttest/useFunnelEmitter.d.ts +29 -0
- package/build/components/providerAttest/useFunnelEmitter.d.ts.map +1 -0
- package/build/components/providerAttest/useFunnelEmitter.js +75 -0
- package/build/components/providerAttest/useFunnelEmitter.js.map +1 -0
- package/build/components/providerAttest/useNativeReplayRunner.d.ts +8 -1
- package/build/components/providerAttest/useNativeReplayRunner.d.ts.map +1 -1
- package/build/components/providerAttest/useNativeReplayRunner.js +82 -2
- package/build/components/providerAttest/useNativeReplayRunner.js.map +1 -1
- package/build/components/providerAttest/useProviderAttestFlow.d.ts +4 -1
- package/build/components/providerAttest/useProviderAttestFlow.d.ts.map +1 -1
- package/build/components/providerAttest/useProviderAttestFlow.js +86 -8
- package/build/components/providerAttest/useProviderAttestFlow.js.map +1 -1
- package/build/components/providerAttest/useProviderFlowLifecycle.d.ts +5 -1
- package/build/components/providerAttest/useProviderFlowLifecycle.d.ts.map +1 -1
- package/build/components/providerAttest/useProviderFlowLifecycle.js +7 -1
- package/build/components/providerAttest/useProviderFlowLifecycle.js.map +1 -1
- package/build/components/providerAttest/useProviderMessageHandler.d.ts +3 -3
- package/build/components/providerAttest/useProviderMessageHandler.d.ts.map +1 -1
- package/build/components/providerAttest/useProviderMessageHandler.js +13 -3
- package/build/components/providerAttest/useProviderMessageHandler.js.map +1 -1
- package/build/constants.d.ts +20 -0
- package/build/constants.d.ts.map +1 -0
- package/build/constants.js +20 -0
- package/build/constants.js.map +1 -0
- package/build/debugLog.d.ts +6 -0
- package/build/debugLog.d.ts.map +1 -1
- package/build/debugLog.js +8 -0
- package/build/debugLog.js.map +1 -1
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/providerMonitor.d.ts +4 -2
- package/build/providerMonitor.d.ts.map +1 -1
- package/build/providerMonitor.js +4 -2
- package/build/providerMonitor.js.map +1 -1
- package/build/satyaConfig.d.ts +16 -3
- package/build/satyaConfig.d.ts.map +1 -1
- package/build/satyaConfig.js +40 -3
- package/build/satyaConfig.js.map +1 -1
- package/build/sdkEventLog.d.ts +114 -0
- package/build/sdkEventLog.d.ts.map +1 -0
- package/build/sdkEventLog.js +663 -0
- package/build/sdkEventLog.js.map +1 -0
- package/build/sdkMetadata.generated.d.ts +1 -1
- package/build/sdkMetadata.generated.js +1 -1
- package/build/sdkMetadata.generated.js.map +1 -1
- package/build/sessionId.d.ts +21 -0
- package/build/sessionId.d.ts.map +1 -0
- package/build/sessionId.js +55 -0
- package/build/sessionId.js.map +1 -0
- package/build/types/artifact.types.d.ts +6 -0
- package/build/types/artifact.types.d.ts.map +1 -1
- package/build/types/artifact.types.js.map +1 -1
- package/ios/Frameworks/libsatya_ffi-rs.xcframework/Info.plist +5 -5
- package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64/libsatya_ffi.a +0 -0
- package/ios/Frameworks/libsatya_ffi-rs.xcframework/ios-arm64_x86_64-simulator/libsatya_ffi.a +0 -0
- package/ios/SatyaAttest.podspec +1 -1
- package/package.json +2 -2
- package/src/components/providerAttest/ProviderAttestModal.tsx +11 -0
- package/src/components/providerAttest/SessionIdRow.tsx +74 -0
- package/src/components/providerAttest/clipboardSupport.ts +48 -0
- package/src/components/providerAttest/styles.ts +26 -1
- package/src/components/providerAttest/teels/useTeelsProviderFlow.ts +96 -5
- package/src/components/providerAttest/types.ts +32 -0
- package/src/components/providerAttest/useCompositeCaptureController.ts +18 -0
- package/src/components/providerAttest/useFunnelEmitter.ts +135 -0
- package/src/components/providerAttest/useNativeReplayRunner.ts +105 -2
- package/src/components/providerAttest/useProviderAttestFlow.ts +146 -39
- package/src/components/providerAttest/useProviderFlowLifecycle.ts +14 -0
- package/src/components/providerAttest/useProviderMessageHandler.ts +17 -6
- package/src/constants.ts +22 -0
- package/src/debugLog.ts +9 -0
- package/src/index.ts +19 -0
- package/src/providerMonitor.ts +4 -2
- package/src/satyaConfig.ts +62 -3
- package/src/sdkEventLog.ts +774 -0
- package/src/sdkMetadata.generated.ts +1 -1
- package/src/sessionId.ts +66 -0
- package/src/types/artifact.types.ts +6 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,73 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.4.0 - 2026-08-17
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **Funnel event logging (on by default).** The SDK emits a fixed set of seven
|
|
8
|
+
lifecycle events — `PROVIDER_INIT`, `LOGIN_COMPLETED`, `ENDPOINT_MATCHED`,
|
|
9
|
+
`NATIVE_REPLAY_SUCCESS`, `ATTESTATION_GENERATED`, `ATTESTATION_VERIFIED`, and
|
|
10
|
+
`FAILED` — to the Burnt SDK-logs ingest, so operators can debug providers,
|
|
11
|
+
user sessions, and SDK errors from the log entries alone. PII-free and
|
|
12
|
+
fire-and-forget; opt out per app with `initSatyaAttest({ eventLogging: false })`.
|
|
13
|
+
New optional knobs: `eventLogLevel?`, `eventLogBridgeDebug?`. The ingest
|
|
14
|
+
endpoint is fixed in the package (`src/constants.ts`) — no option, prop, or
|
|
15
|
+
env override — and delivery is best-effort: an unreachable ingest never
|
|
16
|
+
affects attestation flows.
|
|
17
|
+
- **Per-task `sessionId`.** Each user task mints one UUID-shaped id, **held
|
|
18
|
+
constant across retries** (with a per-attempt `attemptIndex`) and threaded into
|
|
19
|
+
every event, so all attempts for one task correlate and retry counts are
|
|
20
|
+
recoverable. Surfaced on `SatyaProviderAttestationResult` and flow progress.
|
|
21
|
+
- **`sessionId` embedded in the attestation** as an optional, *unsigned*
|
|
22
|
+
`sdkSessionId` envelope field (never in the signed statement), so the verifier
|
|
23
|
+
and downstream consumers can tie an attestation to its session and retries.
|
|
24
|
+
`attestationId` and all signatures are byte-identical; existing attestations
|
|
25
|
+
remain valid and the SDK-v3 verifier accepts both. Native Satya artifacts only
|
|
26
|
+
— TeeLS attestations are never modified. **Deployment order:** roll out the
|
|
27
|
+
`sdkSessionId`-aware verifier before (or together with) apps on 3.4.0 —
|
|
28
|
+
older verifiers reject *composite* artifacts that carry the new envelope
|
|
29
|
+
field (single-endpoint artifacts are parsed leniently and unaffected).
|
|
30
|
+
- **Failure screen shows the `sessionId` with a Copy control** so end users can
|
|
31
|
+
share it with support for debugging (host `onCopySessionId?` callback or the
|
|
32
|
+
Share sheet; no dependency).
|
|
33
|
+
- **`LOGIN_COMPLETED` fires from every login-done signal** — the provider
|
|
34
|
+
injection's `__satyaReady` flag (which also triggers the post-login cover
|
|
35
|
+
overlay) and an accepted `auth.submitSignal` response — deduped to one event
|
|
36
|
+
per attempt. Its `logData` records how login was detected with derived,
|
|
37
|
+
PII-free fields only: `loginSignalSource` (`satyaReady` | `submitSignal`),
|
|
38
|
+
the registry-declared `loginSignalId`, `submitStatusClass` (e.g. `2xx`),
|
|
39
|
+
`loginBodyMatched`, `loginLatencyMs` (attempt start → login done), and
|
|
40
|
+
`captureMode` (`composite` | `single`).
|
|
41
|
+
- **TeeLS flows emit their applicable events** — `PROVIDER_INIT`,
|
|
42
|
+
`ATTESTATION_GENERATED`, `ATTESTATION_VERIFIED` (`verifiedBy: 'teels'`), and a
|
|
43
|
+
terminal `FAILED` (`USER_CANCELLED` / `SUPERSEDED` included) — with the claim's
|
|
44
|
+
attestation id on the envelope (`attestationId`) and mirrored in
|
|
45
|
+
`logData.teelsAttestationId`.
|
|
46
|
+
- **`FAILED` carries the failure reason**: a secret-scrubbed, length-capped
|
|
47
|
+
`errorMessage` plus the verifier's own taxonomy (`verifierErrorCode` /
|
|
48
|
+
`verifierErrorClass` / `verifierErrorStage`) when the backend verifier
|
|
49
|
+
rejected the artifact.
|
|
50
|
+
- New public exports: the funnel emitter, the event-type enum, the session-id
|
|
51
|
+
helper, and the `SdkEventLogConfig` / `SdkEventLogData` types.
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
|
|
55
|
+
- **PII: the disclosed username is no longer logged.** The native replay debug
|
|
56
|
+
line logged `disclosedUsername` verbatim; it now logs `hasDisclosedUsername`
|
|
57
|
+
(a boolean) only.
|
|
58
|
+
|
|
59
|
+
### Notes
|
|
60
|
+
|
|
61
|
+
- Emission is **fire-and-forget and telemetry-only**: it never blocks, delays,
|
|
62
|
+
or fails an attestation, never carries claims/artifact contents, and is sent
|
|
63
|
+
with `credentials: 'omit'`. `logData` is built from an allowlist and hard-capped
|
|
64
|
+
at 2 KB. Transient `429`s back off and retry without dropping events.
|
|
65
|
+
- Funnel logging and `sdkSessionId` are **not** part of the hashed provider
|
|
66
|
+
policy or the signed statement, so every provider keeps an unchanged policy
|
|
67
|
+
hash and `attestationId`. The verifier validates the unsigned `sdkSessionId`
|
|
68
|
+
to a UUID shape before echoing/logging it. The change is strictly additive: no
|
|
69
|
+
public export or config field was removed or renamed.
|
|
70
|
+
|
|
3
71
|
## 3.3.0 - 2026-08-14
|
|
4
72
|
|
|
5
73
|
### Fixed
|
package/PUBLISHING.md
CHANGED
|
@@ -24,9 +24,11 @@ Check before release:
|
|
|
24
24
|
npm view @burnt-labs/expo-satya-attest version
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
If npm returns `E404`, the package has not been published yet.
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
If npm returns `E404`, the package has not been published yet. Publishing runs through
|
|
28
|
+
npm OIDC Trusted Publishing from `publish-expo-satya-attest.yml` (the package's single
|
|
29
|
+
trusted publisher on npmjs.com), so CI carries no long-lived `NPM_TOKEN`; the workflow
|
|
30
|
+
just needs `id-token: write` and npm >= 11.5.1. Scoped public publishes must use
|
|
31
|
+
`npm publish --access public`.
|
|
30
32
|
|
|
31
33
|
## Native Artifacts That Must Ship
|
|
32
34
|
|
|
@@ -201,8 +203,9 @@ unique prerelease version:
|
|
|
201
203
|
1.0.1-snapshot.<run>.<attempt>.sha-<commit>
|
|
202
204
|
```
|
|
203
205
|
|
|
204
|
-
The snapshot
|
|
205
|
-
example, if `package.json` is `1.0.0`, the snapshot version
|
|
206
|
+
The snapshot job (in `publish-expo-satya-attest.yml`) increments the package's patch base
|
|
207
|
+
in CI before publishing. For example, if `package.json` is `1.0.0`, the snapshot version
|
|
208
|
+
is based on `1.0.1`:
|
|
206
209
|
`1.0.1-snapshot.<run>.<attempt>.sha-<commit>`.
|
|
207
210
|
|
|
208
211
|
Snapshots use the `snapshot` dist-tag so test apps do not need to know the generated
|
package/README.md
CHANGED
|
@@ -133,33 +133,28 @@ verification claim, and do not log or persist the result by default.
|
|
|
133
133
|
|
|
134
134
|
The SATYA SDK performs no verification of the TeeLS result — it neither
|
|
135
135
|
verifies the quote nor checks that the claim data matches it. Before trusting
|
|
136
|
-
the result, the consuming application or its backend must verify it
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
`{ data, policyHash }` instead of bare `data`. Any mismatch means the claim
|
|
159
|
-
data was substituted after attestation.
|
|
160
|
-
|
|
161
|
-
The result carries no nonce, so enforce your own freshness and replay policy
|
|
162
|
-
wherever the attestation crosses a trust boundary.
|
|
136
|
+
the result, the consuming application or its backend must verify it. Post the
|
|
137
|
+
quote **and** the exact claim (`attestation.claim`) to the independent TeeLS
|
|
138
|
+
verifier's quote+claim endpoint and require `success: true`:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
curl -X POST https://attest.burnt.com/verify-quote \
|
|
142
|
+
-H 'content-type: application/json' \
|
|
143
|
+
-d '{"hex":"<quote hex>","claim":{ ...attestation.claim... }}'
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The response carries the DCAP quote verdict (`quote.verified`, `tcb_status`,
|
|
147
|
+
`quote.body` measurements) plus a `claim` verdict with per-check results
|
|
148
|
+
(`binding` — the quote's `reportdata` matches the claim, `providerKnown`,
|
|
149
|
+
`schemaMatch`, `policyMatch`, `timeValid`) and a `reason` on failure. The claim
|
|
150
|
+
is required: the quote-only `POST /verify` route refuses claim-carrying
|
|
151
|
+
requests so claim verification can't be skipped accidentally. If you pin
|
|
152
|
+
measurements yourself, compare `quote.body.mrtd` / `rtmr0`–`rtmr3` against the
|
|
153
|
+
registry at `GET https://attest.burnt.com/measurements`.
|
|
154
|
+
|
|
155
|
+
The result carries no nonce beyond the claim's `issuedAt`/`expiresAt` window,
|
|
156
|
+
so enforce your own freshness and replay policy wherever the attestation
|
|
157
|
+
crosses a trust boundary.
|
|
163
158
|
|
|
164
159
|
## Native Trust Tiers
|
|
165
160
|
|
|
@@ -937,6 +932,38 @@ is only `provider`, `outcome`, and `latencyMs` — no user data, claims, session
|
|
|
937
932
|
identifiers, or artifact contents. The endpoint enforces a registry allow-list;
|
|
938
933
|
unknown provider ids are acknowledged but not recorded.
|
|
939
934
|
|
|
935
|
+
## Funnel Event Logging
|
|
936
|
+
|
|
937
|
+
The SDK emits seven lifecycle events — `PROVIDER_INIT`, `LOGIN_COMPLETED`,
|
|
938
|
+
`ENDPOINT_MATCHED`, `NATIVE_REPLAY_SUCCESS`, `ATTESTATION_GENERATED`,
|
|
939
|
+
`ATTESTATION_VERIFIED`, and `FAILED` — to the SDK-logs ingest
|
|
940
|
+
(`POST https://satya-sdk-logs.burnt.com/v1/sdk-events`), viewable on the
|
|
941
|
+
provider-registry Monitoring dashboard. **On by default**; opt out with
|
|
942
|
+
`initSatyaAttest({ eventLogging: false })`.
|
|
943
|
+
|
|
944
|
+
- **Correlation:** each user task mints one UUID `sessionId`, held constant
|
|
945
|
+
across retries (each attempt is numbered with `attemptIndex`) and embedded in
|
|
946
|
+
native artifacts as the unsigned `sdkSessionId` envelope field. From
|
|
947
|
+
`ATTESTATION_GENERATED` on, events also carry the `attestationId` join key
|
|
948
|
+
(for TeeLS flows, the claim's attestation id). The failure screen shows the
|
|
949
|
+
`sessionId` with a Copy control for support hand-off. **Deploy the
|
|
950
|
+
`sdkSessionId`-aware verifier before rolling out 3.4.0 clients** — older
|
|
951
|
+
verifiers reject *composite* artifacts carrying the new envelope field.
|
|
952
|
+
- **PII stance:** `logData` is built from a fail-closed allowlist of derived
|
|
953
|
+
fields (status buckets, error codes, timings, versions) and hard-capped at
|
|
954
|
+
2 KB — never cookies, tokens, bodies, usernames, or full URLs. Sent with
|
|
955
|
+
`credentials: 'omit'`; `deviceId` is never sent. Events are analytics-only —
|
|
956
|
+
nothing downstream should treat them as evidence.
|
|
957
|
+
- **Delivery:** fire-and-forget off the attestation path; `429` responses back
|
|
958
|
+
off and retry without dropping; a bounded in-memory queue sheds the oldest
|
|
959
|
+
non-`FAILED` events only under overflow.
|
|
960
|
+
- Optional knobs: `eventLogLevel`, and `eventLogBridgeDebug` (attach a scrubbed
|
|
961
|
+
debug-log tail to `FAILED`; first-party debug builds only). The ingest
|
|
962
|
+
endpoint is fixed in the package (`src/constants.ts`) and cannot be
|
|
963
|
+
overridden by options, props, or env — app-controlled input never chooses
|
|
964
|
+
where session-correlated telemetry goes. Delivery is best-effort: an
|
|
965
|
+
unreachable or erroring ingest never affects attestation flows.
|
|
966
|
+
|
|
940
967
|
## Checks
|
|
941
968
|
|
|
942
969
|
```bash
|
package/android/build.gradle
CHANGED
|
@@ -4,13 +4,13 @@ plugins {
|
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
group = 'expo.modules.satyaattest'
|
|
7
|
-
version = '3.
|
|
7
|
+
version = '3.4.0'
|
|
8
8
|
|
|
9
9
|
android {
|
|
10
10
|
namespace "expo.modules.satyaattest"
|
|
11
11
|
defaultConfig {
|
|
12
12
|
versionCode 1
|
|
13
|
-
versionName "3.
|
|
13
|
+
versionName "3.4.0"
|
|
14
14
|
// StrongBox key attestation needs API 28+; basic Keystore attestation API 24+.
|
|
15
15
|
minSdkVersion 24
|
|
16
16
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProviderAttestModal.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/ProviderAttestModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ProviderAttestModal.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/ProviderAttestModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAwC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,UAAU,wBAAwB;IAChC,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,EAAE,wBAAwB,qBAMrE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { AccessibilityInfo, ActivityIndicator, Animated, Easing, Keyboard, LayoutAnimation, Modal, Platform, Pressable, StatusBar, StyleSheet, Text, useWindowDimensions, View, } from 'react-native';
|
|
3
3
|
import { initialWindowMetrics, SafeAreaInsetsContext, SafeAreaProvider, } from 'react-native-safe-area-context';
|
|
4
|
+
import { SessionIdRow } from './SessionIdRow';
|
|
4
5
|
import { WEBVIEW_BOOTSTRAP_URL } from './constants';
|
|
5
6
|
import { coverCopy, friendlyError, friendlyTeelsError, isRetryableError, preparingCopy, processingCopy, } from './copy';
|
|
6
7
|
import { managedPopupKey, managedPopupSource, safeWebViewUri } from './popupRelay';
|
|
@@ -144,7 +145,7 @@ function AndroidSheetHost({ flow }) {
|
|
|
144
145
|
</Modal>);
|
|
145
146
|
}
|
|
146
147
|
function ProviderSheetContent({ flow, insets }) {
|
|
147
|
-
const { closeFlow, closeManagedPopup, contentReady, effectiveUserAgent, error, errorCode, errorRetryable, handleHardwareBack, handleMessage, handleNavigationStateChange, handleOpenWindow, handlePopupNavigationStateChange, handlePopupOpenWindow, handlePopupShouldStartLoadWithRequest, handleShouldStartLoadWithRequest, handleReload, handleContentProcessDidTerminate, handleRenderProcessGone, handleWebViewError, handleWebViewHttpError, isTeelsFlow, isVerificationCovered, mainDocumentScriptReady, mainInjectedScript, managedPopup, markContentReady, markLoadEnd, markLoadStart, markPopupContentReady, maybeTriggerHtmlCapture, openFlow, phase, popupContentReady, popupDocumentScriptReady, popupHostRef, popupInjectedScript, popupRef, preparing, presentation, resolved, ResolvedWebView, secureConnection, secureHost, setBrowserChrome, setPopupChrome, theme, title, useNativePopups, webHostRef, webRef, webViewLoading, webViewProps, webViewUrl, returnToProvider, verificationPresentationPending, verificationPresentationStalled, } = flow;
|
|
148
|
+
const { closeFlow, closeManagedPopup, contentReady, effectiveUserAgent, error, errorCode, errorRetryable, sessionId, onCopySessionId, handleHardwareBack, handleMessage, handleNavigationStateChange, handleOpenWindow, handlePopupNavigationStateChange, handlePopupOpenWindow, handlePopupShouldStartLoadWithRequest, handleShouldStartLoadWithRequest, handleReload, handleContentProcessDidTerminate, handleRenderProcessGone, handleWebViewError, handleWebViewHttpError, isTeelsFlow, isVerificationCovered, mainDocumentScriptReady, mainInjectedScript, managedPopup, markContentReady, markLoadEnd, markLoadStart, markPopupContentReady, maybeTriggerHtmlCapture, openFlow, phase, popupContentReady, popupDocumentScriptReady, popupHostRef, popupInjectedScript, popupRef, preparing, presentation, resolved, ResolvedWebView, secureConnection, secureHost, setBrowserChrome, setPopupChrome, theme, title, useNativePopups, webHostRef, webRef, webViewLoading, webViewProps, webViewUrl, returnToProvider, verificationPresentationPending, verificationPresentationStalled, } = flow;
|
|
148
149
|
const useSheet = presentation === 'sheet';
|
|
149
150
|
const [coverOpacity] = useState(() => new Animated.Value(1));
|
|
150
151
|
const [popupCoverOpacity] = useState(() => new Animated.Value(1));
|
|
@@ -401,6 +402,7 @@ function ProviderSheetContent({ flow, insets }) {
|
|
|
401
402
|
<Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>
|
|
402
403
|
{isTeelsFlow ? friendlyTeelsError(error, errorCode) : friendlyError(error, errorCode)}
|
|
403
404
|
</Text>
|
|
405
|
+
{sessionId ? (<SessionIdRow sessionId={sessionId} onCopySessionId={onCopySessionId} mutedColor={theme.mutedColor ?? '#66758a'} accentColor={theme.accentColor ?? '#2752d9'}/>) : null}
|
|
404
406
|
{isRetryableError(errorCode, errorRetryable) ? (<Pressable style={[styles.primaryAction, { backgroundColor: theme.accentColor }]} onPress={openFlow}>
|
|
405
407
|
<Text style={styles.primaryActionText}>Try again</Text>
|
|
406
408
|
</Pressable>) : null}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProviderAttestModal.js","sourceRoot":"","sources":["../../../src/components/providerAttest/ProviderAttestModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport {\n AccessibilityInfo,\n ActivityIndicator,\n Animated,\n Easing,\n Keyboard,\n type KeyboardEvent,\n LayoutAnimation,\n Modal,\n Platform,\n Pressable,\n StatusBar,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport {\n initialWindowMetrics,\n SafeAreaInsetsContext,\n SafeAreaProvider,\n type EdgeInsets,\n} from 'react-native-safe-area-context';\n\nimport { WEBVIEW_BOOTSTRAP_URL } from './constants';\nimport {\n coverCopy,\n friendlyError,\n friendlyTeelsError,\n isRetryableError,\n preparingCopy,\n processingCopy,\n} from './copy';\nimport { managedPopupKey, managedPopupSource, safeWebViewUri } from './popupRelay';\nimport { defaultMobileBrowserUserAgent, providerLoginUrl } from './providerResolution';\nimport { styles } from './styles';\nimport { insetPadding } from './theme';\nimport { isLoadableDocumentUrl } from './urlUtils';\nimport type { ProviderAttestFlow } from './useProviderAttestFlow';\nimport { invokeWebViewCallback, readBrowserChromeState } from './webviewRuntime';\n\ninterface ProviderAttestModalProps {\n flow: ProviderAttestFlow;\n}\n\nexport function ProviderAttestModal({ flow }: ProviderAttestModalProps) {\n // Android has no native sheet, so drive an in-app animated one; iOS uses pageSheet.\n if (Platform.OS === 'android' && flow.presentation === 'sheet') {\n return <AndroidSheetHost flow={flow} />;\n }\n return <SharedModalHost flow={flow} />;\n}\n\nfunction SharedModalHost({ flow }: ProviderAttestModalProps) {\n const { handleHardwareBack, handleModalRequestClose, modalVisible, presentation, theme } = flow;\n const useSheet = presentation === 'sheet';\n return (\n <Modal\n visible={modalVisible}\n animationType=\"slide\"\n presentationStyle={Platform.OS === 'ios' && useSheet ? 'pageSheet' : 'fullScreen'}\n statusBarTranslucent={!useSheet}\n navigationBarTranslucent\n onRequestClose={Platform.OS === 'ios' ? handleModalRequestClose : handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <ModalKeyboardInset>\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(insets) => <ProviderSheetContent flow={flow} insets={insets} />}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </ModalKeyboardInset>\n </Modal>\n );\n}\n\n// iOS never resizes the WKWebView layout viewport for the keyboard (Android adjustResize\n// does), and RN's KeyboardAvoidingView measures parent-relative, which under-pads inside\n// the offset pageSheet presentation — so pad by the exact overlap in window coordinates.\nfunction ModalKeyboardInset({ children }: { children: React.ReactNode }) {\n const hostRef = useRef<View | null>(null);\n const appliedInsetRef = useRef(0);\n const [bottomInset, setBottomInset] = useState(0);\n useEffect(() => {\n if (Platform.OS !== 'ios') return undefined;\n const applyKeyboardFrame = (event: KeyboardEvent) => {\n hostRef.current?.measureInWindow((_x, y, _width, height) => {\n const hostBottom = y + height;\n const keyboardTop = event.endCoordinates.screenY;\n const keyboardBottom = keyboardTop + event.endCoordinates.height;\n // The iPad floating/undocked keyboard reports a frame that ends above the modal\n // bottom; only inset when the keyboard actually covers the bottom edge.\n const overlap =\n keyboardBottom >= hostBottom ? Math.max(0, Math.round(hostBottom - keyboardTop)) : 0;\n if (appliedInsetRef.current === overlap) return;\n appliedInsetRef.current = overlap;\n LayoutAnimation.configureNext({\n duration: event.duration > 0 ? event.duration : 250,\n update: { type: LayoutAnimation.Types.keyboard },\n });\n setBottomInset(overlap);\n });\n };\n const subscription = Keyboard.addListener('keyboardWillChangeFrame', applyKeyboardFrame);\n return () => subscription.remove();\n }, []);\n return (\n <View\n collapsable={false}\n ref={hostRef}\n style={[\n styles.modalKeyboardAvoiding,\n bottomInset > 0 ? { paddingBottom: bottomInset } : null,\n ]}>\n {children}\n </View>\n );\n}\n\nfunction AndroidSheetHost({ flow }: ProviderAttestModalProps) {\n const { closeFlow, handleHardwareBack, modalVisible, theme } = flow;\n const { height } = useWindowDimensions();\n const [translateY] = useState(() => new Animated.Value(height));\n const [backdropOpacity] = useState(() => new Animated.Value(0));\n // Keeps the Modal rendered through the slide-out animation.\n const [mounted, setMounted] = useState(false);\n // Height via ref so a resize while open doesn't re-run the entrance animation.\n const heightRef = useRef(height);\n useEffect(() => {\n heightRef.current = height;\n }, [height]);\n\n useEffect(() => {\n if (modalVisible) {\n // Mount for the whole open→close lifecycle so an early dismiss still slides out.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setMounted(true);\n translateY.setValue(heightRef.current);\n Animated.parallel([\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n damping: 24,\n stiffness: 260,\n mass: 0.9,\n }),\n Animated.timing(backdropOpacity, {\n toValue: 1,\n duration: 180,\n useNativeDriver: true,\n }),\n ]).start();\n return;\n }\n Animated.parallel([\n Animated.timing(translateY, {\n toValue: heightRef.current,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(backdropOpacity, { toValue: 0, duration: 160, useNativeDriver: true }),\n ]).start(({ finished }) => {\n if (finished) setMounted(false);\n });\n }, [modalVisible, translateY, backdropOpacity]);\n\n if (!modalVisible && !mounted) return null;\n\n return (\n <Modal\n visible\n transparent\n animationType=\"none\"\n statusBarTranslucent\n navigationBarTranslucent\n onRequestClose={handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <View style={styles.androidRoot}>\n <Animated.View\n style={[\n styles.backdrop,\n { opacity: backdropOpacity, backgroundColor: theme.backdropColor },\n ]}>\n <Pressable\n style={StyleSheet.absoluteFill}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n onPress={() => closeFlow(true)}\n />\n </Animated.View>\n <Animated.View\n style={[\n styles.androidSheet,\n {\n transform: [{ translateY }],\n backgroundColor: theme.surfaceColor,\n borderTopLeftRadius: theme.sheetCornerRadius,\n borderTopRightRadius: theme.sheetCornerRadius,\n },\n ]}>\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(insets) => <ProviderSheetContent flow={flow} insets={insets} />}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\ninterface ProviderSheetContentProps {\n flow: ProviderAttestFlow;\n insets: EdgeInsets | null;\n}\n\nfunction ProviderSheetContent({ flow, insets }: ProviderSheetContentProps) {\n const {\n closeFlow,\n closeManagedPopup,\n contentReady,\n effectiveUserAgent,\n error,\n errorCode,\n errorRetryable,\n handleHardwareBack,\n handleMessage,\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n handleReload,\n handleContentProcessDidTerminate,\n handleRenderProcessGone,\n handleWebViewError,\n handleWebViewHttpError,\n isTeelsFlow,\n isVerificationCovered,\n mainDocumentScriptReady,\n mainInjectedScript,\n managedPopup,\n markContentReady,\n markLoadEnd,\n markLoadStart,\n markPopupContentReady,\n maybeTriggerHtmlCapture,\n openFlow,\n phase,\n popupContentReady,\n popupDocumentScriptReady,\n popupHostRef,\n popupInjectedScript,\n popupRef,\n preparing,\n presentation,\n resolved,\n ResolvedWebView,\n secureConnection,\n secureHost,\n setBrowserChrome,\n setPopupChrome,\n theme,\n title,\n useNativePopups,\n webHostRef,\n webRef,\n webViewLoading,\n webViewProps,\n webViewUrl,\n returnToProvider,\n verificationPresentationPending,\n verificationPresentationStalled,\n } = flow;\n\n const useSheet = presentation === 'sheet';\n const [coverOpacity] = useState(() => new Animated.Value(1));\n const [popupCoverOpacity] = useState(() => new Animated.Value(1));\n // Browser-style loading line: trickle while loading, snap to 100% and fade on done.\n const [barProgress] = useState(() => new Animated.Value(0));\n const [barOpacity] = useState(() => new Animated.Value(0));\n\n useEffect(() => {\n Animated.timing(coverOpacity, {\n toValue: contentReady ? 0 : 1,\n duration: contentReady ? 220 : 0,\n useNativeDriver: true,\n }).start();\n }, [contentReady, coverOpacity]);\n\n useEffect(() => {\n Animated.timing(popupCoverOpacity, {\n toValue: popupContentReady ? 0 : 1,\n duration: popupContentReady ? 220 : 0,\n useNativeDriver: true,\n }).start();\n }, [popupContentReady, popupCoverOpacity]);\n\n useEffect(() => {\n if (Platform.OS !== 'ios' || !isVerificationCovered || flow.isProcessing) return;\n const { title } = coverCopy({\n pending: verificationPresentationPending,\n stalled: verificationPresentationStalled,\n });\n AccessibilityInfo.announceForAccessibility(`${title.replace(/\\.\\.\\.$/, '')}.`);\n }, [\n flow.isProcessing,\n isVerificationCovered,\n verificationPresentationPending,\n verificationPresentationStalled,\n ]);\n\n useEffect(() => {\n if (webViewLoading) {\n barProgress.setValue(0.03);\n Animated.parallel([\n Animated.timing(barOpacity, { toValue: 1, duration: 120, useNativeDriver: false }),\n Animated.timing(barProgress, {\n toValue: 0.9,\n duration: 9000,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: false,\n }),\n ]).start();\n return;\n }\n Animated.sequence([\n Animated.timing(barProgress, {\n toValue: 1,\n duration: 160,\n easing: Easing.out(Easing.quad),\n useNativeDriver: false,\n }),\n Animated.timing(barOpacity, { toValue: 0, duration: 220, useNativeDriver: false }),\n ]).start(({ finished }) => {\n if (finished) barProgress.setValue(0);\n });\n }, [webViewLoading, barProgress, barOpacity]);\n\n const preparingName = title === 'Provider Attestation' ? undefined : title;\n const coverStatusCopy = coverCopy({\n pending: verificationPresentationPending,\n stalled: verificationPresentationStalled,\n });\n const providerContentConcealed = isVerificationCovered || !!error || preparing;\n const showRefresh = !!resolved && !providerContentConcealed;\n\n return (\n <View\n style={[\n styles.modalRoot,\n { backgroundColor: theme.surfaceColor },\n useSheet && {\n borderTopLeftRadius: theme.sheetCornerRadius,\n borderTopRightRadius: theme.sheetCornerRadius,\n overflow: 'hidden',\n },\n insetPadding(insets, presentation),\n ]}>\n {useSheet && theme.showGrabber ? (\n <View style={styles.grabberWrap}>\n <View style={styles.grabber} />\n </View>\n ) : null}\n <View style={[styles.header, { backgroundColor: theme.surfaceColor }]}>\n {showRefresh ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Reload page\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleReload}>\n <Text style={[styles.headerRefreshGlyph, { color: theme.onSurfaceColor }]}>⟲</Text>\n </Pressable>\n ) : (\n <View style={styles.headerSide} />\n )}\n <View style={styles.headerCenter}>\n <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>\n {title}\n </Text>\n {secureHost ? (\n <View style={styles.domainPill}>\n <Text style={[styles.domainLockGlyph, { color: theme.mutedColor }]}>\n {secureConnection ? '🔒' : '⚠'}\n </Text>\n <Text style={[styles.domainText, { color: theme.mutedColor }]} numberOfLines={1}>\n {secureHost}\n </Text>\n </View>\n ) : null}\n </View>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close browser\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleHardwareBack}>\n <View style={styles.headerCloseButton}>\n <Text style={[styles.headerCloseGlyph, { color: theme.onSurfaceColor }]}>✕</Text>\n </View>\n </Pressable>\n </View>\n <View style={styles.progressTrack}>\n <Animated.View\n style={[\n styles.progressFill,\n {\n backgroundColor: theme.accentColor,\n opacity: barOpacity,\n width: barProgress.interpolate({\n inputRange: [0, 1],\n outputRange: ['0%', '100%'],\n }),\n },\n ]}\n />\n </View>\n <View ref={webHostRef} style={[styles.webViewHost, { backgroundColor: theme.surfaceColor }]}>\n {ResolvedWebView && resolved ? (\n <ResolvedWebView\n {...(webViewProps ?? {})}\n {...(isTeelsFlow\n ? {\n onContentProcessDidTerminate: handleContentProcessDidTerminate,\n onRenderProcessGone: handleRenderProcessGone,\n onError: handleWebViewError,\n onHttpError: handleWebViewHttpError,\n }\n : {})}\n geolocationEnabled={resolved.template.requiresLocation === true}\n ref={webRef}\n source={{\n uri: safeWebViewUri(\n mainDocumentScriptReady\n ? (webViewUrl ?? providerLoginUrl(resolved.template))\n : WEBVIEW_BOOTSTRAP_URL,\n providerLoginUrl(resolved.template),\n Platform.OS === 'android'\n ),\n }}\n style={[styles.webView, webViewProps?.style]}\n accessibilityElementsHidden={providerContentConcealed}\n importantForAccessibility={providerContentConcealed ? 'no-hide-descendants' : 'auto'}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={useNativePopups}\n injectedJavaScriptBeforeContentLoaded={mainInjectedScript}\n injectedJavaScript={mainInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handleOpenWindow}\n onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}\n onNavigationStateChange={handleNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeMainWebViewCallback(webViewProps?.onLoadStart, event, isTeelsFlow, 'before');\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n markLoadStart(nextChrome.url);\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n invokeMainWebViewCallback(webViewProps?.onLoadStart, event, isTeelsFlow, 'after');\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeMainWebViewCallback(webViewProps?.onLoadEnd, event, isTeelsFlow, 'before');\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n markContentReady();\n markLoadEnd(nextChrome.url);\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n webRef.current?.injectJavaScript?.(mainInjectedScript);\n if (!isTeelsFlow) maybeTriggerHtmlCapture(nextChrome.url);\n invokeMainWebViewCallback(webViewProps?.onLoadEnd, event, isTeelsFlow, 'after');\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n ) : (\n <View style={styles.webViewFallback}>\n <Text style={styles.errorText}>react-native-webview is not available.</Text>\n </View>\n )}\n {ResolvedWebView && resolved ? (\n <Animated.View\n pointerEvents={contentReady ? 'none' : 'auto'}\n style={[\n styles.fadeCover,\n { backgroundColor: theme.surfaceColor, opacity: coverOpacity },\n ]}>\n {!contentReady ? <ActivityIndicator color={theme.accentColor} size=\"large\" /> : null}\n </Animated.View>\n ) : null}\n {ResolvedWebView && resolved && managedPopup && isLoadableDocumentUrl(managedPopup.url) ? (\n <View\n ref={popupHostRef}\n accessibilityElementsHidden={providerContentConcealed}\n importantForAccessibility={providerContentConcealed ? 'no-hide-descendants' : 'auto'}\n style={[styles.popupOverlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={[styles.popupHeader, { backgroundColor: theme.surfaceColor }]}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={() => closeManagedPopup()}>\n <Text style={[styles.headerBackGlyph, { color: theme.onSurfaceColor }]}>{'<'}</Text>\n </Pressable>\n <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>\n Sign in\n </Text>\n <View style={styles.headerSide} />\n </View>\n <View style={styles.webViewHost}>\n <ResolvedWebView\n {...(webViewProps ?? {})}\n geolocationEnabled={resolved.template.requiresLocation === true}\n ref={popupRef}\n key={managedPopupKey(managedPopup)}\n source={\n popupDocumentScriptReady\n ? managedPopupSource(managedPopup)\n : { uri: WEBVIEW_BOOTSTRAP_URL }\n }\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={false}\n injectedJavaScriptBeforeContentLoaded={popupInjectedScript}\n injectedJavaScript={popupInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handlePopupOpenWindow}\n onShouldStartLoadWithRequest={handlePopupShouldStartLoadWithRequest}\n onNavigationStateChange={handlePopupNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (!popupDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) {\n return;\n }\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (!popupDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) {\n return;\n }\n markPopupContentReady();\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n popupRef.current?.injectJavaScript?.(popupInjectedScript);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n <Animated.View\n pointerEvents={popupContentReady ? 'none' : 'auto'}\n style={[\n styles.fadeCover,\n { backgroundColor: theme.surfaceColor, opacity: popupCoverOpacity },\n ]}>\n {!popupContentReady ? (\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n ) : null}\n </Animated.View>\n </View>\n </View>\n ) : null}\n {providerContentConcealed ? (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={[\n styles.privacyCoverBase,\n {\n backgroundColor: theme.statusBarStyle === 'light-content' ? '#000000' : '#ffffff',\n },\n ]}\n />\n ) : null}\n {isVerificationCovered && !flow.isProcessing ? (\n <View\n accessible={!verificationPresentationStalled}\n accessibilityLabel={`${coverStatusCopy.title.replace(/\\.\\.\\.$/, '')}.`}\n accessibilityLiveRegion=\"polite\"\n accessibilityViewIsModal\n style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n {verificationPresentationStalled ? null : (\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n )}\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {coverStatusCopy.title}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n {coverStatusCopy.subtitle}\n </Text>\n {verificationPresentationStalled ? (\n <>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Return to provider\"\n style={[styles.primaryAction, { backgroundColor: theme.accentColor }]}\n onPress={returnToProvider}>\n <Text style={styles.primaryActionText}>Return to provider</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Cancel verification\"\n style={styles.secondaryAction}\n onPress={() => closeFlow(true)}>\n <Text style={[styles.secondaryActionText, { color: theme.mutedColor }]}>\n Cancel\n </Text>\n </Pressable>\n </>\n ) : null}\n </View>\n ) : null}\n {flow.isProcessing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {processingCopy(phase)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Keep this screen open - it only takes a moment.\n </Text>\n </View>\n ) : null}\n {error ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={styles.errorIconWrap}>\n <Text style={styles.errorIconGlyph}>!</Text>\n </View>\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {isTeelsFlow ? 'Could not complete attestation' : 'Could not verify your account'}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n {isTeelsFlow ? friendlyTeelsError(error, errorCode) : friendlyError(error, errorCode)}\n </Text>\n {isRetryableError(errorCode, errorRetryable) ? (\n <Pressable\n style={[styles.primaryAction, { backgroundColor: theme.accentColor }]}\n onPress={openFlow}>\n <Text style={styles.primaryActionText}>Try again</Text>\n </Pressable>\n ) : null}\n <Pressable style={styles.secondaryAction} onPress={() => closeFlow(true)}>\n <Text style={[styles.secondaryActionText, { color: theme.mutedColor }]}>Close</Text>\n </Pressable>\n </View>\n ) : null}\n {preparing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {preparingCopy(preparingName)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Setting up a secure connection.\n </Text>\n </View>\n ) : null}\n {Platform.OS === 'ios' ? (\n <View\n style={styles.edgeSwipeZone}\n accessibilityElementsHidden\n {...flow.edgeSwipeHandlers}\n />\n ) : null}\n </View>\n </View>\n );\n}\n\nfunction invokeMainWebViewCallback(\n callback: unknown,\n event: unknown,\n isTeelsFlow: boolean | undefined,\n timing: 'before' | 'after'\n): void {\n if ((!isTeelsFlow && timing !== 'before') || (isTeelsFlow && timing !== 'after')) return;\n if (!isTeelsFlow) {\n invokeWebViewCallback(callback, event);\n return;\n }\n try {\n invokeWebViewCallback(callback, event);\n } catch {\n // Observational host callbacks cannot interrupt or settle the TeeLS flow.\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ProviderAttestModal.js","sourceRoot":"","sources":["../../../src/components/providerAttest/ProviderAttestModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport {\n AccessibilityInfo,\n ActivityIndicator,\n Animated,\n Easing,\n Keyboard,\n type KeyboardEvent,\n LayoutAnimation,\n Modal,\n Platform,\n Pressable,\n StatusBar,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport {\n initialWindowMetrics,\n SafeAreaInsetsContext,\n SafeAreaProvider,\n type EdgeInsets,\n} from 'react-native-safe-area-context';\n\nimport { SessionIdRow } from './SessionIdRow';\nimport { WEBVIEW_BOOTSTRAP_URL } from './constants';\nimport {\n coverCopy,\n friendlyError,\n friendlyTeelsError,\n isRetryableError,\n preparingCopy,\n processingCopy,\n} from './copy';\nimport { managedPopupKey, managedPopupSource, safeWebViewUri } from './popupRelay';\nimport { defaultMobileBrowserUserAgent, providerLoginUrl } from './providerResolution';\nimport { styles } from './styles';\nimport { insetPadding } from './theme';\nimport { isLoadableDocumentUrl } from './urlUtils';\nimport type { ProviderAttestFlow } from './useProviderAttestFlow';\nimport { invokeWebViewCallback, readBrowserChromeState } from './webviewRuntime';\n\ninterface ProviderAttestModalProps {\n flow: ProviderAttestFlow;\n}\n\nexport function ProviderAttestModal({ flow }: ProviderAttestModalProps) {\n // Android has no native sheet, so drive an in-app animated one; iOS uses pageSheet.\n if (Platform.OS === 'android' && flow.presentation === 'sheet') {\n return <AndroidSheetHost flow={flow} />;\n }\n return <SharedModalHost flow={flow} />;\n}\n\nfunction SharedModalHost({ flow }: ProviderAttestModalProps) {\n const { handleHardwareBack, handleModalRequestClose, modalVisible, presentation, theme } = flow;\n const useSheet = presentation === 'sheet';\n return (\n <Modal\n visible={modalVisible}\n animationType=\"slide\"\n presentationStyle={Platform.OS === 'ios' && useSheet ? 'pageSheet' : 'fullScreen'}\n statusBarTranslucent={!useSheet}\n navigationBarTranslucent\n onRequestClose={Platform.OS === 'ios' ? handleModalRequestClose : handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <ModalKeyboardInset>\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(insets) => <ProviderSheetContent flow={flow} insets={insets} />}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </ModalKeyboardInset>\n </Modal>\n );\n}\n\n// iOS never resizes the WKWebView layout viewport for the keyboard (Android adjustResize\n// does), and RN's KeyboardAvoidingView measures parent-relative, which under-pads inside\n// the offset pageSheet presentation — so pad by the exact overlap in window coordinates.\nfunction ModalKeyboardInset({ children }: { children: React.ReactNode }) {\n const hostRef = useRef<View | null>(null);\n const appliedInsetRef = useRef(0);\n const [bottomInset, setBottomInset] = useState(0);\n useEffect(() => {\n if (Platform.OS !== 'ios') return undefined;\n const applyKeyboardFrame = (event: KeyboardEvent) => {\n hostRef.current?.measureInWindow((_x, y, _width, height) => {\n const hostBottom = y + height;\n const keyboardTop = event.endCoordinates.screenY;\n const keyboardBottom = keyboardTop + event.endCoordinates.height;\n // The iPad floating/undocked keyboard reports a frame that ends above the modal\n // bottom; only inset when the keyboard actually covers the bottom edge.\n const overlap =\n keyboardBottom >= hostBottom ? Math.max(0, Math.round(hostBottom - keyboardTop)) : 0;\n if (appliedInsetRef.current === overlap) return;\n appliedInsetRef.current = overlap;\n LayoutAnimation.configureNext({\n duration: event.duration > 0 ? event.duration : 250,\n update: { type: LayoutAnimation.Types.keyboard },\n });\n setBottomInset(overlap);\n });\n };\n const subscription = Keyboard.addListener('keyboardWillChangeFrame', applyKeyboardFrame);\n return () => subscription.remove();\n }, []);\n return (\n <View\n collapsable={false}\n ref={hostRef}\n style={[\n styles.modalKeyboardAvoiding,\n bottomInset > 0 ? { paddingBottom: bottomInset } : null,\n ]}>\n {children}\n </View>\n );\n}\n\nfunction AndroidSheetHost({ flow }: ProviderAttestModalProps) {\n const { closeFlow, handleHardwareBack, modalVisible, theme } = flow;\n const { height } = useWindowDimensions();\n const [translateY] = useState(() => new Animated.Value(height));\n const [backdropOpacity] = useState(() => new Animated.Value(0));\n // Keeps the Modal rendered through the slide-out animation.\n const [mounted, setMounted] = useState(false);\n // Height via ref so a resize while open doesn't re-run the entrance animation.\n const heightRef = useRef(height);\n useEffect(() => {\n heightRef.current = height;\n }, [height]);\n\n useEffect(() => {\n if (modalVisible) {\n // Mount for the whole open→close lifecycle so an early dismiss still slides out.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setMounted(true);\n translateY.setValue(heightRef.current);\n Animated.parallel([\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n damping: 24,\n stiffness: 260,\n mass: 0.9,\n }),\n Animated.timing(backdropOpacity, {\n toValue: 1,\n duration: 180,\n useNativeDriver: true,\n }),\n ]).start();\n return;\n }\n Animated.parallel([\n Animated.timing(translateY, {\n toValue: heightRef.current,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(backdropOpacity, { toValue: 0, duration: 160, useNativeDriver: true }),\n ]).start(({ finished }) => {\n if (finished) setMounted(false);\n });\n }, [modalVisible, translateY, backdropOpacity]);\n\n if (!modalVisible && !mounted) return null;\n\n return (\n <Modal\n visible\n transparent\n animationType=\"none\"\n statusBarTranslucent\n navigationBarTranslucent\n onRequestClose={handleHardwareBack}>\n <StatusBar barStyle={theme.statusBarStyle} backgroundColor=\"transparent\" translucent />\n <View style={styles.androidRoot}>\n <Animated.View\n style={[\n styles.backdrop,\n { opacity: backdropOpacity, backgroundColor: theme.backdropColor },\n ]}>\n <Pressable\n style={StyleSheet.absoluteFill}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n onPress={() => closeFlow(true)}\n />\n </Animated.View>\n <Animated.View\n style={[\n styles.androidSheet,\n {\n transform: [{ translateY }],\n backgroundColor: theme.surfaceColor,\n borderTopLeftRadius: theme.sheetCornerRadius,\n borderTopRightRadius: theme.sheetCornerRadius,\n },\n ]}>\n <SafeAreaProvider initialMetrics={initialWindowMetrics}>\n <SafeAreaInsetsContext.Consumer>\n {(insets) => <ProviderSheetContent flow={flow} insets={insets} />}\n </SafeAreaInsetsContext.Consumer>\n </SafeAreaProvider>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\ninterface ProviderSheetContentProps {\n flow: ProviderAttestFlow;\n insets: EdgeInsets | null;\n}\n\nfunction ProviderSheetContent({ flow, insets }: ProviderSheetContentProps) {\n const {\n closeFlow,\n closeManagedPopup,\n contentReady,\n effectiveUserAgent,\n error,\n errorCode,\n errorRetryable,\n sessionId,\n onCopySessionId,\n handleHardwareBack,\n handleMessage,\n handleNavigationStateChange,\n handleOpenWindow,\n handlePopupNavigationStateChange,\n handlePopupOpenWindow,\n handlePopupShouldStartLoadWithRequest,\n handleShouldStartLoadWithRequest,\n handleReload,\n handleContentProcessDidTerminate,\n handleRenderProcessGone,\n handleWebViewError,\n handleWebViewHttpError,\n isTeelsFlow,\n isVerificationCovered,\n mainDocumentScriptReady,\n mainInjectedScript,\n managedPopup,\n markContentReady,\n markLoadEnd,\n markLoadStart,\n markPopupContentReady,\n maybeTriggerHtmlCapture,\n openFlow,\n phase,\n popupContentReady,\n popupDocumentScriptReady,\n popupHostRef,\n popupInjectedScript,\n popupRef,\n preparing,\n presentation,\n resolved,\n ResolvedWebView,\n secureConnection,\n secureHost,\n setBrowserChrome,\n setPopupChrome,\n theme,\n title,\n useNativePopups,\n webHostRef,\n webRef,\n webViewLoading,\n webViewProps,\n webViewUrl,\n returnToProvider,\n verificationPresentationPending,\n verificationPresentationStalled,\n } = flow;\n\n const useSheet = presentation === 'sheet';\n const [coverOpacity] = useState(() => new Animated.Value(1));\n const [popupCoverOpacity] = useState(() => new Animated.Value(1));\n // Browser-style loading line: trickle while loading, snap to 100% and fade on done.\n const [barProgress] = useState(() => new Animated.Value(0));\n const [barOpacity] = useState(() => new Animated.Value(0));\n\n useEffect(() => {\n Animated.timing(coverOpacity, {\n toValue: contentReady ? 0 : 1,\n duration: contentReady ? 220 : 0,\n useNativeDriver: true,\n }).start();\n }, [contentReady, coverOpacity]);\n\n useEffect(() => {\n Animated.timing(popupCoverOpacity, {\n toValue: popupContentReady ? 0 : 1,\n duration: popupContentReady ? 220 : 0,\n useNativeDriver: true,\n }).start();\n }, [popupContentReady, popupCoverOpacity]);\n\n useEffect(() => {\n if (Platform.OS !== 'ios' || !isVerificationCovered || flow.isProcessing) return;\n const { title } = coverCopy({\n pending: verificationPresentationPending,\n stalled: verificationPresentationStalled,\n });\n AccessibilityInfo.announceForAccessibility(`${title.replace(/\\.\\.\\.$/, '')}.`);\n }, [\n flow.isProcessing,\n isVerificationCovered,\n verificationPresentationPending,\n verificationPresentationStalled,\n ]);\n\n useEffect(() => {\n if (webViewLoading) {\n barProgress.setValue(0.03);\n Animated.parallel([\n Animated.timing(barOpacity, { toValue: 1, duration: 120, useNativeDriver: false }),\n Animated.timing(barProgress, {\n toValue: 0.9,\n duration: 9000,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: false,\n }),\n ]).start();\n return;\n }\n Animated.sequence([\n Animated.timing(barProgress, {\n toValue: 1,\n duration: 160,\n easing: Easing.out(Easing.quad),\n useNativeDriver: false,\n }),\n Animated.timing(barOpacity, { toValue: 0, duration: 220, useNativeDriver: false }),\n ]).start(({ finished }) => {\n if (finished) barProgress.setValue(0);\n });\n }, [webViewLoading, barProgress, barOpacity]);\n\n const preparingName = title === 'Provider Attestation' ? undefined : title;\n const coverStatusCopy = coverCopy({\n pending: verificationPresentationPending,\n stalled: verificationPresentationStalled,\n });\n const providerContentConcealed = isVerificationCovered || !!error || preparing;\n const showRefresh = !!resolved && !providerContentConcealed;\n\n return (\n <View\n style={[\n styles.modalRoot,\n { backgroundColor: theme.surfaceColor },\n useSheet && {\n borderTopLeftRadius: theme.sheetCornerRadius,\n borderTopRightRadius: theme.sheetCornerRadius,\n overflow: 'hidden',\n },\n insetPadding(insets, presentation),\n ]}>\n {useSheet && theme.showGrabber ? (\n <View style={styles.grabberWrap}>\n <View style={styles.grabber} />\n </View>\n ) : null}\n <View style={[styles.header, { backgroundColor: theme.surfaceColor }]}>\n {showRefresh ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Reload page\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleReload}>\n <Text style={[styles.headerRefreshGlyph, { color: theme.onSurfaceColor }]}>⟲</Text>\n </Pressable>\n ) : (\n <View style={styles.headerSide} />\n )}\n <View style={styles.headerCenter}>\n <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>\n {title}\n </Text>\n {secureHost ? (\n <View style={styles.domainPill}>\n <Text style={[styles.domainLockGlyph, { color: theme.mutedColor }]}>\n {secureConnection ? '🔒' : '⚠'}\n </Text>\n <Text style={[styles.domainText, { color: theme.mutedColor }]} numberOfLines={1}>\n {secureHost}\n </Text>\n </View>\n ) : null}\n </View>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close browser\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={handleHardwareBack}>\n <View style={styles.headerCloseButton}>\n <Text style={[styles.headerCloseGlyph, { color: theme.onSurfaceColor }]}>✕</Text>\n </View>\n </Pressable>\n </View>\n <View style={styles.progressTrack}>\n <Animated.View\n style={[\n styles.progressFill,\n {\n backgroundColor: theme.accentColor,\n opacity: barOpacity,\n width: barProgress.interpolate({\n inputRange: [0, 1],\n outputRange: ['0%', '100%'],\n }),\n },\n ]}\n />\n </View>\n <View ref={webHostRef} style={[styles.webViewHost, { backgroundColor: theme.surfaceColor }]}>\n {ResolvedWebView && resolved ? (\n <ResolvedWebView\n {...(webViewProps ?? {})}\n {...(isTeelsFlow\n ? {\n onContentProcessDidTerminate: handleContentProcessDidTerminate,\n onRenderProcessGone: handleRenderProcessGone,\n onError: handleWebViewError,\n onHttpError: handleWebViewHttpError,\n }\n : {})}\n geolocationEnabled={resolved.template.requiresLocation === true}\n ref={webRef}\n source={{\n uri: safeWebViewUri(\n mainDocumentScriptReady\n ? (webViewUrl ?? providerLoginUrl(resolved.template))\n : WEBVIEW_BOOTSTRAP_URL,\n providerLoginUrl(resolved.template),\n Platform.OS === 'android'\n ),\n }}\n style={[styles.webView, webViewProps?.style]}\n accessibilityElementsHidden={providerContentConcealed}\n importantForAccessibility={providerContentConcealed ? 'no-hide-descendants' : 'auto'}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={useNativePopups}\n injectedJavaScriptBeforeContentLoaded={mainInjectedScript}\n injectedJavaScript={mainInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handleOpenWindow}\n onShouldStartLoadWithRequest={handleShouldStartLoadWithRequest}\n onNavigationStateChange={handleNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeMainWebViewCallback(webViewProps?.onLoadStart, event, isTeelsFlow, 'before');\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n markLoadStart(nextChrome.url);\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n invokeMainWebViewCallback(webViewProps?.onLoadStart, event, isTeelsFlow, 'after');\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeMainWebViewCallback(webViewProps?.onLoadEnd, event, isTeelsFlow, 'before');\n if (!mainDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) return;\n markContentReady();\n markLoadEnd(nextChrome.url);\n setBrowserChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n webRef.current?.injectJavaScript?.(mainInjectedScript);\n if (!isTeelsFlow) maybeTriggerHtmlCapture(nextChrome.url);\n invokeMainWebViewCallback(webViewProps?.onLoadEnd, event, isTeelsFlow, 'after');\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n ) : (\n <View style={styles.webViewFallback}>\n <Text style={styles.errorText}>react-native-webview is not available.</Text>\n </View>\n )}\n {ResolvedWebView && resolved ? (\n <Animated.View\n pointerEvents={contentReady ? 'none' : 'auto'}\n style={[\n styles.fadeCover,\n { backgroundColor: theme.surfaceColor, opacity: coverOpacity },\n ]}>\n {!contentReady ? <ActivityIndicator color={theme.accentColor} size=\"large\" /> : null}\n </Animated.View>\n ) : null}\n {ResolvedWebView && resolved && managedPopup && isLoadableDocumentUrl(managedPopup.url) ? (\n <View\n ref={popupHostRef}\n accessibilityElementsHidden={providerContentConcealed}\n importantForAccessibility={providerContentConcealed ? 'no-hide-descendants' : 'auto'}\n style={[styles.popupOverlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={[styles.popupHeader, { backgroundColor: theme.surfaceColor }]}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back\"\n hitSlop={12}\n style={styles.headerSide}\n onPress={() => closeManagedPopup()}>\n <Text style={[styles.headerBackGlyph, { color: theme.onSurfaceColor }]}>{'<'}</Text>\n </Pressable>\n <Text style={[styles.headerTitle, { color: theme.onSurfaceColor }]} numberOfLines={1}>\n Sign in\n </Text>\n <View style={styles.headerSide} />\n </View>\n <View style={styles.webViewHost}>\n <ResolvedWebView\n {...(webViewProps ?? {})}\n geolocationEnabled={resolved.template.requiresLocation === true}\n ref={popupRef}\n key={managedPopupKey(managedPopup)}\n source={\n popupDocumentScriptReady\n ? managedPopupSource(managedPopup)\n : { uri: WEBVIEW_BOOTSTRAP_URL }\n }\n style={[styles.webView, webViewProps?.style]}\n javaScriptEnabled\n javaScriptCanOpenWindowsAutomatically\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n userAgent={effectiveUserAgent ?? defaultMobileBrowserUserAgent()}\n incognito={false}\n cacheEnabled\n setSupportMultipleWindows={false}\n injectedJavaScriptBeforeContentLoaded={popupInjectedScript}\n injectedJavaScript={popupInjectedScript}\n injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}\n injectedJavaScriptForMainFrameOnly={false}\n onMessage={handleMessage}\n onOpenWindow={handlePopupOpenWindow}\n onShouldStartLoadWithRequest={handlePopupShouldStartLoadWithRequest}\n onNavigationStateChange={handlePopupNavigationStateChange}\n onLoadStart={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadStart, event);\n if (!popupDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) {\n return;\n }\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: true,\n }));\n }}\n onLoadEnd={(event: unknown) => {\n const nextChrome = readBrowserChromeState(event);\n invokeWebViewCallback(webViewProps?.onLoadEnd, event);\n if (!popupDocumentScriptReady && nextChrome.url === WEBVIEW_BOOTSTRAP_URL) {\n return;\n }\n markPopupContentReady();\n setPopupChrome((current) => ({\n ...current,\n ...nextChrome,\n loading: false,\n }));\n popupRef.current?.injectJavaScript?.(popupInjectedScript);\n }}\n originWhitelist={['http://*', 'https://*', 'about:*']}\n />\n <Animated.View\n pointerEvents={popupContentReady ? 'none' : 'auto'}\n style={[\n styles.fadeCover,\n { backgroundColor: theme.surfaceColor, opacity: popupCoverOpacity },\n ]}>\n {!popupContentReady ? (\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n ) : null}\n </Animated.View>\n </View>\n </View>\n ) : null}\n {providerContentConcealed ? (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={[\n styles.privacyCoverBase,\n {\n backgroundColor: theme.statusBarStyle === 'light-content' ? '#000000' : '#ffffff',\n },\n ]}\n />\n ) : null}\n {isVerificationCovered && !flow.isProcessing ? (\n <View\n accessible={!verificationPresentationStalled}\n accessibilityLabel={`${coverStatusCopy.title.replace(/\\.\\.\\.$/, '')}.`}\n accessibilityLiveRegion=\"polite\"\n accessibilityViewIsModal\n style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n {verificationPresentationStalled ? null : (\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n )}\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {coverStatusCopy.title}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n {coverStatusCopy.subtitle}\n </Text>\n {verificationPresentationStalled ? (\n <>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Return to provider\"\n style={[styles.primaryAction, { backgroundColor: theme.accentColor }]}\n onPress={returnToProvider}>\n <Text style={styles.primaryActionText}>Return to provider</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Cancel verification\"\n style={styles.secondaryAction}\n onPress={() => closeFlow(true)}>\n <Text style={[styles.secondaryActionText, { color: theme.mutedColor }]}>\n Cancel\n </Text>\n </Pressable>\n </>\n ) : null}\n </View>\n ) : null}\n {flow.isProcessing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {processingCopy(phase)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Keep this screen open - it only takes a moment.\n </Text>\n </View>\n ) : null}\n {error ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <View style={styles.errorIconWrap}>\n <Text style={styles.errorIconGlyph}>!</Text>\n </View>\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {isTeelsFlow ? 'Could not complete attestation' : 'Could not verify your account'}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n {isTeelsFlow ? friendlyTeelsError(error, errorCode) : friendlyError(error, errorCode)}\n </Text>\n {sessionId ? (\n <SessionIdRow\n sessionId={sessionId}\n onCopySessionId={onCopySessionId}\n mutedColor={theme.mutedColor ?? '#66758a'}\n accentColor={theme.accentColor ?? '#2752d9'}\n />\n ) : null}\n {isRetryableError(errorCode, errorRetryable) ? (\n <Pressable\n style={[styles.primaryAction, { backgroundColor: theme.accentColor }]}\n onPress={openFlow}>\n <Text style={styles.primaryActionText}>Try again</Text>\n </Pressable>\n ) : null}\n <Pressable style={styles.secondaryAction} onPress={() => closeFlow(true)}>\n <Text style={[styles.secondaryActionText, { color: theme.mutedColor }]}>Close</Text>\n </Pressable>\n </View>\n ) : null}\n {preparing ? (\n <View style={[styles.overlay, { backgroundColor: theme.surfaceColor }]}>\n <ActivityIndicator color={theme.accentColor} size=\"large\" />\n <Text style={[styles.overlayTitle, { color: theme.onSurfaceColor }]}>\n {preparingCopy(preparingName)}\n </Text>\n <Text style={[styles.overlaySubtitle, { color: theme.mutedColor }]}>\n Setting up a secure connection.\n </Text>\n </View>\n ) : null}\n {Platform.OS === 'ios' ? (\n <View\n style={styles.edgeSwipeZone}\n accessibilityElementsHidden\n {...flow.edgeSwipeHandlers}\n />\n ) : null}\n </View>\n </View>\n );\n}\n\nfunction invokeMainWebViewCallback(\n callback: unknown,\n event: unknown,\n isTeelsFlow: boolean | undefined,\n timing: 'before' | 'after'\n): void {\n if ((!isTeelsFlow && timing !== 'before') || (isTeelsFlow && timing !== 'after')) return;\n if (!isTeelsFlow) {\n invokeWebViewCallback(callback, event);\n return;\n }\n try {\n invokeWebViewCallback(callback, event);\n } catch {\n // Observational host callbacks cannot interrupt or settle the TeeLS flow.\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface SessionIdRowProps {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
onCopySessionId?: (id: string) => void;
|
|
4
|
+
mutedColor: string;
|
|
5
|
+
accentColor: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Shows the funnel sessionId on the error screen with a Copy control so an end
|
|
9
|
+
* user can hand it to support. The full id is selectable and announced for
|
|
10
|
+
* accessibility; only the display is truncated (the copy carries the full id).
|
|
11
|
+
*/
|
|
12
|
+
export declare function SessionIdRow({ sessionId, onCopySessionId, mutedColor, accentColor, }: SessionIdRowProps): import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=SessionIdRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionIdRow.d.ts","sourceRoot":"","sources":["../../../src/components/providerAttest/SessionIdRow.tsx"],"names":[],"mappings":"AAMA,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,eAAe,EACf,UAAU,EACV,WAAW,GACZ,EAAE,iBAAiB,+BA8CnB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { AccessibilityInfo, Pressable, Text, View } from 'react-native';
|
|
3
|
+
import { copyText } from './clipboardSupport';
|
|
4
|
+
import { styles } from './styles';
|
|
5
|
+
function truncateId(id) {
|
|
6
|
+
return id.length > 14 ? `${id.slice(0, 8)}…${id.slice(-4)}` : id;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Shows the funnel sessionId on the error screen with a Copy control so an end
|
|
10
|
+
* user can hand it to support. The full id is selectable and announced for
|
|
11
|
+
* accessibility; only the display is truncated (the copy carries the full id).
|
|
12
|
+
*/
|
|
13
|
+
export function SessionIdRow({ sessionId, onCopySessionId, mutedColor, accentColor, }) {
|
|
14
|
+
const [copied, setCopied] = useState(false);
|
|
15
|
+
const resetTimerRef = useRef(null);
|
|
16
|
+
useEffect(() => () => {
|
|
17
|
+
if (resetTimerRef.current)
|
|
18
|
+
clearTimeout(resetTimerRef.current);
|
|
19
|
+
}, []);
|
|
20
|
+
const handleCopy = useCallback(() => {
|
|
21
|
+
copyText(sessionId, onCopySessionId)
|
|
22
|
+
.then((result) => {
|
|
23
|
+
if (result === 'unavailable')
|
|
24
|
+
return;
|
|
25
|
+
setCopied(true);
|
|
26
|
+
AccessibilityInfo.announceForAccessibility('Session ID copied');
|
|
27
|
+
if (resetTimerRef.current)
|
|
28
|
+
clearTimeout(resetTimerRef.current);
|
|
29
|
+
resetTimerRef.current = setTimeout(() => setCopied(false), 2000);
|
|
30
|
+
})
|
|
31
|
+
.catch(() => {
|
|
32
|
+
/* copyText never rejects; guard for safety */
|
|
33
|
+
});
|
|
34
|
+
}, [onCopySessionId, sessionId]);
|
|
35
|
+
return (<View style={styles.sessionRow}>
|
|
36
|
+
<Text style={styles.sessionLabel}>Session</Text>
|
|
37
|
+
<Text selectable style={[styles.sessionValue, { color: mutedColor }]} accessibilityLabel={`Session ID ${sessionId}`} accessibilityHint="Share this with support to debug this attempt">
|
|
38
|
+
{truncateId(sessionId)}
|
|
39
|
+
</Text>
|
|
40
|
+
<Pressable onPress={handleCopy} accessibilityRole="button" accessibilityLabel={copied ? 'Session ID copied' : 'Copy session ID'} style={styles.sessionCopy}>
|
|
41
|
+
<Text style={[styles.sessionCopyText, { color: accentColor }]}>
|
|
42
|
+
{copied ? 'Copied ✓' : 'Copy'}
|
|
43
|
+
</Text>
|
|
44
|
+
</Pressable>
|
|
45
|
+
</View>);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=SessionIdRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionIdRow.js","sourceRoot":"","sources":["../../../src/components/providerAttest/SessionIdRow.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { AccessibilityInfo, Pressable, Text, View } from 'react-native';\n\nimport { copyText } from './clipboardSupport';\nimport { styles } from './styles';\n\ninterface SessionIdRowProps {\n sessionId: string;\n onCopySessionId?: (id: string) => void;\n mutedColor: string;\n accentColor: string;\n}\n\nfunction truncateId(id: string): string {\n return id.length > 14 ? `${id.slice(0, 8)}…${id.slice(-4)}` : id;\n}\n\n/**\n * Shows the funnel sessionId on the error screen with a Copy control so an end\n * user can hand it to support. The full id is selectable and announced for\n * accessibility; only the display is truncated (the copy carries the full id).\n */\nexport function SessionIdRow({\n sessionId,\n onCopySessionId,\n mutedColor,\n accentColor,\n}: SessionIdRowProps) {\n const [copied, setCopied] = useState(false);\n const resetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (resetTimerRef.current) clearTimeout(resetTimerRef.current);\n },\n []\n );\n\n const handleCopy = useCallback(() => {\n copyText(sessionId, onCopySessionId)\n .then((result) => {\n if (result === 'unavailable') return;\n setCopied(true);\n AccessibilityInfo.announceForAccessibility('Session ID copied');\n if (resetTimerRef.current) clearTimeout(resetTimerRef.current);\n resetTimerRef.current = setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n /* copyText never rejects; guard for safety */\n });\n }, [onCopySessionId, sessionId]);\n\n return (\n <View style={styles.sessionRow}>\n <Text style={styles.sessionLabel}>Session</Text>\n <Text\n selectable\n style={[styles.sessionValue, { color: mutedColor }]}\n accessibilityLabel={`Session ID ${sessionId}`}\n accessibilityHint=\"Share this with support to debug this attempt\">\n {truncateId(sessionId)}\n </Text>\n <Pressable\n onPress={handleCopy}\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? 'Session ID copied' : 'Copy session ID'}\n style={styles.sessionCopy}>\n <Text style={[styles.sessionCopyText, { color: accentColor }]}>\n {copied ? 'Copied ✓' : 'Copy'}\n </Text>\n </Pressable>\n </View>\n );\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type CopyResult = 'handled' | 'shared' | 'unavailable';
|
|
2
|
+
/**
|
|
3
|
+
* Copy `value` to the clipboard with graceful degradation and NO optional
|
|
4
|
+
* native dependency.
|
|
5
|
+
*
|
|
6
|
+
* The SDK deliberately does not `require('expo-clipboard')`: Metro bundles every
|
|
7
|
+
* statically-required module, so an optional `require` either fails to transform
|
|
8
|
+
* (a computed specifier) or breaks bundling for any host that hasn't installed
|
|
9
|
+
* the module. Instead:
|
|
10
|
+
* 1. `onHostCopy` — the host app's own clipboard handler (e.g. one that calls
|
|
11
|
+
* `expo-clipboard`/`@react-native-clipboard`). This is the path to a SILENT
|
|
12
|
+
* copy, opted into by the host.
|
|
13
|
+
* 2. React Native's core `Share` sheet — always present, no dependency.
|
|
14
|
+
* If neither applies, returns `'unavailable'` and the caller keeps the value
|
|
15
|
+
* rendered as selectable text so the user can copy it manually. Never throws.
|
|
16
|
+
*/
|
|
17
|
+
export declare function copyText(value: string, onHostCopy?: (value: string) => void | Promise<void>): Promise<CopyResult>;
|
|
18
|
+
//# sourceMappingURL=clipboardSupport.d.ts.map
|