@robono/messaging-react-native 0.12.0 → 0.13.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 +6 -0
- package/README.md +29 -4
- package/SBOM.spdx.json +98 -50
- package/dist/expo.d.ts +1 -0
- package/dist/expo.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/sign-in.d.ts +76 -0
- package/dist/sign-in.js +46 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
## 0.12.0 — unpublished candidate
|
|
2
2
|
|
|
3
|
+
## 0.13.0
|
|
4
|
+
|
|
5
|
+
- Share the Messenger sign-in, country/phone controls and loading/recovery screen with website integrations.
|
|
6
|
+
- Require the messaging core update for direct hosted routing and clearer connection errors.
|
|
7
|
+
|
|
8
|
+
|
|
3
9
|
Keep Android recording alive through microphone permission dialogs; process two bounded thumbnails concurrently with permission-safe reuse. Add authenticated host downloads and host-controlled links/addresses. Keep Expo 55 audio handling compatible. Add self-chat and consumer integration hooks, stable forwarded-message delivery states and group-invitation eligibility.
|
|
4
10
|
|
|
5
11
|
## 0.10.0 — release candidate
|
package/README.md
CHANGED
|
@@ -324,10 +324,7 @@ in `media.waveform`. The playback track remains seekable when the waveform is
|
|
|
324
324
|
hidden. Managed storage computes waveform data independently of this preference.
|
|
325
325
|
|
|
326
326
|
Groups offer polls; direct chats offer a recipient-only Yes/No question whose
|
|
327
|
-
first answer is final. Both use the same app-height popup frame as tracking and social previews.
|
|
328
|
-
`20261101017400_messaging_captions_questions.sql` and the updated messaging handler
|
|
329
|
-
before releasing these SDK changes. Deploy the updated media inspector before the
|
|
330
|
-
updated managed-media handler. These source changes have not been published.
|
|
327
|
+
first answer is final. Both use the same app-height popup frame as tracking and social previews. The hosted service supplies the required message and media support.
|
|
331
328
|
|
|
332
329
|
### Optional downloads in the viewer
|
|
333
330
|
|
|
@@ -491,3 +488,31 @@ contact picker using the exported `MessagingPopup`. Account callbacks include
|
|
|
491
488
|
`onEditProfile`, `onDeleteAccount`, and `onSignOut`; the host supplies its own
|
|
492
489
|
confirmation and account service. These optional callbacks do not grant service
|
|
493
490
|
permissions or delete an account by themselves.
|
|
491
|
+
|
|
492
|
+
### Shared sign-in presentation
|
|
493
|
+
|
|
494
|
+
`MessagingSignIn`, `MessagingPhoneInput` and `MessagingChoicePicker` are optional
|
|
495
|
+
shared UI components, also exported by `@robono/messaging-web`. Robono's new
|
|
496
|
+
consumer app uses these same components. The card, code cells, consent row,
|
|
497
|
+
buttons and field proportions follow the existing Messenger.
|
|
498
|
+
|
|
499
|
+
Continue using your existing login when embedding Messenger. These components
|
|
500
|
+
add **no second account, SMS provider, credential storage or authentication
|
|
501
|
+
service**. Your host controls `stage`, field values, validation, busy/error state,
|
|
502
|
+
verification expiry and `onSubmit`. Supply your own company logo/name through
|
|
503
|
+
`logo` or `appearance`, your colors through `appearance.colors`, consent copy and
|
|
504
|
+
policy links through `consent`, and translated text through `labels`.
|
|
505
|
+
|
|
506
|
+
Render your `MessagingPhoneInput` and its `MessagingChoicePicker` together inside
|
|
507
|
+
`MessagingSignIn.phoneField`; profile choices belong in `profileFields`. This
|
|
508
|
+
keeps website pickers inside the sign-in container. The host supplies supported
|
|
509
|
+
countries and validates/normalizes numbers with its own authentication provider.
|
|
510
|
+
Use `secondsRemaining` only with an expiry returned by that provider. An expired
|
|
511
|
+
code changes the submit action to “Send a new code”; the host performs that action.
|
|
512
|
+
Never include private integration keys in these props.
|
|
513
|
+
|
|
514
|
+
`MessagingConnectionState` is the shared waiting/recovery screen used by customer
|
|
515
|
+
starters and Robono Messenger. Pass `error`, `onRetry`, optional `onSignOut`,
|
|
516
|
+
`appearance`, and translated `labels`. Account actions appear only on failure,
|
|
517
|
+
never during normal connection startup. The hosted connection selects Robono's
|
|
518
|
+
approved direct transport automatically; no extra phone setup is required.
|
package/SBOM.spdx.json
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"spdxVersion": "SPDX-2.3",
|
|
3
3
|
"dataLicense": "CC0-1.0",
|
|
4
4
|
"SPDXID": "SPDXRef-DOCUMENT",
|
|
5
|
-
"name": "@robono/messaging-react-native@0.
|
|
6
|
-
"documentNamespace": "https://robono.com/sbom/messaging-react-native/0.
|
|
5
|
+
"name": "@robono/messaging-react-native@0.13.0",
|
|
6
|
+
"documentNamespace": "https://robono.com/sbom/messaging-react-native/0.13.0/62cc7412f6bb96e10510087313848ae9b51b97b3",
|
|
7
7
|
"creationInfo": {
|
|
8
|
-
"created": "2026-11-
|
|
8
|
+
"created": "2026-11-06T06:37:57.480Z",
|
|
9
9
|
"creators": [
|
|
10
10
|
"Organization: Robono (support@robono.com)"
|
|
11
11
|
]
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
{
|
|
15
15
|
"name": "@robono/messaging-react-native",
|
|
16
16
|
"SPDXID": "SPDXRef-Package",
|
|
17
|
-
"versionInfo": "0.
|
|
17
|
+
"versionInfo": "0.13.0",
|
|
18
18
|
"downloadLocation": "NOASSERTION",
|
|
19
19
|
"filesAnalyzed": true,
|
|
20
20
|
"packageVerificationCode": {
|
|
21
|
-
"packageVerificationCodeValue": "
|
|
21
|
+
"packageVerificationCodeValue": "62cc7412f6bb96e10510087313848ae9b51b97b3"
|
|
22
22
|
},
|
|
23
23
|
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
24
24
|
"licenseDeclared": "LicenseRef-RobonoSDK",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"LicenseRef-RobonoSDK"
|
|
27
27
|
],
|
|
28
28
|
"copyrightText": "Copyright (c) 2026 Add to Loop LLC.",
|
|
29
|
-
"comment": "Host-supplied peers (not bundled): {\"@robono/messaging\":\"^0.
|
|
29
|
+
"comment": "Host-supplied peers (not bundled): {\"@robono/messaging\":\"^0.9.0\",\"react\":\">=18.2 <20\",\"react-native\":\">=0.76 <1\",\"expo-audio\":\">=55 <57\",\"expo-image-picker\":\">=55 <57\",\"expo-document-picker\":\">=55 <57\",\"expo-file-system\":\">=55.0.5 <57\",\"expo-sharing\":\">=55 <57\",\"expo-video\":\">=55 <57\",\"expo-crypto\":\">=55 <57\",\"react-native-safe-area-context\":\">=5 <6\",\"react-native-svg\":\">=15 <16\",\"@robono/calling-react-native\":\"^0.9.0\",\"expo-clipboard\":\">=8 <57\",\"expo-image-manipulator\":\">=14 <57\",\"expo-video-thumbnails\":\">=14 <57\",\"react-native-webview\":\">=13 <14\",\"expo-blur\":\">=55 <57\",\"expo-notifications\":\">=55 <57\",\"expo-secure-store\":\">=55 <57\",\"@robono/location-react-native\":\"^0.4.1\",\"expo-location\":\">=55 <57\",\"expo-constants\":\">=55 <57\",\"@robono/location\":\"^0.4.0\",\"expo-haptics\":\">=55 <57\",\"@robono/calling\":\"^0.6.1\"}"
|
|
30
30
|
}
|
|
31
31
|
],
|
|
32
32
|
"files": [
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"checksums": [
|
|
37
37
|
{
|
|
38
38
|
"algorithm": "SHA256",
|
|
39
|
-
"checksumValue": "
|
|
39
|
+
"checksumValue": "064f79b2f6f13afd3f9be36fd19a3e72f37f083d90cfd98f937cbcca9fad50b6"
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
"algorithm": "SHA1",
|
|
43
|
-
"checksumValue": "
|
|
43
|
+
"checksumValue": "2b2f928dc7a3c1c46b47b2177578706e736aba52"
|
|
44
44
|
}
|
|
45
45
|
],
|
|
46
46
|
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
@@ -74,11 +74,11 @@
|
|
|
74
74
|
"checksums": [
|
|
75
75
|
{
|
|
76
76
|
"algorithm": "SHA256",
|
|
77
|
-
"checksumValue": "
|
|
77
|
+
"checksumValue": "1cb5d619fe7a3c48a0549cd88c7b88933b23bbc3d35349fbf86f88530e8bd663"
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
"algorithm": "SHA1",
|
|
81
|
-
"checksumValue": "
|
|
81
|
+
"checksumValue": "207e4842eb76c8aeba804531054f41440768db8b"
|
|
82
82
|
}
|
|
83
83
|
],
|
|
84
84
|
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
@@ -986,11 +986,11 @@
|
|
|
986
986
|
"checksums": [
|
|
987
987
|
{
|
|
988
988
|
"algorithm": "SHA256",
|
|
989
|
-
"checksumValue": "
|
|
989
|
+
"checksumValue": "1a6209024ce9bfc62ec75651fb132d824283fdbb8a57980c6e6847f68d993f51"
|
|
990
990
|
},
|
|
991
991
|
{
|
|
992
992
|
"algorithm": "SHA1",
|
|
993
|
-
"checksumValue": "
|
|
993
|
+
"checksumValue": "08c9618ed2212ad4f0e737c7637d3d9387d4c8f6"
|
|
994
994
|
}
|
|
995
995
|
],
|
|
996
996
|
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
@@ -1005,11 +1005,11 @@
|
|
|
1005
1005
|
"checksums": [
|
|
1006
1006
|
{
|
|
1007
1007
|
"algorithm": "SHA256",
|
|
1008
|
-
"checksumValue": "
|
|
1008
|
+
"checksumValue": "dd3a925714f56d2b80855765de0ca153df1d25de914c7bd774e7b8bf733d9e64"
|
|
1009
1009
|
},
|
|
1010
1010
|
{
|
|
1011
1011
|
"algorithm": "SHA1",
|
|
1012
|
-
"checksumValue": "
|
|
1012
|
+
"checksumValue": "b781852984bf1f691ca819a7053729b83df00a1c"
|
|
1013
1013
|
}
|
|
1014
1014
|
],
|
|
1015
1015
|
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
@@ -1366,11 +1366,11 @@
|
|
|
1366
1366
|
"checksums": [
|
|
1367
1367
|
{
|
|
1368
1368
|
"algorithm": "SHA256",
|
|
1369
|
-
"checksumValue": "
|
|
1369
|
+
"checksumValue": "e967021e67feca25bc633efab399342787f3ba9bcb36c290741b6eb149530c6d"
|
|
1370
1370
|
},
|
|
1371
1371
|
{
|
|
1372
1372
|
"algorithm": "SHA1",
|
|
1373
|
-
"checksumValue": "
|
|
1373
|
+
"checksumValue": "cbb077cf37979e79a9c0c20517108ac4274cf29e"
|
|
1374
1374
|
}
|
|
1375
1375
|
],
|
|
1376
1376
|
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
@@ -1385,11 +1385,11 @@
|
|
|
1385
1385
|
"checksums": [
|
|
1386
1386
|
{
|
|
1387
1387
|
"algorithm": "SHA256",
|
|
1388
|
-
"checksumValue": "
|
|
1388
|
+
"checksumValue": "df4fd59d3411bb33c4a141b4e1d35cd0af04b324b6b9e55d603b933c84d9ae94"
|
|
1389
1389
|
},
|
|
1390
1390
|
{
|
|
1391
1391
|
"algorithm": "SHA1",
|
|
1392
|
-
"checksumValue": "
|
|
1392
|
+
"checksumValue": "6db8394aa451cfe7e3210ef69b8af59f8387cc0d"
|
|
1393
1393
|
}
|
|
1394
1394
|
],
|
|
1395
1395
|
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
@@ -2349,8 +2349,46 @@
|
|
|
2349
2349
|
"copyrightText": "Copyright (c) 2026 Add to Loop LLC."
|
|
2350
2350
|
},
|
|
2351
2351
|
{
|
|
2352
|
-
"fileName": "./dist/
|
|
2352
|
+
"fileName": "./dist/sign-in.d.ts",
|
|
2353
2353
|
"SPDXID": "SPDXRef-File-122",
|
|
2354
|
+
"checksums": [
|
|
2355
|
+
{
|
|
2356
|
+
"algorithm": "SHA256",
|
|
2357
|
+
"checksumValue": "8d6a4abef6d01aa22806fc52e4928dad7ff60260708ce8106c86eff4e894b0d8"
|
|
2358
|
+
},
|
|
2359
|
+
{
|
|
2360
|
+
"algorithm": "SHA1",
|
|
2361
|
+
"checksumValue": "30483f77e3ca45f5bb196f33115e0ca85343df88"
|
|
2362
|
+
}
|
|
2363
|
+
],
|
|
2364
|
+
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
2365
|
+
"licenseInfoInFiles": [
|
|
2366
|
+
"LicenseRef-RobonoSDK"
|
|
2367
|
+
],
|
|
2368
|
+
"copyrightText": "Copyright (c) 2026 Add to Loop LLC."
|
|
2369
|
+
},
|
|
2370
|
+
{
|
|
2371
|
+
"fileName": "./dist/sign-in.js",
|
|
2372
|
+
"SPDXID": "SPDXRef-File-123",
|
|
2373
|
+
"checksums": [
|
|
2374
|
+
{
|
|
2375
|
+
"algorithm": "SHA256",
|
|
2376
|
+
"checksumValue": "c95fe483ee8408b990cffc6c06050b42854bd2aff9ebd048f77d0af54e99edc0"
|
|
2377
|
+
},
|
|
2378
|
+
{
|
|
2379
|
+
"algorithm": "SHA1",
|
|
2380
|
+
"checksumValue": "45270810dbb363327953fdc7cd632a7a5f3c3f2b"
|
|
2381
|
+
}
|
|
2382
|
+
],
|
|
2383
|
+
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
2384
|
+
"licenseInfoInFiles": [
|
|
2385
|
+
"LicenseRef-RobonoSDK"
|
|
2386
|
+
],
|
|
2387
|
+
"copyrightText": "Copyright (c) 2026 Add to Loop LLC."
|
|
2388
|
+
},
|
|
2389
|
+
{
|
|
2390
|
+
"fileName": "./dist/social.d.ts",
|
|
2391
|
+
"SPDXID": "SPDXRef-File-124",
|
|
2354
2392
|
"checksums": [
|
|
2355
2393
|
{
|
|
2356
2394
|
"algorithm": "SHA256",
|
|
@@ -2369,7 +2407,7 @@
|
|
|
2369
2407
|
},
|
|
2370
2408
|
{
|
|
2371
2409
|
"fileName": "./dist/social.js",
|
|
2372
|
-
"SPDXID": "SPDXRef-File-
|
|
2410
|
+
"SPDXID": "SPDXRef-File-125",
|
|
2373
2411
|
"checksums": [
|
|
2374
2412
|
{
|
|
2375
2413
|
"algorithm": "SHA256",
|
|
@@ -2388,7 +2426,7 @@
|
|
|
2388
2426
|
},
|
|
2389
2427
|
{
|
|
2390
2428
|
"fileName": "./dist/translation-settings.d.ts",
|
|
2391
|
-
"SPDXID": "SPDXRef-File-
|
|
2429
|
+
"SPDXID": "SPDXRef-File-126",
|
|
2392
2430
|
"checksums": [
|
|
2393
2431
|
{
|
|
2394
2432
|
"algorithm": "SHA256",
|
|
@@ -2407,7 +2445,7 @@
|
|
|
2407
2445
|
},
|
|
2408
2446
|
{
|
|
2409
2447
|
"fileName": "./dist/translation-settings.js",
|
|
2410
|
-
"SPDXID": "SPDXRef-File-
|
|
2448
|
+
"SPDXID": "SPDXRef-File-127",
|
|
2411
2449
|
"checksums": [
|
|
2412
2450
|
{
|
|
2413
2451
|
"algorithm": "SHA256",
|
|
@@ -2426,7 +2464,7 @@
|
|
|
2426
2464
|
},
|
|
2427
2465
|
{
|
|
2428
2466
|
"fileName": "./dist/typography.d.ts",
|
|
2429
|
-
"SPDXID": "SPDXRef-File-
|
|
2467
|
+
"SPDXID": "SPDXRef-File-128",
|
|
2430
2468
|
"checksums": [
|
|
2431
2469
|
{
|
|
2432
2470
|
"algorithm": "SHA256",
|
|
@@ -2445,7 +2483,7 @@
|
|
|
2445
2483
|
},
|
|
2446
2484
|
{
|
|
2447
2485
|
"fileName": "./dist/typography.js",
|
|
2448
|
-
"SPDXID": "SPDXRef-File-
|
|
2486
|
+
"SPDXID": "SPDXRef-File-129",
|
|
2449
2487
|
"checksums": [
|
|
2450
2488
|
{
|
|
2451
2489
|
"algorithm": "SHA256",
|
|
@@ -2464,7 +2502,7 @@
|
|
|
2464
2502
|
},
|
|
2465
2503
|
{
|
|
2466
2504
|
"fileName": "./dist/use-quote-gesture.d.ts",
|
|
2467
|
-
"SPDXID": "SPDXRef-File-
|
|
2505
|
+
"SPDXID": "SPDXRef-File-130",
|
|
2468
2506
|
"checksums": [
|
|
2469
2507
|
{
|
|
2470
2508
|
"algorithm": "SHA256",
|
|
@@ -2483,7 +2521,7 @@
|
|
|
2483
2521
|
},
|
|
2484
2522
|
{
|
|
2485
2523
|
"fileName": "./dist/use-quote-gesture.js",
|
|
2486
|
-
"SPDXID": "SPDXRef-File-
|
|
2524
|
+
"SPDXID": "SPDXRef-File-131",
|
|
2487
2525
|
"checksums": [
|
|
2488
2526
|
{
|
|
2489
2527
|
"algorithm": "SHA256",
|
|
@@ -2502,7 +2540,7 @@
|
|
|
2502
2540
|
},
|
|
2503
2541
|
{
|
|
2504
2542
|
"fileName": "./dist/visual/icon-nodes.d.ts",
|
|
2505
|
-
"SPDXID": "SPDXRef-File-
|
|
2543
|
+
"SPDXID": "SPDXRef-File-132",
|
|
2506
2544
|
"checksums": [
|
|
2507
2545
|
{
|
|
2508
2546
|
"algorithm": "SHA256",
|
|
@@ -2521,7 +2559,7 @@
|
|
|
2521
2559
|
},
|
|
2522
2560
|
{
|
|
2523
2561
|
"fileName": "./dist/visual/icon-nodes.js",
|
|
2524
|
-
"SPDXID": "SPDXRef-File-
|
|
2562
|
+
"SPDXID": "SPDXRef-File-133",
|
|
2525
2563
|
"checksums": [
|
|
2526
2564
|
{
|
|
2527
2565
|
"algorithm": "SHA256",
|
|
@@ -2540,7 +2578,7 @@
|
|
|
2540
2578
|
},
|
|
2541
2579
|
{
|
|
2542
2580
|
"fileName": "./dist/visual/icon-paths.d.ts",
|
|
2543
|
-
"SPDXID": "SPDXRef-File-
|
|
2581
|
+
"SPDXID": "SPDXRef-File-134",
|
|
2544
2582
|
"checksums": [
|
|
2545
2583
|
{
|
|
2546
2584
|
"algorithm": "SHA256",
|
|
@@ -2559,7 +2597,7 @@
|
|
|
2559
2597
|
},
|
|
2560
2598
|
{
|
|
2561
2599
|
"fileName": "./dist/visual/icon-paths.js",
|
|
2562
|
-
"SPDXID": "SPDXRef-File-
|
|
2600
|
+
"SPDXID": "SPDXRef-File-135",
|
|
2563
2601
|
"checksums": [
|
|
2564
2602
|
{
|
|
2565
2603
|
"algorithm": "SHA256",
|
|
@@ -2578,7 +2616,7 @@
|
|
|
2578
2616
|
},
|
|
2579
2617
|
{
|
|
2580
2618
|
"fileName": "./dist/visual/RobonoIcon.d.ts",
|
|
2581
|
-
"SPDXID": "SPDXRef-File-
|
|
2619
|
+
"SPDXID": "SPDXRef-File-136",
|
|
2582
2620
|
"checksums": [
|
|
2583
2621
|
{
|
|
2584
2622
|
"algorithm": "SHA256",
|
|
@@ -2597,7 +2635,7 @@
|
|
|
2597
2635
|
},
|
|
2598
2636
|
{
|
|
2599
2637
|
"fileName": "./dist/visual/RobonoIcon.js",
|
|
2600
|
-
"SPDXID": "SPDXRef-File-
|
|
2638
|
+
"SPDXID": "SPDXRef-File-137",
|
|
2601
2639
|
"checksums": [
|
|
2602
2640
|
{
|
|
2603
2641
|
"algorithm": "SHA256",
|
|
@@ -2616,7 +2654,7 @@
|
|
|
2616
2654
|
},
|
|
2617
2655
|
{
|
|
2618
2656
|
"fileName": "./dist/visual/weather-artwork.d.ts",
|
|
2619
|
-
"SPDXID": "SPDXRef-File-
|
|
2657
|
+
"SPDXID": "SPDXRef-File-138",
|
|
2620
2658
|
"checksums": [
|
|
2621
2659
|
{
|
|
2622
2660
|
"algorithm": "SHA256",
|
|
@@ -2635,7 +2673,7 @@
|
|
|
2635
2673
|
},
|
|
2636
2674
|
{
|
|
2637
2675
|
"fileName": "./dist/visual/weather-artwork.js",
|
|
2638
|
-
"SPDXID": "SPDXRef-File-
|
|
2676
|
+
"SPDXID": "SPDXRef-File-139",
|
|
2639
2677
|
"checksums": [
|
|
2640
2678
|
{
|
|
2641
2679
|
"algorithm": "SHA256",
|
|
@@ -2654,7 +2692,7 @@
|
|
|
2654
2692
|
},
|
|
2655
2693
|
{
|
|
2656
2694
|
"fileName": "./dist/visual/weather-conditions.d.ts",
|
|
2657
|
-
"SPDXID": "SPDXRef-File-
|
|
2695
|
+
"SPDXID": "SPDXRef-File-140",
|
|
2658
2696
|
"checksums": [
|
|
2659
2697
|
{
|
|
2660
2698
|
"algorithm": "SHA256",
|
|
@@ -2673,7 +2711,7 @@
|
|
|
2673
2711
|
},
|
|
2674
2712
|
{
|
|
2675
2713
|
"fileName": "./dist/visual/weather-conditions.js",
|
|
2676
|
-
"SPDXID": "SPDXRef-File-
|
|
2714
|
+
"SPDXID": "SPDXRef-File-141",
|
|
2677
2715
|
"checksums": [
|
|
2678
2716
|
{
|
|
2679
2717
|
"algorithm": "SHA256",
|
|
@@ -2692,7 +2730,7 @@
|
|
|
2692
2730
|
},
|
|
2693
2731
|
{
|
|
2694
2732
|
"fileName": "./dist/visual/WeatherArtwork.d.ts",
|
|
2695
|
-
"SPDXID": "SPDXRef-File-
|
|
2733
|
+
"SPDXID": "SPDXRef-File-142",
|
|
2696
2734
|
"checksums": [
|
|
2697
2735
|
{
|
|
2698
2736
|
"algorithm": "SHA256",
|
|
@@ -2711,7 +2749,7 @@
|
|
|
2711
2749
|
},
|
|
2712
2750
|
{
|
|
2713
2751
|
"fileName": "./dist/visual/WeatherArtwork.js",
|
|
2714
|
-
"SPDXID": "SPDXRef-File-
|
|
2752
|
+
"SPDXID": "SPDXRef-File-143",
|
|
2715
2753
|
"checksums": [
|
|
2716
2754
|
{
|
|
2717
2755
|
"algorithm": "SHA256",
|
|
@@ -2730,7 +2768,7 @@
|
|
|
2730
2768
|
},
|
|
2731
2769
|
{
|
|
2732
2770
|
"fileName": "./dist/voice-composer.d.ts",
|
|
2733
|
-
"SPDXID": "SPDXRef-File-
|
|
2771
|
+
"SPDXID": "SPDXRef-File-144",
|
|
2734
2772
|
"checksums": [
|
|
2735
2773
|
{
|
|
2736
2774
|
"algorithm": "SHA256",
|
|
@@ -2749,7 +2787,7 @@
|
|
|
2749
2787
|
},
|
|
2750
2788
|
{
|
|
2751
2789
|
"fileName": "./dist/voice-composer.js",
|
|
2752
|
-
"SPDXID": "SPDXRef-File-
|
|
2790
|
+
"SPDXID": "SPDXRef-File-145",
|
|
2753
2791
|
"checksums": [
|
|
2754
2792
|
{
|
|
2755
2793
|
"algorithm": "SHA256",
|
|
@@ -2768,7 +2806,7 @@
|
|
|
2768
2806
|
},
|
|
2769
2807
|
{
|
|
2770
2808
|
"fileName": "./dist/voice-waveform.d.ts",
|
|
2771
|
-
"SPDXID": "SPDXRef-File-
|
|
2809
|
+
"SPDXID": "SPDXRef-File-146",
|
|
2772
2810
|
"checksums": [
|
|
2773
2811
|
{
|
|
2774
2812
|
"algorithm": "SHA256",
|
|
@@ -2787,7 +2825,7 @@
|
|
|
2787
2825
|
},
|
|
2788
2826
|
{
|
|
2789
2827
|
"fileName": "./dist/voice-waveform.js",
|
|
2790
|
-
"SPDXID": "SPDXRef-File-
|
|
2828
|
+
"SPDXID": "SPDXRef-File-147",
|
|
2791
2829
|
"checksums": [
|
|
2792
2830
|
{
|
|
2793
2831
|
"algorithm": "SHA256",
|
|
@@ -2806,7 +2844,7 @@
|
|
|
2806
2844
|
},
|
|
2807
2845
|
{
|
|
2808
2846
|
"fileName": "./licenses/robono-icons-lucide-license.txt",
|
|
2809
|
-
"SPDXID": "SPDXRef-File-
|
|
2847
|
+
"SPDXID": "SPDXRef-File-148",
|
|
2810
2848
|
"checksums": [
|
|
2811
2849
|
{
|
|
2812
2850
|
"algorithm": "SHA256",
|
|
@@ -2825,7 +2863,7 @@
|
|
|
2825
2863
|
},
|
|
2826
2864
|
{
|
|
2827
2865
|
"fileName": "./licenses/robono-icons-weather-attribution.txt",
|
|
2828
|
-
"SPDXID": "SPDXRef-File-
|
|
2866
|
+
"SPDXID": "SPDXRef-File-149",
|
|
2829
2867
|
"checksums": [
|
|
2830
2868
|
{
|
|
2831
2869
|
"algorithm": "SHA256",
|
|
@@ -2844,7 +2882,7 @@
|
|
|
2844
2882
|
},
|
|
2845
2883
|
{
|
|
2846
2884
|
"fileName": "./licenses/robono-icons-weather-license.txt",
|
|
2847
|
-
"SPDXID": "SPDXRef-File-
|
|
2885
|
+
"SPDXID": "SPDXRef-File-150",
|
|
2848
2886
|
"checksums": [
|
|
2849
2887
|
{
|
|
2850
2888
|
"algorithm": "SHA256",
|
|
@@ -2863,15 +2901,15 @@
|
|
|
2863
2901
|
},
|
|
2864
2902
|
{
|
|
2865
2903
|
"fileName": "./package.json",
|
|
2866
|
-
"SPDXID": "SPDXRef-File-
|
|
2904
|
+
"SPDXID": "SPDXRef-File-151",
|
|
2867
2905
|
"checksums": [
|
|
2868
2906
|
{
|
|
2869
2907
|
"algorithm": "SHA256",
|
|
2870
|
-
"checksumValue": "
|
|
2908
|
+
"checksumValue": "25e69f9f73cbe9e2b5699bed53d56241a31a4e0e1f4b65a10856ed09d228b8c9"
|
|
2871
2909
|
},
|
|
2872
2910
|
{
|
|
2873
2911
|
"algorithm": "SHA1",
|
|
2874
|
-
"checksumValue": "
|
|
2912
|
+
"checksumValue": "3c28563059dc1cdf96476c0a3fd3a261e510bbf8"
|
|
2875
2913
|
}
|
|
2876
2914
|
],
|
|
2877
2915
|
"licenseConcluded": "LicenseRef-RobonoSDK",
|
|
@@ -2882,7 +2920,7 @@
|
|
|
2882
2920
|
},
|
|
2883
2921
|
{
|
|
2884
2922
|
"fileName": "./plugin/preserve-call-audio.cjs",
|
|
2885
|
-
"SPDXID": "SPDXRef-File-
|
|
2923
|
+
"SPDXID": "SPDXRef-File-152",
|
|
2886
2924
|
"checksums": [
|
|
2887
2925
|
{
|
|
2888
2926
|
"algorithm": "SHA256",
|
|
@@ -2901,7 +2939,7 @@
|
|
|
2901
2939
|
},
|
|
2902
2940
|
{
|
|
2903
2941
|
"fileName": "./setup.plugin.cjs",
|
|
2904
|
-
"SPDXID": "SPDXRef-File-
|
|
2942
|
+
"SPDXID": "SPDXRef-File-153",
|
|
2905
2943
|
"checksums": [
|
|
2906
2944
|
{
|
|
2907
2945
|
"algorithm": "SHA256",
|
|
@@ -3684,6 +3722,16 @@
|
|
|
3684
3722
|
"spdxElementId": "SPDXRef-Package",
|
|
3685
3723
|
"relationshipType": "CONTAINS",
|
|
3686
3724
|
"relatedSpdxElement": "SPDXRef-File-151"
|
|
3725
|
+
},
|
|
3726
|
+
{
|
|
3727
|
+
"spdxElementId": "SPDXRef-Package",
|
|
3728
|
+
"relationshipType": "CONTAINS",
|
|
3729
|
+
"relatedSpdxElement": "SPDXRef-File-152"
|
|
3730
|
+
},
|
|
3731
|
+
{
|
|
3732
|
+
"spdxElementId": "SPDXRef-Package",
|
|
3733
|
+
"relationshipType": "CONTAINS",
|
|
3734
|
+
"relatedSpdxElement": "SPDXRef-File-153"
|
|
3687
3735
|
}
|
|
3688
3736
|
],
|
|
3689
3737
|
"hasExtractedLicensingInfos": [
|
package/dist/expo.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './expo-screen.js';
|
|
2
2
|
export { ExpoMessenger, createExpoMessenger, createHostedExpoMessenger, type ExpoMessengerProps } from './expo-messenger.js';
|
|
3
3
|
export { MessagingPopup } from './popup.js';
|
|
4
|
+
export { MessagingConnectionState, type MessagingConnectionStateProps, MessagingSignIn, MessagingPhoneInput, MessagingChoicePicker, type MessagingSignInProps, type MessagingPhoneInputProps, type MessagingChoice, type MessagingChoicePickerProps } from './sign-in.js';
|
package/dist/expo.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './expo-screen.js';
|
|
2
2
|
export { ExpoMessenger, createExpoMessenger, createHostedExpoMessenger } from './expo-messenger.js';
|
|
3
3
|
export { MessagingPopup } from './popup.js';
|
|
4
|
+
export { MessagingConnectionState, MessagingSignIn, MessagingPhoneInput, MessagingChoicePicker } from './sign-in.js';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { MessagingConnectionState, type MessagingConnectionStateProps, MessagingSignIn, MessagingPhoneInput, MessagingChoicePicker, type MessagingSignInProps, type MessagingPhoneInputProps, type MessagingChoice, type MessagingChoicePickerProps } from './sign-in.js';
|
|
1
2
|
import type { MessagingCustomization } from './customization.js';
|
|
2
3
|
export { RobonoLocaleProvider, useRobonoLocale } from './localization.js';
|
|
3
4
|
import { type MessagingAccount } from './account.js';
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { MessagingRoomModeration, MessagingRoomRemoval } from './room-moderation.js';
|
|
3
|
+
export { MessagingConnectionState, MessagingSignIn, MessagingPhoneInput, MessagingChoicePicker } from './sign-in.js';
|
|
3
4
|
import { CustomMessage } from './custom-message.js';
|
|
4
5
|
import { MessagingTypography } from './typography.js';
|
|
5
6
|
import { Text, TextInput } from './typography.js';
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import React, { type ReactNode } from 'react';
|
|
2
|
+
import { type MessagingAppearance } from '@robono/messaging';
|
|
3
|
+
/** Optional presentation only. The customer's existing identity provider owns all verification. */
|
|
4
|
+
export interface MessagingSignInProps {
|
|
5
|
+
appearance?: MessagingAppearance;
|
|
6
|
+
logo?: ReactNode;
|
|
7
|
+
stage: 'phone' | 'code' | 'profile';
|
|
8
|
+
/** Country selector and phone input supplied by the host, using MessagingPhoneInput if desired. */
|
|
9
|
+
phoneField: ReactNode;
|
|
10
|
+
code: string;
|
|
11
|
+
onCodeChange: (code: string) => void;
|
|
12
|
+
name: string;
|
|
13
|
+
onNameChange: (name: string) => void;
|
|
14
|
+
profileFields?: ReactNode;
|
|
15
|
+
consent: {
|
|
16
|
+
checked: boolean;
|
|
17
|
+
onChange: (checked: boolean) => void;
|
|
18
|
+
title: string;
|
|
19
|
+
details: ReactNode;
|
|
20
|
+
};
|
|
21
|
+
busy?: boolean;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
/** Remaining lifetime reported by the identity provider. Never invent a verification deadline. */
|
|
25
|
+
secondsRemaining?: number;
|
|
26
|
+
onSubmit: () => void;
|
|
27
|
+
onChangePhone: () => void;
|
|
28
|
+
labels?: Partial<Record<'phoneSubtitle' | 'codeSubtitle' | 'profileSubtitle' | 'phone' | 'name' | 'namePlaceholder' | 'continue' | 'verify' | 'sendAgain' | 'busy' | 'changePhone' | 'code' | 'expired', string>>;
|
|
29
|
+
}
|
|
30
|
+
/** Original Messenger's card, typography, consent row and code cells, shared by web and native. */
|
|
31
|
+
export declare function MessagingSignIn(p: MessagingSignInProps): React.JSX.Element;
|
|
32
|
+
export interface MessagingPhoneInputProps {
|
|
33
|
+
value: string;
|
|
34
|
+
onChange: (value: string) => void;
|
|
35
|
+
countryName: string;
|
|
36
|
+
callingCode: string;
|
|
37
|
+
flag: string;
|
|
38
|
+
onChooseCountry: () => void;
|
|
39
|
+
disabled?: boolean;
|
|
40
|
+
placeholder?: string;
|
|
41
|
+
label?: string;
|
|
42
|
+
appearance?: MessagingAppearance;
|
|
43
|
+
}
|
|
44
|
+
/** Same field proportions and divider as Messenger, with host-owned country data. */
|
|
45
|
+
export declare function MessagingPhoneInput(p: MessagingPhoneInputProps): React.JSX.Element;
|
|
46
|
+
export interface MessagingChoice {
|
|
47
|
+
value: string;
|
|
48
|
+
label: string;
|
|
49
|
+
detail?: string;
|
|
50
|
+
symbol?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface MessagingChoicePickerProps {
|
|
53
|
+
visible: boolean;
|
|
54
|
+
title: string;
|
|
55
|
+
closeLabel?: string;
|
|
56
|
+
choices: ReadonlyArray<MessagingChoice>;
|
|
57
|
+
selected: string;
|
|
58
|
+
onSelect: (value: string) => void;
|
|
59
|
+
onClose: () => void;
|
|
60
|
+
appearance?: MessagingAppearance;
|
|
61
|
+
}
|
|
62
|
+
/** The same compact choice list for customer sign-in, language and country fields. */
|
|
63
|
+
export declare function MessagingChoicePicker(p: MessagingChoicePickerProps): React.JSX.Element;
|
|
64
|
+
/** The same connection/recovery screen for customer websites and phone apps. */
|
|
65
|
+
export interface MessagingConnectionStateProps {
|
|
66
|
+
appearance?: MessagingAppearance;
|
|
67
|
+
error?: string;
|
|
68
|
+
onRetry?: () => void;
|
|
69
|
+
onSignOut?: () => void;
|
|
70
|
+
labels?: {
|
|
71
|
+
loading?: string;
|
|
72
|
+
retry?: string;
|
|
73
|
+
signOut?: string;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export declare function MessagingConnectionState({ appearance, error, onRetry, onSignOut, labels }: MessagingConnectionStateProps): React.JSX.Element;
|
package/dist/sign-in.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState } from 'react';
|
|
3
|
+
import { ActivityIndicator, FlatList, Image, Keyboard, KeyboardAvoidingView, Platform, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';
|
|
4
|
+
import { defaultMessagingSettings } from '@robono/messaging';
|
|
5
|
+
import { RobonoIcon } from './visual/RobonoIcon.js';
|
|
6
|
+
import { MessagingMenuSurface, MessagingPopupHost } from './popup.js';
|
|
7
|
+
function surfaces(background) {
|
|
8
|
+
const hex = /^#[\da-f]{6}$/i.test(background) ? background : '#050505';
|
|
9
|
+
const rgb = [1, 3, 5].map(i => parseInt(hex.slice(i, i + 2), 16));
|
|
10
|
+
const sign = rgb.reduce((a, b) => a + b, 0) > 384 ? -1 : 1;
|
|
11
|
+
const offset = (n) => '#' + rgb.map(v => Math.max(0, Math.min(255, v + sign * n)).toString(16).padStart(2, '0')).join('');
|
|
12
|
+
return { card: offset(12), field: offset(24), border: offset(37) };
|
|
13
|
+
}
|
|
14
|
+
/** Original Messenger's card, typography, consent row and code cells, shared by web and native. */
|
|
15
|
+
export function MessagingSignIn(p) {
|
|
16
|
+
const a = p.appearance ?? defaultMessagingSettings().appearance, c = a.colors, surface = surfaces(c.background);
|
|
17
|
+
const labels = { phoneSubtitle: 'Enter your mobile number to continue.', codeSubtitle: 'Enter the 6-digit code.', profileSubtitle: 'Finish setting up your account.', phone: 'Mobile number', name: 'Name', namePlaceholder: 'Your name', continue: 'Continue', verify: 'Verify', sendAgain: 'Send a new code', busy: 'Checking...', changePhone: 'Use a different number', code: 'Verification code', expired: 'Code expired', ...p.labels };
|
|
18
|
+
const input = useRef(null), [focused, setFocused] = useState(false);
|
|
19
|
+
const expired = p.secondsRemaining !== undefined && p.secondsRemaining <= 0;
|
|
20
|
+
const disabled = !!p.busy || !!p.disabled || (p.stage === 'phone' && !p.consent.checked) || (p.stage === 'code' && !expired && p.code.length !== 6) || (p.stage === 'profile' && !p.name.trim());
|
|
21
|
+
const label = p.busy ? labels.busy : p.stage === 'code' ? (expired ? labels.sendAgain : labels.verify) : labels.continue;
|
|
22
|
+
return _jsx(MessagingPopupHost, { children: _jsx(KeyboardAvoidingView, { behavior: Platform.OS === 'ios' ? 'padding' : undefined, style: { flex: 1, minHeight: 0, backgroundColor: c.background }, children: _jsx(ScrollView, { keyboardShouldPersistTaps: "handled", contentContainerStyle: s.page, children: _jsxs(Pressable, { accessible: false, onPress: Keyboard.dismiss, style: [s.card, { backgroundColor: surface.card, borderColor: surface.border }], children: [p.logo ? _jsx(View, { style: s.logo, children: p.logo }) : a.logoUrl ? _jsx(Image, { accessibilityLabel: a.name, source: { uri: a.logoUrl }, style: s.logo, resizeMode: "contain" }) : _jsx(Text, { style: [s.brand, { color: c.foreground }], children: a.name }), _jsx(Text, { style: { color: c.secondary, fontSize: 16 }, children: p.stage === 'phone' ? labels.phoneSubtitle : p.stage === 'code' ? labels.codeSubtitle : labels.profileSubtitle }), p.stage === 'phone' ? _jsxs(_Fragment, { children: [_jsx(Text, { style: [s.label, { color: c.foreground }], children: labels.phone }), p.phoneField, _jsxs(View, { style: s.consentRow, children: [_jsx(Pressable, { accessibilityRole: "checkbox", accessibilityLabel: p.consent.title, accessibilityState: { checked: p.consent.checked, disabled: !!p.busy }, disabled: p.busy, hitSlop: 8, onPress: () => { Keyboard.dismiss(); p.consent.onChange(!p.consent.checked); }, style: [s.checkbox, { borderColor: c.accent, backgroundColor: p.consent.checked ? c.accent : 'transparent' }], children: p.consent.checked && _jsx(RobonoIcon, { name: "checkmark", size: 17, color: c.background }) }), _jsxs(View, { style: { flex: 1, minWidth: 0, gap: 4 }, children: [_jsx(Text, { style: [s.consentTitle, { color: c.foreground }], children: p.consent.title }), _jsx(Text, { style: [s.consentDetails, { color: c.secondary }], children: p.consent.details })] })] })] }) : p.stage === 'profile' ? _jsxs(_Fragment, { children: [_jsx(Text, { style: [s.label, { color: c.foreground }], children: labels.name }), _jsx(TextInput, { accessibilityLabel: labels.name, value: p.name, onChangeText: p.onNameChange, editable: !p.busy, maxLength: 80, autoCapitalize: "words", textContentType: "name", placeholder: labels.namePlaceholder, placeholderTextColor: c.secondary, style: [s.input, { color: c.foreground, backgroundColor: surface.field, borderColor: surface.border }] }), p.profileFields] }) : _jsxs(_Fragment, { children: [_jsxs(Pressable, { accessible: false, onPress: () => input.current?.focus(), style: { minHeight: 58, position: 'relative' }, children: [_jsx(View, { accessible: false, style: s.codeRow, children: Array.from({ length: 6 }, (_, i) => _jsx(View, { style: [s.codeCell, { backgroundColor: surface.field, borderColor: focused && i === Math.min(p.code.length, 5) ? c.accent : p.code[i] ? c.secondary : surface.border, borderWidth: focused && i === Math.min(p.code.length, 5) ? 2 : 1 }], children: _jsx(Text, { style: { fontSize: 28, fontWeight: '700', color: c.foreground }, children: p.code[i] ?? '' }) }, i)) }), _jsx(TextInput, { ref: input, accessibilityLabel: labels.code, value: p.code, onChangeText: v => p.onCodeChange(v.replace(/\D/g, '').slice(0, 6)), onFocus: () => setFocused(true), onBlur: () => setFocused(false), editable: !p.busy && !expired, keyboardType: "number-pad", autoComplete: "sms-otp", textContentType: "oneTimeCode", maxLength: 6, caretHidden: true, style: s.hiddenInput })] }), p.secondsRemaining !== undefined && _jsxs(View, { style: s.countdown, children: [_jsx(RobonoIcon, { name: "time-outline", size: 17, color: c.secondary }), _jsx(Text, { accessibilityLiveRegion: expired ? 'polite' : 'none', style: { color: expired ? '#EF4444' : c.secondary, fontSize: 15, fontWeight: '700', fontVariant: ['tabular-nums'] }, children: expired ? labels.expired : Math.floor(p.secondsRemaining / 60) + ':' + String(p.secondsRemaining % 60).padStart(2, '0') })] })] }), !!p.error && _jsx(Text, { accessibilityRole: "alert", style: { color: '#EF4444', fontSize: 14, lineHeight: 19 }, children: p.error }), _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: label, accessibilityState: { disabled, busy: !!p.busy }, disabled: disabled, onPress: p.onSubmit, style: [s.button, { backgroundColor: c.accent, opacity: disabled ? .45 : 1 }], children: _jsx(Text, { style: { color: c.background, fontWeight: '800' }, children: label }) }), p.stage !== 'phone' && _jsx(Pressable, { disabled: p.busy, accessibilityRole: "button", onPress: p.onChangePhone, children: _jsx(Text, { style: { color: c.accent, fontWeight: '600', textAlign: 'center', paddingVertical: 12 }, children: labels.changePhone }) })] }) }) }) });
|
|
23
|
+
}
|
|
24
|
+
/** Same field proportions and divider as Messenger, with host-owned country data. */
|
|
25
|
+
export function MessagingPhoneInput(p) { const c = (p.appearance ?? defaultMessagingSettings().appearance).colors, surface = surfaces(c.background); return _jsxs(View, { style: [s.phoneRow, { backgroundColor: surface.field, borderColor: surface.border }], children: [_jsxs(Pressable, { accessibilityRole: "button", accessibilityLabel: 'Country, ' + p.countryName, disabled: p.disabled, hitSlop: 4, onPress: () => { Keyboard.dismiss(); p.onChooseCountry(); }, style: s.country, children: [_jsx(Text, { style: { fontSize: 19 }, children: p.flag }), _jsx(Text, { style: { fontSize: 17, fontWeight: '700', color: c.foreground }, children: p.callingCode }), _jsx(RobonoIcon, { name: "chevron-down", size: 16, color: c.secondary })] }), _jsx(View, { style: [s.divider, { backgroundColor: surface.border }] }), _jsx(TextInput, { accessibilityLabel: p.label ?? 'Mobile number', value: p.value, onChangeText: p.onChange, editable: !p.disabled, keyboardType: "phone-pad", autoComplete: "tel-national", textContentType: "telephoneNumber", maxLength: 20, placeholder: p.placeholder, placeholderTextColor: c.secondary, style: { flex: 1, minHeight: 52, fontSize: 17, color: c.foreground } })] }); }
|
|
26
|
+
/** The same compact choice list for customer sign-in, language and country fields. */
|
|
27
|
+
export function MessagingChoicePicker(p) {
|
|
28
|
+
const c = (p.appearance ?? defaultMessagingSettings().appearance).colors, surface = surfaces(c.background);
|
|
29
|
+
return _jsx(MessagingMenuSurface, { visible: p.visible, onClose: p.onClose, children: () => _jsx(View, { style: { flex: 1, justifyContent: 'center', padding: 16, backgroundColor: 'rgba(0,0,0,.72)' }, children: _jsxs(View, { accessibilityViewIsModal: true, style: { maxHeight: '82%', width: '100%', maxWidth: 480, alignSelf: 'center', borderRadius: 8, borderWidth: 1, borderColor: surface.border, backgroundColor: c.background, overflow: 'hidden' }, children: [_jsxs(View, { style: { minHeight: 58, paddingStart: 16, paddingEnd: 58, justifyContent: 'center', borderBottomWidth: StyleSheet.hairlineWidth, borderBottomColor: surface.border, backgroundColor: surface.card }, children: [_jsx(Text, { accessibilityRole: "header", style: { color: c.foreground, fontSize: 18, fontWeight: '800' }, children: p.title }), _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: p.closeLabel ?? 'Close ' + p.title, onPress: p.onClose, style: { position: 'absolute', top: 0, end: 0, width: 58, height: 58, alignItems: 'center', justifyContent: 'center' }, children: _jsx(RobonoIcon, { name: "close", size: 22, color: c.foreground }) })] }), _jsx(FlatList, { data: p.choices, keyExtractor: row => row.value, keyboardShouldPersistTaps: "handled", contentContainerStyle: { padding: 8 }, renderItem: ({ item }) => _jsxs(Pressable, { accessibilityRole: "radio", accessibilityLabel: item.label + (item.detail ? ', ' + item.detail : ''), accessibilityState: { selected: p.selected === item.value }, onPress: () => p.onSelect(item.value), style: { minHeight: 58, borderRadius: 8, flexDirection: 'row', alignItems: 'center', gap: 12, paddingHorizontal: 12, paddingVertical: 8, backgroundColor: p.selected === item.value ? surface.field : 'transparent' }, children: [item.symbol && _jsx(Text, { style: { width: 31, fontSize: 21 }, children: item.symbol }), _jsxs(View, { style: { flex: 1, minWidth: 0 }, children: [_jsx(Text, { style: { color: c.foreground, fontSize: 16, fontWeight: '800' }, children: item.label }), item.detail && _jsx(Text, { style: { color: c.secondary, fontSize: 13, marginTop: 2 }, children: item.detail })] }), p.selected === item.value && _jsx(RobonoIcon, { name: "checkmark", size: 22, color: c.accent })] }) })] }) }) });
|
|
30
|
+
}
|
|
31
|
+
// Measurements copied from src/AppRoot.tsx authCard/phoneInput/codeCell/smsConsent styles.
|
|
32
|
+
// Keep behavior and presentation here: the consumer app must not fork these screens.
|
|
33
|
+
const s = StyleSheet.create({
|
|
34
|
+
page: { flexGrow: 1, justifyContent: 'center', padding: 24 }, card: { width: '100%', maxWidth: 480, alignSelf: 'center', borderRadius: 8, padding: 24, gap: 12, borderWidth: 1 },
|
|
35
|
+
logo: { width: 168, height: 48, alignSelf: 'center', marginBottom: 4 }, brand: { fontSize: 24, fontWeight: '800', textAlign: 'center', marginBottom: 4 },
|
|
36
|
+
label: { fontSize: 14, fontWeight: '700', marginBottom: -8 }, input: { minHeight: 52, borderWidth: 1, borderColor: '#2A2A2A', borderRadius: 8, paddingHorizontal: 16, fontSize: 17, backgroundColor: '#1D1D1D' },
|
|
37
|
+
phoneRow: { minHeight: 52, borderWidth: 1, borderColor: '#2A2A2A', borderRadius: 8, paddingHorizontal: 12, backgroundColor: '#1D1D1D', flexDirection: 'row', alignItems: 'center', direction: 'ltr' },
|
|
38
|
+
country: { minHeight: 50, flexDirection: 'row', alignItems: 'center', gap: 5, paddingRight: 8 }, divider: { width: StyleSheet.hairlineWidth, height: 28, marginRight: 12, backgroundColor: '#2A2A2A' },
|
|
39
|
+
consentRow: { flexDirection: 'row', alignItems: 'flex-start', gap: 8 }, checkbox: { width: 28, height: 28, borderWidth: 2, borderRadius: 6, alignItems: 'center', justifyContent: 'center', marginTop: 2 }, consentTitle: { fontSize: 14, fontWeight: '800', lineHeight: 19 }, consentDetails: { fontSize: 12, lineHeight: 17 },
|
|
40
|
+
codeRow: { minHeight: 58, flexDirection: 'row', justifyContent: 'center', gap: 8, direction: 'ltr' }, codeCell: { flex: 1, maxWidth: 52, minHeight: 58, borderRadius: 8, alignItems: 'center', justifyContent: 'center', backgroundColor: '#1D1D1D' }, hiddenInput: { position: 'absolute', top: 0, right: 0, bottom: 0, left: 0, zIndex: 2, color: 'transparent', backgroundColor: 'transparent', opacity: .01, fontSize: 1 },
|
|
41
|
+
countdown: { alignSelf: 'center', flexDirection: 'row', alignItems: 'center', gap: 6, direction: 'ltr' }, button: { minHeight: 48, borderRadius: 8, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 16 },
|
|
42
|
+
});
|
|
43
|
+
export function MessagingConnectionState({ appearance, error, onRetry, onSignOut, labels }) {
|
|
44
|
+
const colors = (appearance ?? defaultMessagingSettings().appearance).colors;
|
|
45
|
+
return _jsxs(View, { style: { flex: 1, minHeight: 160, backgroundColor: colors.background, alignItems: 'center', justifyContent: 'center', padding: 24, gap: 16 }, children: [!error && _jsx(ActivityIndicator, { color: colors.accent }), _jsx(Text, { accessibilityRole: error ? 'alert' : undefined, accessibilityLiveRegion: "polite", style: { color: colors.foreground, fontSize: 17, lineHeight: 25, textAlign: 'center', maxWidth: 400 }, children: error || labels?.loading || 'Opening Messenger…' }), error && onRetry && _jsx(Pressable, { accessibilityRole: "button", onPress: onRetry, style: { minHeight: 48, minWidth: 180, paddingHorizontal: 24, alignItems: 'center', justifyContent: 'center', backgroundColor: colors.accent, borderRadius: 8 }, children: _jsx(Text, { style: { color: colors.background, fontSize: 16, fontWeight: '700' }, children: labels?.retry || 'Try again' }) }), error && onSignOut && _jsx(Pressable, { accessibilityRole: "button", onPress: onSignOut, style: { minHeight: 44, justifyContent: 'center', paddingHorizontal: 16 }, children: _jsx(Text, { style: { color: colors.accent, fontSize: 16 }, children: labels?.signOut || 'Sign out' }) })] });
|
|
46
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robono/messaging-react-native",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "Optional, composable direct and group messaging screens for Robono.",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"prepack": "npm run build && node ../../scripts/generate-sdk-file-sbom.mjs"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
|
-
"@robono/messaging": "^0.
|
|
58
|
+
"@robono/messaging": "^0.9.0",
|
|
59
59
|
"react": ">=18.2 <20",
|
|
60
60
|
"react-native": ">=0.76 <1",
|
|
61
61
|
"expo-audio": ">=55 <57",
|