@redacto.io/consent-sdk-react-native 5.0.0-beta.1 → 5.0.0-beta.10

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.
@@ -1,12 +1,14 @@
1
1
  import {
2
- __require
3
- } from "./chunk-Y6FXYEAI.mjs";
2
+ SANDBOX_TOKEN_HEADER,
3
+ __require,
4
+ languageOptions
5
+ } from "./chunk-B2TXWC2C.mjs";
4
6
 
5
7
  // src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx
6
- import { useEffect as useEffect20 } from "react";
8
+ import { useEffect as useEffect21 } from "react";
7
9
  import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
8
10
  import { I18nextProvider } from "react-i18next";
9
- import { View as View50, StyleSheet as StyleSheet53, StatusBar as StatusBar2, Platform as Platform8 } from "react-native";
11
+ import { View as View52, StyleSheet as StyleSheet55, StatusBar as StatusBar2, Platform as Platform8 } from "react-native";
10
12
 
11
13
  // src/RedactoPrivacyCenter/lib/i18n.ts
12
14
  import i18n from "i18next";
@@ -423,7 +425,14 @@ var translation_default = {
423
425
  submittingAs: "Submitting as {{email}}",
424
426
  tapToChooseFile: "Tap to choose a file",
425
427
  view: "View",
426
- whatDoYouNeed: "What do you need?"
428
+ whatDoYouNeed: "What do you need?",
429
+ sessionExpiredTitle: "Your session has expired",
430
+ sessionExpiredDescription: "Please sign in again to continue.",
431
+ chooseYourProfile: "Choose your profile",
432
+ loginIdentifierLinkedToMultipleProfiles: "The login identifier is linked to more than one profile. Choose the one you want to view.",
433
+ userIdLabel: "User ID: {{id}}",
434
+ signingInEllipsis: "Signing in\u2026",
435
+ switchProfile: "Switch profile"
427
436
  };
428
437
 
429
438
  // src/RedactoPrivacyCenter/locales/as/translation.json
@@ -837,7 +846,14 @@ var translation_default2 = {
837
846
  submittingAs: "{{email}} \u09B9\u09BF\u099A\u09BE\u09AA\u09C7 \u09A6\u09BE\u0996\u09BF\u09B2 \u0995\u09F0\u09BF \u0986\u099B\u09C7",
838
847
  tapToChooseFile: "\u09AB\u09BE\u0987\u09B2 \u09AC\u09BE\u099B\u09BF\u09AC\u09B2\u09C8 \u099F\u09BF\u09AA\u0995",
839
848
  view: "\u099A\u09BE\u0993\u0995",
840
- whatDoYouNeed: "\u0986\u09AA\u09CB\u09A8\u09BE\u0995 \u0995\u09BF \u09B2\u09BE\u0997\u09C7?"
849
+ whatDoYouNeed: "\u0986\u09AA\u09CB\u09A8\u09BE\u0995 \u0995\u09BF \u09B2\u09BE\u0997\u09C7?",
850
+ sessionExpiredTitle: "\u0986\u09AA\u09CB\u09A8\u09BE\u09F0 \u099B\u09C7\u099A\u09A8 \u09B6\u09C7\u09B7 \u09B9\u09C8\u099B\u09C7",
851
+ sessionExpiredDescription: "\u0985\u09AC\u09CD\u09AF\u09BE\u09B9\u09A4 \u09F0\u09BE\u0996\u09BF\u09AC\u09B2\u09C8 \u0985\u09A8\u09C1\u0997\u09CD\u09F0\u09B9 \u0995\u09F0\u09BF \u09AA\u09C1\u09A8\u09F0 \u099B\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09F0\u0995\u0964",
852
+ chooseYourProfile: "\u0986\u09AA\u09CB\u09A8\u09BE\u09F0 \u09AA\u09CD\u09F0'\u09AB\u09BE\u0987\u09B2 \u09AC\u09BE\u099B\u09A8\u09BF \u0995\u09F0\u0995",
853
+ loginIdentifierLinkedToMultipleProfiles: "\u09B2\u0997\u0987\u09A8 \u0986\u0987\u09A1\u09BF \u098F\u0995\u09BE\u09A7\u09BF\u0995 \u09AA\u09CD\u09F0'\u09AB\u09BE\u0987\u09B2\u09F0 \u09B8\u09C8\u09A4\u09C7 \u09B8\u0982\u09AF\u09C1\u0995\u09CD\u09A4\u0964 \u0986\u09AA\u09C1\u09A8\u09BF \u099A\u09BE\u09AC \u09AC\u09BF\u099A\u09F0\u09BE\u099F\u09CB \u09AC\u09BE\u099B\u09A8\u09BF \u0995\u09F0\u0995\u0964",
854
+ userIdLabel: "\u09AC\u09CD\u09AF\u09F1\u09B9\u09BE\u09F0\u0995\u09BE\u09F0\u09C0 \u0986\u0987\u09A1\u09BF: {{id}}",
855
+ signingInEllipsis: "\u099B\u09BE\u0987\u09A8 \u0987\u09A8 \u09B9\u09C8 \u0986\u099B\u09C7\u2026",
856
+ switchProfile: "\u09AA\u09CD\u09F0'\u09AB\u09BE\u0987\u09B2 \u09B8\u09B2\u09A8\u09BF \u0995\u09F0\u0995"
841
857
  };
842
858
 
843
859
  // src/RedactoPrivacyCenter/locales/bn/translation.json
@@ -1251,7 +1267,14 @@ var translation_default3 = {
1251
1267
  submittingAs: "{{email}} \u09B9\u09BF\u09B8\u09BE\u09AC\u09C7 \u099C\u09AE\u09BE \u09A6\u09C7\u0993\u09AF\u09BC\u09BE \u09B9\u099A\u09CD\u099B\u09C7",
1252
1268
  tapToChooseFile: "\u09AB\u09BE\u0987\u09B2 \u09AC\u09C7\u099B\u09C7 \u09A8\u09BF\u09A4\u09C7 \u099F\u09CD\u09AF\u09BE\u09AA \u0995\u09B0\u09C1\u09A8",
1253
1269
  view: "\u09A6\u09C7\u0996\u09C1\u09A8",
1254
- whatDoYouNeed: "\u0986\u09AA\u09A8\u09BE\u09B0 \u0995\u09C0 \u09AA\u09CD\u09B0\u09AF\u09BC\u09CB\u099C\u09A8?"
1270
+ whatDoYouNeed: "\u0986\u09AA\u09A8\u09BE\u09B0 \u0995\u09C0 \u09AA\u09CD\u09B0\u09AF\u09BC\u09CB\u099C\u09A8?",
1271
+ sessionExpiredTitle: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09B8\u09C7\u09B6\u09A8 \u09AE\u09C7\u09AF\u09BC\u09BE\u09A6 \u09B6\u09C7\u09B7 \u09B9\u09AF\u09BC\u09C7 \u0997\u09C7\u099B\u09C7",
1272
+ sessionExpiredDescription: "\u099A\u09BE\u09B2\u09BF\u09AF\u09BC\u09C7 \u09AF\u09C7\u09A4\u09C7 \u0985\u09A8\u09C1\u0997\u09CD\u09B0\u09B9 \u0995\u09B0\u09C7 \u0986\u09AC\u09BE\u09B0 \u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
1273
+ chooseYourProfile: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u09AC\u09C7\u099B\u09C7 \u09A8\u09BF\u09A8",
1274
+ loginIdentifierLinkedToMultipleProfiles: "\u09B2\u0997\u0987\u09A8 \u0986\u0987\u09A1\u09BF \u098F\u0995\u09BE\u09A7\u09BF\u0995 \u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2\u09C7\u09B0 \u09B8\u09BE\u09A5\u09C7 \u09AF\u09C1\u0995\u09CD\u09A4\u0964 \u0986\u09AA\u09A8\u09BF \u09AF\u09C7\u099F\u09BF \u09A6\u09C7\u0996\u09A4\u09C7 \u099A\u09BE\u09A8 \u09B8\u09C7\u099F\u09BF \u09AC\u09C7\u099B\u09C7 \u09A8\u09BF\u09A8\u0964",
1275
+ userIdLabel: "\u09AC\u09CD\u09AF\u09AC\u09B9\u09BE\u09B0\u0995\u09BE\u09B0\u09C0\u09B0 \u0986\u0987\u09A1\u09BF: {{id}}",
1276
+ signingInEllipsis: "\u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u09B9\u099A\u09CD\u099B\u09C7\u2026",
1277
+ switchProfile: "\u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09A8 \u0995\u09B0\u09C1\u09A8"
1255
1278
  };
1256
1279
 
1257
1280
  // src/RedactoPrivacyCenter/locales/brx/translation.json
@@ -1665,7 +1688,14 @@ var translation_default4 = {
1665
1688
  submittingAs: "{{email}} \u092E\u0939\u0930\u0948 \u0917\u0925\u093E\u092F\u0917\u093E\u0938\u093F\u0928\u094B",
1666
1689
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u0938\u093E\u092F\u0916\u0928\u094B \u091F\u0947\u092C \u0916\u093E\u0932\u093E\u092E",
1667
1690
  view: "\u0928\u093E\u092F",
1668
- whatDoYouNeed: "\u0928\u094B\u0902\u0925\u093E\u0902\u0928\u094B \u092E\u093E \u0917\u094B\u0928\u093E\u0902?"
1691
+ whatDoYouNeed: "\u0928\u094B\u0902\u0925\u093E\u0902\u0928\u094B \u092E\u093E \u0917\u094B\u0928\u093E\u0902?",
1692
+ sessionExpiredTitle: "\u0928\u094B\u0902\u0925\u093E\u0902\u0928\u093F \u0938\u0947\u0938\u0928 \u091C\u094B\u092C\u092C\u093E\u092F",
1693
+ sessionExpiredDescription: "\u0938\u093E\u0932\u093E\u092F\u0928\u094B \u0925\u093E\u0916\u093E\u092F \u0905\u0928\u0928\u093E\u0928\u0948 \u092B\u093F\u0928 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0916\u093E\u0932\u093E\u092E\u0964",
1694
+ chooseYourProfile: "\u0928\u094B\u0902\u0925\u093E\u0902\u0928\u093F \u092A\u094D\u0930\u092B\u093E\u0907\u0932 \u0938\u093E\u092F\u0916",
1695
+ loginIdentifierLinkedToMultipleProfiles: "\u0932\u0949\u0917\u093F\u0928 \u0906\u0908\u0921\u0940 \u092E\u094B\u0928\u0938\u0947\u0928\u093F\u0916\u094D\u0930\u0941\u0907 \u092C\u093E\u0902\u0938\u093F\u0928 \u092A\u094D\u0930\u092B\u093E\u0907\u0932\u091C\u094B\u0902 \u0928\u093E\u0902\u091C\u093E\u092C \u0926\u0902\u0964 \u0928\u094B\u0902\u0925\u093E\u0919\u093E \u0928\u093E\u092F\u0928\u094B \u0932\u0941\u092C\u0948\u092F\u094B\u092C\u094D\u0932\u093E \u092C\u0947\u0916\u094C \u0938\u093E\u092F\u0916\u0964",
1696
+ userIdLabel: "\u092F\u0942\u091C\u0930 \u0906\u0908\u0921\u0940: {{id}}",
1697
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u091C\u093E\u092F\u0917\u093E\u0938\u093F\u0928\u094B \u0926\u0902\u2026",
1698
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u0938\u094B\u0932\u093E\u092F"
1669
1699
  };
1670
1700
 
1671
1701
  // src/RedactoPrivacyCenter/locales/doi/translation.json
@@ -2079,7 +2109,14 @@ var translation_default5 = {
2079
2109
  submittingAs: "{{email}} \u0926\u0947 \u0930\u0942\u092A \u091A \u091C\u092E\u093E\u0902 \u0915\u0930\u0926\u0947",
2080
2110
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u091A\u0941\u0928\u0928\u0947 \u0906\u0938\u094D\u0924\u0948 \u091F\u0948\u092A \u0915\u0930\u094B",
2081
2111
  view: "\u0926\u093F\u0915\u094D\u0916\u094B",
2082
- whatDoYouNeed: "\u0924\u0941\u0938\u0947\u0902 \u0915\u0947\u0939\u094D \u091A\u093E\u0939\u093F\u0926\u093E?"
2112
+ whatDoYouNeed: "\u0924\u0941\u0938\u0947\u0902 \u0915\u0947\u0939\u094D \u091A\u093E\u0939\u093F\u0926\u093E?",
2113
+ sessionExpiredTitle: "\u0924\u0941\u0902\u0926\u093E \u0938\u0924\u094D\u0930 \u0916\u0924\u092E \u0939\u094B\u0908 \u0917\u0947\u0906 \u0910",
2114
+ sessionExpiredDescription: "\u091C\u093E\u0930\u0940 \u0930\u0915\u094D\u0916\u0928\u0947 \u0906\u0938\u094D\u0924\u0948 \u0915\u0943\u092A\u093E \u0915\u0930\u093F\u092F\u0948 \u092B\u093F\u0930\u0940 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u094B\u0964",
2115
+ chooseYourProfile: "\u0905\u092A\u0928\u0940 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u091A\u0941\u0928\u094B",
2116
+ loginIdentifierLinkedToMultipleProfiles: "\u0932\u0949\u0917\u093F\u0928 \u0906\u0908\u0921\u0940 \u0907\u0915 \u0915\u094B\u0932\u093E \u092E\u0924\u093E \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932\u0947\u0902 \u0915\u0928\u094D\u0928\u0948 \u091C\u0941\u0921\u093C\u094D\u092F\u093E \u0926\u093E \u0910\u0964 \u091C\u0947\u0939\u094D\u0921\u093C\u0940 \u0924\u0941\u0938\u0947\u0902 \u0926\u093F\u0915\u094D\u0916\u0928\u0940 \u0910 \u0913\u0939\u094D \u091A\u0941\u0928\u094B\u0964",
2117
+ userIdLabel: "\u092A\u094D\u0930\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0906\u0908\u0921\u0940: {{id}}",
2118
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0939\u094B\u0906 \u0915\u0930\u0926\u093E \u0910\u2026",
2119
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u092C\u0926\u0932\u094B"
2083
2120
  };
2084
2121
 
2085
2122
  // src/RedactoPrivacyCenter/locales/gom/translation.json
@@ -2493,7 +2530,14 @@ var translation_default6 = {
2493
2530
  submittingAs: "{{email}} \u092E\u094D\u0939\u0942\u0923 \u0938\u093E\u0926\u0930 \u0915\u0930\u0924\u093E",
2494
2531
  tapToChooseFile: "\u092B\u093E\u092F\u0932 \u0928\u093F\u0935\u0921\u092A\u093E\u0915 \u091F\u0945\u092A \u0915\u0930\u093E\u0924",
2495
2532
  view: "\u092A\u0933\u092F\u093E\u0924",
2496
- whatDoYouNeed: "\u0924\u0941\u092E\u0915\u093E\u0902 \u0915\u093F\u0924\u0947\u0902 \u091C\u093E\u092F?"
2533
+ whatDoYouNeed: "\u0924\u0941\u092E\u0915\u093E\u0902 \u0915\u093F\u0924\u0947\u0902 \u091C\u093E\u092F?",
2534
+ sessionExpiredTitle: "\u0924\u0941\u092E\u091A\u0947\u0902 \u0938\u0924\u094D\u0930 \u0938\u094B\u0902\u092A\u0932\u093E\u0902",
2535
+ sessionExpiredDescription: "\u092B\u0941\u0921\u0947\u0902 \u0935\u091A\u092A\u093E\u0915 \u0909\u092A\u0915\u093E\u0930 \u0915\u0930\u0942\u0928 \u092A\u0930\u0924\u0942\u0928 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u093E\u0924.",
2536
+ chooseYourProfile: "\u0924\u0941\u092E\u091A\u0947\u0902 \u092A\u094D\u0930\u094B\u092B\u093E\u092F\u0932 \u0928\u093F\u0935\u0921\u093E\u0924",
2537
+ loginIdentifierLinkedToMultipleProfiles: "\u0932\u0949\u0917\u093F\u0928 \u0906\u092F\u0921\u0940 \u090F\u0915\u093E\u092A\u0930\u0938 \u091A\u0921 \u092A\u094D\u0930\u094B\u092B\u093E\u092F\u0932\u093E\u0902\u0915 \u091C\u094B\u0921\u0932\u093E. \u0924\u0941\u092E\u0915\u093E\u0902 \u091C\u0947\u0902 \u092A\u0933\u094B\u0935\u092A\u093E\u0915 \u091C\u093E\u092F \u0924\u0947\u0902 \u0928\u093F\u0935\u0921\u093E\u0924.",
2538
+ userIdLabel: "\u0935\u093E\u092A\u0930\u092A\u0940 \u0906\u092F\u0921\u0940: {{id}}",
2539
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u091C\u093E\u0935\u0928 \u0906\u0938\u093E\u2026",
2540
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u092F\u0932 \u092C\u0926\u0932\u093E"
2497
2541
  };
2498
2542
 
2499
2543
  // src/RedactoPrivacyCenter/locales/gu/translation.json
@@ -2907,7 +2951,14 @@ var translation_default7 = {
2907
2951
  submittingAs: "{{email}} \u0AA4\u0AB0\u0AC0\u0A95\u0AC7 \u0AB8\u0AAC\u0AAE\u0ABF\u0A9F \u0A95\u0AB0\u0AC0 \u0AB0\u0AB9\u0ACD\u0AAF\u0ABE \u0A9B\u0ACB",
2908
2952
  tapToChooseFile: "\u0AAB\u0ABE\u0A87\u0AB2 \u0AAA\u0AB8\u0A82\u0AA6 \u0A95\u0AB0\u0AB5\u0ABE \u0A9F\u0AC5\u0AAA \u0A95\u0AB0\u0ACB",
2909
2953
  view: "\u0A9C\u0AC1\u0A93",
2910
- whatDoYouNeed: "\u0AA4\u0AAE\u0AA8\u0AC7 \u0AB6\u0AC1\u0A82 \u0A9C\u0ACB\u0A88\u0A8F \u0A9B\u0AC7?"
2954
+ whatDoYouNeed: "\u0AA4\u0AAE\u0AA8\u0AC7 \u0AB6\u0AC1\u0A82 \u0A9C\u0ACB\u0A88\u0A8F \u0A9B\u0AC7?",
2955
+ sessionExpiredTitle: "\u0AA4\u0AAE\u0ABE\u0AB0\u0AC1\u0A82 \u0AB8\u0AA4\u0ACD\u0AB0 \u0AB8\u0AAE\u0ABE\u0AAA\u0ACD\u0AA4 \u0AA5\u0A88 \u0A97\u0AAF\u0AC1\u0A82 \u0A9B\u0AC7",
2956
+ sessionExpiredDescription: "\u0A9A\u0ABE\u0AB2\u0AC1 \u0AB0\u0ABE\u0A96\u0AB5\u0ABE \u0AAE\u0ABE\u0A9F\u0AC7 \u0A95\u0AC3\u0AAA\u0ABE \u0A95\u0AB0\u0AC0\u0AA8\u0AC7 \u0AAB\u0AB0\u0AC0\u0AA5\u0AC0 \u0AB8\u0ABE\u0A87\u0AA8 \u0A87\u0AA8 \u0A95\u0AB0\u0ACB.",
2957
+ chooseYourProfile: "\u0AA4\u0AAE\u0ABE\u0AB0\u0AC0 \u0AAA\u0ACD\u0AB0\u0ACB\u0AAB\u0ABE\u0A87\u0AB2 \u0AAA\u0AB8\u0A82\u0AA6 \u0A95\u0AB0\u0ACB",
2958
+ loginIdentifierLinkedToMultipleProfiles: "\u0AB2\u0ACB\u0A97\u0ABF\u0AA8 \u0A86\u0A88\u0AA1\u0AC0 \u0A8F\u0A95 \u0A95\u0AB0\u0AA4\u0ABE\u0A82 \u0AB5\u0AA7\u0AC1 \u0AAA\u0ACD\u0AB0\u0ACB\u0AAB\u0ABE\u0A87\u0AB2 \u0AB8\u0ABE\u0AA5\u0AC7 \u0A9C\u0ACB\u0AA1\u0ABE\u0AAF\u0AC7\u0AB2 \u0A9B\u0AC7. \u0AA4\u0AAE\u0AC7 \u0A9C\u0AC7 \u0A9C\u0ACB\u0AB5\u0ABE \u0AAE\u0ABE\u0A82\u0A97\u0ACB \u0A9B\u0ACB \u0AA4\u0AC7 \u0AAA\u0AB8\u0A82\u0AA6 \u0A95\u0AB0\u0ACB.",
2959
+ userIdLabel: "\u0AB5\u0AAA\u0AB0\u0ABE\u0AB6\u0A95\u0AB0\u0ACD\u0AA4\u0ABE \u0A86\u0A88\u0AA1\u0AC0: {{id}}",
2960
+ signingInEllipsis: "\u0AB8\u0ABE\u0A87\u0AA8 \u0A87\u0AA8 \u0AA5\u0A88 \u0AB0\u0AB9\u0ACD\u0AAF\u0AC1\u0A82 \u0A9B\u0AC7\u2026",
2961
+ switchProfile: "\u0AAA\u0ACD\u0AB0\u0ACB\u0AAB\u0ABE\u0A87\u0AB2 \u0AAC\u0AA6\u0AB2\u0ACB"
2911
2962
  };
2912
2963
 
2913
2964
  // src/RedactoPrivacyCenter/locales/hi/translation.json
@@ -3321,7 +3372,14 @@ var translation_default8 = {
3321
3372
  submittingAs: "{{email}} \u0915\u0947 \u0930\u0942\u092A \u092E\u0947\u0902 \u0938\u092C\u092E\u093F\u091F \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902",
3322
3373
  tapToChooseFile: "\u092B\u093C\u093E\u0907\u0932 \u091A\u0941\u0928\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u091F\u0948\u092A \u0915\u0930\u0947\u0902",
3323
3374
  view: "\u0926\u0947\u0916\u0947\u0902",
3324
- whatDoYouNeed: "\u0906\u092A\u0915\u094B \u0915\u094D\u092F\u093E \u091A\u093E\u0939\u093F\u090F?"
3375
+ whatDoYouNeed: "\u0906\u092A\u0915\u094B \u0915\u094D\u092F\u093E \u091A\u093E\u0939\u093F\u090F?",
3376
+ sessionExpiredTitle: "\u0906\u092A\u0915\u093E \u0938\u0924\u094D\u0930 \u0938\u092E\u093E\u092A\u094D\u0924 \u0939\u094B \u0917\u092F\u093E \u0939\u0948",
3377
+ sessionExpiredDescription: "\u091C\u093E\u0930\u0940 \u0930\u0916\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0915\u0943\u092A\u092F\u093E \u092B\u093F\u0930 \u0938\u0947 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902\u0964",
3378
+ chooseYourProfile: "\u0905\u092A\u0928\u0940 \u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932 \u091A\u0941\u0928\u0947\u0902",
3379
+ loginIdentifierLinkedToMultipleProfiles: "\u0932\u0949\u0917\u093F\u0928 \u0906\u0908\u0921\u0940 \u090F\u0915 \u0938\u0947 \u0905\u0927\u093F\u0915 \u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932 \u0938\u0947 \u091C\u0941\u0921\u093C\u093E \u0939\u0948\u0964 \u091C\u093F\u0938\u0947 \u0906\u092A \u0926\u0947\u0916\u0928\u093E \u091A\u093E\u0939\u0924\u0947 \u0939\u0948\u0902 \u0909\u0938\u0947 \u091A\u0941\u0928\u0947\u0902\u0964",
3380
+ userIdLabel: "\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0906\u0908\u0921\u0940: {{id}}",
3381
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
3382
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932 \u092C\u0926\u0932\u0947\u0902"
3325
3383
  };
3326
3384
 
3327
3385
  // src/RedactoPrivacyCenter/locales/kn/translation.json
@@ -3735,7 +3793,14 @@ var translation_default9 = {
3735
3793
  submittingAs: "{{email}} \u0C86\u0C97\u0CBF \u0CB8\u0CB2\u0CCD\u0CB2\u0CBF\u0CB8\u0CB2\u0CBE\u0C97\u0CC1\u0CA4\u0CCD\u0CA4\u0CBF\u0CA6\u0CC6",
3736
3794
  tapToChooseFile: "\u0CAB\u0CC8\u0CB2\u0CCD \u0C86\u0CAF\u0CCD\u0C95\u0CC6\u0CAE\u0CBE\u0CA1\u0CB2\u0CC1 \u0C9F\u0CCD\u0CAF\u0CBE\u0CAA\u0CCD \u0CAE\u0CBE\u0CA1\u0CBF",
3737
3795
  view: "\u0CB5\u0CC0\u0C95\u0CCD\u0CB7\u0CBF\u0CB8\u0CBF",
3738
- whatDoYouNeed: "\u0CA8\u0CBF\u0CAE\u0C97\u0CC6 \u0C8F\u0CA8\u0CC1 \u0CAC\u0CC7\u0C95\u0CC1?"
3796
+ whatDoYouNeed: "\u0CA8\u0CBF\u0CAE\u0C97\u0CC6 \u0C8F\u0CA8\u0CC1 \u0CAC\u0CC7\u0C95\u0CC1?",
3797
+ sessionExpiredTitle: "\u0CA8\u0CBF\u0CAE\u0CCD\u0CAE \u0CB8\u0CC6\u0CB7\u0CA8\u0CCD \u0C85\u0CB5\u0CA7\u0CBF \u0CAE\u0CC1\u0C97\u0CBF\u0CA6\u0CBF\u0CA6\u0CC6",
3798
+ sessionExpiredDescription: "\u0CAE\u0CC1\u0C82\u0CA6\u0CC1\u0CB5\u0CB0\u0CBF\u0CB8\u0CB2\u0CC1 \u0CA6\u0CAF\u0CB5\u0CBF\u0C9F\u0CCD\u0C9F\u0CC1 \u0CAE\u0CA4\u0CCD\u0CA4\u0CC6 \u0CB8\u0CC8\u0CA8\u0CCD \u0C87\u0CA8\u0CCD \u0CAE\u0CBE\u0CA1\u0CBF.",
3799
+ chooseYourProfile: "\u0CA8\u0CBF\u0CAE\u0CCD\u0CAE \u0CAA\u0CCD\u0CB0\u0CCA\u0CAB\u0CC8\u0CB2\u0CCD \u0C86\u0CAF\u0CCD\u0C95\u0CC6\u0CAE\u0CBE\u0CA1\u0CBF",
3800
+ loginIdentifierLinkedToMultipleProfiles: "\u0CB2\u0CBE\u0C97\u0CBF\u0CA8\u0CCD \u0C90\u0CA1\u0CBF \u0C92\u0C82\u0CA6\u0C95\u0CCD\u0C95\u0CBF\u0C82\u0CA4 \u0CB9\u0CC6\u0C9A\u0CCD\u0C9A\u0CC1 \u0CAA\u0CCD\u0CB0\u0CCA\u0CAB\u0CC8\u0CB2\u0CCD\u200C\u0C97\u0CB3\u0CBF\u0C97\u0CC6 \u0CB2\u0CBF\u0C82\u0C95\u0CCD \u0C86\u0C97\u0CBF\u0CA6\u0CC6. \u0CA8\u0CC0\u0CB5\u0CC1 \u0CB5\u0CC0\u0C95\u0CCD\u0CB7\u0CBF\u0CB8\u0CB2\u0CC1 \u0CAC\u0CAF\u0CB8\u0CC1\u0CB5\u0CC1\u0CA6\u0CA8\u0CCD\u0CA8\u0CC1 \u0C86\u0CAF\u0CCD\u0C95\u0CC6\u0CAE\u0CBE\u0CA1\u0CBF.",
3801
+ userIdLabel: "\u0CAC\u0CB3\u0C95\u0CC6\u0CA6\u0CBE\u0CB0 \u0C90\u0CA1\u0CBF: {{id}}",
3802
+ signingInEllipsis: "\u0CB8\u0CC8\u0CA8\u0CCD \u0C87\u0CA8\u0CCD \u0C86\u0C97\u0CC1\u0CA4\u0CCD\u0CA4\u0CBF\u0CA6\u0CC6\u2026",
3803
+ switchProfile: "\u0CAA\u0CCD\u0CB0\u0CCA\u0CAB\u0CC8\u0CB2\u0CCD \u0CAC\u0CA6\u0CB2\u0CBE\u0CAF\u0CBF\u0CB8\u0CBF"
3739
3804
  };
3740
3805
 
3741
3806
  // src/RedactoPrivacyCenter/locales/ks/translation.json
@@ -4149,7 +4214,14 @@ var translation_default10 = {
4149
4214
  submittingAs: "{{email}} \u067E\u0620\u0658\u0679\u06BE \u062C\u0645\u0639 \u06A9\u0631\u0627\u0646",
4150
4215
  tapToChooseFile: "\u0641\u0627\u06CC\u0644 \u0698\u0627\u0631\u0646\u06C1 \u062E\u0672\u0637\u0631\u0655 \u0679\u06CC\u067E \u06A9\u0631\u06CC\u0648",
4151
4216
  view: "\u0648\u064F\u0686\u06BE\u0650\u0648",
4152
- whatDoYouNeed: "\u062A\u0648\u06C1\u0650 \u06A9\u06CC\u0627 \u0636\u0631\u0648\u0631\u062A \u0686\u06BE\u064F\u061F"
4217
+ whatDoYouNeed: "\u062A\u0648\u06C1\u0650 \u06A9\u06CC\u0627 \u0636\u0631\u0648\u0631\u062A \u0686\u06BE\u064F\u061F",
4218
+ sessionExpiredTitle: "\u062A\u064F\u06C1\u0646\u065B\u062F \u0633\u06CC\u0634\u064E\u0646 \u062E\u062A\u0645 \u06AF\u06C4\u0645\u064F\u062A",
4219
+ sessionExpiredDescription: "\u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u0646\u06C1\u0655 \u062E\u0672\u0637\u0631\u0655 \u0645\u06C1\u0631\u0628\u0627\u0646\u06CC \u06A9\u0631\u0650\u062A\u06BE \u062F\u0648\u0628\u0627\u0631\u0655 \u0633\u0627\u0626\u0646 \u0627\u0650\u0646 \u06A9\u0631\u06CC\u0648\u06D4",
4220
+ chooseYourProfile: "\u067E\u0646\u0646\u06C1\u0655 \u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u0698\u0627\u0631\u0655\u0648",
4221
+ loginIdentifierLinkedToMultipleProfiles: "\u0644\u0627\u06AF \u0627\u0650\u0646 \u0622\u0626\u06CC \u0688\u06CC \u0686\u06BE\u064F \u0627\u06A9\u06C1 \u06A9\u06BE\u06C4\u062A\u06C1 \u0632\u06CC\u0627\u062F\u0655 \u067E\u0631\u0648\u0641\u0627\u0626\u0644\u0646 \u0633\u065F\u062A\u0620 \u062C\u0648\u0691\u0646\u06C1 \u0622\u0645\u064F\u062A\u06D4 \u06CC\u064F\u0633 \u062A\u0648\u06C1\u06C1\u0650 \u0648\u064F\u0686\u06BE\u064F\u0646 \u0686\u06BE\u0650\u0648 \u06CC\u0698\u06BE\u0627\u0646 \u0633\u064F \u0698\u0627\u0631\u0655\u0648\u06D4",
4222
+ userIdLabel: "\u0635\u0627\u0631\u0641 \u0622\u0626\u06CC \u0688\u06CC: {{id}}",
4223
+ signingInEllipsis: "\u0633\u0627\u0626\u0646 \u0627\u0650\u0646 \u06AF\u0698\u06BE\u0627\u0646 \u0686\u06BE\u064F\u2026",
4224
+ switchProfile: "\u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u0628\u062F\u0644\u0627\u0648"
4153
4225
  };
4154
4226
 
4155
4227
  // src/RedactoPrivacyCenter/locales/mai/translation.json
@@ -4563,7 +4635,14 @@ var translation_default11 = {
4563
4635
  submittingAs: "{{email}} \u0930\u0942\u092A\u092E\u0947 \u091C\u092E\u093E \u0915\u093D \u0930\u0939\u0932 \u091B\u0940",
4564
4636
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u091A\u0941\u0928\u092C\u093E\u0915 \u0932\u0947\u0932 \u091F\u0948\u092A \u0915\u0930\u0942",
4565
4637
  view: "\u0926\u0947\u0916\u0942",
4566
- whatDoYouNeed: "\u0905\u0939\u093E\u0901\u0915\u0947\u0901 \u0915\u0940 \u091A\u093E\u0939\u0940?"
4638
+ whatDoYouNeed: "\u0905\u0939\u093E\u0901\u0915\u0947\u0901 \u0915\u0940 \u091A\u093E\u0939\u0940?",
4639
+ sessionExpiredTitle: "\u0905\u0939\u093E\u0901\u0915 \u0938\u0924\u094D\u0930 \u0938\u092E\u093E\u092A\u094D\u0924 \u092D\u093D \u0917\u0947\u0932 \u0905\u091B\u093F",
4640
+ sessionExpiredDescription: "\u091C\u093E\u0930\u0940 \u0930\u093E\u0916\u092C\u093E\u0915 \u0932\u0947\u0932 \u0915\u0943\u092A\u092F\u093E \u092B\u0947\u0930 \u0938\u0901 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0942\u0964",
4641
+ chooseYourProfile: "\u0905\u092A\u0928 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u091A\u0941\u0928\u0942",
4642
+ loginIdentifierLinkedToMultipleProfiles: "\u0932\u0949\u0917\u093F\u0928 \u0906\u0907\u0921\u0940 \u090F\u0915\u093E\u0927\u093F\u0915 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932\u0938\u0901 \u091C\u0941\u0921\u093C\u0932 \u0905\u091B\u093F\u0964 \u091C\u0947 \u0905\u0939\u093E\u0901 \u0926\u0947\u0916\u092F \u091A\u093E\u0939\u0948\u0924 \u091B\u0940 \u0913\u0915\u0930\u093E \u091A\u0941\u0928\u0942\u0964",
4643
+ userIdLabel: "\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0906\u0907\u0921\u0940: {{id}}",
4644
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u092D' \u0930\u0939\u0932 \u0905\u091B\u093F\u2026",
4645
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u092C\u0926\u0932\u0942"
4567
4646
  };
4568
4647
 
4569
4648
  // src/RedactoPrivacyCenter/locales/ml/translation.json
@@ -4977,7 +5056,14 @@ var translation_default12 = {
4977
5056
  submittingAs: "{{email}} \u0D06\u0D2F\u0D3F \u0D38\u0D2E\u0D7C\u0D2A\u0D4D\u0D2A\u0D3F\u0D15\u0D4D\u0D15\u0D41\u0D28\u0D4D\u0D28\u0D41",
4978
5057
  tapToChooseFile: "\u0D2B\u0D2F\u0D7D \u0D24\u0D3F\u0D30\u0D1E\u0D4D\u0D1E\u0D46\u0D1F\u0D41\u0D15\u0D4D\u0D15\u0D3E\u0D7B \u0D1F\u0D3E\u0D2A\u0D4D\u0D2A\u0D4D \u0D1A\u0D46\u0D2F\u0D4D\u0D2F\u0D41\u0D15",
4979
5058
  view: "\u0D15\u0D3E\u0D23\u0D41\u0D15",
4980
- whatDoYouNeed: "\u0D28\u0D3F\u0D19\u0D4D\u0D19\u0D7E\u0D15\u0D4D\u0D15\u0D4D \u0D0E\u0D28\u0D4D\u0D24\u0D3E\u0D23\u0D4D \u0D35\u0D47\u0D23\u0D4D\u0D1F\u0D24\u0D4D?"
5059
+ whatDoYouNeed: "\u0D28\u0D3F\u0D19\u0D4D\u0D19\u0D7E\u0D15\u0D4D\u0D15\u0D4D \u0D0E\u0D28\u0D4D\u0D24\u0D3E\u0D23\u0D4D \u0D35\u0D47\u0D23\u0D4D\u0D1F\u0D24\u0D4D?",
5060
+ sessionExpiredTitle: "\u0D28\u0D3F\u0D19\u0D4D\u0D19\u0D33\u0D41\u0D1F\u0D46 \u0D38\u0D46\u0D37\u0D7B \u0D15\u0D3E\u0D32\u0D39\u0D30\u0D23\u0D2A\u0D4D\u0D2A\u0D46\u0D1F\u0D4D\u0D1F\u0D41",
5061
+ sessionExpiredDescription: "\u0D24\u0D41\u0D1F\u0D30\u0D3E\u0D7B \u0D26\u0D2F\u0D35\u0D3E\u0D2F\u0D3F \u0D35\u0D40\u0D23\u0D4D\u0D1F\u0D41\u0D02 \u0D38\u0D48\u0D7B \u0D07\u0D7B \u0D1A\u0D46\u0D2F\u0D4D\u0D2F\u0D41\u0D15.",
5062
+ chooseYourProfile: "\u0D28\u0D3F\u0D19\u0D4D\u0D19\u0D33\u0D41\u0D1F\u0D46 \u0D2A\u0D4D\u0D30\u0D4A\u0D2B\u0D48\u0D7D \u0D24\u0D3F\u0D30\u0D1E\u0D4D\u0D1E\u0D46\u0D1F\u0D41\u0D15\u0D4D\u0D15\u0D41\u0D15",
5063
+ loginIdentifierLinkedToMultipleProfiles: "\u0D32\u0D4B\u0D17\u0D3F\u0D7B \u0D10\u0D21\u0D3F \u0D12\u0D28\u0D4D\u0D28\u0D3F\u0D32\u0D27\u0D3F\u0D15\u0D02 \u0D2A\u0D4D\u0D30\u0D4A\u0D2B\u0D48\u0D32\u0D41\u0D15\u0D33\u0D41\u0D2E\u0D3E\u0D2F\u0D3F \u0D2C\u0D28\u0D4D\u0D27\u0D3F\u0D2A\u0D4D\u0D2A\u0D3F\u0D1A\u0D4D\u0D1A\u0D3F\u0D30\u0D3F\u0D15\u0D4D\u0D15\u0D41\u0D28\u0D4D\u0D28\u0D41. \u0D28\u0D3F\u0D19\u0D4D\u0D19\u0D7E \u0D15\u0D3E\u0D23\u0D3E\u0D7B \u0D06\u0D17\u0D4D\u0D30\u0D39\u0D3F\u0D15\u0D4D\u0D15\u0D41\u0D28\u0D4D\u0D28\u0D24\u0D4D \u0D24\u0D3F\u0D30\u0D1E\u0D4D\u0D1E\u0D46\u0D1F\u0D41\u0D15\u0D4D\u0D15\u0D41\u0D15.",
5064
+ userIdLabel: "\u0D09\u0D2A\u0D2F\u0D4B\u0D15\u0D4D\u0D24\u0D43 \u0D10\u0D21\u0D3F: {{id}}",
5065
+ signingInEllipsis: "\u0D38\u0D48\u0D7B \u0D07\u0D7B \u0D1A\u0D46\u0D2F\u0D4D\u0D2F\u0D41\u0D28\u0D4D\u0D28\u0D41\u2026",
5066
+ switchProfile: "\u0D2A\u0D4D\u0D30\u0D4A\u0D2B\u0D48\u0D7D \u0D2E\u0D3E\u0D31\u0D4D\u0D31\u0D41\u0D15"
4981
5067
  };
4982
5068
 
4983
5069
  // src/RedactoPrivacyCenter/locales/mni-Mtei/translation.json
@@ -5391,7 +5477,14 @@ var translation_default13 = {
5391
5477
  submittingAs: "{{email}} \uABD1\uABE3\uABCF\uABC5 \uABCA\uABE5\uABD2\uABE0\uABC2\uABE4",
5392
5478
  tapToChooseFile: "\uABD0\uABE5\uABCF\uABDC \uABC8\uABDF\uABC5\uABD5 \uABC7\uABE6\uABDE \uABC7\uABE7",
5393
5479
  view: "\uABCC\uABE6\uABE1\uABCE",
5394
- whatDoYouNeed: "\uABD1\uABD7\uABE3\uABDD\uABD7 \uABC0\uABD4\uABE4 \uABC7\uABC9\uABE5\uABCF\uABD0\uABD7\uABD5\uABD2\uABE6?"
5480
+ whatDoYouNeed: "\uABD1\uABD7\uABE3\uABDD\uABD7 \uABC0\uABD4\uABE4 \uABC7\uABC9\uABE5\uABCF\uABD0\uABD7\uABD5\uABD2\uABE6?",
5481
+ sessionExpiredTitle: "\uABD1\uABD7\uABE3\uABDD\uABD2\uABE4 \uABC1\uABE6\uABC1\uABDF \uABC2\uABE3\uABCF\uABD4\uABE6",
5482
+ sessionExpiredDescription: "\uABC3\uABC8\uABE5 \uABC6\uABE0\uABCA\uABD4\uABDB\uABC5\uABD5 \uABC6\uABE5\uABC5\uABD5\uABE4\uABD7\uABE8\uABC5 \uABD1\uABC3\uABE8\uABDB \uABCD\uABDF\uABC5 \uABC1\uABE5\uABCF\uABDF \uABCF\uABDF \uABC7\uABE7\uABD5\uABE4\uABCC\uABE8\uABEB",
5483
+ chooseYourProfile: "\u09A8\u09B9\u09BE\u0995\u09CD\u0995\u09C0 \u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u0996\u09A8\u09AC\u09BF\u09AF\u09BC\u09C1",
5484
+ loginIdentifierLinkedToMultipleProfiles: "\u09B2\u0997\u0987\u09A8 \u0986\u0987\u09A1\u09BF \u0985\u09B8\u09BF \u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u0985\u09AE\u09A6\u0997\u09C0 \u09B9\u09C7\u09A8\u09CD\u09A8\u09BE \u09B2\u09CB\u0987\u09A8\u09A8\u09AC\u09BE \u09B2\u09C8\u0964 \u09A8\u09B9\u09BE\u0995\u09CD\u09A8\u09BE \u09AF\u09BC\u09C7\u0982\u09A8\u09BF\u0982\u09AC\u09BE \u0985\u09A6\u09C1 \u0996\u09A8\u09AC\u09BF\u09AF\u09BC\u09C1\u0964",
5485
+ userIdLabel: "\uABC3\uABE4\uABD1\uABE3\uABCF\uABD5 \uABD1\uABE5\uABCF\uABD7\uABE4: {{id}}",
5486
+ signingInEllipsis: "\u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u09A4\u09CC\u09B0\u09BF\u2026",
5487
+ switchProfile: "\u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u09B9\u09CB\u0982\u09A6\u09CB\u0995-\u0989"
5395
5488
  };
5396
5489
 
5397
5490
  // src/RedactoPrivacyCenter/locales/mr/translation.json
@@ -5805,7 +5898,14 @@ var translation_default14 = {
5805
5898
  submittingAs: "{{email}} \u092E\u094D\u0939\u0923\u0942\u0928 \u0938\u092C\u092E\u093F\u091F \u0915\u0930\u0924 \u0906\u0939\u0947",
5806
5899
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u0928\u093F\u0935\u0921\u0923\u094D\u092F\u093E\u0938\u093E\u0920\u0940 \u091F\u0945\u092A \u0915\u0930\u093E",
5807
5900
  view: "\u092A\u0939\u093E",
5808
- whatDoYouNeed: "\u0924\u0941\u092E\u094D\u0939\u093E\u0932\u093E \u0915\u093E\u092F \u0939\u0935\u0947 \u0906\u0939\u0947?"
5901
+ whatDoYouNeed: "\u0924\u0941\u092E\u094D\u0939\u093E\u0932\u093E \u0915\u093E\u092F \u0939\u0935\u0947 \u0906\u0939\u0947?",
5902
+ sessionExpiredTitle: "\u0924\u0941\u092E\u091A\u0947 \u0938\u0924\u094D\u0930 \u0938\u0902\u092A\u0932\u0947 \u0906\u0939\u0947",
5903
+ sessionExpiredDescription: "\u0938\u0941\u0930\u0942 \u0920\u0947\u0935\u0923\u094D\u092F\u093E\u0938\u093E\u0920\u0940 \u0915\u0943\u092A\u092F\u093E \u092A\u0941\u0928\u094D\u0939\u093E \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u093E.",
5904
+ chooseYourProfile: "\u0924\u0941\u092E\u091A\u0940 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u0928\u093F\u0935\u0921\u093E",
5905
+ loginIdentifierLinkedToMultipleProfiles: "\u0932\u0949\u0917\u093F\u0928 \u0906\u092F\u0921\u0940 \u090F\u0915\u093E\u092A\u0947\u0915\u094D\u0937\u093E \u091C\u093E\u0938\u094D\u0924 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932\u0936\u0940 \u091C\u094B\u0921\u0932\u0947\u0932\u093E \u0906\u0939\u0947. \u0924\u0941\u092E\u094D\u0939\u093E\u0932\u093E \u091C\u0940 \u092A\u093E\u0939\u093E\u092F\u091A\u0940 \u0906\u0939\u0947 \u0924\u0940 \u0928\u093F\u0935\u0921\u093E.",
5906
+ userIdLabel: "\u0935\u093E\u092A\u0930\u0915\u0930\u094D\u0924\u093E \u0906\u092F\u0921\u0940: {{id}}",
5907
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0924 \u0906\u0939\u0947\u2026",
5908
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u092C\u0926\u0932\u093E"
5809
5909
  };
5810
5910
 
5811
5911
  // src/RedactoPrivacyCenter/locales/ne/translation.json
@@ -6219,7 +6319,14 @@ var translation_default15 = {
6219
6319
  submittingAs: "{{email}} \u0915\u094B \u0930\u0942\u092A\u092E\u093E \u092A\u0947\u0936 \u0917\u0930\u094D\u0926\u0948",
6220
6320
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u091B\u093E\u0928\u094D\u0928 \u091F\u094D\u092F\u093E\u092A \u0917\u0930\u094D\u0928\u0941\u0939\u094B\u0938\u094D",
6221
6321
  view: "\u0939\u0947\u0930\u094D\u0928\u0941\u0939\u094B\u0938\u094D",
6222
- whatDoYouNeed: "\u0924\u092A\u093E\u0908\u0902\u0932\u093E\u0908 \u0915\u0947 \u091A\u093E\u0939\u093F\u0928\u094D\u091B?"
6322
+ whatDoYouNeed: "\u0924\u092A\u093E\u0908\u0902\u0932\u093E\u0908 \u0915\u0947 \u091A\u093E\u0939\u093F\u0928\u094D\u091B?",
6323
+ sessionExpiredTitle: "\u0924\u092A\u093E\u0908\u0902\u0915\u094B \u0938\u0924\u094D\u0930 \u0938\u092E\u093E\u092A\u094D\u0924 \u092D\u090F\u0915\u094B \u091B",
6324
+ sessionExpiredDescription: "\u091C\u093E\u0930\u0940 \u0930\u093E\u0916\u094D\u0928 \u0915\u0943\u092A\u092F\u093E \u092B\u0947\u0930\u093F \u0938\u093E\u0907\u0928 \u0907\u0928 \u0917\u0930\u094D\u0928\u0941\u0939\u094B\u0938\u094D\u0964",
6325
+ chooseYourProfile: "\u0906\u092B\u094D\u0928\u094B \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u091B\u093E\u0928\u094D\u0928\u0941\u0939\u094B\u0938\u094D",
6326
+ loginIdentifierLinkedToMultipleProfiles: "\u0932\u0917\u0907\u0928 \u0906\u0908\u0921\u0940 \u090F\u0915\u092D\u0928\u094D\u0926\u093E \u092C\u0922\u0940 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932\u0938\u0901\u0917 \u091C\u094B\u0921\u093F\u090F\u0915\u094B \u091B\u0964 \u0924\u092A\u093E\u0908\u0902\u0932\u0947 \u0939\u0947\u0930\u094D\u0928 \u091A\u093E\u0939\u0928\u0941\u092D\u090F\u0915\u094B \u091B\u093E\u0928\u094D\u0928\u0941\u0939\u094B\u0938\u094D\u0964",
6327
+ userIdLabel: "\u092A\u094D\u0930\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0906\u0908\u0921\u0940: {{id}}",
6328
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0939\u0941\u0901\u0926\u0948\u091B\u2026",
6329
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u092C\u0926\u0932\u094D\u0928\u0941\u0939\u094B\u0938\u094D"
6223
6330
  };
6224
6331
 
6225
6332
  // src/RedactoPrivacyCenter/locales/or/translation.json
@@ -6633,7 +6740,14 @@ var translation_default16 = {
6633
6740
  submittingAs: "{{email}} \u0B2D\u0B3E\u0B2C\u0B47 \u0B26\u0B3E\u0B16\u0B32 \u0B15\u0B30\u0B41\u0B1B\u0B28\u0B4D\u0B24\u0B3F",
6634
6741
  tapToChooseFile: "\u0B2B\u0B3E\u0B07\u0B32 \u0B2C\u0B3E\u0B1B\u0B3F\u0B2C\u0B3E\u0B15\u0B41 \u0B1F\u0B4D\u0B5F\u0B3E\u0B2A \u0B15\u0B30\u0B28\u0B4D\u0B24\u0B41",
6635
6742
  view: "\u0B26\u0B47\u0B16\u0B28\u0B4D\u0B24\u0B41",
6636
- whatDoYouNeed: "\u0B06\u0B2A\u0B23 \u0B15\u0B23 \u0B1A\u0B3E\u0B39\u0B3E\u0B28\u0B4D\u0B24\u0B3F?"
6743
+ whatDoYouNeed: "\u0B06\u0B2A\u0B23 \u0B15\u0B23 \u0B1A\u0B3E\u0B39\u0B3E\u0B28\u0B4D\u0B24\u0B3F?",
6744
+ sessionExpiredTitle: "\u0B06\u0B2A\u0B23\u0B19\u0B4D\u0B15 \u0B38\u0B47\u0B38\u0B28\u0B4D \u0B38\u0B2E\u0B3E\u0B2A\u0B4D\u0B24 \u0B39\u0B4B\u0B07\u0B2F\u0B3E\u0B07\u0B1B\u0B3F",
6745
+ sessionExpiredDescription: "\u0B1C\u0B3E\u0B30\u0B3F \u0B30\u0B16\u0B3F\u0B2C\u0B3E\u0B15\u0B41 \u0B26\u0B5F\u0B3E\u0B15\u0B30\u0B3F \u0B2A\u0B41\u0B28\u0B30\u0B4D\u0B2C\u0B3E\u0B30 \u0B38\u0B3E\u0B07\u0B28\u0B4D \u0B07\u0B28\u0B4D \u0B15\u0B30\u0B28\u0B4D\u0B24\u0B41\u0964",
6746
+ chooseYourProfile: "\u0B06\u0B2A\u0B23\u0B19\u0B4D\u0B15 \u0B2A\u0B4D\u0B30\u0B4B\u0B2B\u0B3E\u0B07\u0B32\u0B4D \u0B2C\u0B3E\u0B1B\u0B28\u0B4D\u0B24\u0B41",
6747
+ loginIdentifierLinkedToMultipleProfiles: "\u0B32\u0B17\u0B07\u0B28\u0B4D \u0B06\u0B07\u0B21\u0B3F \u0B0F\u0B15\u0B3E\u0B27\u0B3F\u0B15 \u0B2A\u0B4D\u0B30\u0B4B\u0B2B\u0B3E\u0B07\u0B32\u0B4D \u0B38\u0B39\u0B3F\u0B24 \u0B2F\u0B4B\u0B21\u0B3C\u0B3E\u0B2F\u0B3E\u0B07\u0B1B\u0B3F\u0964 \u0B06\u0B2A\u0B23 \u0B26\u0B47\u0B16\u0B3F\u0B2C\u0B3E\u0B15\u0B41 \u0B1A\u0B3E\u0B39\u0B41\u0B01\u0B25\u0B3F\u0B2C\u0B3E\u0B1F\u0B3F \u0B2C\u0B3E\u0B1B\u0B28\u0B4D\u0B24\u0B41\u0964",
6748
+ userIdLabel: "\u0B2C\u0B4D\u0B5F\u0B2C\u0B39\u0B3E\u0B30\u0B15\u0B3E\u0B30\u0B40 \u0B06\u0B07\u0B21\u0B3F: {{id}}",
6749
+ signingInEllipsis: "\u0B38\u0B3E\u0B07\u0B28\u0B4D \u0B07\u0B28\u0B4D \u0B39\u0B47\u0B09\u0B1B\u0B3F\u2026",
6750
+ switchProfile: "\u0B2A\u0B4D\u0B30\u0B4B\u0B2B\u0B3E\u0B07\u0B32\u0B4D \u0B2C\u0B26\u0B33\u0B3E\u0B28\u0B4D\u0B24\u0B41"
6637
6751
  };
6638
6752
 
6639
6753
  // src/RedactoPrivacyCenter/locales/pa/translation.json
@@ -7047,7 +7161,14 @@ var translation_default17 = {
7047
7161
  submittingAs: "{{email}} \u0A35\u0A1C\u0A4B\u0A02 \u0A38\u0A2C\u0A2E\u0A3F\u0A1F \u0A15\u0A30 \u0A30\u0A39\u0A47 \u0A39\u0A4B",
7048
7162
  tapToChooseFile: "\u0A2B\u0A3E\u0A08\u0A32 \u0A1A\u0A41\u0A23\u0A28 \u0A32\u0A08 \u0A1F\u0A48\u0A2A \u0A15\u0A30\u0A4B",
7049
7163
  view: "\u0A26\u0A47\u0A16\u0A4B",
7050
- whatDoYouNeed: "\u0A24\u0A41\u0A39\u0A3E\u0A28\u0A42\u0A70 \u0A15\u0A40 \u0A1A\u0A3E\u0A39\u0A40\u0A26\u0A3E \u0A39\u0A48?"
7164
+ whatDoYouNeed: "\u0A24\u0A41\u0A39\u0A3E\u0A28\u0A42\u0A70 \u0A15\u0A40 \u0A1A\u0A3E\u0A39\u0A40\u0A26\u0A3E \u0A39\u0A48?",
7165
+ sessionExpiredTitle: "\u0A24\u0A41\u0A39\u0A3E\u0A21\u0A3E \u0A38\u0A48\u0A38\u0A3C\u0A28 \u0A38\u0A2E\u0A3E\u0A2A\u0A24 \u0A39\u0A4B \u0A17\u0A3F\u0A06 \u0A39\u0A48",
7166
+ sessionExpiredDescription: "\u0A1C\u0A3E\u0A30\u0A40 \u0A30\u0A71\u0A16\u0A23 \u0A32\u0A08 \u0A15\u0A3F\u0A30\u0A2A\u0A3E \u0A15\u0A30\u0A15\u0A47 \u0A26\u0A41\u0A2C\u0A3E\u0A30\u0A3E \u0A38\u0A3E\u0A08\u0A28 \u0A07\u0A28 \u0A15\u0A30\u0A4B\u0964",
7167
+ chooseYourProfile: "\u0A06\u0A2A\u0A23\u0A40 \u0A2A\u0A4D\u0A30\u0A4B\u0A2B\u0A3E\u0A08\u0A32 \u0A1A\u0A41\u0A23\u0A4B",
7168
+ loginIdentifierLinkedToMultipleProfiles: "\u0A32\u0A4C\u0A17\u0A07\u0A28 \u0A06\u0A08\u0A21\u0A40 \u0A07\u0A71\u0A15 \u0A24\u0A4B\u0A02 \u0A35\u0A71\u0A27 \u0A2A\u0A4D\u0A30\u0A4B\u0A2B\u0A3E\u0A08\u0A32\u0A3E\u0A02 \u0A28\u0A3E\u0A32 \u0A1C\u0A41\u0A5C\u0A3F\u0A06 \u0A39\u0A4B\u0A07\u0A06 \u0A39\u0A48\u0964 \u0A1C\u0A4B \u0A24\u0A41\u0A38\u0A40\u0A02 \u0A35\u0A47\u0A16\u0A23\u0A3E \u0A1A\u0A3E\u0A39\u0A41\u0A70\u0A26\u0A47 \u0A39\u0A4B \u0A09\u0A39 \u0A1A\u0A41\u0A23\u0A4B\u0964",
7169
+ userIdLabel: "\u0A09\u0A2A\u0A2F\u0A4B\u0A17\u0A15\u0A30\u0A24\u0A3E \u0A06\u0A08\u0A21\u0A40: {{id}}",
7170
+ signingInEllipsis: "\u0A38\u0A3E\u0A08\u0A28 \u0A07\u0A28 \u0A39\u0A4B \u0A30\u0A3F\u0A39\u0A3E \u0A39\u0A48\u2026",
7171
+ switchProfile: "\u0A2A\u0A4D\u0A30\u0A4B\u0A2B\u0A3E\u0A08\u0A32 \u0A2C\u0A26\u0A32\u0A4B"
7051
7172
  };
7052
7173
 
7053
7174
  // src/RedactoPrivacyCenter/locales/sa/translation.json
@@ -7461,7 +7582,14 @@ var translation_default18 = {
7461
7582
  submittingAs: "{{email}} \u0907\u0924\u093F \u0938\u092E\u0930\u094D\u092A\u092F\u0928\u094D",
7462
7583
  tapToChooseFile: "\u0938\u091E\u094D\u091A\u093F\u0915\u093E\u0902 \u091A\u0947\u0924\u0941\u0902 \u0938\u094D\u092A\u0943\u0936\u0924\u0941",
7463
7584
  view: "\u092A\u0936\u094D\u092F",
7464
- whatDoYouNeed: "\u092D\u0935\u0924\u0903 \u0915\u093F\u092E\u094D \u0906\u0935\u0936\u094D\u092F\u0915\u092E\u094D?"
7585
+ whatDoYouNeed: "\u092D\u0935\u0924\u0903 \u0915\u093F\u092E\u094D \u0906\u0935\u0936\u094D\u092F\u0915\u092E\u094D?",
7586
+ sessionExpiredTitle: "\u092D\u0935\u0924\u0903 \u0938\u0924\u094D\u0930\u0902 \u0938\u092E\u093E\u092A\u094D\u0924\u092E\u094D",
7587
+ sessionExpiredDescription: "\u0905\u0928\u0941\u0935\u0930\u094D\u0924\u0928\u093E\u0930\u094D\u0925\u0902 \u0915\u0943\u092A\u092F\u093E \u092A\u0941\u0928\u0903 \u092A\u094D\u0930\u0935\u0947\u0936\u0902 \u0915\u0930\u094B\u0924\u0941\u0964",
7588
+ chooseYourProfile: "\u0938\u094D\u0935\u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932\u0902 \u091A\u093F\u0928\u094B\u0924\u0941",
7589
+ loginIdentifierLinkedToMultipleProfiles: "\u092A\u094D\u0930\u0935\u0947\u0936-\u0906\u092F\u0921\u0940 \u090F\u0915\u093E\u0927\u093F\u0915\u0948\u0903 \u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932\u0948\u0903 \u0938\u0939 \u0938\u092E\u094D\u092C\u0926\u094D\u0927\u0903 \u0905\u0938\u094D\u0924\u093F\u0964 \u092F\u0924\u094D \u0926\u094D\u0930\u0937\u094D\u091F\u0941\u092E\u094D \u0907\u091A\u094D\u091B\u0924\u093F \u0924\u0924\u094D \u091A\u093F\u0928\u094B\u0924\u0941\u0964",
7590
+ userIdLabel: "\u0909\u092A\u092F\u094B\u0915\u094D\u0924\u0943-\u0906\u092F\u0921\u0940: {{id}}",
7591
+ signingInEllipsis: "\u092A\u094D\u0930\u0935\u0947\u0936\u0903 \u0915\u094D\u0930\u093F\u092F\u0924\u0947\u2026",
7592
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932\u0902 \u092A\u0930\u093F\u0935\u0930\u094D\u0924\u092F\u0924\u0941"
7465
7593
  };
7466
7594
 
7467
7595
  // src/RedactoPrivacyCenter/locales/sat/translation.json
@@ -7875,7 +8003,14 @@ var translation_default19 = {
7875
8003
  submittingAs: "{{email}} \u1C5E\u1C6E\u1C60\u1C5F\u1C5B\u1C6E \u1C61\u1C5A\u1C62\u1C5F \u1C6E\u1C6B\u1C5F",
7876
8004
  tapToChooseFile: "\u1C6F\u1C77\u1C5F\u1C6D\u1C64\u1C5E \u1C75\u1C5F\u1C6A\u1C77\u1C5F\u1C63 \u1C5E\u1C5F\u1C79\u1C5C\u1C64\u1C6B \u1C74\u1C6E\u1C6F \u1C62\u1C6E",
7877
8005
  view: "\u1C67\u1C6E\u1C5E \u1C62\u1C6E",
7878
- whatDoYouNeed: "\u1C5F\u1C62 \u1C6A\u1C6E\u1C6B \u1C5E\u1C5F\u1C79\u1C60\u1C5B\u1C64?"
8006
+ whatDoYouNeed: "\u1C5F\u1C62 \u1C6A\u1C6E\u1C6B \u1C5E\u1C5F\u1C79\u1C60\u1C5B\u1C64?",
8007
+ sessionExpiredTitle: "\u1C5F\u1C62\u1C5F\u1C5C \u1C65\u1C6E\u1C65\u1C5A\u1C71 \u1C62\u1C69\u1C6A\u1C5F\u1C79\u1C6B\u1C6E\u1C71\u1C5F",
8008
+ sessionExpiredDescription: "\u1C5E\u1C5F\u1C66\u1C5F \u1C6A\u1C5F\u1C5E\u1C5F\u1C63 \u1C5E\u1C5F\u1C79\u1C5C\u1C64\u1C6B \u1C6B\u1C5F\u1C6D\u1C5F \u1C60\u1C5F\u1C5B\u1C6E \u1C6B\u1C73\u1C66\u1C72\u1C5F \u1C65\u1C5F\u1C6D\u1C71 \u1C64\u1C71 \u1C62\u1C6E\u1C7E",
8009
+ chooseYourProfile: "\u1C5F\u1C62\u1C5F\u1C5C \u1C6F\u1C68\u1C73\u1C6F\u1C77\u1C5F\u1C6D\u1C64\u1C5E \u1C75\u1C5F\u1C6A\u1C77\u1C5F\u1C63 \u1C62\u1C6E",
8010
+ loginIdentifierLinkedToMultipleProfiles: "\u1C5E\u1C5A\u1C5C\u1C64\u1C71 \u1C5F\u1C6D\u1C70\u1C64 \u1C6B\u1C5A \u1C62\u1C64\u1C6B \u1C60\u1C77\u1C5A\u1C71 \u1C70\u1C77\u1C6E\u1C68 \u1C6F\u1C68\u1C73\u1C6F\u1C77\u1C5F\u1C6D\u1C64\u1C5E \u1C65\u1C5F\u1C76 \u1C61\u1C69\u1C70\u1C5F\u1C79\u1C63 \u1C5F\u1C60\u1C5F\u1C71\u1C5F\u1C7E \u1C5F\u1C62 \u1C67\u1C6E\u1C5E \u1C65\u1C5F\u1C71\u1C5F\u1C62 \u1C5A\u1C71\u1C5F \u1C75\u1C5F\u1C6A\u1C77\u1C5F\u1C63 \u1C62\u1C6E\u1C7E",
8011
+ userIdLabel: "\u1C75\u1C6E\u1C75\u1C77\u1C5F\u1C68\u1C64\u1C6D\u1C5F\u1C79 \u1C5F\u1C6D\u1C70\u1C64: {{id}}",
8012
+ signingInEllipsis: "\u1C65\u1C5F\u1C6D\u1C64\u1C71 \u1C64\u1C71 \u1C6E\u1C6B\u1C5F\u1C6D\u2026",
8013
+ switchProfile: "\u1C6F\u1C68\u1C73\u1C6F\u1C77\u1C5F\u1C6D\u1C64\u1C5E \u1C75\u1C5A\u1C6B\u1C5A\u1C5E \u1C62\u1C6E"
7879
8014
  };
7880
8015
 
7881
8016
  // src/RedactoPrivacyCenter/locales/sd/translation.json
@@ -8289,7 +8424,14 @@ var translation_default20 = {
8289
8424
  submittingAs: "{{email}} \u0637\u0648\u0631 \u062C\u0645\u0639 \u06AA\u0631\u064A \u0631\u0647\u064A\u0627 \u0622\u0647\u064A\u0648",
8290
8425
  tapToChooseFile: "\u0641\u0627\u0626\u0644 \u0686\u0648\u0646\u068A\u06BB \u0644\u0627\u0621\u0650 \u067D\u064A\u067E \u06AA\u0631\u064A\u0648",
8291
8426
  view: "\u068F\u0633\u0648",
8292
- whatDoYouNeed: "\u062A\u0648\u0647\u0627\u0646 \u06A9\u064A \u0687\u0627 \u06AF\u0647\u0631\u062C\u064A\u061F"
8427
+ whatDoYouNeed: "\u062A\u0648\u0647\u0627\u0646 \u06A9\u064A \u0687\u0627 \u06AF\u0647\u0631\u062C\u064A\u061F",
8428
+ sessionExpiredTitle: "\u062A\u0648\u0647\u0627\u0646 \u062C\u0648 \u0633\u064A\u0634\u0646 \u062E\u062A\u0645 \u067F\u064A \u0648\u064A\u0648 \u0622\u0647\u064A",
8429
+ sessionExpiredDescription: "\u062C\u0627\u0631\u064A \u0631\u06A9\u06BB \u0644\u0627\u0621\u0650 \u0645\u0647\u0631\u0628\u0627\u0646\u064A \u06AA\u0631\u064A \u067B\u064A\u0647\u0631 \u0633\u0627\u0626\u0646 \u0627\u0646 \u06AA\u0631\u064A\u0648.",
8430
+ chooseYourProfile: "\u067E\u0646\u0647\u0646\u062C\u0648 \u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u0686\u0648\u0646\u068A\u064A\u0648",
8431
+ loginIdentifierLinkedToMultipleProfiles: "\u0644\u0627\u06AF \u0627\u0646 \u0622\u0626\u064A\u068A\u064A \u0647\u06AA \u06A9\u0627\u0646 \u0648\u068C\u064A\u06AA \u067E\u0631\u0648\u0641\u0627\u0626\u0644\u0646 \u0633\u0627\u0646 \u06B3\u0646\u068D\u064A\u0644 \u0622\u0647\u064A. \u062C\u064A\u06AA\u0648 \u062A\u0648\u0647\u0627\u0646 \u068F\u0633\u06BB \u0686\u0627\u0647\u064A\u0648 \u067F\u0627 \u0627\u0647\u0648 \u0686\u0648\u0646\u068A\u064A\u0648.",
8432
+ userIdLabel: "\u064A\u0648\u0632\u0631 \u0622\u0626\u064A\u068A\u064A: {{id}}",
8433
+ signingInEllipsis: "\u0633\u0627\u0626\u0646 \u0627\u0646 \u067F\u064A \u0631\u0647\u064A\u0648 \u0622\u0647\u064A\u2026",
8434
+ switchProfile: "\u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u062A\u0628\u062F\u064A\u0644 \u06AA\u0631\u064A\u0648"
8293
8435
  };
8294
8436
 
8295
8437
  // src/RedactoPrivacyCenter/locales/ta/translation.json
@@ -8703,7 +8845,14 @@ var translation_default21 = {
8703
8845
  submittingAs: "{{email}} \u0B86\u0B95 \u0B9A\u0BAE\u0BB0\u0BCD\u0BAA\u0BCD\u0BAA\u0BBF\u0B95\u0BCD\u0B95\u0BBF\u0BB1\u0BC0\u0BB0\u0BCD\u0B95\u0BB3\u0BCD",
8704
8846
  tapToChooseFile: "\u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC8\u0BA4\u0BCD \u0BA4\u0BC7\u0BB0\u0BCD\u0BA8\u0BCD\u0BA4\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95 \u0BA4\u0B9F\u0BCD\u0B9F\u0BB5\u0BC1\u0BAE\u0BCD",
8705
8847
  view: "\u0BAA\u0BBE\u0BB0\u0BCD",
8706
- whatDoYouNeed: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA9\u0BCD\u0BA9 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD?"
8848
+ whatDoYouNeed: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA9\u0BCD\u0BA9 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD?",
8849
+ sessionExpiredTitle: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B85\u0BAE\u0BB0\u0BCD\u0BB5\u0BC1 \u0B95\u0BBE\u0BB2\u0BBE\u0BB5\u0BA4\u0BBF\u0BAF\u0BBE\u0B95\u0BBF\u0BB5\u0BBF\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1",
8850
+ sessionExpiredDescription: "\u0BA4\u0BCA\u0B9F\u0BB0\u0BCD\u0BB5\u0BA4\u0BB1\u0BCD\u0B95\u0BC1 \u0BA4\u0BAF\u0BB5\u0BC1\u0B9A\u0BC6\u0BAF\u0BCD\u0BA4\u0BC1 \u0BAE\u0BC0\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD \u0B89\u0BB3\u0BCD\u0BA8\u0BC1\u0BB4\u0BC8\u0BAF\u0BB5\u0BC1\u0BAE\u0BCD.",
8851
+ chooseYourProfile: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BC1\u0BAF\u0BB5\u0BBF\u0BB5\u0BB0\u0BA4\u0BCD\u0BA4\u0BC8\u0BA4\u0BCD \u0BA4\u0BC7\u0BB0\u0BCD\u0BA8\u0BCD\u0BA4\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD",
8852
+ loginIdentifierLinkedToMultipleProfiles: "\u0B89\u0BB3\u0BCD\u0BA8\u0BC1\u0BB4\u0BC8\u0BB5\u0BC1 \u0B90\u0B9F\u0BBF \u0B92\u0BA9\u0BCD\u0BB1\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0BAE\u0BC7\u0BB1\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F \u0B9A\u0BC1\u0BAF\u0BB5\u0BBF\u0BB5\u0BB0\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B9F\u0BA9\u0BCD \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BC1\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1. \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95 \u0BB5\u0BBF\u0BB0\u0BC1\u0BAE\u0BCD\u0BAA\u0BC1\u0BB5\u0BA4\u0BC8\u0BA4\u0BCD \u0BA4\u0BC7\u0BB0\u0BCD\u0BA8\u0BCD\u0BA4\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD.",
8853
+ userIdLabel: "\u0BAA\u0BAF\u0BA9\u0BB0\u0BCD \u0B90\u0B9F\u0BBF: {{id}}",
8854
+ signingInEllipsis: "\u0B89\u0BB3\u0BCD\u0BA8\u0BC1\u0BB4\u0BC8\u0B95\u0BBF\u0BB1\u0BA4\u0BC1\u2026",
8855
+ switchProfile: "\u0B9A\u0BC1\u0BAF\u0BB5\u0BBF\u0BB5\u0BB0\u0BA4\u0BCD\u0BA4\u0BC8 \u0BAE\u0BBE\u0BB1\u0BCD\u0BB1\u0BC1"
8707
8856
  };
8708
8857
 
8709
8858
  // src/RedactoPrivacyCenter/locales/te/translation.json
@@ -9117,7 +9266,14 @@ var translation_default22 = {
9117
9266
  submittingAs: "{{email}} \u0C17\u0C3E \u0C38\u0C2E\u0C30\u0C4D\u0C2A\u0C3F\u0C38\u0C4D\u0C24\u0C41\u0C28\u0C4D\u0C28\u0C3E\u0C30\u0C41",
9118
9267
  tapToChooseFile: "\u0C2B\u0C48\u0C32\u0C4D\u200C\u0C28\u0C41 \u0C0E\u0C02\u0C1A\u0C41\u0C15\u0C4B\u0C35\u0C21\u0C3E\u0C28\u0C3F\u0C15\u0C3F \u0C28\u0C4A\u0C15\u0C4D\u0C15\u0C02\u0C21\u0C3F",
9119
9268
  view: "\u0C35\u0C40\u0C15\u0C4D\u0C37\u0C3F\u0C02\u0C1A\u0C02\u0C21\u0C3F",
9120
- whatDoYouNeed: "\u0C2E\u0C40\u0C15\u0C41 \u0C0F\u0C2E\u0C3F \u0C15\u0C3E\u0C35\u0C3E\u0C32\u0C3F?"
9269
+ whatDoYouNeed: "\u0C2E\u0C40\u0C15\u0C41 \u0C0F\u0C2E\u0C3F \u0C15\u0C3E\u0C35\u0C3E\u0C32\u0C3F?",
9270
+ sessionExpiredTitle: "\u0C2E\u0C40 \u0C38\u0C46\u0C37\u0C28\u0C4D \u0C17\u0C21\u0C41\u0C35\u0C41 \u0C2E\u0C41\u0C17\u0C3F\u0C38\u0C3F\u0C02\u0C26\u0C3F",
9271
+ sessionExpiredDescription: "\u0C15\u0C4A\u0C28\u0C38\u0C3E\u0C17\u0C3F\u0C02\u0C1A\u0C21\u0C3E\u0C28\u0C3F\u0C15\u0C3F \u0C26\u0C2F\u0C1A\u0C47\u0C38\u0C3F \u0C2E\u0C33\u0C4D\u0C32\u0C40 \u0C38\u0C48\u0C28\u0C4D \u0C07\u0C28\u0C4D \u0C1A\u0C47\u0C2F\u0C02\u0C21\u0C3F.",
9272
+ chooseYourProfile: "\u0C2E\u0C40 \u0C2A\u0C4D\u0C30\u0C4A\u0C2B\u0C48\u0C32\u0C4D\u200C\u0C28\u0C41 \u0C0E\u0C02\u0C1A\u0C41\u0C15\u0C4B\u0C02\u0C21\u0C3F",
9273
+ loginIdentifierLinkedToMultipleProfiles: "\u0C32\u0C3E\u0C17\u0C3F\u0C28\u0C4D \u0C10\u0C21\u0C3F \u0C12\u0C15\u0C1F\u0C3F \u0C15\u0C02\u0C1F\u0C47 \u0C0E\u0C15\u0C4D\u0C15\u0C41\u0C35 \u0C2A\u0C4D\u0C30\u0C4A\u0C2B\u0C48\u0C32\u0C4D\u200C\u0C32\u0C24\u0C4B \u0C05\u0C28\u0C41\u0C38\u0C02\u0C27\u0C3E\u0C28\u0C3F\u0C02\u0C1A\u0C2C\u0C21\u0C3F\u0C02\u0C26\u0C3F. \u0C2E\u0C40\u0C30\u0C41 \u0C1A\u0C42\u0C21\u0C3E\u0C32\u0C28\u0C41\u0C15\u0C41\u0C02\u0C1F\u0C41\u0C28\u0C4D\u0C28\u0C26\u0C3E\u0C28\u0C4D\u0C28\u0C3F \u0C0E\u0C02\u0C1A\u0C41\u0C15\u0C4B\u0C02\u0C21\u0C3F.",
9274
+ userIdLabel: "\u0C35\u0C3F\u0C28\u0C3F\u0C2F\u0C4B\u0C17\u0C26\u0C3E\u0C30\u0C41 \u0C10\u0C21\u0C3F: {{id}}",
9275
+ signingInEllipsis: "\u0C38\u0C48\u0C28\u0C4D \u0C07\u0C28\u0C4D \u0C05\u0C35\u0C41\u0C24\u0C4B\u0C02\u0C26\u0C3F\u2026",
9276
+ switchProfile: "\u0C2A\u0C4D\u0C30\u0C4A\u0C2B\u0C48\u0C32\u0C4D\u200C\u0C28\u0C41 \u0C2E\u0C3E\u0C30\u0C4D\u0C1A\u0C02\u0C21\u0C3F"
9121
9277
  };
9122
9278
 
9123
9279
  // src/RedactoPrivacyCenter/locales/ur/translation.json
@@ -9531,7 +9687,14 @@ var translation_default23 = {
9531
9687
  submittingAs: "{{email}} \u06A9\u06D2 \u0637\u0648\u0631 \u067E\u0631 \u062C\u0645\u0639 \u06A9\u0631 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA",
9532
9688
  tapToChooseFile: "\u0641\u0627\u0626\u0644 \u0645\u0646\u062A\u062E\u0628 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0679\u06CC\u067E \u06A9\u0631\u06CC\u06BA",
9533
9689
  view: "\u062F\u06CC\u06A9\u06BE\u06CC\u06BA",
9534
- whatDoYouNeed: "\u0622\u067E \u06A9\u0648 \u06A9\u06CC\u0627 \u0686\u0627\u06C1\u06CC\u06D2\u061F"
9690
+ whatDoYouNeed: "\u0622\u067E \u06A9\u0648 \u06A9\u06CC\u0627 \u0686\u0627\u06C1\u06CC\u06D2\u061F",
9691
+ sessionExpiredTitle: "\u0622\u067E \u06A9\u0627 \u0633\u06CC\u0634\u0646 \u062E\u062A\u0645 \u06C1\u0648 \u06AF\u06CC\u0627 \u06C1\u06D2",
9692
+ sessionExpiredDescription: "\u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0628\u0631\u0627\u06C1 \u06A9\u0631\u0645 \u062F\u0648\u0628\u0627\u0631\u06C1 \u0633\u0627\u0626\u0646 \u0627\u0650\u0646 \u06A9\u0631\u06CC\u06BA\u06D4",
9693
+ chooseYourProfile: "\u0627\u067E\u0646\u06CC \u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u0645\u0646\u062A\u062E\u0628 \u06A9\u0631\u06CC\u06BA",
9694
+ loginIdentifierLinkedToMultipleProfiles: "\u0644\u0627\u06AF \u0627\u0646 \u0622\u0626\u06CC \u0688\u06CC \u0627\u06CC\u06A9 \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1 \u067E\u0631\u0648\u0641\u0627\u0626\u0644\u0632 \u0633\u06D2 \u0645\u0646\u0633\u0644\u06A9 \u06C1\u06D2\u06D4 \u062C\u0633\u06D2 \u0622\u067E \u062F\u06CC\u06A9\u06BE\u0646\u0627 \u0686\u0627\u06C1\u062A\u06D2 \u06C1\u06CC\u06BA \u0627\u0633\u06D2 \u0645\u0646\u062A\u062E\u0628 \u06A9\u0631\u06CC\u06BA\u06D4",
9695
+ userIdLabel: "\u0635\u0627\u0631\u0641 \u0622\u0626\u06CC \u0688\u06CC: {{id}}",
9696
+ signingInEllipsis: "\u0633\u0627\u0626\u0646 \u0627\u0646 \u06C1\u0648 \u0631\u06C1\u0627 \u06C1\u06D2\u2026",
9697
+ switchProfile: "\u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u062A\u0628\u062F\u06CC\u0644 \u06A9\u0631\u06CC\u06BA"
9535
9698
  };
9536
9699
 
9537
9700
  // src/RedactoPrivacyCenter/lib/locales.ts
@@ -9749,7 +9912,54 @@ function useSafeInsets() {
9749
9912
  // src/RedactoPrivacyCenter/context/BaseUrlContext.tsx
9750
9913
  import { createContext, useContext, useMemo } from "react";
9751
9914
 
9915
+ // src/RedactoPrivacyCenter/lib/sandbox.ts
9916
+ var sandboxConfig = null;
9917
+ var setSandboxConfig = (config) => {
9918
+ sandboxConfig = config;
9919
+ };
9920
+ var getSandboxConfig = () => sandboxConfig;
9921
+ var isSandboxMode = () => sandboxConfig !== null;
9922
+ var sandboxAuthHeaders = () => {
9923
+ if (!sandboxConfig) {
9924
+ return null;
9925
+ }
9926
+ return {
9927
+ [SANDBOX_TOKEN_HEADER]: sandboxConfig.token
9928
+ };
9929
+ };
9930
+ var sandboxBodyIdentity = () => {
9931
+ if (!sandboxConfig) {
9932
+ return null;
9933
+ }
9934
+ if (sandboxConfig.ucic) {
9935
+ return { org_user_id: sandboxConfig.ucic };
9936
+ }
9937
+ return sandboxConfig.subject.includes("@") ? { primary_email: sandboxConfig.subject } : { primary_mobile: sandboxConfig.subject };
9938
+ };
9939
+ var sandboxQueryIdentity = () => sandboxBodyIdentity();
9940
+ var sandboxContact = () => sandboxConfig ? sandboxConfig.ucic || sandboxConfig.subject : null;
9941
+
9752
9942
  // src/RedactoPrivacyCenter/api/fetcher.ts
9943
+ var ApiError = class _ApiError extends Error {
9944
+ constructor(message, options = {}) {
9945
+ super(message);
9946
+ this.name = "ApiError";
9947
+ this.status = options.status;
9948
+ this.detail = options.detail;
9949
+ Object.setPrototypeOf(this, _ApiError.prototype);
9950
+ }
9951
+ };
9952
+ var TERMINAL_REFRESH_STATUSES = /* @__PURE__ */ new Set([400, 401, 403, 422]);
9953
+ function isTerminalRefreshError(error) {
9954
+ const e = error;
9955
+ if (!e) return false;
9956
+ if (typeof e.status === "number") {
9957
+ return TERMINAL_REFRESH_STATUSES.has(e.status);
9958
+ }
9959
+ const message = (typeof e.message === "string" ? e.message : "").toLowerCase();
9960
+ if (!message) return false;
9961
+ return message.includes("expired") || message.includes("revoked") || message.includes("not found") || message.includes("already used") || message.includes("invalid refresh token") || message.includes("unauthorized") || message.includes("[401]") || message.includes("[403]");
9962
+ }
9753
9963
  async function apiFetch(url, options = {}) {
9754
9964
  const { getAuthToken, headers = {}, ...fetchOptions } = options;
9755
9965
  const requestHeaders = new Headers();
@@ -9774,11 +9984,18 @@ async function apiFetch(url, options = {}) {
9774
9984
  }
9775
9985
  }
9776
9986
  if (getAuthToken) {
9777
- const token = await getAuthToken();
9778
- if (token) {
9779
- const trimmedToken = token.trim();
9780
- requestHeaders.set("X-Auth-Token", trimmedToken);
9781
- requestHeaders.set("x-auth-token", trimmedToken);
9987
+ const sandboxHeaders = sandboxAuthHeaders();
9988
+ if (sandboxHeaders) {
9989
+ Object.entries(sandboxHeaders).forEach(([key, value]) => {
9990
+ requestHeaders.set(key, value);
9991
+ });
9992
+ } else {
9993
+ const token = await getAuthToken();
9994
+ if (token) {
9995
+ const trimmedToken = token.trim();
9996
+ requestHeaders.set("X-Auth-Token", trimmedToken);
9997
+ requestHeaders.set("x-auth-token", trimmedToken);
9998
+ }
9782
9999
  }
9783
10000
  }
9784
10001
  const fetchOptionsFinal = {
@@ -9807,7 +10024,7 @@ async function apiFetch(url, options = {}) {
9807
10024
  } catch {
9808
10025
  }
9809
10026
  }
9810
- throw new Error(errorMessage);
10027
+ throw new ApiError(errorMessage, { status: response.status });
9811
10028
  }
9812
10029
  const contentLength = response.headers.get("Content-Length");
9813
10030
  const contentType = response.headers.get("Content-Type") || "";
@@ -9869,14 +10086,29 @@ function arrayBufferToBase64(buffer) {
9869
10086
  return result;
9870
10087
  }
9871
10088
  function createConsentClient(baseUrl, ledgerBaseUrl) {
9872
- const useLedger = Boolean(ledgerBaseUrl);
10089
+ const ledgerConfigured = Boolean(ledgerBaseUrl);
10090
+ const useLedger = () => ledgerConfigured && !isSandboxMode();
9873
10091
  const ledgerBase = (ledgerBaseUrl != null ? ledgerBaseUrl : "").replace(/\/$/, "");
9874
10092
  function ledgerUrl(baseRequest, path) {
9875
- if (!useLedger) {
10093
+ if (!useLedger()) {
9876
10094
  throw new Error("ledgerUrl called without a configured ledgerBaseUrl");
9877
10095
  }
9878
10096
  return `${ledgerBase}/public/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}${path}`;
9879
10097
  }
10098
+ function appendSandboxIdentity(queryParams) {
10099
+ const identity = sandboxQueryIdentity();
10100
+ if (identity) {
10101
+ Object.entries(identity).forEach(([key, value]) => {
10102
+ queryParams.append(key, value);
10103
+ });
10104
+ }
10105
+ }
10106
+ function sandboxIdentitySuffix() {
10107
+ const queryParams = new URLSearchParams();
10108
+ appendSandboxIdentity(queryParams);
10109
+ const queryString = queryParams.toString();
10110
+ return queryString ? `?${queryString}` : "";
10111
+ }
9880
10112
  async function privacyCenterApiFetch(url, options) {
9881
10113
  const { authToken, getAuthToken, headers = {}, ...fetchOptions } = options;
9882
10114
  const requestHeaders = new Headers();
@@ -9900,11 +10132,18 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
9900
10132
  );
9901
10133
  }
9902
10134
  }
9903
- const token = authToken || (getAuthToken ? await getAuthToken() : null);
9904
- if (token) {
9905
- const trimmedToken = token.trim();
9906
- const bearerToken = trimmedToken.startsWith("Bearer ") ? trimmedToken : `Bearer ${trimmedToken}`;
9907
- requestHeaders.set("Authorization", bearerToken);
10135
+ const sandboxHeaders = sandboxAuthHeaders();
10136
+ if (sandboxHeaders) {
10137
+ Object.entries(sandboxHeaders).forEach(([key, value]) => {
10138
+ requestHeaders.set(key, value);
10139
+ });
10140
+ } else {
10141
+ const token = authToken || (getAuthToken ? await getAuthToken() : null);
10142
+ if (token) {
10143
+ const trimmedToken = token.trim();
10144
+ const bearerToken = trimmedToken.startsWith("Bearer ") ? trimmedToken : `Bearer ${trimmedToken}`;
10145
+ requestHeaders.set("Authorization", bearerToken);
10146
+ }
9908
10147
  }
9909
10148
  const fetchOptionsFinal = {
9910
10149
  ...fetchOptions,
@@ -9985,18 +10224,20 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
9985
10224
  async createCaseRequest(baseRequest, payload, authToken, options) {
9986
10225
  const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/case`;
9987
10226
  const { useSessionAuth = false, getAuthToken, ...fetchOptions } = options || {};
10227
+ const contact = sandboxContact();
10228
+ const requestPayload = contact && payload && typeof payload === "object" ? { ...payload, contact } : payload;
9988
10229
  if (useSessionAuth) {
9989
10230
  return apiFetch(url, {
9990
10231
  ...fetchOptions,
9991
10232
  method: "POST",
9992
- body: JSON.stringify(payload),
10233
+ body: JSON.stringify(requestPayload),
9993
10234
  getAuthToken
9994
10235
  });
9995
10236
  }
9996
10237
  return privacyCenterApiFetch(url, {
9997
10238
  ...fetchOptions,
9998
10239
  method: "POST",
9999
- body: JSON.stringify(payload),
10240
+ body: JSON.stringify(requestPayload),
10000
10241
  authToken: authToken || baseRequest.authToken
10001
10242
  });
10002
10243
  },
@@ -10077,9 +10318,10 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10077
10318
  if (params.status) queryParams.append("status", params.status);
10078
10319
  if (params.product_uuid) queryParams.append("product_uuid", params.product_uuid);
10079
10320
  if (params.language) queryParams.append("language", params.language);
10321
+ appendSandboxIdentity(queryParams);
10080
10322
  const queryString = queryParams.toString();
10081
10323
  const consentsSuffix = `/user-consents${queryString ? `?${queryString}` : ""}`;
10082
- const url = useLedger ? ledgerUrl(baseRequest, consentsSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${consentsSuffix}`;
10324
+ const url = useLedger() ? ledgerUrl(baseRequest, consentsSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${consentsSuffix}`;
10083
10325
  return privacyCenterApiFetch(url, {
10084
10326
  ...options,
10085
10327
  method: "GET",
@@ -10098,9 +10340,10 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10098
10340
  if (params.search) queryParams.append("search", params.search);
10099
10341
  if (params.language) queryParams.append("language", params.language);
10100
10342
  if (params.nominator_uuid) queryParams.append("nominator_uuid", params.nominator_uuid);
10343
+ appendSandboxIdentity(queryParams);
10101
10344
  const queryString = queryParams.toString();
10102
10345
  const purposesSuffix = `/user-consents/${productUuid}/purposes${queryString ? `?${queryString}` : ""}`;
10103
- const url = useLedger ? ledgerUrl(baseRequest, purposesSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${purposesSuffix}`;
10346
+ const url = useLedger() ? ledgerUrl(baseRequest, purposesSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${purposesSuffix}`;
10104
10347
  return privacyCenterApiFetch(url, {
10105
10348
  ...options,
10106
10349
  method: "GET",
@@ -10121,16 +10364,23 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10121
10364
  * Without a ledger, the legacy Python `/manage-consent?status=` endpoint is
10122
10365
  * used with its `{ purpose_uuid, contact, ... }` payload.
10123
10366
  */
10124
- async manageConsent(baseRequest, purposeId, contact, status, authToken, options, nominatorContact, dataElementUuids, noticeUuid, dataElements) {
10125
- if (!useLedger) {
10367
+ async manageConsent(baseRequest, purposeId, contact, status, authToken, options, nominatorContact, dataElementUuids, noticeUuid, dataElements, language) {
10368
+ if (!useLedger()) {
10126
10369
  const url2 = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/manage-consent?status=${status}`;
10127
- const body2 = { purpose_uuid: purposeId, contact };
10370
+ const sandboxSingleContact = sandboxContact();
10371
+ const body2 = {
10372
+ purpose_uuid: purposeId,
10373
+ contact: sandboxSingleContact != null ? sandboxSingleContact : contact
10374
+ };
10128
10375
  if (nominatorContact) {
10129
10376
  body2.nominator_contact = nominatorContact;
10130
10377
  }
10131
10378
  if (Array.isArray(dataElementUuids) && dataElementUuids.length > 0) {
10132
10379
  body2.data_element_uuids = dataElementUuids;
10133
10380
  }
10381
+ if (language) {
10382
+ body2.language = language;
10383
+ }
10134
10384
  return privacyCenterApiFetch(url2, {
10135
10385
  ...options,
10136
10386
  method: "POST",
@@ -10165,7 +10415,8 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10165
10415
  selected: purposeSelected,
10166
10416
  data_elements: elements
10167
10417
  }
10168
- ]
10418
+ ],
10419
+ ...language ? { language } : {}
10169
10420
  };
10170
10421
  const url = ledgerUrl(baseRequest, "/submit-consent");
10171
10422
  return privacyCenterApiFetch(url, {
@@ -10183,6 +10434,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10183
10434
  if (offset !== void 0) queryParams.append("offset", offset.toString());
10184
10435
  if (limit !== void 0) queryParams.append("limit", limit.toString());
10185
10436
  if (language) queryParams.append("language", language);
10437
+ appendSandboxIdentity(queryParams);
10186
10438
  const queryString = queryParams.toString();
10187
10439
  const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/activities${queryString ? `?${queryString}` : ""}`;
10188
10440
  return privacyCenterApiFetch(url, {
@@ -10190,6 +10442,32 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10190
10442
  authToken: authToken || baseRequest.authToken
10191
10443
  });
10192
10444
  },
10445
+ /**
10446
+ * List all data principals that share this session's contact
10447
+ * (shared-contact profile picker). Identity is derived server-side from the
10448
+ * JWT — the caller sends nothing but its bearer token.
10449
+ */
10450
+ async listIdentities(baseRequest, authToken, options) {
10451
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/identities`;
10452
+ return privacyCenterApiFetch(url, {
10453
+ ...options,
10454
+ authToken: authToken || baseRequest.authToken
10455
+ });
10456
+ },
10457
+ /**
10458
+ * Re-scope the session to a chosen principal uuid (must be one of the
10459
+ * principals sharing this session's contact). Returns fresh access/refresh
10460
+ * tokens scoped to that principal.
10461
+ */
10462
+ async selectPrincipal(baseRequest, principalUuid, authToken, options) {
10463
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/identities/select`;
10464
+ return privacyCenterApiFetch(url, {
10465
+ ...options,
10466
+ method: "POST",
10467
+ body: JSON.stringify({ uuid: principalUuid }),
10468
+ authToken: authToken || baseRequest.authToken
10469
+ });
10470
+ },
10193
10471
  /**
10194
10472
  * Get receipts (privacy center)
10195
10473
  */
@@ -10203,9 +10481,10 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10203
10481
  if (params.created_before) queryParams.append("created_before", params.created_before);
10204
10482
  if (params.notice_uuid) queryParams.append("notice_uuid", params.notice_uuid);
10205
10483
  if (params.language) queryParams.append("language", params.language);
10484
+ appendSandboxIdentity(queryParams);
10206
10485
  const queryString = queryParams.toString();
10207
10486
  const receiptsSuffix = `/receipts${queryString ? `?${queryString}` : ""}`;
10208
- const url = useLedger ? ledgerUrl(baseRequest, receiptsSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${receiptsSuffix}`;
10487
+ const url = useLedger() ? ledgerUrl(baseRequest, receiptsSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${receiptsSuffix}`;
10209
10488
  return privacyCenterApiFetch(url, {
10210
10489
  ...options,
10211
10490
  method: "GET",
@@ -10219,11 +10498,16 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10219
10498
  * the RN UI writes to a temp file to open/share. 404 => not found.
10220
10499
  */
10221
10500
  async getReceiptPdf(baseRequest, receiptUuid, authToken) {
10222
- const url = useLedger ? ledgerUrl(baseRequest, `/receipts/${receiptUuid}/download`) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/receipts/${receiptUuid}/pdf`;
10501
+ const url = useLedger() ? ledgerUrl(baseRequest, `/receipts/${receiptUuid}/download`) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/receipts/${receiptUuid}/pdf`;
10223
10502
  const token = authToken || baseRequest.authToken;
10224
10503
  const requestHeaders = new Headers();
10225
10504
  requestHeaders.set("Accept", "application/pdf");
10226
- if (token) {
10505
+ const sandboxHeaders = sandboxAuthHeaders();
10506
+ if (sandboxHeaders) {
10507
+ Object.entries(sandboxHeaders).forEach(([key, value]) => {
10508
+ requestHeaders.set(key, value);
10509
+ });
10510
+ } else if (token) {
10227
10511
  const trimmedToken = token.trim();
10228
10512
  const bearerToken = trimmedToken.startsWith("Bearer ") ? trimmedToken : `Bearer ${trimmedToken}`;
10229
10513
  requestHeaders.set("Authorization", bearerToken);
@@ -10249,6 +10533,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10249
10533
  if (offset !== void 0) queryParams.append("offset", offset.toString());
10250
10534
  if (limit !== void 0) queryParams.append("limit", limit.toString());
10251
10535
  if (language) queryParams.append("language", language);
10536
+ appendSandboxIdentity(queryParams);
10252
10537
  const queryString = queryParams.toString();
10253
10538
  const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases?${queryString}`;
10254
10539
  return privacyCenterApiFetch(url, {
@@ -10260,7 +10545,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10260
10545
  * Get case messages (privacy center)
10261
10546
  */
10262
10547
  async getCaseMessages(baseRequest, caseUuid, authToken, options) {
10263
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/messages`;
10548
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/messages${sandboxIdentitySuffix()}`;
10264
10549
  return privacyCenterApiFetch(url, {
10265
10550
  ...options,
10266
10551
  authToken: authToken || baseRequest.authToken
@@ -10270,7 +10555,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10270
10555
  * Send a message in a case (privacy center)
10271
10556
  */
10272
10557
  async sendCaseMessage(baseRequest, caseUuid, body, documentUuids, authToken, options) {
10273
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/messages`;
10558
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/messages${sandboxIdentitySuffix()}`;
10274
10559
  return privacyCenterApiFetch(url, {
10275
10560
  ...options,
10276
10561
  method: "POST",
@@ -10282,7 +10567,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10282
10567
  * Upload a document for a case (privacy center)
10283
10568
  */
10284
10569
  async uploadCaseDocument(baseRequest, caseUuid, formData, authToken, options) {
10285
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/upload-document`;
10570
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/upload-document${sandboxIdentitySuffix()}`;
10286
10571
  return privacyCenterApiFetch(url, {
10287
10572
  ...options,
10288
10573
  method: "POST",
@@ -10315,6 +10600,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10315
10600
  if ((params == null ? void 0 : params.limit) !== void 0) queryParams.append("limit", params.limit.toString());
10316
10601
  if (params == null ? void 0 : params.include_summary) queryParams.append("include_summary", "true");
10317
10602
  if (params == null ? void 0 : params.language) queryParams.append("language", params.language);
10603
+ appendSandboxIdentity(queryParams);
10318
10604
  const queryString = queryParams.toString();
10319
10605
  const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${queryString ? `?${queryString}` : ""}`;
10320
10606
  return privacyCenterApiFetch(url, {
@@ -10326,7 +10612,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10326
10612
  * Get notification summary (aggregated counts only)
10327
10613
  */
10328
10614
  async getNotificationSummary(baseRequest, authToken) {
10329
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/summary`;
10615
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/summary${sandboxIdentitySuffix()}`;
10330
10616
  return privacyCenterApiFetch(url, {
10331
10617
  method: "GET",
10332
10618
  authToken: authToken || baseRequest.authToken
@@ -10336,7 +10622,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10336
10622
  * Get unread notification count (lightweight, for the header badge)
10337
10623
  */
10338
10624
  async getUnreadCount(baseRequest, authToken) {
10339
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/unread-count`;
10625
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/unread-count${sandboxIdentitySuffix()}`;
10340
10626
  return privacyCenterApiFetch(url, {
10341
10627
  method: "GET",
10342
10628
  authToken: authToken || baseRequest.authToken
@@ -10346,7 +10632,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10346
10632
  * Mark a single notification as read
10347
10633
  */
10348
10634
  async markNotificationRead(baseRequest, notificationUuid, authToken) {
10349
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${notificationUuid}/read`;
10635
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${notificationUuid}/read${sandboxIdentitySuffix()}`;
10350
10636
  return privacyCenterApiFetch(url, {
10351
10637
  method: "PATCH",
10352
10638
  authToken: authToken || baseRequest.authToken
@@ -10356,7 +10642,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10356
10642
  * Mark all notifications as read
10357
10643
  */
10358
10644
  async markAllNotificationsRead(baseRequest, authToken) {
10359
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/mark-all-read`;
10645
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/mark-all-read${sandboxIdentitySuffix()}`;
10360
10646
  return privacyCenterApiFetch(url, {
10361
10647
  method: "POST",
10362
10648
  authToken: authToken || baseRequest.authToken
@@ -10366,7 +10652,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10366
10652
  * Acknowledge a notification (sets is_read and is_acknowledged to true)
10367
10653
  */
10368
10654
  async acknowledgeNotification(baseRequest, notificationUuid, authToken) {
10369
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${notificationUuid}/acknowledge`;
10655
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${notificationUuid}/acknowledge${sandboxIdentitySuffix()}`;
10370
10656
  return privacyCenterApiFetch(url, {
10371
10657
  method: "POST",
10372
10658
  authToken: authToken || baseRequest.authToken
@@ -10605,7 +10891,8 @@ async function manageConsentServer(params) {
10605
10891
  params.nominatorContact,
10606
10892
  params.dataElementUuids,
10607
10893
  params.noticeUuid,
10608
- params.dataElements
10894
+ params.dataElements,
10895
+ params.language
10609
10896
  );
10610
10897
  if (result && typeof result === "object" && "success" in result) {
10611
10898
  return Boolean(result.success);
@@ -11096,7 +11383,8 @@ var manageConsent = async ({
11096
11383
  nominatorContact,
11097
11384
  dataElementUuids,
11098
11385
  noticeUuid,
11099
- dataElements
11386
+ dataElements,
11387
+ language
11100
11388
  }) => {
11101
11389
  try {
11102
11390
  const accessToken = await ensureValidToken(organizationId, workspaceId, void 0, authContext, consentClient);
@@ -11114,7 +11402,8 @@ var manageConsent = async ({
11114
11402
  nominatorContact,
11115
11403
  dataElementUuids,
11116
11404
  noticeUuid,
11117
- dataElements
11405
+ dataElements,
11406
+ language
11118
11407
  });
11119
11408
  return result;
11120
11409
  } catch (error) {
@@ -11135,7 +11424,8 @@ var manageConsent = async ({
11135
11424
  nominatorContact,
11136
11425
  dataElementUuids,
11137
11426
  noticeUuid,
11138
- dataElements
11427
+ dataElements,
11428
+ language
11139
11429
  });
11140
11430
  }
11141
11431
  console.error(`Error ${action} consent:`, error);
@@ -11474,6 +11764,40 @@ var acknowledgeNotification = async (organizationId, workspaceId, notificationUu
11474
11764
  var isRefreshing = false;
11475
11765
  var refreshPromise = null;
11476
11766
  var TOKEN_EXPIRY_BUFFER_SECONDS = 30;
11767
+ var deadRefreshToken = null;
11768
+ var transientRefreshFailureUntil = 0;
11769
+ var transientRefreshBackoffMs = 0;
11770
+ var MIN_REFRESH_BACKOFF_MS = 3e4;
11771
+ var MAX_REFRESH_BACKOFF_MS = 3e5;
11772
+ var sessionExpiredListener = null;
11773
+ var setSessionExpiredListener = (fn) => {
11774
+ sessionExpiredListener = fn;
11775
+ };
11776
+ var notifySessionExpired = () => {
11777
+ sessionExpiredListener == null ? void 0 : sessionExpiredListener();
11778
+ };
11779
+ var activeRefreshToken = (authContext) => (authContext == null ? void 0 : authContext.refreshToken) || getStoredValue("refresh_token") || null;
11780
+ var isRefreshBlocked = (authContext) => {
11781
+ const active = activeRefreshToken(authContext);
11782
+ if (active !== null && active === deadRefreshToken) return true;
11783
+ return Date.now() < transientRefreshFailureUntil;
11784
+ };
11785
+ var noteTransientRefreshFailure = () => {
11786
+ transientRefreshBackoffMs = Math.min(
11787
+ Math.max(transientRefreshBackoffMs * 2, MIN_REFRESH_BACKOFF_MS),
11788
+ MAX_REFRESH_BACKOFF_MS
11789
+ );
11790
+ transientRefreshFailureUntil = Date.now() + transientRefreshBackoffMs;
11791
+ };
11792
+ var markRefreshTokenDead = (token) => {
11793
+ if (token) deadRefreshToken = token;
11794
+ notifySessionExpired();
11795
+ };
11796
+ var resetRefreshCircuit = () => {
11797
+ deadRefreshToken = null;
11798
+ transientRefreshFailureUntil = 0;
11799
+ transientRefreshBackoffMs = 0;
11800
+ };
11477
11801
  var tokenStore = {};
11478
11802
  var getStoredValue = (key) => {
11479
11803
  var _a3;
@@ -11529,6 +11853,18 @@ var decodeJwtToken = (token) => {
11529
11853
  return null;
11530
11854
  }
11531
11855
  };
11856
+ var resolveContactFromJwt = (decoded) => {
11857
+ if (!decoded) {
11858
+ return null;
11859
+ }
11860
+ const userData = decoded.user_data || {};
11861
+ const candidate = decoded.contact || decoded.primary_email || userData.primary_email || userData.primary_mobile || userData.org_user_id;
11862
+ if (typeof candidate !== "string") {
11863
+ return null;
11864
+ }
11865
+ const contact = candidate.trim();
11866
+ return contact === "" ? null : contact;
11867
+ };
11532
11868
  var isJwtExpired = (token, bufferSeconds = 30) => {
11533
11869
  if (!token || typeof token !== "string") return true;
11534
11870
  try {
@@ -11555,11 +11891,16 @@ var compareEmails = (email1, email2) => {
11555
11891
  return decodeURIComponent(email1.trim()).toLowerCase() === email2.trim().toLowerCase();
11556
11892
  };
11557
11893
  var ensureValidToken = async (organizationId, workspaceId, _slug, authContext, consentClient) => {
11894
+ const sandbox = getSandboxConfig();
11895
+ if (sandbox) {
11896
+ return sandbox.token;
11897
+ }
11558
11898
  const accessToken = (authContext == null ? void 0 : authContext.accessToken) || getStoredValue("access_token");
11559
11899
  if (accessToken && typeof accessToken === "string" && accessToken.trim() !== "" && !isJwtExpired(accessToken, TOKEN_EXPIRY_BUFFER_SECONDS)) {
11560
11900
  return accessToken;
11561
11901
  }
11562
11902
  if (isRefreshing && refreshPromise) return refreshPromise;
11903
+ if (isRefreshBlocked(authContext)) return null;
11563
11904
  isRefreshing = true;
11564
11905
  refreshPromise = performTokenRefresh(
11565
11906
  organizationId,
@@ -11587,6 +11928,7 @@ var performTokenRefresh = async (organizationId, workspaceId, authContext, conse
11587
11928
  if (!refreshToken || typeof refreshToken !== "string" || refreshToken.trim() === "") {
11588
11929
  if (authContext == null ? void 0 : authContext.onError)
11589
11930
  authContext.onError(new Error("No refresh token available"));
11931
+ notifySessionExpired();
11590
11932
  signOutPrivacyCenter();
11591
11933
  return null;
11592
11934
  }
@@ -11616,11 +11958,13 @@ var performTokenRefresh = async (organizationId, workspaceId, authContext, conse
11616
11958
  if (newRefreshToken)
11617
11959
  setStoredValue("refresh_token", newRefreshToken);
11618
11960
  }
11961
+ resetRefreshCircuit();
11619
11962
  return newAccessToken;
11620
11963
  }
11621
11964
  }
11622
11965
  if (authContext == null ? void 0 : authContext.onError)
11623
11966
  authContext.onError(new Error("Refresh token expired or revoked"));
11967
+ markRefreshTokenDead(refreshToken);
11624
11968
  signOutPrivacyCenter();
11625
11969
  return null;
11626
11970
  } catch (error) {
@@ -11628,7 +11972,12 @@ var performTokenRefresh = async (organizationId, workspaceId, authContext, conse
11628
11972
  authContext.onError(
11629
11973
  error instanceof Error ? error : new Error(String(error))
11630
11974
  );
11631
- signOutPrivacyCenter();
11975
+ if (isTerminalRefreshError(error)) {
11976
+ markRefreshTokenDead(refreshToken);
11977
+ signOutPrivacyCenter();
11978
+ } else {
11979
+ noteTransientRefreshFailure();
11980
+ }
11632
11981
  return null;
11633
11982
  }
11634
11983
  };
@@ -11656,6 +12005,23 @@ var formatDateTime = (timestamp) => {
11656
12005
  hours = hours % 12 || 12;
11657
12006
  return `${month} ${day}, ${year} at ${hours}:${minutes} ${ampm}`;
11658
12007
  };
12008
+ var extractCaseRef = (response) => {
12009
+ if (!response || typeof response !== "object") {
12010
+ return null;
12011
+ }
12012
+ const wrapper = response;
12013
+ const candidates = [wrapper.detail, response];
12014
+ for (const candidate of candidates) {
12015
+ if (!candidate || typeof candidate !== "object") {
12016
+ continue;
12017
+ }
12018
+ const { case_id: caseId, uuid } = candidate;
12019
+ if (caseId || uuid) {
12020
+ return { case_id: caseId != null ? caseId : "", uuid: uuid != null ? uuid : "" };
12021
+ }
12022
+ }
12023
+ return null;
12024
+ };
11659
12025
  var generateUuid = () => {
11660
12026
  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
11661
12027
  const r = Math.random() * 16 | 0;
@@ -11675,10 +12041,10 @@ function extractJwtAuthData(token) {
11675
12041
  if (!decoded) {
11676
12042
  return { email: null, organizationId: null, workspaceId: null, organizationName: null };
11677
12043
  }
11678
- const userData = decoded.user_data;
11679
- const userEmail = decoded.contact || decoded.primary_email || decoded.email || decoded.user_uuid || decoded.sub || (userData && typeof userData === "object" ? userData.primary_email || userData.email || userData.contact : null) || null;
12044
+ const contact = resolveContactFromJwt(decoded);
11680
12045
  return {
11681
- email: typeof userEmail === "string" ? userEmail : null,
12046
+ // `resolveContactFromJwt` already returns a trimmed, non-empty string or null.
12047
+ email: contact,
11682
12048
  organizationId: decoded.organisation_uuid || null,
11683
12049
  workspaceId: decoded.workspace_uuid || null,
11684
12050
  organizationName: decoded.organisation_name || null
@@ -11687,20 +12053,82 @@ function extractJwtAuthData(token) {
11687
12053
  function syncJwtDataToStore(token) {
11688
12054
  const authData = extractJwtAuthData(token);
11689
12055
  setStoredValue("access_token", token);
11690
- if (authData.email) setStoredValue("email", authData.email);
12056
+ if (authData.email) {
12057
+ setStoredValue("email", authData.email);
12058
+ } else {
12059
+ removeStoredValue("email");
12060
+ }
11691
12061
  if (authData.organizationId) setStoredValue("pc_org_id", authData.organizationId);
11692
12062
  if (authData.workspaceId) setStoredValue("pc_workspace_id", authData.workspaceId);
11693
12063
  return authData;
11694
12064
  }
11695
- function AuthProvider({ children, accessToken: initialAccessToken, refreshToken: initialRefreshToken, onError }) {
11696
- const initialAuth = extractJwtAuthData(initialAccessToken);
12065
+ function configureSandbox(props) {
12066
+ var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
12067
+ const token = (_a3 = props.token) == null ? void 0 : _a3.trim();
12068
+ if (!token) {
12069
+ setSandboxConfig(null);
12070
+ return null;
12071
+ }
12072
+ const organisationUuid = (_c = (_b = props.organisationUuid) == null ? void 0 : _b.trim()) != null ? _c : "";
12073
+ const workspaceUuid = (_e = (_d = props.workspaceUuid) == null ? void 0 : _d.trim()) != null ? _e : "";
12074
+ const ucic = (_g = (_f = props.sandboxUcic) == null ? void 0 : _f.trim()) != null ? _g : "";
12075
+ const subject = (_i = (_h = props.sandboxSubject) == null ? void 0 : _h.trim()) != null ? _i : "";
12076
+ const slug = (_k = (_j = props.slug) == null ? void 0 : _j.trim()) != null ? _k : "";
12077
+ if (!organisationUuid || !workspaceUuid) {
12078
+ throw new Error("Sandbox mode requires organisationUuid and workspaceUuid props");
12079
+ }
12080
+ if (!ucic && !subject) {
12081
+ throw new Error("Sandbox mode requires a UCIC, email, or mobile");
12082
+ }
12083
+ setSandboxConfig({
12084
+ token,
12085
+ ucic: ucic || void 0,
12086
+ subject,
12087
+ organisationUuid,
12088
+ workspaceUuid,
12089
+ slug
12090
+ });
12091
+ const contact = ucic || subject;
12092
+ setStoredValue("access_token", token);
12093
+ if (organisationUuid) setStoredValue("pc_org_id", organisationUuid);
12094
+ if (workspaceUuid) setStoredValue("pc_workspace_id", workspaceUuid);
12095
+ if (contact) setStoredValue("email", contact);
12096
+ return {
12097
+ email: contact || null,
12098
+ organizationId: organisationUuid || null,
12099
+ workspaceId: workspaceUuid || null,
12100
+ organizationName: null
12101
+ };
12102
+ }
12103
+ function AuthProvider(props) {
12104
+ const {
12105
+ children,
12106
+ accessToken: initialAccessToken,
12107
+ refreshToken: initialRefreshToken,
12108
+ token: sandboxToken,
12109
+ sandboxUcic,
12110
+ sandboxSubject,
12111
+ organisationUuid,
12112
+ workspaceUuid,
12113
+ slug,
12114
+ onError
12115
+ } = props;
12116
+ const [sandboxAuth] = useState(() => configureSandbox(props));
12117
+ const sandboxActive = sandboxAuth !== null;
12118
+ const initialAuth = sandboxAuth != null ? sandboxAuth : extractJwtAuthData(initialAccessToken);
11697
12119
  const [accessToken, setAccessToken] = useState(() => {
12120
+ if (sandboxActive) {
12121
+ return sandboxToken != null ? sandboxToken : "";
12122
+ }
11698
12123
  if (initialAccessToken && initialAccessToken.trim() !== "") {
11699
12124
  syncJwtDataToStore(initialAccessToken);
11700
12125
  }
11701
12126
  return initialAccessToken;
11702
12127
  });
11703
12128
  const [refreshToken, setRefreshToken] = useState(() => {
12129
+ if (sandboxActive) {
12130
+ return "";
12131
+ }
11704
12132
  if (initialRefreshToken && initialRefreshToken.trim() !== "") {
11705
12133
  setStoredValue("refresh_token", initialRefreshToken);
11706
12134
  }
@@ -11711,6 +12139,20 @@ function AuthProvider({ children, accessToken: initialAccessToken, refreshToken:
11711
12139
  const [workspaceId, setWorkspaceId] = useState(initialAuth.workspaceId);
11712
12140
  const [organizationName, setOrganizationName] = useState(initialAuth.organizationName);
11713
12141
  useEffect(() => {
12142
+ if (!sandboxActive) {
12143
+ return;
12144
+ }
12145
+ const seeded = configureSandbox(props);
12146
+ if (seeded) {
12147
+ setEmail(seeded.email);
12148
+ setOrganizationId(seeded.organizationId);
12149
+ setWorkspaceId(seeded.workspaceId);
12150
+ setOrganizationName(seeded.organizationName);
12151
+ }
12152
+ return () => setSandboxConfig(null);
12153
+ }, [sandboxActive, sandboxToken, sandboxUcic, sandboxSubject, organisationUuid, workspaceUuid, slug]);
12154
+ useEffect(() => {
12155
+ if (sandboxActive) return;
11714
12156
  if (accessToken) {
11715
12157
  const authData = syncJwtDataToStore(accessToken);
11716
12158
  setEmail(authData.email);
@@ -11718,11 +12160,13 @@ function AuthProvider({ children, accessToken: initialAccessToken, refreshToken:
11718
12160
  setWorkspaceId(authData.workspaceId);
11719
12161
  setOrganizationName(authData.organizationName);
11720
12162
  }
11721
- }, [accessToken]);
12163
+ }, [accessToken, sandboxActive]);
11722
12164
  useEffect(() => {
12165
+ if (sandboxActive) return;
11723
12166
  if (refreshToken) setStoredValue("refresh_token", refreshToken);
11724
- }, [refreshToken]);
12167
+ }, [refreshToken, sandboxActive]);
11725
12168
  useEffect(() => {
12169
+ if (sandboxActive) return;
11726
12170
  setAccessToken(initialAccessToken);
11727
12171
  if (initialAccessToken && initialAccessToken.trim() !== "") {
11728
12172
  const authData = syncJwtDataToStore(initialAccessToken);
@@ -11731,10 +12175,11 @@ function AuthProvider({ children, accessToken: initialAccessToken, refreshToken:
11731
12175
  setWorkspaceId(authData.workspaceId);
11732
12176
  setOrganizationName(authData.organizationName);
11733
12177
  }
11734
- }, [initialAccessToken]);
12178
+ }, [initialAccessToken, sandboxActive]);
11735
12179
  useEffect(() => {
12180
+ if (sandboxActive) return;
11736
12181
  setRefreshToken(initialRefreshToken);
11737
- }, [initialRefreshToken]);
12182
+ }, [initialRefreshToken, sandboxActive]);
11738
12183
  const updateTokens = useCallback((newAccessToken, newRefreshToken) => {
11739
12184
  setAccessToken(newAccessToken);
11740
12185
  if (newRefreshToken) setRefreshToken(newRefreshToken);
@@ -11991,8 +12436,17 @@ function DataAvailabilityProvider({ children }) {
11991
12436
  mountedRef.current = false;
11992
12437
  };
11993
12438
  }, []);
12439
+ useEffect3(() => {
12440
+ setSessionExpiredListener(() => {
12441
+ if (!mountedRef.current) return;
12442
+ runIdRef.current += 1;
12443
+ setStatus("session-expired");
12444
+ });
12445
+ return () => setSessionExpiredListener(null);
12446
+ }, []);
11994
12447
  const runCheck = useCallback4(async () => {
11995
12448
  if (!organizationId || !workspaceId) return;
12449
+ if (isRefreshBlocked(authContext)) return;
11996
12450
  const runId = ++runIdRef.current;
11997
12451
  setStatus("checking");
11998
12452
  const contact = email;
@@ -14129,7 +14583,7 @@ import { useTranslation as useTranslation10 } from "react-i18next";
14129
14583
 
14130
14584
  // src/RedactoPrivacyCenter/lib/consentManagerUtils.ts
14131
14585
  function purposeItemToUserConsent(purpose, group) {
14132
- var _a3, _b, _c, _d;
14586
+ var _a3, _b, _c, _d, _e;
14133
14587
  return {
14134
14588
  purpose_uuid: purpose.purpose_uuid,
14135
14589
  purpose: purpose.name,
@@ -14142,7 +14596,9 @@ function purposeItemToUserConsent(purpose, group) {
14142
14596
  product_uuid: group.product_uuid,
14143
14597
  product_name: group.product_name,
14144
14598
  product_description: group.product_description,
14145
- nominator_info: (_d = group.nominator) != null ? _d : void 0
14599
+ nominator_info: (_d = group.nominator) != null ? _d : void 0,
14600
+ revoke_warning_message: (_e = purpose.revoke_warning_message) != null ? _e : null,
14601
+ notice_uuid: purpose.notice_uuid
14146
14602
  };
14147
14603
  }
14148
14604
  function getDisplayProductGroups(detail, tab) {
@@ -14221,31 +14677,6 @@ var ConsentStatusEnum = /* @__PURE__ */ ((ConsentStatusEnum2) => {
14221
14677
  })(ConsentStatusEnum || {});
14222
14678
 
14223
14679
  // src/RedactoPrivacyCenter/lib/constants.ts
14224
- var languageOptions = [
14225
- { value: "en", label: "English" },
14226
- { value: "hi", label: "\u0939\u093F\u0928\u094D\u0926\u0940 (Hindi)" },
14227
- { value: "te", label: "\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41 (Telugu)" },
14228
- { value: "mr", label: "\u092E\u0930\u093E\u0920\u0940 (Marathi)" },
14229
- { value: "ta", label: "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD (Tamil)" },
14230
- { value: "ur", label: "\u0627\u0631\u062F\u0648 (Urdu)" },
14231
- { value: "gu", label: "\u0A97\u0AC1\u0A9C\u0AB0\u0ABE\u0AA4\u0AC0 (Gujarati)" },
14232
- { value: "kn", label: "\u0C95\u0CA8\u0CCD\u0CA8\u0CA1 (Kannada)" },
14233
- { value: "ml", label: "\u0D2E\u0D32\u0D2F\u0D3E\u0D33\u0D02 (Malayalam)" },
14234
- { value: "pa", label: "\u0A2A\u0A70\u0A1C\u0A3E\u0A2C\u0A40 (Punjabi)" },
14235
- { value: "or", label: "\u0B13\u0B21\u0B3C\u0B3F\u0B06 (Odia)" },
14236
- { value: "as", label: "\u0985\u09B8\u09AE\u09C0\u09AF\u09BC\u09BE (Assamese)" },
14237
- { value: "bn", label: "\u09AC\u09BE\u0982\u09B2\u09BE (Bengali)" },
14238
- { value: "mai", label: "\u092E\u0948\u0925\u093F\u0932\u0940 (Maithili)" },
14239
- { value: "ne", label: "\u0928\u0947\u092A\u093E\u0932\u0940 (Nepali)" },
14240
- { value: "sd", label: "\u0633\u0646\u068C\u064A (Sindhi)" },
14241
- { value: "doi", label: "\u0921\u094B\u0917\u0930\u0940 (Dogri)" },
14242
- { value: "mni-Mtei", label: "\uABC3\uABE9\uABC7\uABE9\uABC2\uABE3\uABDF (Manipuri)" },
14243
- { value: "gom", label: "\u0915\u094B\u0902\u0915\u0923\u0940 (Goan Konkani)" },
14244
- { value: "sa", label: "\u0938\u0902\u0938\u094D\u0915\u0943\u0924\u092E\u094D (Sanskrit)" },
14245
- { value: "brx", label: "\u092C\u0921\u093C\u094B (Bodo)" },
14246
- { value: "ks", label: "\u0643\u0672\u0634\u064F\u0631 (Kashmiri)" },
14247
- { value: "sat", label: "\u1C65\u1C5F\u1C71\u1C5B\u1C5F\u1C72\u1C64 (Santali)" }
14248
- ];
14249
14680
  var PAGE_CHROME_BY_PAGE = {
14250
14681
  home: {
14251
14682
  titleKey: "privacyCenter",
@@ -14323,8 +14754,14 @@ var useTimePeriodOptions = () => {
14323
14754
  );
14324
14755
  };
14325
14756
  var MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL = 3;
14757
+ var PRODUCT_SCOPED_REQUEST_TYPES = [
14758
+ "ACCESS" /* ACCESS */,
14759
+ "erasure" /* ERASURE */,
14760
+ "CORRECTION" /* CORRECTION */
14761
+ ];
14326
14762
  var SEARCH_DEBOUNCE_DELAY = 500;
14327
14763
  var FORM_PICKER_GROUP_LIMIT = 100;
14764
+ var LEGACY_PRODUCT_GROUP_UUID = "__legacy_flat_purposes__";
14328
14765
  var POLL_INTERVAL = 3e4;
14329
14766
  var NOTIFICATION_PAGE_SIZE = 10;
14330
14767
  var TAB_TO_CATEGORY = {
@@ -14433,7 +14870,7 @@ var ModifyConsentModal = ({
14433
14870
  action: "revoke",
14434
14871
  buttonLabel: t("revokeConsent"),
14435
14872
  buttonColor: colors.error,
14436
- warningMessage: t("revokeConsentWarning"),
14873
+ warningMessage: selectedRecord.revoke_warning_message || t("revokeConsentWarning"),
14437
14874
  description: nominatorLabel ? t("aboutToModifyConsentOnBehalf", { nominator: nominatorLabel }) : t("aboutToModifyConsent")
14438
14875
  };
14439
14876
  }
@@ -15104,7 +15541,8 @@ function ConsentManager() {
15104
15541
  dataElements: (_b = selectedRecord == null ? void 0 : selectedRecord.data_elements) == null ? void 0 : _b.map((de) => ({
15105
15542
  uuid: de.uuid,
15106
15543
  selected: de.selected
15107
- }))
15544
+ })),
15545
+ language: langParam
15108
15546
  });
15109
15547
  setIsModalOpen(false);
15110
15548
  setSelectedRecord(null);
@@ -15116,7 +15554,7 @@ function ConsentManager() {
15116
15554
  setIsManageLoading(false);
15117
15555
  }
15118
15556
  },
15119
- [organizationId, workspaceId, email, authContext, consentClient, selectedRecord, fetchData, t]
15557
+ [organizationId, workspaceId, email, authContext, consentClient, selectedRecord, langParam, fetchData, t]
15120
15558
  );
15121
15559
  const handleExport = useCallback6(async () => {
15122
15560
  if (!consentData.length) return;
@@ -15479,6 +15917,7 @@ function ActivitiesList() {
15479
15917
  () => ({ accessToken, refreshToken, onError, updateTokens }),
15480
15918
  [accessToken, refreshToken, onError, updateTokens]
15481
15919
  );
15920
+ const { langParam } = useCurrentLanguage();
15482
15921
  const [activities, setActivities] = useState14([]);
15483
15922
  const [totalCount, setTotalCount] = useState14(0);
15484
15923
  const [isLoading, setIsLoading] = useState14(true);
@@ -15490,7 +15929,7 @@ function ActivitiesList() {
15490
15929
  var _a3, _b, _c;
15491
15930
  if (!organizationId || !workspaceId) return;
15492
15931
  try {
15493
- const response = await fetchActivities(organizationId, workspaceId, nextOffset, PAGE_SIZE, authContext, consentClient);
15932
+ const response = await fetchActivities(organizationId, workspaceId, nextOffset, PAGE_SIZE, authContext, consentClient, langParam);
15494
15933
  if (!response) return;
15495
15934
  const rows = (_a3 = response.data) != null ? _a3 : [];
15496
15935
  setActivities((prev) => append ? [...prev, ...rows] : rows);
@@ -15501,7 +15940,7 @@ function ActivitiesList() {
15501
15940
  if (!append) setActivities([]);
15502
15941
  }
15503
15942
  },
15504
- [organizationId, workspaceId, authContext, consentClient]
15943
+ [organizationId, workspaceId, authContext, consentClient, langParam]
15505
15944
  );
15506
15945
  useEffect12(() => {
15507
15946
  setIsLoading(true);
@@ -15640,10 +16079,10 @@ import { useTranslation as useTranslation13 } from "react-i18next";
15640
16079
  // src/RedactoPrivacyCenter/lib/dateGroup.ts
15641
16080
  import { useCallback as useCallback8 } from "react";
15642
16081
  import { useTranslation as useTranslation12 } from "react-i18next";
15643
- function monthKey(ts) {
16082
+ function monthKey(ts, locale) {
15644
16083
  if (!ts) return "";
15645
16084
  try {
15646
- return new Date(ts).toLocaleDateString(void 0, { month: "long", year: "numeric" });
16085
+ return new Date(ts).toLocaleDateString(locale || void 0, { month: "long", year: "numeric" });
15647
16086
  } catch {
15648
16087
  return "";
15649
16088
  }
@@ -15719,7 +16158,7 @@ function groupByTime(items, getTs, classify) {
15719
16158
  );
15720
16159
  }
15721
16160
  function useRelativeDate() {
15722
- const { t } = useTranslation12();
16161
+ const { t, i18n: i18n2 } = useTranslation12();
15723
16162
  return useCallback8(
15724
16163
  (ts) => {
15725
16164
  if (!ts) return "";
@@ -15732,7 +16171,7 @@ function useRelativeDate() {
15732
16171
  if (dayDiff <= 0) return t("today", { defaultValue: "Today" });
15733
16172
  if (dayDiff === 1) return t("yesterday", { defaultValue: "Yesterday" });
15734
16173
  if (dayDiff < 7) return t("daysAgo", { count: dayDiff, defaultValue: "{{count}} days ago" });
15735
- return d.toLocaleDateString(void 0, {
16174
+ return d.toLocaleDateString(i18n2.language || void 0, {
15736
16175
  month: "short",
15737
16176
  day: "numeric",
15738
16177
  ...d.getFullYear() !== now.getFullYear() ? { year: "numeric" } : {}
@@ -15741,10 +16180,28 @@ function useRelativeDate() {
15741
16180
  return ts;
15742
16181
  }
15743
16182
  },
15744
- [t]
16183
+ [t, i18n2.language]
15745
16184
  );
15746
16185
  }
15747
16186
 
16187
+ // src/RedactoPrivacyCenter/lib/receiptEvent.ts
16188
+ function eventLabelKey(eventType) {
16189
+ const v = String(eventType || "").toUpperCase();
16190
+ if (v.includes("GRANT")) {
16191
+ return "consentGranted";
16192
+ }
16193
+ if (v.includes("WITHDRAW") || v.includes("REVOK")) {
16194
+ return "consentRevoked";
16195
+ }
16196
+ if (v.includes("DECLIN")) {
16197
+ return "consentDeclined";
16198
+ }
16199
+ if (v.includes("EXPIR")) {
16200
+ return "consentExpired";
16201
+ }
16202
+ return void 0;
16203
+ }
16204
+
15748
16205
  // src/RedactoPrivacyCenter/components/ReceiptsList.tsx
15749
16206
  import { Fragment as Fragment7, jsx as jsx41, jsxs as jsxs25 } from "react/jsx-runtime";
15750
16207
  var PAGE_SIZE2 = 10;
@@ -15780,11 +16237,10 @@ function receiptBadgeStatus(eventType) {
15780
16237
  if (v.includes("EXPIR")) return "warning";
15781
16238
  return "secondary";
15782
16239
  }
15783
- var ReceiptRow = React15.memo(({ item, colors, downloading, onDownload, downloadLabel, dateLabel }) => {
16240
+ var ReceiptRow = React15.memo(({ item, colors, downloading, onDownload, downloadLabel, dateLabel, eventLabel }) => {
15784
16241
  const product = item.product_name_display || item.product_name || "";
15785
- const event = item.event_type_display || item.event_type || "";
15786
- const primary = product || event || "-";
15787
- const badgeLabel = event || "-";
16242
+ const primary = product || eventLabel || "-";
16243
+ const badgeLabel = eventLabel || "-";
15788
16244
  return /* @__PURE__ */ jsxs25(View30, { style: styles31.row, children: [
15789
16245
  /* @__PURE__ */ jsx41(NameAvatar, { name: primary, seed: item.uuid || primary, size: "sm" }),
15790
16246
  /* @__PURE__ */ jsxs25(View30, { style: styles31.body, children: [
@@ -15811,7 +16267,7 @@ var ReceiptRow = React15.memo(({ item, colors, downloading, onDownload, download
15811
16267
  });
15812
16268
  ReceiptRow.displayName = "ReceiptRow";
15813
16269
  function ReceiptsList() {
15814
- const { t } = useTranslation13();
16270
+ const { t, i18n: i18n2 } = useTranslation13();
15815
16271
  const { accessToken, refreshToken, organizationId, workspaceId, updateTokens, onError } = useAuth();
15816
16272
  const { consentClient } = useBaseUrl();
15817
16273
  const { colors } = useTheme();
@@ -15896,14 +16352,18 @@ function ReceiptsList() {
15896
16352
  const sections = useMemo13(() => {
15897
16353
  const map = /* @__PURE__ */ new Map();
15898
16354
  for (const r of receipts) {
15899
- const key = monthKey(r.created_at);
16355
+ const key = monthKey(r.created_at, i18n2.language);
15900
16356
  const arr = map.get(key);
15901
16357
  if (arr) arr.push(r);
15902
16358
  else map.set(key, [r]);
15903
16359
  }
15904
16360
  return Array.from(map, ([title, data]) => ({ title, data }));
15905
- }, [receipts]);
16361
+ }, [receipts, i18n2.language]);
15906
16362
  const downloadLabel = t("download") || "Download";
16363
+ const eventLabelFor = (r) => {
16364
+ const key = eventLabelKey(r.event_type);
16365
+ return key ? t(key) : r.event_type_display || r.event_type || "-";
16366
+ };
15907
16367
  const handleScroll = useCallback9(
15908
16368
  (e) => {
15909
16369
  const { layoutMeasurement, contentOffset, contentSize } = e.nativeEvent;
@@ -15985,7 +16445,8 @@ function ReceiptsList() {
15985
16445
  downloading: downloadingUuid === item.uuid,
15986
16446
  onDownload: handleDownload,
15987
16447
  downloadLabel,
15988
- dateLabel: relativeLabel(item.created_at)
16448
+ dateLabel: relativeLabel(item.created_at),
16449
+ eventLabel: eventLabelFor(item)
15989
16450
  }
15990
16451
  )
15991
16452
  ] }, `${item.uuid || item.created_at}-${index}`)) }, section2.title)),
@@ -16141,6 +16602,25 @@ var uploadFileWithS2S = async ({
16141
16602
  }
16142
16603
  };
16143
16604
 
16605
+ // src/RedactoPrivacyCenter/lib/requestType.ts
16606
+ var isRequestType = (requestType, expected) => typeof requestType === "string" && requestType.toLowerCase() === expected.toLowerCase();
16607
+ var isProductScopedRequestType = (requestType) => PRODUCT_SCOPED_REQUEST_TYPES.some((type) => isRequestType(requestType, type));
16608
+
16609
+ // src/RedactoPrivacyCenter/lib/erasureConsent.ts
16610
+ var isErasureRequestType = (requestType) => isRequestType(requestType, "erasure" /* ERASURE */);
16611
+ var resolveErasurePurposeNames = (purposeNames, fallback) => {
16612
+ if (purposeNames.length === 0 || purposeNames.length > MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL) {
16613
+ return fallback;
16614
+ }
16615
+ return purposeNames.join(", ");
16616
+ };
16617
+ var erasureConsentPayload = (requestType, revokeConsentOnFulfilment) => {
16618
+ if (!isErasureRequestType(requestType)) {
16619
+ return {};
16620
+ }
16621
+ return { revoke_consent_on_fulfilment: revokeConsentOnFulfilment };
16622
+ };
16623
+
16144
16624
  // src/RedactoPrivacyCenter/lib/filePicker.ts
16145
16625
  import { Alert as Alert4 } from "react-native";
16146
16626
  async function pickFile() {
@@ -16315,19 +16795,32 @@ var consentGroupToFormProductGroup = (group) => {
16315
16795
  };
16316
16796
  };
16317
16797
  var purposeItemToFormPurpose = (purpose) => {
16318
- var _a3, _b;
16798
+ var _a3, _b, _c, _d, _e, _f;
16319
16799
  return {
16320
- uuid: purpose.purpose_uuid,
16321
- purpose_uuid: purpose.purpose_uuid,
16800
+ // The ledger keys purposes as `purpose_uuid`; the legacy Python
16801
+ // user-consents payload keys some of them as `uuid`. Accept either so the
16802
+ // picker and the submitted `purpose_uuid` resolve on both backends.
16803
+ uuid: (_b = (_a3 = purpose.purpose_uuid) != null ? _a3 : purpose.uuid) != null ? _b : "",
16804
+ purpose_uuid: (_d = (_c = purpose.purpose_uuid) != null ? _c : purpose.uuid) != null ? _d : "",
16322
16805
  name: purpose.name,
16323
- description: (_a3 = purpose.description) != null ? _a3 : "",
16806
+ description: (_e = purpose.description) != null ? _e : "",
16324
16807
  industries: "",
16325
16808
  selected: false,
16326
16809
  given_consent: false,
16327
16810
  status: purpose.status,
16328
16811
  validity: null,
16329
16812
  enabled: true,
16330
- data_elements: ((_b = purpose.data_elements) != null ? _b : []).map(consentDataElementToFormDataElement)
16813
+ data_elements: ((_f = purpose.data_elements) != null ? _f : []).map(consentDataElementToFormDataElement)
16814
+ };
16815
+ };
16816
+ var legacyFlatGroup = (form, label) => {
16817
+ var _a3;
16818
+ return {
16819
+ product_uuid: LEGACY_PRODUCT_GROUP_UUID,
16820
+ product_name: label,
16821
+ product_description: null,
16822
+ nominator: null,
16823
+ purposes: ((_a3 = form.purposes) != null ? _a3 : []).map((wrapper) => wrapper == null ? void 0 : wrapper.purpose).filter((purpose) => Boolean(purpose))
16331
16824
  };
16332
16825
  };
16333
16826
  var consentDataElementToFormDataElement = (element) => ({
@@ -16364,16 +16857,10 @@ var buildGroupDataElements = (group) => {
16364
16857
  // src/RedactoPrivacyCenter/components/Form.tsx
16365
16858
  import { Fragment as Fragment9, jsx as jsx43, jsxs as jsxs27 } from "react/jsx-runtime";
16366
16859
  var TOTAL_STEPS = 3;
16367
- var PRODUCT_SCOPED_REQUEST_TYPES = /* @__PURE__ */ new Set([
16368
- "ACCESS" /* ACCESS */,
16369
- "erasure" /* ERASURE */,
16370
- "CORRECTION" /* CORRECTION */
16371
- ]);
16372
- var isProductScopedRequestType = (rt) => PRODUCT_SCOPED_REQUEST_TYPES.has(rt);
16373
16860
  function Form({ onCreateRequest }) {
16374
16861
  const { t } = useTranslation15();
16375
16862
  const { accessToken, refreshToken, email, organizationId, workspaceId, updateTokens, onError } = useAuth();
16376
- const { consentClient, baseUrl, ledgerBaseUrl } = useBaseUrl();
16863
+ const { consentClient, baseUrl } = useBaseUrl();
16377
16864
  const { colors } = useTheme();
16378
16865
  const requestTypeLabels = useRequestTypeLabels();
16379
16866
  const timePeriodOptions = useTimePeriodOptions();
@@ -16410,10 +16897,10 @@ function Form({ onCreateRequest }) {
16410
16897
  });
16411
16898
  const [uploadedDocs, setUploadedDocs] = useState16([]);
16412
16899
  const [isUploading, setIsUploading] = useState16(false);
16413
- const withLedgerPickerGroups = useCallback10(
16900
+ const withUserConsentPickerGroups = useCallback10(
16414
16901
  async (form, language) => {
16415
16902
  var _a3, _b;
16416
- if (!ledgerBaseUrl || !organizationId || !workspaceId) {
16903
+ if (!organizationId || !workspaceId) {
16417
16904
  return form;
16418
16905
  }
16419
16906
  const consents = await fetchUserConsents({
@@ -16428,16 +16915,18 @@ function Form({ onCreateRequest }) {
16428
16915
  authContext,
16429
16916
  consentClient
16430
16917
  });
16431
- if (!consents) {
16918
+ const direct = (_a3 = consents == null ? void 0 : consents.direct) != null ? _a3 : [];
16919
+ const nominated = (_b = consents == null ? void 0 : consents.nominated) != null ? _b : [];
16920
+ if (direct.length === 0 && nominated.length === 0) {
16432
16921
  return form;
16433
16922
  }
16434
16923
  return {
16435
16924
  ...form,
16436
- direct_groups: ((_a3 = consents.direct) != null ? _a3 : []).map(consentGroupToFormProductGroup),
16437
- nominated_groups: ((_b = consents.nominated) != null ? _b : []).map(consentGroupToFormProductGroup)
16925
+ direct_groups: direct.map(consentGroupToFormProductGroup),
16926
+ nominated_groups: nominated.map(consentGroupToFormProductGroup)
16438
16927
  };
16439
16928
  },
16440
- [ledgerBaseUrl, organizationId, workspaceId, authContext, consentClient]
16929
+ [organizationId, workspaceId, authContext, consentClient]
16441
16930
  );
16442
16931
  useEffect14(() => {
16443
16932
  if (!organizationId || !workspaceId || !contact) return;
@@ -16445,7 +16934,7 @@ function Form({ onCreateRequest }) {
16445
16934
  setIsLoading(true);
16446
16935
  getFormData(organizationId, workspaceId, contact, false, false, authContext, consentClient, langParam).then(async (data) => {
16447
16936
  if (!data) return;
16448
- const withGroups = await withLedgerPickerGroups(data, langParam);
16937
+ const withGroups = await withUserConsentPickerGroups(data, langParam);
16449
16938
  if (!isCancelled) setFormDataResponse(withGroups);
16450
16939
  }).catch((error) => {
16451
16940
  console.warn("Error fetching form data:", error);
@@ -16462,16 +16951,24 @@ function Form({ onCreateRequest }) {
16462
16951
  authContext,
16463
16952
  consentClient,
16464
16953
  langParam,
16465
- withLedgerPickerGroups
16954
+ withUserConsentPickerGroups
16466
16955
  ]);
16467
16956
  const allGroups = useMemo14(() => {
16468
16957
  var _a3, _b;
16469
16958
  if (!formDataResponse) return [];
16470
- return [
16959
+ const groups = [
16471
16960
  ...(_a3 = formDataResponse.direct_groups) != null ? _a3 : [],
16472
16961
  ...(_b = formDataResponse.nominated_groups) != null ? _b : []
16473
16962
  ];
16474
- }, [formDataResponse]);
16963
+ if (groups.length > 0) {
16964
+ return groups;
16965
+ }
16966
+ const flatGroup = legacyFlatGroup(formDataResponse, t("yourData"));
16967
+ if (buildGroupPurposes(flatGroup).length === 0) {
16968
+ return [];
16969
+ }
16970
+ return [flatGroup];
16971
+ }, [formDataResponse, t]);
16475
16972
  const skipProductStep = allGroups.length === 1;
16476
16973
  const selectedGroup = useMemo14(() => {
16477
16974
  var _a3, _b;
@@ -16503,7 +17000,7 @@ function Form({ onCreateRequest }) {
16503
17000
  setSelectedProductKey(null);
16504
17001
  }
16505
17002
  setNominationData({ nominee_email: "", nominee_mobile: "" });
16506
- if (requestType === "grievance" /* GRIEVANCE */ && grievanceOptions.length > 0) {
17003
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */) && grievanceOptions.length > 0) {
16507
17004
  const resetGrievances = grievanceOptions.reduce(
16508
17005
  (acc, option) => {
16509
17006
  acc[option.value] = false;
@@ -16532,12 +17029,10 @@ function Form({ onCreateRequest }) {
16532
17029
  () => groupPurposes.filter((p) => selectedPurposes.has(p.uuid)).map((p) => p.name).filter(Boolean),
16533
17030
  [groupPurposes, selectedPurposes]
16534
17031
  );
16535
- const selectedErasurePurposeNames = useMemo14(() => {
16536
- if (selectedErasurePurposeList.length === 0 || selectedErasurePurposeList.length > MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL) {
16537
- return t("revokeConsentModalYourPurposes");
16538
- }
16539
- return selectedErasurePurposeList.join(", ");
16540
- }, [selectedErasurePurposeList, t]);
17032
+ const selectedErasurePurposeNames = useMemo14(
17033
+ () => resolveErasurePurposeNames(selectedErasurePurposeList, t("revokeConsentModalYourPurposes")),
17034
+ [selectedErasurePurposeList, t]
17035
+ );
16541
17036
  const togglePurpose = useCallback10(
16542
17037
  (purpose) => {
16543
17038
  const uuid = purpose.uuid;
@@ -16644,7 +17139,7 @@ function Form({ onCreateRequest }) {
16644
17139
  if (isProductScopedRequestType(requestType)) {
16645
17140
  if (allGroups.length === 0) return false;
16646
17141
  if (!selectedGroup) return false;
16647
- if (requestType === "CORRECTION" /* CORRECTION */) {
17142
+ if (isRequestType(requestType, "CORRECTION" /* CORRECTION */)) {
16648
17143
  if (selectedCorrectionFields.size === 0) return false;
16649
17144
  return Array.from(selectedCorrectionFields).every((fieldUuid) => {
16650
17145
  var _a3, _b;
@@ -16652,15 +17147,15 @@ function Form({ onCreateRequest }) {
16652
17147
  return Boolean(((_a3 = v == null ? void 0 : v.current) == null ? void 0 : _a3.trim()) && ((_b = v == null ? void 0 : v.updated) == null ? void 0 : _b.trim()));
16653
17148
  });
16654
17149
  }
16655
- if (requestType === "ACCESS" /* ACCESS */ || requestType === "erasure" /* ERASURE */) {
17150
+ if (isRequestType(requestType, "ACCESS" /* ACCESS */) || isErasureRequestType(requestType)) {
16656
17151
  return selectedPurposes.size > 0;
16657
17152
  }
16658
17153
  return false;
16659
17154
  }
16660
- if (requestType === "grievance" /* GRIEVANCE */) {
17155
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */)) {
16661
17156
  return Object.values(selectedGrievances).some(Boolean);
16662
17157
  }
16663
- if (requestType === "nomination" /* NOMINATION */) {
17158
+ if (isRequestType(requestType, "nomination" /* NOMINATION */)) {
16664
17159
  return Boolean(nominationData.nominee_email);
16665
17160
  }
16666
17161
  return false;
@@ -16674,9 +17169,17 @@ function Form({ onCreateRequest }) {
16674
17169
  selectedGrievances,
16675
17170
  nominationData
16676
17171
  ]);
16677
- const isFormValid = useMemo14(() => detailsValid && confirmChecked, [detailsValid, confirmChecked]);
17172
+ const isFormValid = useMemo14(
17173
+ () => Boolean(contact.trim()) && detailsValid && confirmChecked,
17174
+ [contact, detailsValid, confirmChecked]
17175
+ );
16678
17176
  const handleUpload = useCallback10(async () => {
16679
17177
  if (!organizationId || !workspaceId) return;
17178
+ const caseUuid = formDataResponse == null ? void 0 : formDataResponse.uuid;
17179
+ if (!caseUuid) {
17180
+ Alert5.alert(t("uploadFile"), t("unableToUpload") || "Unable to upload file. Please try again.");
17181
+ return;
17182
+ }
16680
17183
  try {
16681
17184
  const file = await pickFile();
16682
17185
  if (!file) return;
@@ -16693,11 +17196,11 @@ function Form({ onCreateRequest }) {
16693
17196
  "payload",
16694
17197
  JSON.stringify({
16695
17198
  organization_uuid: organizationId || "",
16696
- space: `privacy/${docUuid}`,
17199
+ space: `privacy/${caseUuid}`,
16697
17200
  uuid: docUuid,
16698
17201
  is_public: true,
16699
17202
  allow_ai_processing: true,
16700
- metadata: { group_by: "privacy", product: "privacy_center" }
17203
+ metadata: { group_by: "privacy", case_uuid: caseUuid, product: "privacy_center" }
16701
17204
  })
16702
17205
  );
16703
17206
  const result = await uploadFileWithS2S({
@@ -16717,18 +17220,28 @@ function Form({ onCreateRequest }) {
16717
17220
  } finally {
16718
17221
  setIsUploading(false);
16719
17222
  }
16720
- }, [organizationId, workspaceId, authContext, consentClient, baseUrl, t]);
17223
+ }, [organizationId, workspaceId, authContext, consentClient, baseUrl, t, formDataResponse]);
16721
17224
  const removeUploadedDoc = useCallback10((uuid) => {
16722
17225
  setUploadedDocs((prev) => prev.filter((d) => d.uuid !== uuid));
16723
17226
  }, []);
17227
+ const alertSubmitFailed = useCallback10(
17228
+ (message) => {
17229
+ Alert5.alert(t("submit"), message || t("unableToSubmit") || "Unable to submit request. Please try again.");
17230
+ },
17231
+ [t]
17232
+ );
16724
17233
  const handleSubmit = useCallback10(async (revoke = false) => {
16725
- var _a3, _b, _c, _d;
16726
- if (!organizationId || !workspaceId || !contact || !requestType || !formDataResponse) return;
17234
+ var _a3;
17235
+ if (!organizationId || !workspaceId || !contact || !requestType || !formDataResponse) {
17236
+ alertSubmitFailed();
17237
+ return;
17238
+ }
16727
17239
  setRevokeConsentOnFulfilment(revoke);
16728
17240
  setIsSubmitting(true);
16729
17241
  try {
16730
17242
  const isProductScoped = isProductScopedRequestType(requestType);
16731
- const anchorGroup = isProductScoped ? selectedGroup : null;
17243
+ const isLegacyFlatSelection = (selectedGroup == null ? void 0 : selectedGroup.product_uuid) === LEGACY_PRODUCT_GROUP_UUID;
17244
+ const anchorGroup = isProductScoped && !isLegacyFlatSelection ? selectedGroup : null;
16732
17245
  const updatePurposes = Array.from(selectedPurposes).map((uuid) => ({
16733
17246
  purpose_uuid: uuid,
16734
17247
  data_element_uuids: Array.from(selectedDataElements.get(uuid) || [])
@@ -16749,27 +17262,27 @@ function Form({ onCreateRequest }) {
16749
17262
  purposes: updatePurposes,
16750
17263
  correction_data: correctionData,
16751
17264
  grievance_types: grievanceTypes,
16752
- ...requestType === "nomination" /* NOMINATION */ ? { nomination_data: nominationData } : {}
17265
+ ...isRequestType(requestType, "nomination" /* NOMINATION */) ? { nomination_data: nominationData } : {}
16753
17266
  },
16754
- time_period: requestType === "ACCESS" /* ACCESS */ ? parseInt(timePeriod || "30", 10) : 0,
17267
+ time_period: isRequestType(requestType, "ACCESS" /* ACCESS */) ? parseInt(timePeriod || "30", 10) : 0,
16755
17268
  requestor_note: additionalNote || "",
16756
- ...requestType === "erasure" /* ERASURE */ ? { revoke_consent_on_fulfilment: revoke } : {},
17269
+ ...erasureConsentPayload(requestType, revoke),
16757
17270
  ...anchorGroup ? { product_uuid: anchorGroup.product_uuid } : {},
16758
17271
  ...(anchorGroup == null ? void 0 : anchorGroup.nominator) ? { data_principal_uuid: anchorGroup.nominator.uuid } : {}
16759
17272
  };
16760
17273
  const response = await createCaseRequest(organizationId, workspaceId, request, false, false, authContext, consentClient);
16761
- const responseAny = response;
16762
- const newCaseId = (_c = (_b = responseAny == null ? void 0 : responseAny.case_id) != null ? _b : (_a3 = responseAny == null ? void 0 : responseAny.detail) == null ? void 0 : _a3.case_id) != null ? _c : null;
17274
+ const caseRef = extractCaseRef(response);
17275
+ const newCaseId = (caseRef == null ? void 0 : caseRef.case_id) || (caseRef == null ? void 0 : caseRef.uuid) || null;
16763
17276
  if (newCaseId) {
16764
17277
  setCaseId(newCaseId);
16765
- setSubmittedProductName((_d = anchorGroup == null ? void 0 : anchorGroup.product_name) != null ? _d : "");
17278
+ setSubmittedProductName((_a3 = anchorGroup == null ? void 0 : anchorGroup.product_name) != null ? _a3 : "");
16766
17279
  setIsSubmitted(true);
16767
17280
  } else {
16768
- Alert5.alert(t("submit"), t("unableToSubmit") || "Unable to submit request. Please try again.");
17281
+ alertSubmitFailed();
16769
17282
  }
16770
17283
  } catch (error) {
16771
17284
  console.warn("Error submitting request:", error);
16772
- Alert5.alert(t("submit"), (error == null ? void 0 : error.message) || t("unableToSubmit") || "Unable to submit request.");
17285
+ alertSubmitFailed(error == null ? void 0 : error.message);
16773
17286
  } finally {
16774
17287
  setIsSubmitting(false);
16775
17288
  }
@@ -16792,11 +17305,13 @@ function Form({ onCreateRequest }) {
16792
17305
  consentClient,
16793
17306
  groupDataElements,
16794
17307
  uploadedDocs,
16795
- t
17308
+ alertSubmitFailed
16796
17309
  ]);
16797
17310
  const handleSubmitClick = useCallback10(() => {
16798
- if (!isFormValid) return;
16799
- if (requestType === "erasure" /* ERASURE */) {
17311
+ if (!isFormValid) {
17312
+ return;
17313
+ }
17314
+ if (isErasureRequestType(requestType)) {
16800
17315
  setIsErasureConsentModalOpen(true);
16801
17316
  return;
16802
17317
  }
@@ -16885,7 +17400,7 @@ function Form({ onCreateRequest }) {
16885
17400
  if (groupPurposes.length === 0) {
16886
17401
  return /* @__PURE__ */ jsx43(Text25, { style: [styles33.placeholder, { color: colors.textSecondary }], children: t("noPurposesAvailable") || "No purposes available" });
16887
17402
  }
16888
- const isErasure = requestType === "erasure" /* ERASURE */;
17403
+ const isErasure = isErasureRequestType(requestType);
16889
17404
  const allPurposesSelected = groupPurposes.every(
16890
17405
  (p) => (p.data_elements || []).every((de) => {
16891
17406
  var _a3;
@@ -17005,18 +17520,18 @@ function Form({ onCreateRequest }) {
17005
17520
  ] }),
17006
17521
  selectedGroup ? /* @__PURE__ */ jsxs27(View32, { style: styles33.section, children: [
17007
17522
  /* @__PURE__ */ jsx43(Text25, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("requestDetails") }),
17008
- /* @__PURE__ */ jsx43(View32, { style: [styles33.sectionCard, elevation.card, { backgroundColor: colors.surface }], children: requestType === "CORRECTION" /* CORRECTION */ ? renderCorrectionFields() : renderPurposeFields() })
17523
+ /* @__PURE__ */ jsx43(View32, { style: [styles33.sectionCard, elevation.card, { backgroundColor: colors.surface }], children: isRequestType(requestType, "CORRECTION" /* CORRECTION */) ? renderCorrectionFields() : renderPurposeFields() })
17009
17524
  ] }) : /* @__PURE__ */ jsxs27(View32, { style: [styles33.hintCard, { backgroundColor: colors.surfaceAlt }], children: [
17010
17525
  /* @__PURE__ */ jsx43(Icon, { name: "circle-alert", size: 18, color: colors.textSecondary }),
17011
17526
  /* @__PURE__ */ jsx43(Text25, { style: [styles33.hintText, { color: colors.textSecondary }], children: t("selectProductFirst", { defaultValue: "Select a product to continue" }) })
17012
17527
  ] }),
17013
- requestType === "ACCESS" /* ACCESS */ && selectedGroup ? /* @__PURE__ */ jsxs27(View32, { style: styles33.section, children: [
17528
+ isRequestType(requestType, "ACCESS" /* ACCESS */) && selectedGroup ? /* @__PURE__ */ jsxs27(View32, { style: styles33.section, children: [
17014
17529
  /* @__PURE__ */ jsx43(Text25, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("timePeriod") }),
17015
17530
  /* @__PURE__ */ jsx43(PCSelect, { value: timePeriod, options: timePeriodOptions, onChange: setTimePeriod, placeholder: t("timePeriod") })
17016
17531
  ] }) : null
17017
17532
  ] });
17018
17533
  }
17019
- if (requestType === "grievance" /* GRIEVANCE */) {
17534
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */)) {
17020
17535
  if (grievanceOptions.length === 0) {
17021
17536
  return /* @__PURE__ */ jsx43(View32, { style: styles33.stepBody, children: /* @__PURE__ */ jsx43(Text25, { style: [styles33.placeholder, { color: colors.textSecondary }], children: t("noPurposesAvailable") || "No grievance types available" }) });
17022
17537
  }
@@ -17032,7 +17547,7 @@ function Form({ onCreateRequest }) {
17032
17547
  ] })
17033
17548
  ] }) });
17034
17549
  }
17035
- if (requestType === "nomination" /* NOMINATION */) {
17550
+ if (isRequestType(requestType, "nomination" /* NOMINATION */)) {
17036
17551
  return /* @__PURE__ */ jsx43(View32, { style: styles33.stepBody, children: /* @__PURE__ */ jsxs27(View32, { style: styles33.section, children: [
17037
17552
  /* @__PURE__ */ jsx43(Text25, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("enterNomineeDetails") }),
17038
17553
  /* @__PURE__ */ jsxs27(View32, { style: [styles33.sectionCard, elevation.card, { backgroundColor: colors.surface }], children: [
@@ -18097,6 +18612,7 @@ function useUnreadCount() {
18097
18612
  const loadRef = useRef8();
18098
18613
  loadRef.current = async () => {
18099
18614
  if (!organizationId || !workspaceId) return;
18615
+ if (isRefreshBlocked(authContext)) return;
18100
18616
  const res = await fetchUnreadCount(organizationId, workspaceId, authContext, consentClient);
18101
18617
  if (res && typeof res.count === "number") setCount(res.count);
18102
18618
  };
@@ -18422,17 +18938,255 @@ function PrivacyCenterEmptyState() {
18422
18938
  return /* @__PURE__ */ jsx49(PCEmpty, { iconName: "shield", title: t("noDataTitle"), description: t("noDataDescription") });
18423
18939
  }
18424
18940
 
18941
+ // src/RedactoPrivacyCenter/components/PrivacyCenterSessionExpired.tsx
18942
+ import { useTranslation as useTranslation20 } from "react-i18next";
18943
+ import { jsx as jsx50 } from "react/jsx-runtime";
18944
+ function PrivacyCenterSessionExpired() {
18945
+ const { t } = useTranslation20();
18946
+ return /* @__PURE__ */ jsx50(
18947
+ PCEmpty,
18948
+ {
18949
+ iconName: "shield",
18950
+ title: t("sessionExpiredTitle"),
18951
+ description: t("sessionExpiredDescription")
18952
+ }
18953
+ );
18954
+ }
18955
+
18956
+ // src/RedactoPrivacyCenter/components/SelectUserGate.tsx
18957
+ import { useCallback as useCallback11, useEffect as useEffect16, useState as useState22 } from "react";
18958
+ import { StyleSheet as StyleSheet41, View as View39 } from "react-native";
18959
+
18960
+ // src/RedactoPrivacyCenter/context/ProfileSwitchContext.tsx
18961
+ import { createContext as createContext7, useContext as useContext7 } from "react";
18962
+ import { jsx as jsx51 } from "react/jsx-runtime";
18963
+ var ProfileSwitchContext = createContext7({
18964
+ switchProfile: null
18965
+ });
18966
+ function ProfileSwitchProvider({
18967
+ switchProfile,
18968
+ children
18969
+ }) {
18970
+ return /* @__PURE__ */ jsx51(ProfileSwitchContext.Provider, { value: { switchProfile }, children });
18971
+ }
18972
+ function useProfileSwitch() {
18973
+ return useContext7(ProfileSwitchContext);
18974
+ }
18975
+
18976
+ // src/RedactoPrivacyCenter/components/SelectUser.tsx
18977
+ import { ScrollView as ScrollView8, StyleSheet as StyleSheet40, Text as Text30, TouchableOpacity as TouchableOpacity15, View as View38 } from "react-native";
18978
+ import { useTranslation as useTranslation21 } from "react-i18next";
18979
+
18980
+ // src/RedactoPrivacyCenter/lib/identityLabels.ts
18981
+ var identityPrimaryValue = (candidate) => {
18982
+ const orgUserId = candidate.org_user_id || "";
18983
+ const email = candidate.primary_email || "";
18984
+ const mobile = candidate.primary_mobile || "";
18985
+ return { orgUserId, fallback: email || mobile || candidate.uuid };
18986
+ };
18987
+ var identitySecondaryLabels = (candidate, primaryLabel) => {
18988
+ const email = candidate.primary_email || "";
18989
+ const mobile = candidate.primary_mobile || "";
18990
+ return [email, mobile].filter(
18991
+ (value, index, all) => value !== "" && value !== primaryLabel && all.indexOf(value) === index
18992
+ );
18993
+ };
18994
+ var selectableIdentities = (candidates) => candidates.filter((candidate) => Boolean(candidate.uuid));
18995
+
18996
+ // src/RedactoPrivacyCenter/components/SelectUser.tsx
18997
+ import { jsx as jsx52, jsxs as jsxs32 } from "react/jsx-runtime";
18998
+ var SelectUser = ({
18999
+ candidates,
19000
+ onSelect,
19001
+ busyUuid,
19002
+ error
19003
+ }) => {
19004
+ const { t } = useTranslation21();
19005
+ const { colors } = useTheme();
19006
+ const selectable = selectableIdentities(candidates);
19007
+ const busy = busyUuid !== null;
19008
+ return /* @__PURE__ */ jsxs32(ScrollView8, { contentContainerStyle: styles39.container, children: [
19009
+ /* @__PURE__ */ jsx52(Text30, { style: [typography.title, styles39.heading, { color: colors.text }], children: t("chooseYourProfile") }),
19010
+ /* @__PURE__ */ jsx52(Text30, { style: [typography.body, styles39.subtitle, { color: colors.textSecondary }], children: t("loginIdentifierLinkedToMultipleProfiles") }),
19011
+ error ? /* @__PURE__ */ jsx52(Text30, { style: [typography.caption, styles39.error, { color: colors.error }], children: error }) : null,
19012
+ selectable.map((candidate) => {
19013
+ const { orgUserId, fallback } = identityPrimaryValue(candidate);
19014
+ const primaryLabel = orgUserId ? t("userIdLabel", { id: orgUserId }) : fallback;
19015
+ const secondaryLabels = identitySecondaryLabels(candidate, primaryLabel);
19016
+ const isBusy = busyUuid === candidate.uuid;
19017
+ return /* @__PURE__ */ jsxs32(
19018
+ TouchableOpacity15,
19019
+ {
19020
+ accessibilityRole: "button",
19021
+ disabled: busy,
19022
+ onPress: () => onSelect(candidate.uuid),
19023
+ style: [
19024
+ styles39.row,
19025
+ {
19026
+ backgroundColor: colors.surface,
19027
+ borderColor: isBusy ? colors.primary : colors.border
19028
+ }
19029
+ ],
19030
+ children: [
19031
+ /* @__PURE__ */ jsxs32(View38, { style: styles39.rowText, children: [
19032
+ /* @__PURE__ */ jsx52(Text30, { style: [typography.label, { color: colors.text }], children: primaryLabel }),
19033
+ secondaryLabels.map((label) => /* @__PURE__ */ jsx52(
19034
+ Text30,
19035
+ {
19036
+ style: [typography.caption, styles39.secondary, { color: colors.textSecondary }],
19037
+ children: label
19038
+ },
19039
+ label
19040
+ ))
19041
+ ] }),
19042
+ isBusy ? /* @__PURE__ */ jsx52(Text30, { style: [typography.caption, { color: colors.textSecondary }], children: t("signingInEllipsis") }) : /* @__PURE__ */ jsx52(Icon, { name: "chevron-right", size: 18, color: colors.textSecondary })
19043
+ ]
19044
+ },
19045
+ candidate.uuid
19046
+ );
19047
+ })
19048
+ ] });
19049
+ };
19050
+ var styles39 = StyleSheet40.create({
19051
+ container: { padding: spacing.lg },
19052
+ heading: { textAlign: "center" },
19053
+ subtitle: { textAlign: "center", marginTop: spacing.xs, marginBottom: spacing.lg },
19054
+ error: { textAlign: "center", marginBottom: spacing.md },
19055
+ row: {
19056
+ flexDirection: "row",
19057
+ alignItems: "center",
19058
+ borderWidth: 1,
19059
+ borderRadius: radii.md,
19060
+ padding: spacing.md,
19061
+ marginBottom: spacing.sm
19062
+ },
19063
+ rowText: { flex: 1 },
19064
+ secondary: { marginTop: 2 }
19065
+ });
19066
+
19067
+ // src/RedactoPrivacyCenter/components/SelectUserGate.tsx
19068
+ import { jsx as jsx53 } from "react/jsx-runtime";
19069
+ function SelectUserGate({ children }) {
19070
+ var _a3, _b;
19071
+ const { accessToken, organizationId, workspaceId, updateTokens } = useAuth();
19072
+ const { consentClient } = useBaseUrl();
19073
+ const { colors } = useTheme();
19074
+ const insets = useSafeInsets();
19075
+ const [phase, setPhase] = useState22("checking");
19076
+ const [candidates, setCandidates] = useState22([]);
19077
+ const [busyUuid, setBusyUuid] = useState22(null);
19078
+ const [selectError, setSelectError] = useState22(null);
19079
+ const [pinnedOrgUserId, setPinnedOrgUserId] = useState22(null);
19080
+ const tokenOrgUserId = ((_b = (_a3 = decodeJwtToken(accessToken)) == null ? void 0 : _a3.user_data) == null ? void 0 : _b.org_user_id) || "";
19081
+ useEffect16(() => {
19082
+ let cancelled = false;
19083
+ if (isSandboxMode() || !organizationId || !workspaceId || !accessToken) {
19084
+ setPhase("resolved");
19085
+ return;
19086
+ }
19087
+ const isPinned = Boolean(pinnedOrgUserId) && pinnedOrgUserId === tokenOrgUserId;
19088
+ setPhase(isPinned ? "resolved" : "checking");
19089
+ (async () => {
19090
+ var _a4;
19091
+ try {
19092
+ const res = await consentClient.listIdentities({
19093
+ organisationUuid: organizationId,
19094
+ workspaceUuid: workspaceId,
19095
+ authToken: accessToken
19096
+ });
19097
+ if (cancelled) return;
19098
+ const list = (_a4 = res == null ? void 0 : res.identities) != null ? _a4 : [];
19099
+ setCandidates(list);
19100
+ setPhase(list.length > 1 && !isPinned ? "picking" : "resolved");
19101
+ } catch {
19102
+ if (cancelled) return;
19103
+ setCandidates([]);
19104
+ setPhase("resolved");
19105
+ }
19106
+ })();
19107
+ return () => {
19108
+ cancelled = true;
19109
+ };
19110
+ }, [organizationId, workspaceId, tokenOrgUserId]);
19111
+ const handleSelect = useCallback11(
19112
+ async (principalUuid) => {
19113
+ var _a4, _b2;
19114
+ if (!principalUuid || busyUuid || !organizationId || !workspaceId) return;
19115
+ setBusyUuid(principalUuid);
19116
+ setSelectError(null);
19117
+ try {
19118
+ const res = await consentClient.selectPrincipal(
19119
+ {
19120
+ organisationUuid: organizationId,
19121
+ workspaceUuid: workspaceId,
19122
+ authToken: accessToken
19123
+ },
19124
+ principalUuid
19125
+ );
19126
+ if (!(res == null ? void 0 : res.token) || !(res == null ? void 0 : res.refresh_token)) {
19127
+ throw new Error("select-principal returned no tokens");
19128
+ }
19129
+ const pinned = ((_b2 = (_a4 = decodeJwtToken(res.token)) == null ? void 0 : _a4.user_data) == null ? void 0 : _b2.org_user_id) || null;
19130
+ setPinnedOrgUserId(pinned);
19131
+ setPhase("resolved");
19132
+ updateTokens(res.token, res.refresh_token);
19133
+ } catch (error) {
19134
+ setSelectError(
19135
+ error instanceof Error ? error.message : "Failed to switch profile"
19136
+ );
19137
+ } finally {
19138
+ setBusyUuid(null);
19139
+ }
19140
+ },
19141
+ [accessToken, busyUuid, consentClient, organizationId, workspaceId, updateTokens]
19142
+ );
19143
+ const canSwitch = candidates.length > 1;
19144
+ const switchProfile = useCallback11(() => {
19145
+ if (!canSwitch) return;
19146
+ setSelectError(null);
19147
+ setPhase("picking");
19148
+ }, [canSwitch]);
19149
+ if (phase === "checking" || phase === "picking") {
19150
+ return /* @__PURE__ */ jsx53(
19151
+ View39,
19152
+ {
19153
+ style: [
19154
+ styles40.screen,
19155
+ {
19156
+ backgroundColor: colors.canvasSubtle,
19157
+ paddingTop: insets.top,
19158
+ paddingBottom: insets.bottom
19159
+ }
19160
+ ],
19161
+ children: phase === "checking" ? /* @__PURE__ */ jsx53(PCLoader, {}) : /* @__PURE__ */ jsx53(
19162
+ SelectUser,
19163
+ {
19164
+ candidates,
19165
+ onSelect: handleSelect,
19166
+ busyUuid,
19167
+ error: selectError
19168
+ }
19169
+ )
19170
+ }
19171
+ );
19172
+ }
19173
+ return /* @__PURE__ */ jsx53(ProfileSwitchProvider, { switchProfile: canSwitch ? switchProfile : null, children });
19174
+ }
19175
+ var styles40 = StyleSheet41.create({
19176
+ screen: { flex: 1 }
19177
+ });
19178
+
18425
19179
  // src/RedactoPrivacyCenter/components/CaseDetails/CaseDetailsPage.tsx
18426
- import { useState as useState23, useMemo as useMemo20, useEffect as useEffect18 } from "react";
18427
- import { View as View45, Text as Text37, StyleSheet as StyleSheet47, ActivityIndicator as ActivityIndicator8, Platform as Platform7 } from "react-native";
18428
- import { useTranslation as useTranslation25 } from "react-i18next";
19180
+ import { useState as useState24, useMemo as useMemo20, useEffect as useEffect19 } from "react";
19181
+ import { View as View47, Text as Text38, StyleSheet as StyleSheet49, ActivityIndicator as ActivityIndicator8, Platform as Platform7 } from "react-native";
19182
+ import { useTranslation as useTranslation27 } from "react-i18next";
18429
19183
 
18430
19184
  // src/RedactoPrivacyCenter/components/CaseDetails/RequestDetailsTab.tsx
18431
- import { View as View38, Text as Text30, ScrollView as ScrollView8, StyleSheet as StyleSheet40 } from "react-native";
18432
- import { useTranslation as useTranslation20 } from "react-i18next";
18433
- import { jsx as jsx50, jsxs as jsxs32 } from "react/jsx-runtime";
19185
+ import { View as View40, Text as Text31, ScrollView as ScrollView9, StyleSheet as StyleSheet42 } from "react-native";
19186
+ import { useTranslation as useTranslation22 } from "react-i18next";
19187
+ import { jsx as jsx54, jsxs as jsxs33 } from "react/jsx-runtime";
18434
19188
  function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18435
- const { t } = useTranslation20();
19189
+ const { t } = useTranslation22();
18436
19190
  const { colors } = useTheme();
18437
19191
  const { listBottom } = usePrivacyCenterInsets({ hasFooter: true });
18438
19192
  const details = selectedCase.request_details;
@@ -18464,36 +19218,36 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18464
19218
  }
18465
19219
  const description = selectedCase.description_display || selectedCase.description;
18466
19220
  const hasDetails = description || details && (details.purposes && details.purposes.length > 0 || details.correction_data && details.correction_data.length > 0 || details.grievance_types && details.grievance_types.length > 0 || details.nomination_data);
18467
- return /* @__PURE__ */ jsxs32(ScrollView8, { style: [styles39.container, { backgroundColor: colors.canvasSubtle }], contentContainerStyle: [styles39.content, { flexGrow: 1, paddingBottom: listBottom }], showsVerticalScrollIndicator: false, children: [
18468
- /* @__PURE__ */ jsx50(View38, { style: styles39.timeline, children: steps.map((step, i) => {
19221
+ return /* @__PURE__ */ jsxs33(ScrollView9, { style: [styles41.container, { backgroundColor: colors.canvasSubtle }], contentContainerStyle: [styles41.content, { flexGrow: 1, paddingBottom: listBottom }], showsVerticalScrollIndicator: false, children: [
19222
+ /* @__PURE__ */ jsx54(View40, { style: styles41.timeline, children: steps.map((step, i) => {
18469
19223
  const isLast = i === steps.length - 1;
18470
- return /* @__PURE__ */ jsxs32(View38, { style: styles39.stepRow, children: [
18471
- /* @__PURE__ */ jsxs32(View38, { style: styles39.gutter, children: [
18472
- /* @__PURE__ */ jsx50(
18473
- View38,
19224
+ return /* @__PURE__ */ jsxs33(View40, { style: styles41.stepRow, children: [
19225
+ /* @__PURE__ */ jsxs33(View40, { style: styles41.gutter, children: [
19226
+ /* @__PURE__ */ jsx54(
19227
+ View40,
18474
19228
  {
18475
19229
  style: [
18476
- styles39.dot,
19230
+ styles41.dot,
18477
19231
  step.state === "upcoming" ? { backgroundColor: colors.canvasSubtle, borderWidth: 2, borderColor: step.danger ? colors.error : colors.border } : { backgroundColor: step.color }
18478
19232
  ],
18479
- children: step.state === "done" ? /* @__PURE__ */ jsx50(Icon, { name: "check", size: 11, color: colors.primaryText, strokeWidth: 3 }) : step.state === "current" ? /* @__PURE__ */ jsx50(View38, { style: [styles39.dotInner, { backgroundColor: colors.primaryText }] }) : null
19233
+ children: step.state === "done" ? /* @__PURE__ */ jsx54(Icon, { name: "check", size: 11, color: colors.primaryText, strokeWidth: 3 }) : step.state === "current" ? /* @__PURE__ */ jsx54(View40, { style: [styles41.dotInner, { backgroundColor: colors.primaryText }] }) : null
18480
19234
  }
18481
19235
  ),
18482
- !isLast ? /* @__PURE__ */ jsx50(View38, { style: [styles39.connector, { backgroundColor: colors.border }] }) : null
19236
+ !isLast ? /* @__PURE__ */ jsx54(View40, { style: [styles41.connector, { backgroundColor: colors.border }] }) : null
18483
19237
  ] }),
18484
- /* @__PURE__ */ jsxs32(View38, { style: [styles39.stepContent, isLast && styles39.stepContentLast], children: [
18485
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.stepLabel, { color: step.danger ? colors.error : colors.text }], children: step.label }),
18486
- step.date ? /* @__PURE__ */ jsx50(Text30, { style: [styles39.stepDate, { color: step.danger ? colors.error : colors.textSecondary }], children: step.date }) : null
19238
+ /* @__PURE__ */ jsxs33(View40, { style: [styles41.stepContent, isLast && styles41.stepContentLast], children: [
19239
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.stepLabel, { color: step.danger ? colors.error : colors.text }], children: step.label }),
19240
+ step.date ? /* @__PURE__ */ jsx54(Text31, { style: [styles41.stepDate, { color: step.danger ? colors.error : colors.textSecondary }], children: step.date }) : null
18487
19241
  ] })
18488
19242
  ] }, `${step.label}-${i}`);
18489
19243
  }) }),
18490
- hasDetails ? /* @__PURE__ */ jsxs32(View38, { style: [styles39.card, elevation.card, { backgroundColor: colors.surface }], children: [
18491
- description ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18492
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("descriptionLabel") || "Description" }),
18493
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.descriptionText, { color: colors.text }], children: description })
19244
+ hasDetails ? /* @__PURE__ */ jsxs33(View40, { style: [styles41.card, elevation.card, { backgroundColor: colors.surface }], children: [
19245
+ description ? /* @__PURE__ */ jsxs33(View40, { style: styles41.block, children: [
19246
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("descriptionLabel") || "Description" }),
19247
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.descriptionText, { color: colors.text }], children: description })
18494
19248
  ] }) : null,
18495
- (details == null ? void 0 : details.purposes) && details.purposes.length > 0 ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18496
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("purposesInvolved") || t("purposes") || "Purposes" }),
19249
+ (details == null ? void 0 : details.purposes) && details.purposes.length > 0 ? /* @__PURE__ */ jsxs33(View40, { style: styles41.block, children: [
19250
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("purposesInvolved") || t("purposes") || "Purposes" }),
18497
19251
  details.purposes.map((rawP, idx) => {
18498
19252
  const p = (rawP == null ? void 0 : rawP.purpose) ? rawP.purpose : rawP;
18499
19253
  const purposeId = (p == null ? void 0 : p.uuid) || (p == null ? void 0 : p.purpose_uuid) || (rawP == null ? void 0 : rawP.purpose_uuid) || idx;
@@ -18501,10 +19255,10 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18501
19255
  const purposeDescription = (p == null ? void 0 : p.description) || (rawP == null ? void 0 : rawP.description);
18502
19256
  const dataElements = Array.isArray(p == null ? void 0 : p.data_elements) ? p.data_elements.filter((de) => (de == null ? void 0 : de.selected) || (de == null ? void 0 : de.given_consent)) : [];
18503
19257
  const dataElementUuids = Array.isArray(rawP == null ? void 0 : rawP.data_element_uuids) ? rawP.data_element_uuids : Array.isArray(p == null ? void 0 : p.data_element_uuids) ? p.data_element_uuids : [];
18504
- return /* @__PURE__ */ jsxs32(View38, { style: [styles39.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: StyleSheet40.hairlineWidth }], children: [
18505
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.itemTitle, { color: colors.text }], children: purposeName }),
18506
- purposeDescription ? /* @__PURE__ */ jsx50(Text30, { style: [styles39.itemDesc, { color: colors.textSecondary }], numberOfLines: 3, children: purposeDescription }) : null,
18507
- dataElements.length > 0 ? /* @__PURE__ */ jsx50(View38, { style: styles39.chipRow, children: dataElements.map((de) => /* @__PURE__ */ jsx50(PCBadge, { status: "info", label: de.name }, de.uuid)) }) : dataElementUuids.length > 0 ? /* @__PURE__ */ jsxs32(Text30, { style: [styles39.itemDesc, { color: colors.textSecondary }], children: [
19258
+ return /* @__PURE__ */ jsxs33(View40, { style: [styles41.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: StyleSheet42.hairlineWidth }], children: [
19259
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.itemTitle, { color: colors.text }], children: purposeName }),
19260
+ purposeDescription ? /* @__PURE__ */ jsx54(Text31, { style: [styles41.itemDesc, { color: colors.textSecondary }], numberOfLines: 3, children: purposeDescription }) : null,
19261
+ dataElements.length > 0 ? /* @__PURE__ */ jsx54(View40, { style: styles41.chipRow, children: dataElements.map((de) => /* @__PURE__ */ jsx54(PCBadge, { status: "info", label: de.name }, de.uuid)) }) : dataElementUuids.length > 0 ? /* @__PURE__ */ jsxs33(Text31, { style: [styles41.itemDesc, { color: colors.textSecondary }], children: [
18508
19262
  dataElementUuids.length,
18509
19263
  " ",
18510
19264
  t("dataElements") || "data elements"
@@ -18512,44 +19266,44 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18512
19266
  ] }, purposeId);
18513
19267
  })
18514
19268
  ] }) : null,
18515
- (details == null ? void 0 : details.correction_data) && details.correction_data.length > 0 ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18516
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("correctionData") || "Correction" }),
18517
- details.correction_data.map((item, idx) => /* @__PURE__ */ jsxs32(View38, { style: [styles39.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: StyleSheet40.hairlineWidth }], children: [
18518
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.itemTitle, { color: colors.text }], children: item.name }),
18519
- /* @__PURE__ */ jsxs32(View38, { style: styles39.correctionValues, children: [
18520
- /* @__PURE__ */ jsxs32(View38, { style: styles39.correctionValue, children: [
18521
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.correctionLabel, { color: colors.textSecondary }], children: t("currentValue") || "Current" }),
18522
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.correctionText, { color: colors.text }], children: item.curr_value || "-" })
19269
+ (details == null ? void 0 : details.correction_data) && details.correction_data.length > 0 ? /* @__PURE__ */ jsxs33(View40, { style: styles41.block, children: [
19270
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("correctionData") || "Correction" }),
19271
+ details.correction_data.map((item, idx) => /* @__PURE__ */ jsxs33(View40, { style: [styles41.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: StyleSheet42.hairlineWidth }], children: [
19272
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.itemTitle, { color: colors.text }], children: item.name }),
19273
+ /* @__PURE__ */ jsxs33(View40, { style: styles41.correctionValues, children: [
19274
+ /* @__PURE__ */ jsxs33(View40, { style: styles41.correctionValue, children: [
19275
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.correctionLabel, { color: colors.textSecondary }], children: t("currentValue") || "Current" }),
19276
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.correctionText, { color: colors.text }], children: item.curr_value || "-" })
18523
19277
  ] }),
18524
- /* @__PURE__ */ jsx50(Icon, { name: "chevron-right", size: 16, color: colors.textSecondary, strokeWidth: 2.2 }),
18525
- /* @__PURE__ */ jsxs32(View38, { style: styles39.correctionValue, children: [
18526
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.correctionLabel, { color: colors.textSecondary }], children: t("newValue") || "New" }),
18527
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.correctionText, { color: colors.primary }], children: item.new_value || "-" })
19278
+ /* @__PURE__ */ jsx54(Icon, { name: "chevron-right", size: 16, color: colors.textSecondary, strokeWidth: 2.2 }),
19279
+ /* @__PURE__ */ jsxs33(View40, { style: styles41.correctionValue, children: [
19280
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.correctionLabel, { color: colors.textSecondary }], children: t("newValue") || "New" }),
19281
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.correctionText, { color: colors.primary }], children: item.new_value || "-" })
18528
19282
  ] })
18529
19283
  ] })
18530
19284
  ] }, idx))
18531
19285
  ] }) : null,
18532
- (details == null ? void 0 : details.grievance_types) && details.grievance_types.length > 0 ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18533
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("grievanceTypes") || "Grievance" }),
18534
- /* @__PURE__ */ jsx50(View38, { style: styles39.chipRow, children: details.grievance_types.map((g, idx) => /* @__PURE__ */ jsx50(PCBadge, { status: "warning", label: (g.grievance || "").replace(/_/g, " ") }, idx)) })
19286
+ (details == null ? void 0 : details.grievance_types) && details.grievance_types.length > 0 ? /* @__PURE__ */ jsxs33(View40, { style: styles41.block, children: [
19287
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("grievanceTypes") || "Grievance" }),
19288
+ /* @__PURE__ */ jsx54(View40, { style: styles41.chipRow, children: details.grievance_types.map((g, idx) => /* @__PURE__ */ jsx54(PCBadge, { status: "warning", label: (g.grievance || "").replace(/_/g, " ") }, idx)) })
18535
19289
  ] }) : null,
18536
- (details == null ? void 0 : details.nomination_data) ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18537
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("nominationData") || "Nomination" }),
18538
- details.nomination_data.nominee_email ? /* @__PURE__ */ jsxs32(View38, { style: styles39.kvRow, children: [
18539
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.kvLabel, { color: colors.textSecondary }], children: t("email") || "Email" }),
18540
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.kvValue, { color: colors.text }], children: details.nomination_data.nominee_email })
19290
+ (details == null ? void 0 : details.nomination_data) ? /* @__PURE__ */ jsxs33(View40, { style: styles41.block, children: [
19291
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("nominationData") || "Nomination" }),
19292
+ details.nomination_data.nominee_email ? /* @__PURE__ */ jsxs33(View40, { style: styles41.kvRow, children: [
19293
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.kvLabel, { color: colors.textSecondary }], children: t("email") || "Email" }),
19294
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.kvValue, { color: colors.text }], children: details.nomination_data.nominee_email })
18541
19295
  ] }) : null,
18542
- details.nomination_data.nominee_mobile ? /* @__PURE__ */ jsxs32(View38, { style: styles39.kvRow, children: [
18543
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.kvLabel, { color: colors.textSecondary }], children: t("mobile") || "Mobile" }),
18544
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.kvValue, { color: colors.text }], children: details.nomination_data.nominee_mobile })
19296
+ details.nomination_data.nominee_mobile ? /* @__PURE__ */ jsxs33(View40, { style: styles41.kvRow, children: [
19297
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.kvLabel, { color: colors.textSecondary }], children: t("mobile") || "Mobile" }),
19298
+ /* @__PURE__ */ jsx54(Text31, { style: [styles41.kvValue, { color: colors.text }], children: details.nomination_data.nominee_mobile })
18545
19299
  ] }) : null
18546
19300
  ] }) : null
18547
19301
  ] }) : null,
18548
- /* @__PURE__ */ jsx50(View38, { style: { marginTop: "auto" }, children: /* @__PURE__ */ jsx50(Footer, {}) })
19302
+ /* @__PURE__ */ jsx54(View40, { style: { marginTop: "auto" }, children: /* @__PURE__ */ jsx54(Footer, {}) })
18549
19303
  ] });
18550
19304
  }
18551
19305
  var DOT = 22;
18552
- var styles39 = StyleSheet40.create({
19306
+ var styles41 = StyleSheet42.create({
18553
19307
  container: {
18554
19308
  flex: 1
18555
19309
  },
@@ -18670,21 +19424,21 @@ var styles39 = StyleSheet40.create({
18670
19424
  });
18671
19425
 
18672
19426
  // src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
18673
- import { useState as useState22, useRef as useRef10, useEffect as useEffect17, useCallback as useCallback11, useMemo as useMemo19 } from "react";
18674
- import { View as View44, Text as Text36, FlatList as FlatList2, StyleSheet as StyleSheet46, ActivityIndicator as ActivityIndicator7 } from "react-native";
18675
- import { useTranslation as useTranslation24 } from "react-i18next";
19427
+ import { useState as useState23, useRef as useRef10, useEffect as useEffect18, useCallback as useCallback12, useMemo as useMemo19 } from "react";
19428
+ import { View as View46, Text as Text37, FlatList as FlatList2, StyleSheet as StyleSheet48, ActivityIndicator as ActivityIndicator7 } from "react-native";
19429
+ import { useTranslation as useTranslation26 } from "react-i18next";
18676
19430
 
18677
19431
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx
18678
- import React22 from "react";
18679
- import { useTranslation as useTranslation22 } from "react-i18next";
19432
+ import React23 from "react";
19433
+ import { useTranslation as useTranslation24 } from "react-i18next";
18680
19434
 
18681
19435
  // src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx
18682
- import React21 from "react";
18683
- import { StyleSheet as StyleSheet42, Text as Text32, View as View40 } from "react-native";
19436
+ import React22 from "react";
19437
+ import { StyleSheet as StyleSheet44, Text as Text33, View as View42 } from "react-native";
18684
19438
 
18685
19439
  // src/RedactoPrivacyCenter/components/CaseDetails/AttachmentCard.tsx
18686
- import { View as View39, Text as Text31, TouchableOpacity as TouchableOpacity15, Linking, StyleSheet as StyleSheet41 } from "react-native";
18687
- import { jsx as jsx51, jsxs as jsxs33 } from "react/jsx-runtime";
19440
+ import { View as View41, Text as Text32, TouchableOpacity as TouchableOpacity16, Linking, StyleSheet as StyleSheet43 } from "react-native";
19441
+ import { jsx as jsx55, jsxs as jsxs34 } from "react/jsx-runtime";
18688
19442
  function AttachmentCard({ doc }) {
18689
19443
  const { colors } = useTheme();
18690
19444
  const downloadUrl = getDownloadUrl(doc.file_url);
@@ -18693,28 +19447,28 @@ function AttachmentCard({ doc }) {
18693
19447
  Linking.openURL(downloadUrl);
18694
19448
  }
18695
19449
  };
18696
- return /* @__PURE__ */ jsxs33(
18697
- TouchableOpacity15,
19450
+ return /* @__PURE__ */ jsxs34(
19451
+ TouchableOpacity16,
18698
19452
  {
18699
- style: [styles40.container, { backgroundColor: colors.surface, borderColor: colors.border }],
19453
+ style: [styles42.container, { backgroundColor: colors.surface, borderColor: colors.border }],
18700
19454
  onPress: handlePress,
18701
19455
  disabled: !downloadUrl,
18702
19456
  activeOpacity: 0.7,
18703
19457
  children: [
18704
- /* @__PURE__ */ jsx51(Icon, { name: "file-text", size: 18, color: colors.textSecondary }),
18705
- /* @__PURE__ */ jsxs33(View39, { style: styles40.info, children: [
18706
- /* @__PURE__ */ jsx51(Text31, { style: [styles40.fileName, { color: colors.text }], numberOfLines: 1, children: doc.file_name || "Document" }),
18707
- doc.file_size ? /* @__PURE__ */ jsx51(Text31, { style: [styles40.fileSize, { color: colors.textSecondary }], children: formatFileSize(doc.file_size) }) : null
19458
+ /* @__PURE__ */ jsx55(Icon, { name: "file-text", size: 18, color: colors.textSecondary }),
19459
+ /* @__PURE__ */ jsxs34(View41, { style: styles42.info, children: [
19460
+ /* @__PURE__ */ jsx55(Text32, { style: [styles42.fileName, { color: colors.text }], numberOfLines: 1, children: doc.file_name || "Document" }),
19461
+ doc.file_size ? /* @__PURE__ */ jsx55(Text32, { style: [styles42.fileSize, { color: colors.textSecondary }], children: formatFileSize(doc.file_size) }) : null
18708
19462
  ] })
18709
19463
  ]
18710
19464
  }
18711
19465
  );
18712
19466
  }
18713
- var styles40 = StyleSheet41.create({
19467
+ var styles42 = StyleSheet43.create({
18714
19468
  container: {
18715
19469
  flexDirection: "row",
18716
19470
  alignItems: "center",
18717
- borderWidth: StyleSheet41.hairlineWidth,
19471
+ borderWidth: StyleSheet43.hairlineWidth,
18718
19472
  borderRadius: radii.md,
18719
19473
  paddingHorizontal: spacing.sm + 2,
18720
19474
  paddingVertical: spacing.sm,
@@ -18734,11 +19488,11 @@ var styles40 = StyleSheet41.create({
18734
19488
  });
18735
19489
 
18736
19490
  // src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx
18737
- import { jsx as jsx52, jsxs as jsxs34 } from "react/jsx-runtime";
19491
+ import { jsx as jsx56, jsxs as jsxs35 } from "react/jsx-runtime";
18738
19492
  var AVATAR_SIZE = 28;
18739
19493
  var AVATAR_GUTTER = 36;
18740
19494
  function TeamAvatar({ tint }) {
18741
- return /* @__PURE__ */ jsx52(View40, { style: [styles41.avatar, { backgroundColor: withAlpha(tint, 0.13) }], children: /* @__PURE__ */ jsx52(Icon, { name: "shield-check", size: 15, color: tint, strokeWidth: 2 }) });
19495
+ return /* @__PURE__ */ jsx56(View42, { style: [styles43.avatar, { backgroundColor: withAlpha(tint, 0.13) }], children: /* @__PURE__ */ jsx56(Icon, { name: "shield-check", size: 15, color: tint, strokeWidth: 2 }) });
18742
19496
  }
18743
19497
  function ChatBubbleImpl({
18744
19498
  message,
@@ -18765,28 +19519,28 @@ function ChatBubbleImpl({
18765
19519
  borderBottomRightRadius: BUBBLE_RADIUS,
18766
19520
  borderBottomLeftRadius: tailRadius
18767
19521
  };
18768
- const bubble = /* @__PURE__ */ jsxs34(View40, { style: [styles41.bubble, bubbleStyle], children: [
18769
- !isPrincipal && isFirstInGroup ? /* @__PURE__ */ jsx52(Text32, { style: [styles41.bubbleSender, { color: colors.primary }], numberOfLines: 1, children: senderLabel }) : null,
18770
- message.body ? /* @__PURE__ */ jsx52(Text32, { style: [styles41.body, { color: isPrincipal ? colors.primaryText : colors.text }], children: message.body }) : null,
18771
- message.documents && message.documents.length > 0 ? /* @__PURE__ */ jsx52(View40, { style: styles41.attachments, children: message.documents.map((doc) => /* @__PURE__ */ jsx52(AttachmentCard, { doc }, doc.uuid)) }) : null
19522
+ const bubble = /* @__PURE__ */ jsxs35(View42, { style: [styles43.bubble, bubbleStyle], children: [
19523
+ !isPrincipal && isFirstInGroup ? /* @__PURE__ */ jsx56(Text33, { style: [styles43.bubbleSender, { color: colors.primary }], numberOfLines: 1, children: senderLabel }) : null,
19524
+ message.body ? /* @__PURE__ */ jsx56(Text33, { style: [styles43.body, { color: isPrincipal ? colors.primaryText : colors.text }], children: message.body }) : null,
19525
+ message.documents && message.documents.length > 0 ? /* @__PURE__ */ jsx56(View42, { style: styles43.attachments, children: message.documents.map((doc) => /* @__PURE__ */ jsx56(AttachmentCard, { doc }, doc.uuid)) }) : null
18772
19526
  ] });
18773
- return /* @__PURE__ */ jsxs34(
18774
- View40,
19527
+ return /* @__PURE__ */ jsxs35(
19528
+ View42,
18775
19529
  {
18776
19530
  style: [
18777
- styles41.row,
18778
- isPrincipal ? styles41.rowRight : styles41.rowLeft,
19531
+ styles43.row,
19532
+ isPrincipal ? styles43.rowRight : styles43.rowLeft,
18779
19533
  { marginTop: isFirstInGroup ? spacing.md : 2 }
18780
19534
  ],
18781
19535
  children: [
18782
- !isPrincipal ? /* @__PURE__ */ jsx52(View40, { style: styles41.avatarSlot, children: isFirstInGroup ? /* @__PURE__ */ jsx52(TeamAvatar, { tint: colors.primary }) : null }) : null,
18783
- /* @__PURE__ */ jsxs34(View40, { style: [styles41.column, isPrincipal ? styles41.columnRight : styles41.columnLeft], children: [
19536
+ !isPrincipal ? /* @__PURE__ */ jsx56(View42, { style: styles43.avatarSlot, children: isFirstInGroup ? /* @__PURE__ */ jsx56(TeamAvatar, { tint: colors.primary }) : null }) : null,
19537
+ /* @__PURE__ */ jsxs35(View42, { style: [styles43.column, isPrincipal ? styles43.columnRight : styles43.columnLeft], children: [
18784
19538
  bubble,
18785
- isLastInGroup ? /* @__PURE__ */ jsx52(
18786
- Text32,
19539
+ isLastInGroup ? /* @__PURE__ */ jsx56(
19540
+ Text33,
18787
19541
  {
18788
19542
  style: [
18789
- styles41.timestamp,
19543
+ styles43.timestamp,
18790
19544
  { color: colors.textSecondary, textAlign: isPrincipal ? "right" : "left" }
18791
19545
  ],
18792
19546
  children: formatMessageTime(timestamp)
@@ -18797,8 +19551,8 @@ function ChatBubbleImpl({
18797
19551
  }
18798
19552
  );
18799
19553
  }
18800
- var ChatBubble = React21.memo(ChatBubbleImpl);
18801
- var styles41 = StyleSheet42.create({
19554
+ var ChatBubble = React22.memo(ChatBubbleImpl);
19555
+ var styles43 = StyleSheet44.create({
18802
19556
  row: {
18803
19557
  flexDirection: "row",
18804
19558
  paddingHorizontal: spacing.md,
@@ -18858,9 +19612,9 @@ var styles41 = StyleSheet42.create({
18858
19612
  });
18859
19613
 
18860
19614
  // src/RedactoPrivacyCenter/components/CaseDetails/DocumentRequestCard.tsx
18861
- import { View as View41, Text as Text33, TouchableOpacity as TouchableOpacity16, StyleSheet as StyleSheet43 } from "react-native";
18862
- import { useTranslation as useTranslation21 } from "react-i18next";
18863
- import { jsx as jsx53, jsxs as jsxs35 } from "react/jsx-runtime";
19615
+ import { View as View43, Text as Text34, TouchableOpacity as TouchableOpacity17, StyleSheet as StyleSheet45 } from "react-native";
19616
+ import { useTranslation as useTranslation23 } from "react-i18next";
19617
+ import { jsx as jsx57, jsxs as jsxs36 } from "react/jsx-runtime";
18864
19618
  var STATUS_BADGE_MAP = {
18865
19619
  pending: "warning",
18866
19620
  under_review: "info",
@@ -18880,20 +19634,20 @@ function humanize(value) {
18880
19634
  }
18881
19635
  function DocumentRequestCard({ message, onUpload, isSubmitting, isCaseFinalized = false }) {
18882
19636
  var _a3;
18883
- const { t } = useTranslation21();
19637
+ const { t } = useTranslation23();
18884
19638
  const { colors } = useTheme();
18885
19639
  const meta = message.document_request_metadata;
18886
19640
  if (!meta) return null;
18887
19641
  const status = meta.document_request_status;
18888
19642
  const canUpload = (status === "pending" || status === "replacement_requested") && !isCaseFinalized;
18889
19643
  const requestEventUuid = meta.document_request_uuid;
18890
- return /* @__PURE__ */ jsxs35(View41, { style: [styles42.container, { borderColor: colors.border, backgroundColor: colors.surface }], children: [
18891
- /* @__PURE__ */ jsxs35(View41, { style: styles42.header, children: [
18892
- /* @__PURE__ */ jsxs35(View41, { style: styles42.titleRow, children: [
18893
- /* @__PURE__ */ jsx53(Icon, { name: "file-check", size: 16, color: colors.primary, strokeWidth: 2 }),
18894
- /* @__PURE__ */ jsx53(Text33, { style: [styles42.title, { color: colors.text }], children: meta.title || t("documentRequestedLabel") || "Document Requested" })
19644
+ return /* @__PURE__ */ jsxs36(View43, { style: [styles44.container, { borderColor: colors.border, backgroundColor: colors.surface }], children: [
19645
+ /* @__PURE__ */ jsxs36(View43, { style: styles44.header, children: [
19646
+ /* @__PURE__ */ jsxs36(View43, { style: styles44.titleRow, children: [
19647
+ /* @__PURE__ */ jsx57(Icon, { name: "file-check", size: 16, color: colors.primary, strokeWidth: 2 }),
19648
+ /* @__PURE__ */ jsx57(Text34, { style: [styles44.title, { color: colors.text }], children: meta.title || t("documentRequestedLabel") || "Document Requested" })
18895
19649
  ] }),
18896
- /* @__PURE__ */ jsx53(
19650
+ /* @__PURE__ */ jsx57(
18897
19651
  PCBadge,
18898
19652
  {
18899
19653
  status: STATUS_BADGE_MAP[status] || "info",
@@ -18901,30 +19655,30 @@ function DocumentRequestCard({ message, onUpload, isSubmitting, isCaseFinalized
18901
19655
  }
18902
19656
  )
18903
19657
  ] }),
18904
- meta.accepted_document ? /* @__PURE__ */ jsx53(Text33, { style: [styles42.accepted, { color: colors.textSecondary }], children: t("acceptedLabel", {
19658
+ meta.accepted_document ? /* @__PURE__ */ jsx57(Text34, { style: [styles44.accepted, { color: colors.textSecondary }], children: t("acceptedLabel", {
18905
19659
  accepted: meta.accepted_document,
18906
19660
  defaultValue: `Accepted: ${meta.accepted_document}`
18907
19661
  }) }) : null,
18908
- meta.rejection_reason ? /* @__PURE__ */ jsxs35(View41, { style: [styles42.rejectionBox, { backgroundColor: colors.errorSoft }], children: [
18909
- /* @__PURE__ */ jsxs35(Text33, { style: [styles42.rejectionLabel, { color: colors.error }], children: [
19662
+ meta.rejection_reason ? /* @__PURE__ */ jsxs36(View43, { style: [styles44.rejectionBox, { backgroundColor: colors.errorSoft }], children: [
19663
+ /* @__PURE__ */ jsxs36(Text34, { style: [styles44.rejectionLabel, { color: colors.error }], children: [
18910
19664
  t("rejectionReasonLabel") || "Rejection reason",
18911
19665
  ":"
18912
19666
  ] }),
18913
- /* @__PURE__ */ jsx53(Text33, { style: [styles42.rejectionText, { color: colors.error }], children: meta.rejection_reason })
19667
+ /* @__PURE__ */ jsx57(Text34, { style: [styles44.rejectionText, { color: colors.error }], children: meta.rejection_reason })
18914
19668
  ] }) : null,
18915
- canUpload && requestEventUuid ? /* @__PURE__ */ jsx53(
18916
- TouchableOpacity16,
19669
+ canUpload && requestEventUuid ? /* @__PURE__ */ jsx57(
19670
+ TouchableOpacity17,
18917
19671
  {
18918
- style: [styles42.uploadButton, { backgroundColor: colors.primary }],
19672
+ style: [styles44.uploadButton, { backgroundColor: colors.primary }],
18919
19673
  onPress: () => onUpload(requestEventUuid),
18920
19674
  disabled: isSubmitting,
18921
19675
  activeOpacity: 0.7,
18922
- children: /* @__PURE__ */ jsx53(Text33, { style: [styles42.uploadButtonText, { color: colors.primaryText }], children: isSubmitting ? t("loading") || "Loading..." : t("uploadAndSubmit") || "Upload & Submit" })
19676
+ children: /* @__PURE__ */ jsx57(Text34, { style: [styles44.uploadButtonText, { color: colors.primaryText }], children: isSubmitting ? t("loading") || "Loading..." : t("uploadAndSubmit") || "Upload & Submit" })
18923
19677
  }
18924
19678
  ) : null
18925
19679
  ] });
18926
19680
  }
18927
- var styles42 = StyleSheet43.create({
19681
+ var styles44 = StyleSheet45.create({
18928
19682
  container: {
18929
19683
  borderWidth: 1.5,
18930
19684
  borderStyle: "dashed",
@@ -18977,20 +19731,20 @@ var styles42 = StyleSheet43.create({
18977
19731
  });
18978
19732
 
18979
19733
  // src/RedactoPrivacyCenter/components/CaseDetails/StatusEvent.tsx
18980
- import { StyleSheet as StyleSheet44, Text as Text34, View as View42 } from "react-native";
18981
- import { jsx as jsx54, jsxs as jsxs36 } from "react/jsx-runtime";
19734
+ import { StyleSheet as StyleSheet46, Text as Text35, View as View44 } from "react-native";
19735
+ import { jsx as jsx58, jsxs as jsxs37 } from "react/jsx-runtime";
18982
19736
  function StatusEvent({ icon, color, bgColor, borderColor, text, subText, timestamp }) {
18983
19737
  const { colors } = useTheme();
18984
- return /* @__PURE__ */ jsxs36(View42, { style: [styles43.container, { backgroundColor: bgColor }], children: [
18985
- /* @__PURE__ */ jsx54(View42, { style: [styles43.iconBubble, { backgroundColor: `${color}1F` }], children: icon }),
18986
- /* @__PURE__ */ jsxs36(View42, { style: styles43.textContainer, children: [
18987
- /* @__PURE__ */ jsx54(Text34, { style: [styles43.text, { color }], children: text }),
18988
- subText ? /* @__PURE__ */ jsx54(Text34, { style: [styles43.subText, { color: colors.textSecondary }], numberOfLines: 2, children: subText }) : null
19738
+ return /* @__PURE__ */ jsxs37(View44, { style: [styles45.container, { backgroundColor: bgColor }], children: [
19739
+ /* @__PURE__ */ jsx58(View44, { style: [styles45.iconBubble, { backgroundColor: `${color}1F` }], children: icon }),
19740
+ /* @__PURE__ */ jsxs37(View44, { style: styles45.textContainer, children: [
19741
+ /* @__PURE__ */ jsx58(Text35, { style: [styles45.text, { color }], children: text }),
19742
+ subText ? /* @__PURE__ */ jsx58(Text35, { style: [styles45.subText, { color: colors.textSecondary }], numberOfLines: 2, children: subText }) : null
18989
19743
  ] }),
18990
- /* @__PURE__ */ jsx54(Text34, { style: [styles43.timestamp, { color: colors.textSecondary }], children: formatMessageTime(timestamp) })
19744
+ /* @__PURE__ */ jsx58(Text35, { style: [styles45.timestamp, { color: colors.textSecondary }], children: formatMessageTime(timestamp) })
18991
19745
  ] });
18992
19746
  }
18993
- var styles43 = StyleSheet44.create({
19747
+ var styles45 = StyleSheet46.create({
18994
19748
  container: {
18995
19749
  flexDirection: "row",
18996
19750
  alignItems: "center",
@@ -19029,10 +19783,10 @@ var styles43 = StyleSheet44.create({
19029
19783
  });
19030
19784
 
19031
19785
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx
19032
- import { Fragment as Fragment12, jsx as jsx55, jsxs as jsxs37 } from "react/jsx-runtime";
19033
- var CheckIcon = ({ color }) => /* @__PURE__ */ jsx55(Icon, { name: "check", size: 14, color, strokeWidth: 2.6 });
19034
- var XIcon = ({ color }) => /* @__PURE__ */ jsx55(Icon, { name: "x", size: 14, color, strokeWidth: 2.6 });
19035
- var RefreshIcon = ({ color }) => /* @__PURE__ */ jsx55(Icon, { name: "refresh-cw", size: 14, color, strokeWidth: 2.2 });
19786
+ import { Fragment as Fragment12, jsx as jsx59, jsxs as jsxs38 } from "react/jsx-runtime";
19787
+ var CheckIcon = ({ color }) => /* @__PURE__ */ jsx59(Icon, { name: "check", size: 14, color, strokeWidth: 2.6 });
19788
+ var XIcon = ({ color }) => /* @__PURE__ */ jsx59(Icon, { name: "x", size: 14, color, strokeWidth: 2.6 });
19789
+ var RefreshIcon = ({ color }) => /* @__PURE__ */ jsx59(Icon, { name: "refresh-cw", size: 14, color, strokeWidth: 2.2 });
19036
19790
  function MessageItemImpl({
19037
19791
  message,
19038
19792
  onUploadForRequest,
@@ -19042,14 +19796,14 @@ function MessageItemImpl({
19042
19796
  isLastInGroup = true
19043
19797
  }) {
19044
19798
  var _a3, _b;
19045
- const { t } = useTranslation22();
19799
+ const { t } = useTranslation24();
19046
19800
  const isPrincipal = message.sender_role === "data_principal";
19047
19801
  const senderLabel = isPrincipal ? t("senderYou") || "You" : t("senderPrivacyTeam") || "Privacy Team";
19048
19802
  switch (message.message_type) {
19049
19803
  case "message_sent":
19050
19804
  case "document_submitted":
19051
19805
  case "document_replaced":
19052
- return /* @__PURE__ */ jsx55(
19806
+ return /* @__PURE__ */ jsx59(
19053
19807
  ChatBubble,
19054
19808
  {
19055
19809
  message,
@@ -19061,8 +19815,8 @@ function MessageItemImpl({
19061
19815
  }
19062
19816
  );
19063
19817
  case "document_requested":
19064
- return /* @__PURE__ */ jsxs37(Fragment12, { children: [
19065
- /* @__PURE__ */ jsx55(
19818
+ return /* @__PURE__ */ jsxs38(Fragment12, { children: [
19819
+ /* @__PURE__ */ jsx59(
19066
19820
  ChatBubble,
19067
19821
  {
19068
19822
  message,
@@ -19073,7 +19827,7 @@ function MessageItemImpl({
19073
19827
  isLastInGroup
19074
19828
  }
19075
19829
  ),
19076
- /* @__PURE__ */ jsx55(
19830
+ /* @__PURE__ */ jsx59(
19077
19831
  DocumentRequestCard,
19078
19832
  {
19079
19833
  message,
@@ -19084,10 +19838,10 @@ function MessageItemImpl({
19084
19838
  )
19085
19839
  ] });
19086
19840
  case "document_approved":
19087
- return /* @__PURE__ */ jsx55(
19841
+ return /* @__PURE__ */ jsx59(
19088
19842
  StatusEvent,
19089
19843
  {
19090
- icon: /* @__PURE__ */ jsx55(CheckIcon, { color: "#059669" }),
19844
+ icon: /* @__PURE__ */ jsx59(CheckIcon, { color: "#059669" }),
19091
19845
  color: "#059669",
19092
19846
  bgColor: "rgba(16, 185, 129, 0.08)",
19093
19847
  borderColor: "rgba(16, 185, 129, 0.2)",
@@ -19096,10 +19850,10 @@ function MessageItemImpl({
19096
19850
  }
19097
19851
  );
19098
19852
  case "document_rejected":
19099
- return /* @__PURE__ */ jsx55(
19853
+ return /* @__PURE__ */ jsx59(
19100
19854
  StatusEvent,
19101
19855
  {
19102
- icon: /* @__PURE__ */ jsx55(XIcon, { color: "#DC2626" }),
19856
+ icon: /* @__PURE__ */ jsx59(XIcon, { color: "#DC2626" }),
19103
19857
  color: "#DC2626",
19104
19858
  bgColor: "rgba(220, 38, 38, 0.08)",
19105
19859
  borderColor: "rgba(220, 38, 38, 0.2)",
@@ -19109,10 +19863,10 @@ function MessageItemImpl({
19109
19863
  }
19110
19864
  );
19111
19865
  case "document_replacement_requested":
19112
- return /* @__PURE__ */ jsx55(
19866
+ return /* @__PURE__ */ jsx59(
19113
19867
  StatusEvent,
19114
19868
  {
19115
- icon: /* @__PURE__ */ jsx55(RefreshIcon, { color: "#D97706" }),
19869
+ icon: /* @__PURE__ */ jsx59(RefreshIcon, { color: "#D97706" }),
19116
19870
  color: "#D97706",
19117
19871
  bgColor: "rgba(245, 158, 11, 0.08)",
19118
19872
  borderColor: "rgba(245, 158, 11, 0.2)",
@@ -19122,7 +19876,7 @@ function MessageItemImpl({
19122
19876
  }
19123
19877
  );
19124
19878
  default:
19125
- return /* @__PURE__ */ jsx55(
19879
+ return /* @__PURE__ */ jsx59(
19126
19880
  ChatBubble,
19127
19881
  {
19128
19882
  message,
@@ -19135,22 +19889,22 @@ function MessageItemImpl({
19135
19889
  );
19136
19890
  }
19137
19891
  }
19138
- var MessageItem = React22.memo(MessageItemImpl);
19892
+ var MessageItem = React23.memo(MessageItemImpl);
19139
19893
 
19140
19894
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageComposer.tsx
19141
- import { useEffect as useEffect16, useRef as useRef9 } from "react";
19895
+ import { useEffect as useEffect17, useRef as useRef9 } from "react";
19142
19896
  import {
19143
19897
  ActivityIndicator as ActivityIndicator6,
19144
19898
  Animated as Animated12,
19145
19899
  Easing as Easing3,
19146
- StyleSheet as StyleSheet45,
19147
- Text as Text35,
19900
+ StyleSheet as StyleSheet47,
19901
+ Text as Text36,
19148
19902
  TextInput as TextInput3,
19149
- TouchableOpacity as TouchableOpacity17,
19150
- View as View43
19903
+ TouchableOpacity as TouchableOpacity18,
19904
+ View as View45
19151
19905
  } from "react-native";
19152
- import { useTranslation as useTranslation23 } from "react-i18next";
19153
- import { jsx as jsx56, jsxs as jsxs38 } from "react/jsx-runtime";
19906
+ import { useTranslation as useTranslation25 } from "react-i18next";
19907
+ import { jsx as jsx60, jsxs as jsxs39 } from "react/jsx-runtime";
19154
19908
  function MessageComposer({
19155
19909
  messageText,
19156
19910
  onMessageTextChange,
@@ -19162,11 +19916,11 @@ function MessageComposer({
19162
19916
  isUploading,
19163
19917
  isCaseFinalized = false
19164
19918
  }) {
19165
- const { t } = useTranslation23();
19919
+ const { t } = useTranslation25();
19166
19920
  const { colors } = useTheme();
19167
19921
  const canSend = (messageText.trim().length > 0 || pendingUpload) && !isSending && !isUploading && !isCaseFinalized;
19168
19922
  const activate = useRef9(new Animated12.Value(canSend ? 1 : 0)).current;
19169
- useEffect16(() => {
19923
+ useEffect17(() => {
19170
19924
  Animated12.timing(activate, {
19171
19925
  toValue: canSend ? 1 : 0,
19172
19926
  duration: 180,
@@ -19186,7 +19940,7 @@ function MessageComposer({
19186
19940
  Animated12.spring(pressScale, { toValue: 1, useNativeDriver: true, speed: 20, bounciness: 6 }).start();
19187
19941
  };
19188
19942
  const pillIn = useRef9(new Animated12.Value(0)).current;
19189
- useEffect16(() => {
19943
+ useEffect17(() => {
19190
19944
  Animated12.timing(pillIn, {
19191
19945
  toValue: pendingUpload ? 1 : 0,
19192
19946
  duration: 220,
@@ -19196,12 +19950,12 @@ function MessageComposer({
19196
19950
  }, [pendingUpload, pillIn]);
19197
19951
  const pillOpacity = pillIn;
19198
19952
  const pillTranslateY = pillIn.interpolate({ inputRange: [0, 1], outputRange: [8, 0] });
19199
- return /* @__PURE__ */ jsxs38(View43, { style: [styles44.container, { borderTopColor: colors.hairline, backgroundColor: colors.canvasSubtle, paddingBottom: spacing.sm }], children: [
19200
- pendingUpload && /* @__PURE__ */ jsxs38(
19953
+ return /* @__PURE__ */ jsxs39(View45, { style: [styles46.container, { borderTopColor: colors.hairline, backgroundColor: colors.canvasSubtle, paddingBottom: spacing.sm }], children: [
19954
+ pendingUpload && /* @__PURE__ */ jsxs39(
19201
19955
  Animated12.View,
19202
19956
  {
19203
19957
  style: [
19204
- styles44.uploadPill,
19958
+ styles46.uploadPill,
19205
19959
  {
19206
19960
  backgroundColor: colors.primarySoft,
19207
19961
  opacity: pillOpacity,
@@ -19209,34 +19963,34 @@ function MessageComposer({
19209
19963
  }
19210
19964
  ],
19211
19965
  children: [
19212
- /* @__PURE__ */ jsx56(Icon, { name: "file", size: 14, color: colors.primary }),
19213
- /* @__PURE__ */ jsxs38(Text35, { style: [styles44.uploadFileName, { color: colors.primary }], numberOfLines: 1, children: [
19966
+ /* @__PURE__ */ jsx60(Icon, { name: "file", size: 14, color: colors.primary }),
19967
+ /* @__PURE__ */ jsxs39(Text36, { style: [styles46.uploadFileName, { color: colors.primary }], numberOfLines: 1, children: [
19214
19968
  pendingUpload.file_name,
19215
19969
  " (",
19216
19970
  formatFileSize(pendingUpload.file_size),
19217
19971
  ")"
19218
19972
  ] }),
19219
- /* @__PURE__ */ jsx56(TouchableOpacity17, { onPress: onRemovePendingUpload, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }, children: /* @__PURE__ */ jsx56(Icon, { name: "x", size: 14, color: colors.textSecondary, strokeWidth: 2.4 }) })
19973
+ /* @__PURE__ */ jsx60(TouchableOpacity18, { onPress: onRemovePendingUpload, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }, children: /* @__PURE__ */ jsx60(Icon, { name: "x", size: 14, color: colors.textSecondary, strokeWidth: 2.4 }) })
19220
19974
  ]
19221
19975
  }
19222
19976
  ),
19223
- /* @__PURE__ */ jsxs38(View43, { style: [styles44.pill, { backgroundColor: colors.surface, borderColor: colors.border }, isCaseFinalized && styles44.pillDisabled], children: [
19224
- /* @__PURE__ */ jsx56(
19225
- TouchableOpacity17,
19977
+ /* @__PURE__ */ jsxs39(View45, { style: [styles46.pill, { backgroundColor: colors.surface, borderColor: colors.border }, isCaseFinalized && styles46.pillDisabled], children: [
19978
+ /* @__PURE__ */ jsx60(
19979
+ TouchableOpacity18,
19226
19980
  {
19227
- style: styles44.attachButton,
19981
+ style: styles46.attachButton,
19228
19982
  onPress: onAttachClick,
19229
19983
  disabled: isUploading || isCaseFinalized,
19230
19984
  activeOpacity: 0.6,
19231
19985
  hitSlop: DEFAULT_HIT_SLOP,
19232
19986
  accessibilityLabel: t("uploadFile") || "Attach file",
19233
- children: isUploading ? /* @__PURE__ */ jsx56(ActivityIndicator6, { size: "small", color: colors.primary }) : /* @__PURE__ */ jsx56(Icon, { name: "paperclip", size: 20, color: colors.textSecondary })
19987
+ children: isUploading ? /* @__PURE__ */ jsx60(ActivityIndicator6, { size: "small", color: colors.primary }) : /* @__PURE__ */ jsx60(Icon, { name: "paperclip", size: 20, color: colors.textSecondary })
19234
19988
  }
19235
19989
  ),
19236
- /* @__PURE__ */ jsx56(
19990
+ /* @__PURE__ */ jsx60(
19237
19991
  TextInput3,
19238
19992
  {
19239
- style: [styles44.input, { color: colors.text }],
19993
+ style: [styles46.input, { color: colors.text }],
19240
19994
  value: messageText,
19241
19995
  onChangeText: onMessageTextChange,
19242
19996
  placeholder: t("messageInputPlaceholder", { defaultValue: "Message\u2026" }),
@@ -19246,8 +20000,8 @@ function MessageComposer({
19246
20000
  editable: !isSending && !isCaseFinalized
19247
20001
  }
19248
20002
  ),
19249
- /* @__PURE__ */ jsx56(Animated12.View, { style: { transform: [{ scale: pressScale }] }, children: /* @__PURE__ */ jsx56(
19250
- TouchableOpacity17,
20003
+ /* @__PURE__ */ jsx60(Animated12.View, { style: { transform: [{ scale: pressScale }] }, children: /* @__PURE__ */ jsx60(
20004
+ TouchableOpacity18,
19251
20005
  {
19252
20006
  onPress: onSend,
19253
20007
  onPressIn: handlePressIn,
@@ -19255,15 +20009,15 @@ function MessageComposer({
19255
20009
  disabled: !canSend,
19256
20010
  activeOpacity: 0.85,
19257
20011
  accessibilityLabel: t("send") || "Send",
19258
- children: /* @__PURE__ */ jsx56(Animated12.View, { style: [styles44.sendButton, { backgroundColor: sendBgColor }], children: isSending ? /* @__PURE__ */ jsx56(ActivityIndicator6, { size: "small", color: colors.primaryText }) : /* @__PURE__ */ jsx56(View43, { style: styles44.sendIcon, children: /* @__PURE__ */ jsx56(Icon, { name: "send", size: 18, color: canSend ? colors.primaryText : colors.textSecondary }) }) })
20012
+ children: /* @__PURE__ */ jsx60(Animated12.View, { style: [styles46.sendButton, { backgroundColor: sendBgColor }], children: isSending ? /* @__PURE__ */ jsx60(ActivityIndicator6, { size: "small", color: colors.primaryText }) : /* @__PURE__ */ jsx60(View45, { style: styles46.sendIcon, children: /* @__PURE__ */ jsx60(Icon, { name: "send", size: 18, color: canSend ? colors.primaryText : colors.textSecondary }) }) })
19259
20013
  }
19260
20014
  ) })
19261
20015
  ] })
19262
20016
  ] });
19263
20017
  }
19264
- var styles44 = StyleSheet45.create({
20018
+ var styles46 = StyleSheet47.create({
19265
20019
  container: {
19266
- borderTopWidth: StyleSheet45.hairlineWidth,
20020
+ borderTopWidth: StyleSheet47.hairlineWidth,
19267
20021
  paddingHorizontal: spacing.md,
19268
20022
  paddingVertical: spacing.sm
19269
20023
  },
@@ -19286,7 +20040,7 @@ var styles44 = StyleSheet45.create({
19286
20040
  pill: {
19287
20041
  flexDirection: "row",
19288
20042
  alignItems: "center",
19289
- borderWidth: StyleSheet45.hairlineWidth,
20043
+ borderWidth: StyleSheet47.hairlineWidth,
19290
20044
  borderRadius: radii.xxl + 4,
19291
20045
  paddingHorizontal: spacing.xs + 2,
19292
20046
  paddingVertical: spacing.xs,
@@ -19325,7 +20079,7 @@ var styles44 = StyleSheet45.create({
19325
20079
  });
19326
20080
 
19327
20081
  // src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
19328
- import { Fragment as Fragment13, jsx as jsx57, jsxs as jsxs39 } from "react/jsx-runtime";
20082
+ import { Fragment as Fragment13, jsx as jsx61, jsxs as jsxs40 } from "react/jsx-runtime";
19329
20083
  var STREAK_GAP_MS = 5 * 60 * 1e3;
19330
20084
  function isStreakBoundary(a, b) {
19331
20085
  if (!a || !b) return true;
@@ -19355,7 +20109,7 @@ function sameDay(a, b) {
19355
20109
  }
19356
20110
  var MESSAGE_POLL_INTERVAL = 3e4;
19357
20111
  function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19358
- const { t } = useTranslation24();
20112
+ const { t } = useTranslation26();
19359
20113
  const { accessToken, refreshToken, email, organizationId, workspaceId, onError, updateTokens } = useAuth();
19360
20114
  const { consentClient } = useBaseUrl();
19361
20115
  const { colors } = useTheme();
@@ -19371,13 +20125,13 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19371
20125
  caseUuid,
19372
20126
  authContext
19373
20127
  );
19374
- const [messageText, setMessageText] = useState22("");
19375
- const [pendingUpload, setPendingUpload] = useState22(null);
19376
- const [isSending, setIsSending] = useState22(false);
19377
- const [isUploading, setIsUploading] = useState22(false);
19378
- const [isSubmittingForRequest, setIsSubmittingForRequest] = useState22(false);
20128
+ const [messageText, setMessageText] = useState23("");
20129
+ const [pendingUpload, setPendingUpload] = useState23(null);
20130
+ const [isSending, setIsSending] = useState23(false);
20131
+ const [isUploading, setIsUploading] = useState23(false);
20132
+ const [isSubmittingForRequest, setIsSubmittingForRequest] = useState23(false);
19379
20133
  const flatListRef = useRef10(null);
19380
- useEffect17(() => {
20134
+ useEffect18(() => {
19381
20135
  if (messages && messages.length > 0) {
19382
20136
  setTimeout(() => {
19383
20137
  var _a3;
@@ -19387,14 +20141,17 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19387
20141
  }, [messages == null ? void 0 : messages.length]);
19388
20142
  const refetchRef = useRef10(refetch);
19389
20143
  refetchRef.current = refetch;
19390
- useEffect17(() => {
20144
+ const authContextRef = useRef10(authContext);
20145
+ authContextRef.current = authContext;
20146
+ useEffect18(() => {
19391
20147
  if (isCaseFinalized) return;
19392
20148
  const id = setInterval(() => {
20149
+ if (isRefreshBlocked(authContextRef.current)) return;
19393
20150
  refetchRef.current();
19394
20151
  }, MESSAGE_POLL_INTERVAL);
19395
20152
  return () => clearInterval(id);
19396
20153
  }, [isCaseFinalized]);
19397
- const handleSend = useCallback11(async () => {
20154
+ const handleSend = useCallback12(async () => {
19398
20155
  if (isCaseFinalized) return;
19399
20156
  if (!messageText.trim() && !pendingUpload) return;
19400
20157
  if (!organizationId || !workspaceId) return;
@@ -19419,7 +20176,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19419
20176
  setIsSending(false);
19420
20177
  }
19421
20178
  }, [isCaseFinalized, messageText, pendingUpload, organizationId, workspaceId, caseUuid, authContext, consentClient, refetch]);
19422
- const handleAttach = useCallback11(async () => {
20179
+ const handleAttach = useCallback12(async () => {
19423
20180
  if (isCaseFinalized) return;
19424
20181
  if (!organizationId || !workspaceId) return;
19425
20182
  try {
@@ -19454,7 +20211,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19454
20211
  setIsUploading(false);
19455
20212
  }
19456
20213
  }, [isCaseFinalized, organizationId, workspaceId, caseUuid, authContext, consentClient]);
19457
- const handleUploadForRequest = useCallback11((_requestEventUuid) => {
20214
+ const handleUploadForRequest = useCallback12((_requestEventUuid) => {
19458
20215
  handleAttach();
19459
20216
  }, [handleAttach]);
19460
20217
  const messagesList = useMemo19(() => {
@@ -19466,17 +20223,17 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19466
20223
  });
19467
20224
  return list;
19468
20225
  }, [messages]);
19469
- const keyExtractor = useCallback11((item) => item.uuid, []);
19470
- const renderMessage = useCallback11(
20226
+ const keyExtractor = useCallback12((item) => item.uuid, []);
20227
+ const renderMessage = useCallback12(
19471
20228
  ({ item, index }) => {
19472
20229
  const prev = index > 0 ? messagesList[index - 1] : void 0;
19473
20230
  const next = index < messagesList.length - 1 ? messagesList[index + 1] : void 0;
19474
20231
  const isFirstInGroup = isStreakBoundary(prev, item);
19475
20232
  const isLastInGroup = isStreakBoundary(item, next);
19476
20233
  const dateSeparator = getDateSeparator(prev == null ? void 0 : prev.created_at, item.created_at, t);
19477
- return /* @__PURE__ */ jsxs39(Fragment13, { children: [
19478
- dateSeparator ? /* @__PURE__ */ jsx57(View44, { style: styles45.daySeparator, children: /* @__PURE__ */ jsx57(View44, { style: [styles45.dayPill, { backgroundColor: colors.surfaceAlt }], children: /* @__PURE__ */ jsx57(Text36, { style: [styles45.dayPillText, { color: colors.textSecondary }], children: dateSeparator }) }) }) : null,
19479
- /* @__PURE__ */ jsx57(
20234
+ return /* @__PURE__ */ jsxs40(Fragment13, { children: [
20235
+ dateSeparator ? /* @__PURE__ */ jsx61(View46, { style: styles47.daySeparator, children: /* @__PURE__ */ jsx61(View46, { style: [styles47.dayPill, { backgroundColor: colors.surfaceAlt }], children: /* @__PURE__ */ jsx61(Text37, { style: [styles47.dayPillText, { color: colors.textSecondary }], children: dateSeparator }) }) }) : null,
20236
+ /* @__PURE__ */ jsx61(
19480
20237
  MessageItem,
19481
20238
  {
19482
20239
  message: item,
@@ -19492,32 +20249,32 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19492
20249
  [messagesList, handleUploadForRequest, isSubmittingForRequest, isCaseFinalized, colors, t]
19493
20250
  );
19494
20251
  if (isLoading) {
19495
- return /* @__PURE__ */ jsx57(View44, { style: styles45.centered, children: /* @__PURE__ */ jsx57(ActivityIndicator7, { size: "large", color: colors.primary }) });
20252
+ return /* @__PURE__ */ jsx61(View46, { style: styles47.centered, children: /* @__PURE__ */ jsx61(ActivityIndicator7, { size: "large", color: colors.primary }) });
19496
20253
  }
19497
20254
  if (error) {
19498
- return /* @__PURE__ */ jsx57(View44, { style: styles45.centered, children: /* @__PURE__ */ jsx57(Text36, { style: [styles45.errorText, { color: colors.error }], children: t("errorLoadingMessages") || "Error loading messages" }) });
20255
+ return /* @__PURE__ */ jsx61(View46, { style: styles47.centered, children: /* @__PURE__ */ jsx61(Text37, { style: [styles47.errorText, { color: colors.error }], children: t("errorLoadingMessages") || "Error loading messages" }) });
19499
20256
  }
19500
- return /* @__PURE__ */ jsxs39(View44, { style: [styles45.container, { backgroundColor: colors.canvasSubtle }], children: [
19501
- /* @__PURE__ */ jsxs39(View44, { style: styles45.secureRow, children: [
19502
- /* @__PURE__ */ jsx57(Icon, { name: "lock", size: 12, color: colors.textSecondary, strokeWidth: 2.2 }),
19503
- /* @__PURE__ */ jsx57(Text36, { style: [styles45.secureText, { color: colors.textSecondary }], children: isCaseFinalized ? t("caseFinalizedMessagesTooltip") || "This case is finalized \u2014 messages can no longer be sent." : `${t("private", { defaultValue: "Private" })} \xB7 ${t("senderPrivacyTeam") || "Privacy Team"}` })
20257
+ return /* @__PURE__ */ jsxs40(View46, { style: [styles47.container, { backgroundColor: colors.canvasSubtle }], children: [
20258
+ /* @__PURE__ */ jsxs40(View46, { style: styles47.secureRow, children: [
20259
+ /* @__PURE__ */ jsx61(Icon, { name: "lock", size: 12, color: colors.textSecondary, strokeWidth: 2.2 }),
20260
+ /* @__PURE__ */ jsx61(Text37, { style: [styles47.secureText, { color: colors.textSecondary }], children: isCaseFinalized ? t("caseFinalizedMessagesTooltip") || "This case is finalized \u2014 messages can no longer be sent." : `${t("private", { defaultValue: "Private" })} \xB7 ${t("senderPrivacyTeam") || "Privacy Team"}` })
19504
20261
  ] }),
19505
- /* @__PURE__ */ jsx57(
20262
+ /* @__PURE__ */ jsx61(
19506
20263
  FlatList2,
19507
20264
  {
19508
20265
  ref: flatListRef,
19509
- style: styles45.list,
20266
+ style: styles47.list,
19510
20267
  data: messagesList,
19511
20268
  keyExtractor,
19512
20269
  renderItem: renderMessage,
19513
20270
  contentContainerStyle: [
19514
- styles45.messagesList,
19515
- messagesList.length ? styles45.messagesListFill : styles45.messagesListCenter
20271
+ styles47.messagesList,
20272
+ messagesList.length ? styles47.messagesListFill : styles47.messagesListCenter
19516
20273
  ],
19517
- ListEmptyComponent: /* @__PURE__ */ jsxs39(View44, { style: styles45.emptyContainer, children: [
19518
- /* @__PURE__ */ jsx57(View44, { style: [styles45.emptyIconWrap, { backgroundColor: colors.primarySoft }], children: /* @__PURE__ */ jsx57(Icon, { name: "messages-square", size: 28, color: colors.primary, strokeWidth: 2 }) }),
19519
- /* @__PURE__ */ jsx57(Text36, { style: [styles45.emptyTitle, { color: colors.text }], children: t("noMessagesYet") || "No messages yet" }),
19520
- /* @__PURE__ */ jsx57(Text36, { style: [styles45.emptySubtitle, { color: colors.textSecondary }], children: t("noMessagesYetSubtitle", "Start the conversation below") })
20274
+ ListEmptyComponent: /* @__PURE__ */ jsxs40(View46, { style: styles47.emptyContainer, children: [
20275
+ /* @__PURE__ */ jsx61(View46, { style: [styles47.emptyIconWrap, { backgroundColor: colors.primarySoft }], children: /* @__PURE__ */ jsx61(Icon, { name: "messages-square", size: 28, color: colors.primary, strokeWidth: 2 }) }),
20276
+ /* @__PURE__ */ jsx61(Text37, { style: [styles47.emptyTitle, { color: colors.text }], children: t("noMessagesYet") || "No messages yet" }),
20277
+ /* @__PURE__ */ jsx61(Text37, { style: [styles47.emptySubtitle, { color: colors.textSecondary }], children: t("noMessagesYetSubtitle", "Start the conversation below") })
19521
20278
  ] }),
19522
20279
  onContentSizeChange: () => {
19523
20280
  var _a3;
@@ -19529,7 +20286,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19529
20286
  removeClippedSubviews: true
19530
20287
  }
19531
20288
  ),
19532
- /* @__PURE__ */ jsx57(
20289
+ /* @__PURE__ */ jsx61(
19533
20290
  MessageComposer,
19534
20291
  {
19535
20292
  messageText,
@@ -19545,7 +20302,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19545
20302
  )
19546
20303
  ] });
19547
20304
  }
19548
- var styles45 = StyleSheet46.create({
20305
+ var styles47 = StyleSheet48.create({
19549
20306
  container: {
19550
20307
  flex: 1
19551
20308
  },
@@ -19628,16 +20385,16 @@ var styles45 = StyleSheet46.create({
19628
20385
  });
19629
20386
 
19630
20387
  // src/RedactoPrivacyCenter/components/CaseDetails/CaseDetailsPage.tsx
19631
- import { jsx as jsx58, jsxs as jsxs40 } from "react/jsx-runtime";
20388
+ import { jsx as jsx62, jsxs as jsxs41 } from "react/jsx-runtime";
19632
20389
  function CaseDetailsPage() {
19633
20390
  var _a3, _b;
19634
- const { t } = useTranslation25();
20391
+ const { t } = useTranslation27();
19635
20392
  const { navigateTo, selectedCase, setSelectedCase, pendingCaseUuid } = useInternalNavigation();
19636
20393
  const { accessToken, refreshToken, email, organizationId, workspaceId, onError, updateTokens } = useAuth();
19637
20394
  const { colors } = useTheme();
19638
20395
  const { keyboardOffset } = usePrivacyCenterInsets();
19639
20396
  const requestTypeLabels = useRequestTypeLabels();
19640
- const [activeTab, setActiveTab] = useState23("request-details");
20397
+ const [activeTab, setActiveTab] = useState24("request-details");
19641
20398
  const authContext = useMemo20(() => ({
19642
20399
  accessToken,
19643
20400
  refreshToken,
@@ -19651,7 +20408,7 @@ function CaseDetailsPage() {
19651
20408
  email != null ? email : void 0,
19652
20409
  authContext
19653
20410
  );
19654
- useEffect18(() => {
20411
+ useEffect19(() => {
19655
20412
  if (!cases) return;
19656
20413
  if (cases.length === 0) {
19657
20414
  navigateTo("form");
@@ -19665,33 +20422,33 @@ function CaseDetailsPage() {
19665
20422
  navigateTo("form");
19666
20423
  }
19667
20424
  }, [cases, targetUuid, setSelectedCase, navigateTo]);
19668
- useEffect18(() => {
20425
+ useEffect19(() => {
19669
20426
  if (!selectedCase && !targetUuid && !isLoading) {
19670
20427
  navigateTo("form");
19671
20428
  }
19672
20429
  }, [selectedCase, targetUuid, isLoading, navigateTo]);
19673
20430
  if (!selectedCase) {
19674
- return /* @__PURE__ */ jsx58(View45, { style: styles46.centered, children: isLoading ? /* @__PURE__ */ jsx58(ActivityIndicator8, { size: "large", color: colors.primary }) : /* @__PURE__ */ jsx58(Text37, { style: [styles46.emptyText, { color: colors.textSecondary }], children: t("noCasesYet") || "No case selected" }) });
20431
+ return /* @__PURE__ */ jsx62(View47, { style: styles48.centered, children: isLoading ? /* @__PURE__ */ jsx62(ActivityIndicator8, { size: "large", color: colors.primary }) : /* @__PURE__ */ jsx62(Text38, { style: [styles48.emptyText, { color: colors.textSecondary }], children: t("noCasesYet") || "No case selected" }) });
19675
20432
  }
19676
20433
  const requestTypeLabel = requestTypeLabels[(_b = selectedCase.request_type) == null ? void 0 : _b.toUpperCase()] || selectedCase.request_type_display || formatCaseStatus(selectedCase.request_type || "");
19677
20434
  const tabs = [
19678
20435
  { id: "request-details", label: t("requestDetails") || "Request Details" },
19679
20436
  { id: "messages", label: t("messages") || "Messages" }
19680
20437
  ];
19681
- return /* @__PURE__ */ jsxs40(
20438
+ return /* @__PURE__ */ jsxs41(
19682
20439
  KeyboardAvoidingViewCompat,
19683
20440
  {
19684
- style: [styles46.container, { backgroundColor: colors.canvasSubtle }],
20441
+ style: [styles48.container, { backgroundColor: colors.canvasSubtle }],
19685
20442
  behavior: "padding",
19686
20443
  keyboardVerticalOffset: Platform7.OS === "ios" ? keyboardOffset : 0,
19687
20444
  children: [
19688
- /* @__PURE__ */ jsxs40(View45, { style: styles46.headerWrap, children: [
19689
- /* @__PURE__ */ jsx58(View45, { style: [styles46.heroCard, elevation.card, { backgroundColor: colors.surface }], children: /* @__PURE__ */ jsxs40(View45, { style: styles46.heroInner, children: [
19690
- /* @__PURE__ */ jsx58(View45, { style: [styles46.accent, { backgroundColor: getCaseStatusColor(selectedCase.status, colors) }] }),
19691
- /* @__PURE__ */ jsxs40(View45, { style: styles46.heroBody, children: [
19692
- /* @__PURE__ */ jsxs40(View45, { style: styles46.heroTopRow, children: [
19693
- /* @__PURE__ */ jsx58(View45, { style: [styles46.typeChip, { backgroundColor: withAlpha(getRequestTypeColor(selectedCase.request_type, colors), 0.12) }], children: /* @__PURE__ */ jsx58(Text37, { style: [styles46.typeChipText, { color: getRequestTypeColor(selectedCase.request_type, colors) }], numberOfLines: 1, children: requestTypeLabel }) }),
19694
- /* @__PURE__ */ jsx58(
20445
+ /* @__PURE__ */ jsxs41(View47, { style: styles48.headerWrap, children: [
20446
+ /* @__PURE__ */ jsx62(View47, { style: [styles48.heroCard, elevation.card, { backgroundColor: colors.surface }], children: /* @__PURE__ */ jsxs41(View47, { style: styles48.heroInner, children: [
20447
+ /* @__PURE__ */ jsx62(View47, { style: [styles48.accent, { backgroundColor: getCaseStatusColor(selectedCase.status, colors) }] }),
20448
+ /* @__PURE__ */ jsxs41(View47, { style: styles48.heroBody, children: [
20449
+ /* @__PURE__ */ jsxs41(View47, { style: styles48.heroTopRow, children: [
20450
+ /* @__PURE__ */ jsx62(View47, { style: [styles48.typeChip, { backgroundColor: withAlpha(getRequestTypeColor(selectedCase.request_type, colors), 0.12) }], children: /* @__PURE__ */ jsx62(Text38, { style: [styles48.typeChipText, { color: getRequestTypeColor(selectedCase.request_type, colors) }], numberOfLines: 1, children: requestTypeLabel }) }),
20451
+ /* @__PURE__ */ jsx62(
19695
20452
  PCBadge,
19696
20453
  {
19697
20454
  status: getCaseStatusVariant(selectedCase.status),
@@ -19700,10 +20457,10 @@ function CaseDetailsPage() {
19700
20457
  }
19701
20458
  )
19702
20459
  ] }),
19703
- /* @__PURE__ */ jsx58(Text37, { style: [styles46.caseId, { color: colors.text }], numberOfLines: 1, children: selectedCase.case_id })
20460
+ /* @__PURE__ */ jsx62(Text38, { style: [styles48.caseId, { color: colors.text }], numberOfLines: 1, children: selectedCase.case_id })
19704
20461
  ] })
19705
20462
  ] }) }),
19706
- /* @__PURE__ */ jsx58(
20463
+ /* @__PURE__ */ jsx62(
19707
20464
  Segmented,
19708
20465
  {
19709
20466
  options: tabs.map((tab) => ({ value: tab.id, label: tab.label })),
@@ -19712,18 +20469,18 @@ function CaseDetailsPage() {
19712
20469
  }
19713
20470
  )
19714
20471
  ] }),
19715
- /* @__PURE__ */ jsx58(View45, { style: styles46.tabContent, children: activeTab === "request-details" ? /* @__PURE__ */ jsx58(
20472
+ /* @__PURE__ */ jsx62(View47, { style: styles48.tabContent, children: activeTab === "request-details" ? /* @__PURE__ */ jsx62(
19716
20473
  RequestDetailsTab,
19717
20474
  {
19718
20475
  selectedCase,
19719
20476
  requestTypeLabel
19720
20477
  }
19721
- ) : /* @__PURE__ */ jsx58(MessagesTab, { caseUuid: selectedCase.uuid, isCaseFinalized: isTerminalCaseStatus(selectedCase.status) }) })
20478
+ ) : /* @__PURE__ */ jsx62(MessagesTab, { caseUuid: selectedCase.uuid, isCaseFinalized: isTerminalCaseStatus(selectedCase.status) }) })
19722
20479
  ]
19723
20480
  }
19724
20481
  );
19725
20482
  }
19726
- var styles46 = StyleSheet47.create({
20483
+ var styles48 = StyleSheet49.create({
19727
20484
  container: {
19728
20485
  flex: 1
19729
20486
  },
@@ -19788,36 +20545,36 @@ var styles46 = StyleSheet47.create({
19788
20545
  });
19789
20546
 
19790
20547
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationsScreen.tsx
19791
- import { useCallback as useCallback13, useEffect as useEffect19, useMemo as useMemo23, useRef as useRef12, useState as useState24 } from "react";
19792
- import { FlatList as FlatList3, RefreshControl as RefreshControl5, StyleSheet as StyleSheet52, Text as Text41, TouchableOpacity as TouchableOpacity21, View as View49 } from "react-native";
19793
- import { useTranslation as useTranslation27 } from "react-i18next";
20548
+ import { useCallback as useCallback14, useEffect as useEffect20, useMemo as useMemo23, useRef as useRef12, useState as useState25 } from "react";
20549
+ import { FlatList as FlatList3, RefreshControl as RefreshControl5, StyleSheet as StyleSheet54, Text as Text42, TouchableOpacity as TouchableOpacity22, View as View51 } from "react-native";
20550
+ import { useTranslation as useTranslation29 } from "react-i18next";
19794
20551
 
19795
20552
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx
19796
- import { StyleSheet as StyleSheet51, Text as Text40, TouchableOpacity as TouchableOpacity20, View as View48 } from "react-native";
19797
- import { useTranslation as useTranslation26 } from "react-i18next";
20553
+ import { StyleSheet as StyleSheet53, Text as Text41, TouchableOpacity as TouchableOpacity21, View as View50 } from "react-native";
20554
+ import { useTranslation as useTranslation28 } from "react-i18next";
19798
20555
 
19799
20556
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationCTAButton.tsx
19800
- import { StyleSheet as StyleSheet48, Text as Text38, TouchableOpacity as TouchableOpacity18 } from "react-native";
19801
- import { jsx as jsx59 } from "react/jsx-runtime";
20557
+ import { StyleSheet as StyleSheet50, Text as Text39, TouchableOpacity as TouchableOpacity19 } from "react-native";
20558
+ import { jsx as jsx63 } from "react/jsx-runtime";
19802
20559
  var NotificationCTAButton = ({ cta, onPress }) => {
19803
20560
  const { colors } = useTheme();
19804
20561
  const tone = cta.style === "danger" ? colors.error : colors.primary;
19805
20562
  const isPrimary = cta.style === "primary" || cta.style === "danger";
19806
- return /* @__PURE__ */ jsx59(
19807
- TouchableOpacity18,
20563
+ return /* @__PURE__ */ jsx63(
20564
+ TouchableOpacity19,
19808
20565
  {
19809
20566
  onPress,
19810
20567
  activeOpacity: 0.7,
19811
20568
  style: [
19812
- styles47.button,
20569
+ styles49.button,
19813
20570
  isPrimary ? { backgroundColor: tone } : { backgroundColor: colors.primarySoft }
19814
20571
  ],
19815
20572
  accessibilityRole: "button",
19816
- children: /* @__PURE__ */ jsx59(Text38, { style: [styles47.label, { color: isPrimary ? colors.primaryText : colors.primary }], numberOfLines: 1, children: cta.label })
20573
+ children: /* @__PURE__ */ jsx63(Text39, { style: [styles49.label, { color: isPrimary ? colors.primaryText : colors.primary }], numberOfLines: 1, children: cta.label })
19817
20574
  }
19818
20575
  );
19819
20576
  };
19820
- var styles47 = StyleSheet48.create({
20577
+ var styles49 = StyleSheet50.create({
19821
20578
  button: {
19822
20579
  paddingHorizontal: spacing.lg,
19823
20580
  paddingVertical: spacing.sm,
@@ -19832,8 +20589,8 @@ var styles47 = StyleSheet48.create({
19832
20589
  });
19833
20590
 
19834
20591
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationIcon.tsx
19835
- import { StyleSheet as StyleSheet49, View as View46 } from "react-native";
19836
- import { jsx as jsx60 } from "react/jsx-runtime";
20592
+ import { StyleSheet as StyleSheet51, View as View48 } from "react-native";
20593
+ import { jsx as jsx64 } from "react/jsx-runtime";
19837
20594
  var CATEGORY_ICON = {
19838
20595
  guardian: "user-round",
19839
20596
  consent: "clock",
@@ -19846,18 +20603,18 @@ var NotificationIcon = ({ notificationType, size = 40 }) => {
19846
20603
  var _a3;
19847
20604
  const category = (_a3 = TYPE_TO_ICON_CATEGORY[notificationType]) != null ? _a3 : "system";
19848
20605
  const color = ICON_COLORS[category];
19849
- return /* @__PURE__ */ jsx60(
19850
- View46,
20606
+ return /* @__PURE__ */ jsx64(
20607
+ View48,
19851
20608
  {
19852
20609
  style: [
19853
- styles48.wrap,
20610
+ styles50.wrap,
19854
20611
  { width: size, height: size, borderRadius: radii.md, backgroundColor: withAlpha(color, 0.13) }
19855
20612
  ],
19856
- children: /* @__PURE__ */ jsx60(Icon, { name: CATEGORY_ICON[category], size: Math.round(size * 0.5), color, strokeWidth: 2 })
20613
+ children: /* @__PURE__ */ jsx64(Icon, { name: CATEGORY_ICON[category], size: Math.round(size * 0.5), color, strokeWidth: 2 })
19857
20614
  }
19858
20615
  );
19859
20616
  };
19860
- var styles48 = StyleSheet49.create({
20617
+ var styles50 = StyleSheet51.create({
19861
20618
  wrap: {
19862
20619
  alignItems: "center",
19863
20620
  justifyContent: "center"
@@ -19866,8 +20623,8 @@ var styles48 = StyleSheet49.create({
19866
20623
 
19867
20624
  // src/RedactoPrivacyCenter/components/NotificationHub/SwipeableRow.tsx
19868
20625
  import { useMemo as useMemo21, useRef as useRef11 } from "react";
19869
- import { Animated as Animated13, PanResponder as PanResponder2, StyleSheet as StyleSheet50, Text as Text39, TouchableOpacity as TouchableOpacity19, View as View47 } from "react-native";
19870
- import { Fragment as Fragment14, jsx as jsx61, jsxs as jsxs41 } from "react/jsx-runtime";
20626
+ import { Animated as Animated13, PanResponder as PanResponder2, StyleSheet as StyleSheet52, Text as Text40, TouchableOpacity as TouchableOpacity20, View as View49 } from "react-native";
20627
+ import { Fragment as Fragment14, jsx as jsx65, jsxs as jsxs42 } from "react/jsx-runtime";
19871
20628
  var ACTION_WIDTH = 80;
19872
20629
  var CLAIM_THRESHOLD = 8;
19873
20630
  var SwipeableRow = ({ actions, background, children }) => {
@@ -19906,37 +20663,37 @@ var SwipeableRow = ({ actions, background, children }) => {
19906
20663
  [maxOpen]
19907
20664
  );
19908
20665
  if (actions.length === 0) {
19909
- return /* @__PURE__ */ jsx61(Fragment14, { children });
20666
+ return /* @__PURE__ */ jsx65(Fragment14, { children });
19910
20667
  }
19911
20668
  const runAction = (action) => {
19912
20669
  settle(0);
19913
20670
  action.onPress();
19914
20671
  };
19915
- return /* @__PURE__ */ jsxs41(View47, { style: styles49.root, children: [
19916
- /* @__PURE__ */ jsx61(View47, { style: styles49.actionsLayer, pointerEvents: "box-none", children: actions.map((action) => /* @__PURE__ */ jsxs41(
19917
- TouchableOpacity19,
20672
+ return /* @__PURE__ */ jsxs42(View49, { style: styles51.root, children: [
20673
+ /* @__PURE__ */ jsx65(View49, { style: styles51.actionsLayer, pointerEvents: "box-none", children: actions.map((action) => /* @__PURE__ */ jsxs42(
20674
+ TouchableOpacity20,
19918
20675
  {
19919
- style: [styles49.action, { width: ACTION_WIDTH, backgroundColor: toneColor2[action.tone] }],
20676
+ style: [styles51.action, { width: ACTION_WIDTH, backgroundColor: toneColor2[action.tone] }],
19920
20677
  onPress: () => runAction(action),
19921
20678
  activeOpacity: 0.85,
19922
20679
  accessibilityRole: "button",
19923
20680
  accessibilityLabel: action.label,
19924
20681
  children: [
19925
- /* @__PURE__ */ jsx61(Icon, { name: action.icon, size: 20, color: colors.primaryText, strokeWidth: 2.2 }),
19926
- /* @__PURE__ */ jsx61(Text39, { style: [styles49.actionLabel, { color: colors.primaryText }], numberOfLines: 1, children: action.label })
20682
+ /* @__PURE__ */ jsx65(Icon, { name: action.icon, size: 20, color: colors.primaryText, strokeWidth: 2.2 }),
20683
+ /* @__PURE__ */ jsx65(Text40, { style: [styles51.actionLabel, { color: colors.primaryText }], numberOfLines: 1, children: action.label })
19927
20684
  ]
19928
20685
  },
19929
20686
  action.key
19930
20687
  )) }),
19931
- /* @__PURE__ */ jsx61(Animated13.View, { style: [{ backgroundColor: background, transform: [{ translateX }] }], ...panResponder.panHandlers, children })
20688
+ /* @__PURE__ */ jsx65(Animated13.View, { style: [{ backgroundColor: background, transform: [{ translateX }] }], ...panResponder.panHandlers, children })
19932
20689
  ] });
19933
20690
  };
19934
- var styles49 = StyleSheet50.create({
20691
+ var styles51 = StyleSheet52.create({
19935
20692
  root: {
19936
20693
  position: "relative"
19937
20694
  },
19938
20695
  actionsLayer: {
19939
- ...StyleSheet50.absoluteFillObject,
20696
+ ...StyleSheet52.absoluteFillObject,
19940
20697
  flexDirection: "row",
19941
20698
  justifyContent: "flex-end"
19942
20699
  },
@@ -19969,10 +20726,10 @@ var formatTimeAgo = (dateString, t) => {
19969
20726
  };
19970
20727
 
19971
20728
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx
19972
- import { Fragment as Fragment15, jsx as jsx62, jsxs as jsxs42 } from "react/jsx-runtime";
20729
+ import { Fragment as Fragment15, jsx as jsx66, jsxs as jsxs43 } from "react/jsx-runtime";
19973
20730
  var NotificationRow = ({ notification, onPress, onMarkRead, onAcknowledge }) => {
19974
20731
  var _a3, _b;
19975
- const { t } = useTranslation26();
20732
+ const { t } = useTranslation28();
19976
20733
  const { colors } = useTheme();
19977
20734
  const isUnread = !notification.is_read;
19978
20735
  const statusLabel = notification.status_label_display || notification.status_label;
@@ -19999,35 +20756,35 @@ var NotificationRow = ({ notification, onPress, onMarkRead, onAcknowledge }) =>
19999
20756
  onPress: onAcknowledge
20000
20757
  });
20001
20758
  }
20002
- return /* @__PURE__ */ jsx62(SwipeableRow, { actions, background: colors.surface, children: /* @__PURE__ */ jsxs42(TouchableOpacity20, { onPress, activeOpacity: 0.6, accessibilityRole: "button", style: styles50.row, children: [
20003
- isUnread ? /* @__PURE__ */ jsx62(View48, { style: [styles50.accent, { backgroundColor: accent }] }) : null,
20004
- /* @__PURE__ */ jsx62(NotificationIcon, { notificationType: notification.notification_type, size: 36 }),
20005
- /* @__PURE__ */ jsxs42(View48, { style: styles50.content, children: [
20006
- /* @__PURE__ */ jsxs42(View48, { style: styles50.titleRow, children: [
20007
- /* @__PURE__ */ jsx62(
20008
- Text40,
20759
+ return /* @__PURE__ */ jsx66(SwipeableRow, { actions, background: colors.surface, children: /* @__PURE__ */ jsxs43(TouchableOpacity21, { onPress, activeOpacity: 0.6, accessibilityRole: "button", style: styles52.row, children: [
20760
+ isUnread ? /* @__PURE__ */ jsx66(View50, { style: [styles52.accent, { backgroundColor: accent }] }) : null,
20761
+ /* @__PURE__ */ jsx66(NotificationIcon, { notificationType: notification.notification_type, size: 36 }),
20762
+ /* @__PURE__ */ jsxs43(View50, { style: styles52.content, children: [
20763
+ /* @__PURE__ */ jsxs43(View50, { style: styles52.titleRow, children: [
20764
+ /* @__PURE__ */ jsx66(
20765
+ Text41,
20009
20766
  {
20010
- style: [styles50.title, { color: colors.text, fontWeight: isUnread ? "700" : "600" }],
20767
+ style: [styles52.title, { color: colors.text, fontWeight: isUnread ? "700" : "600" }],
20011
20768
  numberOfLines: 2,
20012
20769
  children: notification.title
20013
20770
  }
20014
20771
  ),
20015
- isUnread ? /* @__PURE__ */ jsx62(View48, { style: [styles50.unreadDot, { backgroundColor: colors.primary }] }) : null
20772
+ isUnread ? /* @__PURE__ */ jsx66(View50, { style: [styles52.unreadDot, { backgroundColor: colors.primary }] }) : null
20016
20773
  ] }),
20017
- /* @__PURE__ */ jsxs42(View48, { style: styles50.metaRow, children: [
20018
- statusLabel ? /* @__PURE__ */ jsxs42(Fragment15, { children: [
20019
- /* @__PURE__ */ jsx62(View48, { style: [styles50.statusDot, { backgroundColor: accent }] }),
20020
- /* @__PURE__ */ jsx62(Text40, { style: [styles50.metaText, { color: colors.textSecondary }], numberOfLines: 1, children: statusLabel }),
20021
- /* @__PURE__ */ jsx62(Text40, { style: [styles50.metaDivider, { color: colors.textSecondary }], children: "\xB7" })
20774
+ /* @__PURE__ */ jsxs43(View50, { style: styles52.metaRow, children: [
20775
+ statusLabel ? /* @__PURE__ */ jsxs43(Fragment15, { children: [
20776
+ /* @__PURE__ */ jsx66(View50, { style: [styles52.statusDot, { backgroundColor: accent }] }),
20777
+ /* @__PURE__ */ jsx66(Text41, { style: [styles52.metaText, { color: colors.textSecondary }], numberOfLines: 1, children: statusLabel }),
20778
+ /* @__PURE__ */ jsx66(Text41, { style: [styles52.metaDivider, { color: colors.textSecondary }], children: "\xB7" })
20022
20779
  ] }) : null,
20023
- /* @__PURE__ */ jsx62(Text40, { style: [styles50.metaText, { color: colors.textSecondary }], children: formatTimeAgo(notification.created_at, t) })
20780
+ /* @__PURE__ */ jsx66(Text41, { style: [styles52.metaText, { color: colors.textSecondary }], children: formatTimeAgo(notification.created_at, t) })
20024
20781
  ] }),
20025
- showAcknowledge && ackCta ? /* @__PURE__ */ jsx62(View48, { style: styles50.ackWrap, children: /* @__PURE__ */ jsx62(NotificationCTAButton, { cta: ackCta, onPress: onAcknowledge }) }) : null
20782
+ showAcknowledge && ackCta ? /* @__PURE__ */ jsx66(View50, { style: styles52.ackWrap, children: /* @__PURE__ */ jsx66(NotificationCTAButton, { cta: ackCta, onPress: onAcknowledge }) }) : null
20026
20783
  ] }),
20027
- /* @__PURE__ */ jsx62(View48, { style: styles50.chevron, children: /* @__PURE__ */ jsx62(Icon, { name: "chevron-right", size: 18, color: colors.textSecondary }) })
20784
+ /* @__PURE__ */ jsx66(View50, { style: styles52.chevron, children: /* @__PURE__ */ jsx66(Icon, { name: "chevron-right", size: 18, color: colors.textSecondary }) })
20028
20785
  ] }) });
20029
20786
  };
20030
- var styles50 = StyleSheet51.create({
20787
+ var styles52 = StyleSheet53.create({
20031
20788
  row: {
20032
20789
  flexDirection: "row",
20033
20790
  alignItems: "center",
@@ -20090,7 +20847,7 @@ var styles50 = StyleSheet51.create({
20090
20847
  });
20091
20848
 
20092
20849
  // src/RedactoPrivacyCenter/components/NotificationHub/useNotificationActions.ts
20093
- import { useCallback as useCallback12, useMemo as useMemo22 } from "react";
20850
+ import { useCallback as useCallback13, useMemo as useMemo22 } from "react";
20094
20851
  import { Linking as Linking2 } from "react-native";
20095
20852
  var useNotificationActions = () => {
20096
20853
  const { navigateTo, setSelectedCase } = useInternalNavigation();
@@ -20101,14 +20858,14 @@ var useNotificationActions = () => {
20101
20858
  () => ({ accessToken, refreshToken, onError, updateTokens }),
20102
20859
  [accessToken, refreshToken, onError, updateTokens]
20103
20860
  );
20104
- const hasAcknowledgeCTA = useCallback12(
20861
+ const hasAcknowledgeCTA = useCallback13(
20105
20862
  (notification) => {
20106
20863
  var _a3, _b;
20107
20864
  return (_b = (_a3 = notification.ctas) == null ? void 0 : _a3.some((cta) => cta.action_type === "acknowledge")) != null ? _b : false;
20108
20865
  },
20109
20866
  []
20110
20867
  );
20111
- const handleMarkRead = useCallback12(
20868
+ const handleMarkRead = useCallback13(
20112
20869
  async (notificationUuid) => {
20113
20870
  if (!organizationId || !workspaceId) return false;
20114
20871
  const result = await markNotificationRead(organizationId, workspaceId, notificationUuid, authContext, consentClient);
@@ -20116,12 +20873,12 @@ var useNotificationActions = () => {
20116
20873
  },
20117
20874
  [organizationId, workspaceId, authContext, consentClient]
20118
20875
  );
20119
- const handleMarkAllRead = useCallback12(async () => {
20876
+ const handleMarkAllRead = useCallback13(async () => {
20120
20877
  if (!organizationId || !workspaceId) return false;
20121
20878
  const result = await markAllRead(organizationId, workspaceId, authContext, consentClient);
20122
20879
  return result !== null;
20123
20880
  }, [organizationId, workspaceId, authContext, consentClient]);
20124
- const handleAcknowledge = useCallback12(
20881
+ const handleAcknowledge = useCallback13(
20125
20882
  async (notificationUuid) => {
20126
20883
  if (!organizationId || !workspaceId) return false;
20127
20884
  const result = await acknowledgeNotification(organizationId, workspaceId, notificationUuid, authContext, consentClient);
@@ -20129,7 +20886,7 @@ var useNotificationActions = () => {
20129
20886
  },
20130
20887
  [organizationId, workspaceId, authContext, consentClient]
20131
20888
  );
20132
- const handleCTAClick = useCallback12(
20889
+ const handleCTAClick = useCallback13(
20133
20890
  async (notification, cta) => {
20134
20891
  var _a3;
20135
20892
  if (cta.action_type === "acknowledge") {
@@ -20186,7 +20943,7 @@ var useNotificationActions = () => {
20186
20943
  };
20187
20944
 
20188
20945
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationsScreen.tsx
20189
- import { Fragment as Fragment16, jsx as jsx63, jsxs as jsxs43 } from "react/jsx-runtime";
20946
+ import { Fragment as Fragment16, jsx as jsx67, jsxs as jsxs44 } from "react/jsx-runtime";
20190
20947
  var EMPTY_SUMMARY = { total: 0, unread: 0, action_needed: 0, acknowledged: 0 };
20191
20948
  var READ_FILTER_TO_PARAM = {
20192
20949
  all: void 0,
@@ -20194,7 +20951,7 @@ var READ_FILTER_TO_PARAM = {
20194
20951
  read: true
20195
20952
  };
20196
20953
  var NotificationsScreen = () => {
20197
- const { t } = useTranslation27();
20954
+ const { t } = useTranslation29();
20198
20955
  const { colors } = useTheme();
20199
20956
  const { langParam } = useCurrentLanguage();
20200
20957
  const { listBottom } = usePrivacyCenterInsets();
@@ -20211,15 +20968,15 @@ var NotificationsScreen = () => {
20211
20968
  handleAcknowledge,
20212
20969
  handleCTAClick
20213
20970
  } = useNotificationActions();
20214
- const [notifications, setNotifications] = useState24([]);
20215
- const [summary, setSummary] = useState24(EMPTY_SUMMARY);
20216
- const [activeTab, setActiveTab] = useState24("all");
20217
- const [readFilter, setReadFilter] = useState24("all");
20218
- const [isLoading, setIsLoading] = useState24(true);
20219
- const [isRefreshing2, setIsRefreshing] = useState24(false);
20220
- const [filterOpen, setFilterOpen] = useState24(false);
20971
+ const [notifications, setNotifications] = useState25([]);
20972
+ const [summary, setSummary] = useState25(EMPTY_SUMMARY);
20973
+ const [activeTab, setActiveTab] = useState25("all");
20974
+ const [readFilter, setReadFilter] = useState25("all");
20975
+ const [isLoading, setIsLoading] = useState25(true);
20976
+ const [isRefreshing2, setIsRefreshing] = useState25(false);
20977
+ const [filterOpen, setFilterOpen] = useState25(false);
20221
20978
  const isFiltered = activeTab !== "all" || readFilter !== "all";
20222
- const loadNotifications = useCallback13(
20979
+ const loadNotifications = useCallback14(
20223
20980
  async (includeSummary = false, silent = false) => {
20224
20981
  if (!organizationId || !workspaceId) return;
20225
20982
  if (!silent) setIsLoading(true);
@@ -20249,18 +21006,21 @@ var NotificationsScreen = () => {
20249
21006
  },
20250
21007
  [organizationId, workspaceId, activeTab, readFilter, authContext, consentClient, langParam]
20251
21008
  );
20252
- useEffect19(() => {
21009
+ useEffect20(() => {
20253
21010
  loadNotifications(true);
20254
21011
  }, [loadNotifications]);
20255
21012
  const loadRef = useRef12(loadNotifications);
20256
21013
  loadRef.current = loadNotifications;
20257
- useEffect19(() => {
21014
+ const authContextRef = useRef12(authContext);
21015
+ authContextRef.current = authContext;
21016
+ useEffect20(() => {
20258
21017
  const id = setInterval(() => {
21018
+ if (isRefreshBlocked(authContextRef.current)) return;
20259
21019
  loadRef.current(false, true);
20260
21020
  }, POLL_INTERVAL);
20261
21021
  return () => clearInterval(id);
20262
21022
  }, []);
20263
- const onNotificationClick = useCallback13(
21023
+ const onNotificationClick = useCallback14(
20264
21024
  async (notification) => {
20265
21025
  const shouldMarkRead = !notification.is_read;
20266
21026
  const shouldAutoAcknowledge = !notification.is_acknowledged && !hasAcknowledgeCTA(notification);
@@ -20281,7 +21041,7 @@ var NotificationsScreen = () => {
20281
21041
  },
20282
21042
  [hasAcknowledgeCTA, handleAcknowledge, handleMarkRead]
20283
21043
  );
20284
- const onRowPress = useCallback13(
21044
+ const onRowPress = useCallback14(
20285
21045
  async (notification) => {
20286
21046
  var _a3;
20287
21047
  const linkCta = (_a3 = notification.ctas) == null ? void 0 : _a3.find((cta) => cta.action_type === "link" && cta.url);
@@ -20299,7 +21059,7 @@ var NotificationsScreen = () => {
20299
21059
  },
20300
21060
  [handleCTAClick, onNotificationClick]
20301
21061
  );
20302
- const onMarkReadRow = useCallback13(
21062
+ const onMarkReadRow = useCallback14(
20303
21063
  async (notification) => {
20304
21064
  if (notification.is_read) return;
20305
21065
  const ok = await handleMarkRead(notification.uuid);
@@ -20309,7 +21069,7 @@ var NotificationsScreen = () => {
20309
21069
  },
20310
21070
  [handleMarkRead]
20311
21071
  );
20312
- const onAcknowledgeRow = useCallback13(
21072
+ const onAcknowledgeRow = useCallback14(
20313
21073
  async (notification) => {
20314
21074
  if (notification.is_acknowledged) return;
20315
21075
  const ok = await handleAcknowledge(notification.uuid);
@@ -20326,7 +21086,14 @@ var NotificationsScreen = () => {
20326
21086
  },
20327
21087
  [handleAcknowledge]
20328
21088
  );
20329
- const onRefresh = useCallback13(() => {
21089
+ const onMarkAllRead = useCallback14(async () => {
21090
+ const ok = await handleMarkAllRead();
21091
+ if (!ok) return;
21092
+ setNotifications((prev) => prev.map((item) => ({ ...item, is_read: true })));
21093
+ setSummary((prev) => ({ ...prev, unread: 0 }));
21094
+ if (readFilter !== "all") loadNotifications(true, true);
21095
+ }, [handleMarkAllRead, readFilter, loadNotifications]);
21096
+ const onRefresh = useCallback14(() => {
20330
21097
  setIsRefreshing(true);
20331
21098
  loadNotifications(true, true);
20332
21099
  }, [loadNotifications]);
@@ -20334,14 +21101,14 @@ var NotificationsScreen = () => {
20334
21101
  () => groupByTime(notifications, (item) => item.created_at, classifyTime),
20335
21102
  [notifications, classifyTime]
20336
21103
  );
20337
- const header = /* @__PURE__ */ jsxs43(View49, { style: styles51.header, children: [
20338
- /* @__PURE__ */ jsxs43(View49, { style: styles51.titleRow, children: [
20339
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.screenTitle, { color: colors.text }], children: t("notifications", { defaultValue: "Notifications" }) }),
20340
- /* @__PURE__ */ jsx63(
20341
- TouchableOpacity21,
21104
+ const header = /* @__PURE__ */ jsxs44(View51, { style: styles53.header, children: [
21105
+ /* @__PURE__ */ jsxs44(View51, { style: styles53.titleRow, children: [
21106
+ /* @__PURE__ */ jsx67(Text42, { style: [styles53.screenTitle, { color: colors.text }], children: t("notifications", { defaultValue: "Notifications" }) }),
21107
+ /* @__PURE__ */ jsx67(
21108
+ TouchableOpacity22,
20342
21109
  {
20343
21110
  style: [
20344
- styles51.filterBtn,
21111
+ styles53.filterBtn,
20345
21112
  {
20346
21113
  backgroundColor: isFiltered ? colors.primarySoft : colors.surface,
20347
21114
  borderColor: isFiltered ? colors.primary : colors.border
@@ -20350,30 +21117,30 @@ var NotificationsScreen = () => {
20350
21117
  onPress: () => setFilterOpen(true),
20351
21118
  accessibilityRole: "button",
20352
21119
  accessibilityLabel: t("filter") || "Filter",
20353
- children: /* @__PURE__ */ jsx63(Icon, { name: "sliders-horizontal", size: 18, color: isFiltered ? colors.primary : colors.text })
21120
+ children: /* @__PURE__ */ jsx67(Icon, { name: "sliders-horizontal", size: 18, color: isFiltered ? colors.primary : colors.text })
20354
21121
  }
20355
21122
  )
20356
21123
  ] }),
20357
- summary.unread > 0 ? /* @__PURE__ */ jsxs43(TouchableOpacity21, { style: styles51.markAllBtn, onPress: handleMarkAllRead, activeOpacity: 0.7, accessibilityRole: "button", children: [
20358
- /* @__PURE__ */ jsx63(Icon, { name: "check-check", size: 15, color: colors.primary, strokeWidth: 2.2 }),
20359
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.markAllLabel, { color: colors.primary }], children: t("markAllAsRead") || "Mark all as read" })
21124
+ summary.unread > 0 ? /* @__PURE__ */ jsxs44(TouchableOpacity22, { style: styles53.markAllBtn, onPress: onMarkAllRead, activeOpacity: 0.7, accessibilityRole: "button", children: [
21125
+ /* @__PURE__ */ jsx67(Icon, { name: "check-check", size: 15, color: colors.primary, strokeWidth: 2.2 }),
21126
+ /* @__PURE__ */ jsx67(Text42, { style: [styles53.markAllLabel, { color: colors.primary }], children: t("markAllAsRead") || "Mark all as read" })
20360
21127
  ] }) : null
20361
21128
  ] });
20362
- return /* @__PURE__ */ jsxs43(Fragment16, { children: [
20363
- /* @__PURE__ */ jsx63(
21129
+ return /* @__PURE__ */ jsxs44(Fragment16, { children: [
21130
+ /* @__PURE__ */ jsx67(
20364
21131
  FlatList3,
20365
21132
  {
20366
21133
  data: sections,
20367
21134
  keyExtractor: (section2) => section2.key,
20368
- style: [styles51.list, { backgroundColor: colors.canvasSubtle }],
20369
- contentContainerStyle: [styles51.listContent, { flexGrow: 1, paddingBottom: listBottom }],
21135
+ style: [styles53.list, { backgroundColor: colors.canvasSubtle }],
21136
+ contentContainerStyle: [styles53.listContent, { flexGrow: 1, paddingBottom: listBottom }],
20370
21137
  ListHeaderComponent: header,
20371
21138
  showsVerticalScrollIndicator: false,
20372
- refreshControl: /* @__PURE__ */ jsx63(RefreshControl5, { refreshing: isRefreshing2, onRefresh, tintColor: colors.primary, colors: [colors.primary] }),
20373
- renderItem: ({ item: section2 }) => /* @__PURE__ */ jsxs43(View49, { style: styles51.section, children: [
20374
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.sectionTitle, { color: colors.textSecondary }], children: section2.title }),
20375
- /* @__PURE__ */ jsx63(View49, { style: [styles51.cardShadow, elevation.card], children: /* @__PURE__ */ jsx63(View49, { style: [styles51.cardClip, { backgroundColor: colors.surface }], children: section2.data.map((item, index) => /* @__PURE__ */ jsxs43(View49, { children: [
20376
- /* @__PURE__ */ jsx63(
21139
+ refreshControl: /* @__PURE__ */ jsx67(RefreshControl5, { refreshing: isRefreshing2, onRefresh, tintColor: colors.primary, colors: [colors.primary] }),
21140
+ renderItem: ({ item: section2 }) => /* @__PURE__ */ jsxs44(View51, { style: styles53.section, children: [
21141
+ /* @__PURE__ */ jsx67(Text42, { style: [styles53.sectionTitle, { color: colors.textSecondary }], children: section2.title }),
21142
+ /* @__PURE__ */ jsx67(View51, { style: [styles53.cardShadow, elevation.card], children: /* @__PURE__ */ jsx67(View51, { style: [styles53.cardClip, { backgroundColor: colors.surface }], children: section2.data.map((item, index) => /* @__PURE__ */ jsxs44(View51, { children: [
21143
+ /* @__PURE__ */ jsx67(
20377
21144
  NotificationRow,
20378
21145
  {
20379
21146
  notification: item,
@@ -20382,19 +21149,19 @@ var NotificationsScreen = () => {
20382
21149
  onAcknowledge: () => onAcknowledgeRow(item)
20383
21150
  }
20384
21151
  ),
20385
- index < section2.data.length - 1 ? /* @__PURE__ */ jsx63(View49, { style: [styles51.separator, { backgroundColor: colors.hairline }] }) : null
21152
+ index < section2.data.length - 1 ? /* @__PURE__ */ jsx67(View51, { style: [styles53.separator, { backgroundColor: colors.hairline }] }) : null
20386
21153
  ] }, item.uuid)) }) })
20387
21154
  ] }),
20388
- ListEmptyComponent: isLoading ? /* @__PURE__ */ jsx63(View49, { style: styles51.skeletonWrap, children: /* @__PURE__ */ jsx63(View49, { style: [styles51.cardClip, elevation.card, { backgroundColor: colors.surface }], children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ jsxs43(View49, { children: [
20389
- /* @__PURE__ */ jsxs43(View49, { style: styles51.skeletonRow, children: [
20390
- /* @__PURE__ */ jsx63(Skeleton, { width: 36, height: 36, radius: radii.md }),
20391
- /* @__PURE__ */ jsxs43(View49, { style: styles51.skeletonLines, children: [
20392
- /* @__PURE__ */ jsx63(Skeleton, { width: "70%", height: 13 }),
20393
- /* @__PURE__ */ jsx63(Skeleton, { width: "40%", height: 10 })
21155
+ ListEmptyComponent: isLoading ? /* @__PURE__ */ jsx67(View51, { style: styles53.skeletonWrap, children: /* @__PURE__ */ jsx67(View51, { style: [styles53.cardClip, elevation.card, { backgroundColor: colors.surface }], children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ jsxs44(View51, { children: [
21156
+ /* @__PURE__ */ jsxs44(View51, { style: styles53.skeletonRow, children: [
21157
+ /* @__PURE__ */ jsx67(Skeleton, { width: 36, height: 36, radius: radii.md }),
21158
+ /* @__PURE__ */ jsxs44(View51, { style: styles53.skeletonLines, children: [
21159
+ /* @__PURE__ */ jsx67(Skeleton, { width: "70%", height: 13 }),
21160
+ /* @__PURE__ */ jsx67(Skeleton, { width: "40%", height: 10 })
20394
21161
  ] })
20395
21162
  ] }),
20396
- i < 3 ? /* @__PURE__ */ jsx63(View49, { style: [styles51.separator, { backgroundColor: colors.hairline }] }) : null
20397
- ] }, i)) }) }) : /* @__PURE__ */ jsx63(View49, { style: styles51.emptyWrap, children: /* @__PURE__ */ jsx63(
21163
+ i < 3 ? /* @__PURE__ */ jsx67(View51, { style: [styles53.separator, { backgroundColor: colors.hairline }] }) : null
21164
+ ] }, i)) }) }) : /* @__PURE__ */ jsx67(View51, { style: styles53.emptyWrap, children: /* @__PURE__ */ jsx67(
20398
21165
  PCEmpty,
20399
21166
  {
20400
21167
  iconName: "circle-check",
@@ -20403,14 +21170,14 @@ var NotificationsScreen = () => {
20403
21170
  }
20404
21171
  ) }),
20405
21172
  ListFooterComponentStyle: { marginTop: "auto" },
20406
- ListFooterComponent: /* @__PURE__ */ jsx63(Footer, {})
21173
+ ListFooterComponent: /* @__PURE__ */ jsx67(Footer, {})
20407
21174
  }
20408
21175
  ),
20409
- /* @__PURE__ */ jsx63(BottomSheet, { visible: filterOpen, onClose: () => setFilterOpen(false), title: t("filter") || "Filter", children: /* @__PURE__ */ jsxs43(View49, { style: styles51.filterSheet, children: [
20410
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.filterGroupLabel, { color: colors.textSecondary }], children: t("category", { defaultValue: "Category" }) }),
20411
- /* @__PURE__ */ jsx63(View49, { style: styles51.chipWrap, children: filterTabs.map((tab) => {
21176
+ /* @__PURE__ */ jsx67(BottomSheet, { visible: filterOpen, onClose: () => setFilterOpen(false), title: t("filter") || "Filter", children: /* @__PURE__ */ jsxs44(View51, { style: styles53.filterSheet, children: [
21177
+ /* @__PURE__ */ jsx67(Text42, { style: [styles53.filterGroupLabel, { color: colors.textSecondary }], children: t("category", { defaultValue: "Category" }) }),
21178
+ /* @__PURE__ */ jsx67(View51, { style: styles53.chipWrap, children: filterTabs.map((tab) => {
20412
21179
  const selected = tab.key === activeTab;
20413
- return /* @__PURE__ */ jsx63(
21180
+ return /* @__PURE__ */ jsx67(
20414
21181
  FilterChip,
20415
21182
  {
20416
21183
  label: tab.label,
@@ -20420,12 +21187,12 @@ var NotificationsScreen = () => {
20420
21187
  tab.key
20421
21188
  );
20422
21189
  }) }),
20423
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.filterGroupLabel, { color: colors.textSecondary, marginTop: spacing.lg }], children: t("readStatus", { defaultValue: "Status" }) }),
20424
- /* @__PURE__ */ jsx63(View49, { style: styles51.chipWrap, children: [
21190
+ /* @__PURE__ */ jsx67(Text42, { style: [styles53.filterGroupLabel, { color: colors.textSecondary, marginTop: spacing.lg }], children: t("readStatus", { defaultValue: "Status" }) }),
21191
+ /* @__PURE__ */ jsx67(View51, { style: styles53.chipWrap, children: [
20425
21192
  { key: "all", label: t("all") || "All" },
20426
21193
  { key: "unread", label: t("unread") || "Unread" },
20427
21194
  { key: "read", label: t("read", { defaultValue: "Read" }) }
20428
- ].map((opt) => /* @__PURE__ */ jsx63(
21195
+ ].map((opt) => /* @__PURE__ */ jsx67(
20429
21196
  FilterChip,
20430
21197
  {
20431
21198
  label: opt.label,
@@ -20434,13 +21201,13 @@ var NotificationsScreen = () => {
20434
21201
  },
20435
21202
  opt.key
20436
21203
  )) }),
20437
- /* @__PURE__ */ jsx63(
20438
- TouchableOpacity21,
21204
+ /* @__PURE__ */ jsx67(
21205
+ TouchableOpacity22,
20439
21206
  {
20440
- style: [styles51.applyBtn, { backgroundColor: colors.primary }],
21207
+ style: [styles53.applyBtn, { backgroundColor: colors.primary }],
20441
21208
  onPress: () => setFilterOpen(false),
20442
21209
  accessibilityRole: "button",
20443
- children: /* @__PURE__ */ jsx63(Text41, { style: [styles51.applyLabel, { color: colors.primaryText }], children: t("done", { defaultValue: "Done" }) })
21210
+ children: /* @__PURE__ */ jsx67(Text42, { style: [styles53.applyLabel, { color: colors.primaryText }], children: t("done", { defaultValue: "Done" }) })
20444
21211
  }
20445
21212
  )
20446
21213
  ] }) })
@@ -20448,25 +21215,25 @@ var NotificationsScreen = () => {
20448
21215
  };
20449
21216
  var FilterChip = ({ label, selected, onPress }) => {
20450
21217
  const { colors } = useTheme();
20451
- return /* @__PURE__ */ jsx63(
20452
- TouchableOpacity21,
21218
+ return /* @__PURE__ */ jsx67(
21219
+ TouchableOpacity22,
20453
21220
  {
20454
21221
  onPress,
20455
21222
  activeOpacity: 0.7,
20456
21223
  accessibilityRole: "button",
20457
21224
  accessibilityState: { selected },
20458
21225
  style: [
20459
- styles51.chip,
21226
+ styles53.chip,
20460
21227
  {
20461
21228
  backgroundColor: selected ? colors.primary : colors.surfaceAlt,
20462
21229
  borderColor: selected ? colors.primary : colors.border
20463
21230
  }
20464
21231
  ],
20465
- children: /* @__PURE__ */ jsx63(Text41, { style: [styles51.chipLabel, { color: selected ? colors.primaryText : colors.text }], children: label })
21232
+ children: /* @__PURE__ */ jsx67(Text42, { style: [styles53.chipLabel, { color: selected ? colors.primaryText : colors.text }], children: label })
20466
21233
  }
20467
21234
  );
20468
21235
  };
20469
- var styles51 = StyleSheet52.create({
21236
+ var styles53 = StyleSheet54.create({
20470
21237
  list: {
20471
21238
  flex: 1
20472
21239
  },
@@ -20500,7 +21267,7 @@ var styles51 = StyleSheet52.create({
20500
21267
  filterBtn: {
20501
21268
  width: 40,
20502
21269
  height: 40,
20503
- borderWidth: StyleSheet52.hairlineWidth,
21270
+ borderWidth: StyleSheet54.hairlineWidth,
20504
21271
  borderRadius: radii.md,
20505
21272
  justifyContent: "center",
20506
21273
  alignItems: "center"
@@ -20521,7 +21288,7 @@ var styles51 = StyleSheet52.create({
20521
21288
  overflow: "hidden"
20522
21289
  },
20523
21290
  separator: {
20524
- height: StyleSheet52.hairlineWidth,
21291
+ height: StyleSheet54.hairlineWidth,
20525
21292
  marginLeft: spacing.lg + 36 + spacing.md
20526
21293
  },
20527
21294
  emptyWrap: {
@@ -20559,7 +21326,7 @@ var styles51 = StyleSheet52.create({
20559
21326
  justifyContent: "center",
20560
21327
  paddingHorizontal: spacing.lg,
20561
21328
  borderRadius: radii.pill,
20562
- borderWidth: StyleSheet52.hairlineWidth
21329
+ borderWidth: StyleSheet54.hairlineWidth
20563
21330
  },
20564
21331
  chipLabel: {
20565
21332
  ...typography.label
@@ -20578,7 +21345,7 @@ var styles51 = StyleSheet52.create({
20578
21345
  });
20579
21346
 
20580
21347
  // src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx
20581
- import { Fragment as Fragment17, jsx as jsx64, jsxs as jsxs44 } from "react/jsx-runtime";
21348
+ import { Fragment as Fragment17, jsx as jsx68, jsxs as jsxs45 } from "react/jsx-runtime";
20582
21349
  var privacyCenterQueryClient = new QueryClient();
20583
21350
  function PrivacyCenterContent({ onBack }) {
20584
21351
  const { currentPage } = useInternalNavigation();
@@ -20588,24 +21355,24 @@ function PrivacyCenterContent({ onBack }) {
20588
21355
  const chromeMode = getPageChromeMode(currentPage);
20589
21356
  const canvasIsLight = isLightColor(colors.canvasSubtle);
20590
21357
  const barStyle = canvasIsLight ? "dark-content" : "light-content";
20591
- useEffect20(() => {
21358
+ useEffect21(() => {
20592
21359
  StatusBar2.setBarStyle(barStyle, true);
20593
21360
  if (Platform8.OS === "android") {
20594
21361
  setNavBarIconStyle(canvasIsLight ? "dark" : "light");
20595
21362
  }
20596
21363
  }, [barStyle, canvasIsLight]);
20597
- return /* @__PURE__ */ jsxs44(View50, { style: [styles52.container, { backgroundColor: colors.canvasSubtle }], children: [
20598
- /* @__PURE__ */ jsx64(StatusBar2, { barStyle, translucent: true }),
20599
- /* @__PURE__ */ jsx64(View50, { style: styles52.mainColumn, children: brandingLoading ? /* @__PURE__ */ jsx64(PCLoader, {}) : /* @__PURE__ */ jsxs44(Fragment17, { children: [
20600
- /* @__PURE__ */ jsx64(SlimTopBar, { mode: chromeMode, onBack }),
20601
- /* @__PURE__ */ jsx64(View50, { style: [styles52.content, { paddingBottom: insets.bottom }], children: status === "checking" ? /* @__PURE__ */ jsx64(PCLoader, {}) : status === "empty" ? /* @__PURE__ */ jsx64(PrivacyCenterEmptyState, {}) : /* @__PURE__ */ jsxs44(Fragment17, { children: [
20602
- currentPage === "home" && /* @__PURE__ */ jsx64(HomeHub, {}),
20603
- currentPage === "consent-manager" && /* @__PURE__ */ jsx64(ConsentManager, {}),
20604
- currentPage === "form" && /* @__PURE__ */ jsx64(FormPage, {}),
20605
- currentPage === "activity" && /* @__PURE__ */ jsx64(ActivitiesList, {}),
20606
- currentPage === "receipts" && /* @__PURE__ */ jsx64(ReceiptsList, {}),
20607
- currentPage === "case-details" && /* @__PURE__ */ jsx64(CaseDetailsPage, {}),
20608
- currentPage === "notifications" && /* @__PURE__ */ jsx64(NotificationsScreen, {})
21364
+ return /* @__PURE__ */ jsxs45(View52, { style: [styles54.container, { backgroundColor: colors.canvasSubtle }], children: [
21365
+ /* @__PURE__ */ jsx68(StatusBar2, { barStyle, translucent: true }),
21366
+ /* @__PURE__ */ jsx68(View52, { style: styles54.mainColumn, children: brandingLoading ? /* @__PURE__ */ jsx68(PCLoader, {}) : /* @__PURE__ */ jsxs45(Fragment17, { children: [
21367
+ /* @__PURE__ */ jsx68(SlimTopBar, { mode: chromeMode, onBack }),
21368
+ /* @__PURE__ */ jsx68(View52, { style: [styles54.content, { paddingBottom: insets.bottom }], children: status === "checking" ? /* @__PURE__ */ jsx68(PCLoader, {}) : status === "session-expired" ? /* @__PURE__ */ jsx68(PrivacyCenterSessionExpired, {}) : status === "empty" ? /* @__PURE__ */ jsx68(PrivacyCenterEmptyState, {}) : /* @__PURE__ */ jsxs45(Fragment17, { children: [
21369
+ currentPage === "home" && /* @__PURE__ */ jsx68(HomeHub, {}),
21370
+ currentPage === "consent-manager" && /* @__PURE__ */ jsx68(ConsentManager, {}),
21371
+ currentPage === "form" && /* @__PURE__ */ jsx68(FormPage, {}),
21372
+ currentPage === "activity" && /* @__PURE__ */ jsx68(ActivitiesList, {}),
21373
+ currentPage === "receipts" && /* @__PURE__ */ jsx68(ReceiptsList, {}),
21374
+ currentPage === "case-details" && /* @__PURE__ */ jsx68(CaseDetailsPage, {}),
21375
+ currentPage === "notifications" && /* @__PURE__ */ jsx68(NotificationsScreen, {})
20609
21376
  ] }) })
20610
21377
  ] }) })
20611
21378
  ] });
@@ -20619,22 +21386,34 @@ function RedactoPrivacyCenter({
20619
21386
  theme: _theme,
20620
21387
  accessToken,
20621
21388
  refreshToken,
21389
+ token,
21390
+ email,
21391
+ mobile,
21392
+ ucic,
21393
+ organisationUuid,
21394
+ workspaceUuid,
20622
21395
  onError,
20623
21396
  initialPage = "home",
20624
21397
  initialCaseUuid,
20625
21398
  onBack
20626
21399
  }) {
20627
- return /* @__PURE__ */ jsx64(SafeAreaBoundary, { children: /* @__PURE__ */ jsx64(KeyboardProviderCompat, { children: /* @__PURE__ */ jsx64(QueryClientProvider, { client: privacyCenterQueryClient, children: /* @__PURE__ */ jsx64(I18nextProvider, { i18n: i18n_default, children: /* @__PURE__ */ jsx64(ThemeProvider, { slug, baseUrl, children: /* @__PURE__ */ jsx64(BaseUrlProvider, { baseUrl, ledgerBaseUrl, children: /* @__PURE__ */ jsx64(
21400
+ return /* @__PURE__ */ jsx68(SafeAreaBoundary, { children: /* @__PURE__ */ jsx68(KeyboardProviderCompat, { children: /* @__PURE__ */ jsx68(QueryClientProvider, { client: privacyCenterQueryClient, children: /* @__PURE__ */ jsx68(I18nextProvider, { i18n: i18n_default, children: /* @__PURE__ */ jsx68(ThemeProvider, { slug, baseUrl, children: /* @__PURE__ */ jsx68(BaseUrlProvider, { baseUrl, ledgerBaseUrl, children: /* @__PURE__ */ jsx68(
20628
21401
  AuthProvider,
20629
21402
  {
20630
- accessToken,
20631
- refreshToken,
21403
+ accessToken: accessToken != null ? accessToken : "",
21404
+ refreshToken: refreshToken != null ? refreshToken : "",
21405
+ token,
21406
+ sandboxUcic: ucic,
21407
+ sandboxSubject: email || mobile,
21408
+ organisationUuid,
21409
+ workspaceUuid,
21410
+ slug,
20632
21411
  onError,
20633
- children: /* @__PURE__ */ jsx64(NavigationProvider, { initialPage, initialPendingCaseUuid: initialCaseUuid != null ? initialCaseUuid : null, children: /* @__PURE__ */ jsx64(DataAvailabilityProvider, { children: /* @__PURE__ */ jsx64(PageStatusProvider, { children: /* @__PURE__ */ jsx64(PrivacyCenterContent, { onBack }) }) }) })
21412
+ children: /* @__PURE__ */ jsx68(NavigationProvider, { initialPage, initialPendingCaseUuid: initialCaseUuid != null ? initialCaseUuid : null, children: /* @__PURE__ */ jsx68(SelectUserGate, { children: /* @__PURE__ */ jsx68(DataAvailabilityProvider, { children: /* @__PURE__ */ jsx68(PageStatusProvider, { children: /* @__PURE__ */ jsx68(PrivacyCenterContent, { onBack }) }) }) }) })
20634
21413
  }
20635
21414
  ) }) }) }) }) }) });
20636
21415
  }
20637
- var styles52 = StyleSheet53.create({
21416
+ var styles54 = StyleSheet55.create({
20638
21417
  container: {
20639
21418
  flex: 1
20640
21419
  },
@@ -20649,78 +21428,78 @@ var styles52 = StyleSheet53.create({
20649
21428
 
20650
21429
  // src/RedactoPrivacyCenter/components/SideMenu.tsx
20651
21430
  import {
20652
- StyleSheet as StyleSheet54,
20653
- Text as Text42,
20654
- TouchableOpacity as TouchableOpacity22,
20655
- View as View51
21431
+ StyleSheet as StyleSheet56,
21432
+ Text as Text43,
21433
+ TouchableOpacity as TouchableOpacity23,
21434
+ View as View53
20656
21435
  } from "react-native";
20657
- import { useTranslation as useTranslation28 } from "react-i18next";
21436
+ import { useTranslation as useTranslation30 } from "react-i18next";
20658
21437
  import Svg2, { Path as Path2 } from "react-native-svg";
20659
- import { Fragment as Fragment18, jsx as jsx65, jsxs as jsxs45 } from "react/jsx-runtime";
21438
+ import { Fragment as Fragment18, jsx as jsx69, jsxs as jsxs46 } from "react/jsx-runtime";
20660
21439
  var MENU_ITEMS = [
20661
21440
  { page: "consent-manager", labelKey: "consentManager", fallback: "Consent Manager", icon: "shield-check" },
20662
21441
  { page: "form", labelKey: "grievanceRequests", fallback: "Privacy Requests", icon: "message-circle-warning" },
20663
21442
  { page: "activity", labelKey: "activity", fallback: "Activity", icon: "activity" }
20664
21443
  ];
20665
21444
  function SideMenu({ onBack } = {}) {
20666
- const { t } = useTranslation28();
21445
+ const { t } = useTranslation30();
20667
21446
  const { currentPage, navigateTo } = useInternalNavigation();
20668
21447
  const { organizationName, email } = useAuth();
20669
21448
  const { colors } = useTheme();
20670
21449
  const orgInitial = organizationName ? organizationName.charAt(0).toUpperCase() : "R";
20671
21450
  const displayName = organizationName || "Organization";
20672
- return /* @__PURE__ */ jsxs45(View51, { style: [styles53.container, { backgroundColor: colors.surface }], children: [
20673
- /* @__PURE__ */ jsxs45(View51, { style: styles53.orgSection, children: [
20674
- /* @__PURE__ */ jsx65(View51, { style: [styles53.avatar, { backgroundColor: colors.primary }], children: /* @__PURE__ */ jsx65(Text42, { style: [styles53.avatarText, { color: colors.primaryText }], children: orgInitial }) }),
20675
- /* @__PURE__ */ jsxs45(View51, { style: styles53.orgInfo, children: [
20676
- /* @__PURE__ */ jsx65(Text42, { style: [styles53.orgName, { color: colors.text }], numberOfLines: 1, children: displayName }),
20677
- email ? /* @__PURE__ */ jsx65(Text42, { style: [styles53.orgEmail, { color: colors.textSecondary }], numberOfLines: 1, children: email }) : null
21451
+ return /* @__PURE__ */ jsxs46(View53, { style: [styles55.container, { backgroundColor: colors.surface }], children: [
21452
+ /* @__PURE__ */ jsxs46(View53, { style: styles55.orgSection, children: [
21453
+ /* @__PURE__ */ jsx69(View53, { style: [styles55.avatar, { backgroundColor: colors.primary }], children: /* @__PURE__ */ jsx69(Text43, { style: [styles55.avatarText, { color: colors.primaryText }], children: orgInitial }) }),
21454
+ /* @__PURE__ */ jsxs46(View53, { style: styles55.orgInfo, children: [
21455
+ /* @__PURE__ */ jsx69(Text43, { style: [styles55.orgName, { color: colors.text }], numberOfLines: 1, children: displayName }),
21456
+ email ? /* @__PURE__ */ jsx69(Text43, { style: [styles55.orgEmail, { color: colors.textSecondary }], numberOfLines: 1, children: email }) : null
20678
21457
  ] })
20679
21458
  ] }),
20680
- /* @__PURE__ */ jsx65(View51, { style: [styles53.divider, { backgroundColor: colors.border }] }),
20681
- /* @__PURE__ */ jsx65(View51, { style: styles53.menuSection, children: MENU_ITEMS.map((item) => {
21459
+ /* @__PURE__ */ jsx69(View53, { style: [styles55.divider, { backgroundColor: colors.border }] }),
21460
+ /* @__PURE__ */ jsx69(View53, { style: styles55.menuSection, children: MENU_ITEMS.map((item) => {
20682
21461
  const isActive = currentPage === item.page || item.page === "form" && currentPage === "case-details";
20683
- return /* @__PURE__ */ jsxs45(
20684
- TouchableOpacity22,
21462
+ return /* @__PURE__ */ jsxs46(
21463
+ TouchableOpacity23,
20685
21464
  {
20686
21465
  style: [
20687
- styles53.menuItem,
20688
- isActive && [styles53.menuItemActive, { backgroundColor: `${colors.primary}14` }]
21466
+ styles55.menuItem,
21467
+ isActive && [styles55.menuItemActive, { backgroundColor: `${colors.primary}14` }]
20689
21468
  ],
20690
21469
  onPress: () => navigateTo(item.page),
20691
21470
  activeOpacity: 0.7,
20692
21471
  accessibilityRole: "button",
20693
21472
  accessibilityState: { selected: isActive },
20694
21473
  children: [
20695
- /* @__PURE__ */ jsx65(View51, { style: styles53.menuIconWrap, children: /* @__PURE__ */ jsx65(Icon, { name: item.icon, size: 18, color: isActive ? colors.primary : colors.textSecondary }) }),
20696
- /* @__PURE__ */ jsx65(
20697
- Text42,
21474
+ /* @__PURE__ */ jsx69(View53, { style: styles55.menuIconWrap, children: /* @__PURE__ */ jsx69(Icon, { name: item.icon, size: 18, color: isActive ? colors.primary : colors.textSecondary }) }),
21475
+ /* @__PURE__ */ jsx69(
21476
+ Text43,
20698
21477
  {
20699
21478
  style: [
20700
- styles53.menuLabel,
21479
+ styles55.menuLabel,
20701
21480
  { color: isActive ? colors.primary : colors.text },
20702
- isActive && styles53.menuLabelActive
21481
+ isActive && styles55.menuLabelActive
20703
21482
  ],
20704
21483
  children: t(item.labelKey) || item.fallback
20705
21484
  }
20706
21485
  ),
20707
- isActive ? /* @__PURE__ */ jsx65(View51, { style: [styles53.activeIndicator, { backgroundColor: colors.primary }] }) : null
21486
+ isActive ? /* @__PURE__ */ jsx69(View53, { style: [styles55.activeIndicator, { backgroundColor: colors.primary }] }) : null
20708
21487
  ]
20709
21488
  },
20710
21489
  item.page
20711
21490
  );
20712
21491
  }) }),
20713
- onBack ? /* @__PURE__ */ jsxs45(Fragment18, { children: [
20714
- /* @__PURE__ */ jsx65(View51, { style: { flex: 1 } }),
20715
- /* @__PURE__ */ jsx65(View51, { style: [styles53.divider, { backgroundColor: colors.border }] }),
20716
- /* @__PURE__ */ jsxs45(
20717
- TouchableOpacity22,
21492
+ onBack ? /* @__PURE__ */ jsxs46(Fragment18, { children: [
21493
+ /* @__PURE__ */ jsx69(View53, { style: { flex: 1 } }),
21494
+ /* @__PURE__ */ jsx69(View53, { style: [styles55.divider, { backgroundColor: colors.border }] }),
21495
+ /* @__PURE__ */ jsxs46(
21496
+ TouchableOpacity23,
20718
21497
  {
20719
- style: styles53.backBtn,
21498
+ style: styles55.backBtn,
20720
21499
  onPress: () => navigateBack(onBack),
20721
21500
  activeOpacity: 0.7,
20722
21501
  children: [
20723
- /* @__PURE__ */ jsx65(Svg2, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", children: onBack === "back" ? /* @__PURE__ */ jsx65(
21502
+ /* @__PURE__ */ jsx69(Svg2, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", children: onBack === "back" ? /* @__PURE__ */ jsx69(
20724
21503
  Path2,
20725
21504
  {
20726
21505
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20729,7 +21508,7 @@ function SideMenu({ onBack } = {}) {
20729
21508
  strokeLinecap: "round",
20730
21509
  strokeLinejoin: "round"
20731
21510
  }
20732
- ) : /* @__PURE__ */ jsx65(
21511
+ ) : /* @__PURE__ */ jsx69(
20733
21512
  Path2,
20734
21513
  {
20735
21514
  d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4 M16 17l5-5-5-5 M21 12H9",
@@ -20739,14 +21518,14 @@ function SideMenu({ onBack } = {}) {
20739
21518
  strokeLinejoin: "round"
20740
21519
  }
20741
21520
  ) }),
20742
- /* @__PURE__ */ jsx65(Text42, { style: [styles53.backBtnLabel, { color: colors.textSecondary }], children: onBack === "back" ? t("back") || "Back" : t("signOut") || "Sign Out" })
21521
+ /* @__PURE__ */ jsx69(Text43, { style: [styles55.backBtnLabel, { color: colors.textSecondary }], children: onBack === "back" ? t("back") || "Back" : t("signOut") || "Sign Out" })
20743
21522
  ]
20744
21523
  }
20745
21524
  )
20746
21525
  ] }) : null
20747
21526
  ] });
20748
21527
  }
20749
- var styles53 = StyleSheet54.create({
21528
+ var styles55 = StyleSheet56.create({
20750
21529
  container: {
20751
21530
  flex: 1,
20752
21531
  paddingTop: 12
@@ -20832,42 +21611,68 @@ var styles53 = StyleSheet54.create({
20832
21611
  });
20833
21612
 
20834
21613
  // src/RedactoPrivacyCenter/components/Navbar.tsx
20835
- import { useCallback as useCallback14, useEffect as useEffect21, useState as useState25 } from "react";
20836
- import { StyleSheet as StyleSheet56, Text as Text44, TouchableOpacity as TouchableOpacity24, View as View53 } from "react-native";
20837
- import { useTranslation as useTranslation30 } from "react-i18next";
21614
+ import { useCallback as useCallback15, useEffect as useEffect22, useState as useState26 } from "react";
21615
+ import { StyleSheet as StyleSheet58, Text as Text45, TouchableOpacity as TouchableOpacity25, View as View55 } from "react-native";
21616
+ import { useTranslation as useTranslation32 } from "react-i18next";
20838
21617
  import Svg4, { Path as Path4 } from "react-native-svg";
20839
21618
 
20840
21619
  // src/RedactoPrivacyCenter/components/UserOrgMenu.tsx
20841
- import { Image as Image4, StyleSheet as StyleSheet55, Text as Text43, TouchableOpacity as TouchableOpacity23, View as View52 } from "react-native";
20842
- import { useTranslation as useTranslation29 } from "react-i18next";
21620
+ import { Image as Image4, StyleSheet as StyleSheet57, Text as Text44, TouchableOpacity as TouchableOpacity24, View as View54 } from "react-native";
21621
+ import { useTranslation as useTranslation31 } from "react-i18next";
20843
21622
  import Svg3, { Path as Path3 } from "react-native-svg";
20844
- import { jsx as jsx66, jsxs as jsxs46 } from "react/jsx-runtime";
21623
+ import { jsx as jsx70, jsxs as jsxs47 } from "react/jsx-runtime";
20845
21624
  var UserOrgMenu = ({ visible, onClose, onBack }) => {
20846
- const { t } = useTranslation29();
21625
+ const { t } = useTranslation31();
20847
21626
  const { organizationName, email } = useAuth();
20848
21627
  const { colors, branding } = useTheme();
21628
+ const { switchProfile } = useProfileSwitch();
20849
21629
  const brandName = (branding == null ? void 0 : branding.brand_name) || organizationName || t("privacyCenter") || "Privacy Center";
20850
21630
  const handleAction = () => {
20851
21631
  onClose();
20852
21632
  navigateBack(onBack);
20853
21633
  };
20854
- return /* @__PURE__ */ jsxs46(BottomSheet, { visible, onClose, title: t("account") || "Account", children: [
20855
- /* @__PURE__ */ jsxs46(View52, { style: styles54.identity, children: [
20856
- (branding == null ? void 0 : branding.logo_url) ? /* @__PURE__ */ jsx66(Image4, { source: { uri: branding.logo_url }, style: styles54.logo, resizeMode: "contain" }) : /* @__PURE__ */ jsx66(PCAvatar, { name: organizationName || brandName, imageUrl: branding == null ? void 0 : branding.icon_url, size: 52 }),
20857
- /* @__PURE__ */ jsxs46(View52, { style: styles54.identityText, children: [
20858
- /* @__PURE__ */ jsx66(Text43, { style: [styles54.orgName, { color: colors.text }], numberOfLines: 2, children: brandName }),
20859
- email ? /* @__PURE__ */ jsx66(Text43, { style: [styles54.email, { color: colors.textSecondary }], numberOfLines: 1, children: email }) : null
21634
+ return /* @__PURE__ */ jsxs47(BottomSheet, { visible, onClose, title: t("account") || "Account", children: [
21635
+ /* @__PURE__ */ jsxs47(View54, { style: styles56.identity, children: [
21636
+ (branding == null ? void 0 : branding.logo_url) ? /* @__PURE__ */ jsx70(Image4, { source: { uri: branding.logo_url }, style: styles56.logo, resizeMode: "contain" }) : /* @__PURE__ */ jsx70(PCAvatar, { name: organizationName || brandName, imageUrl: branding == null ? void 0 : branding.icon_url, size: 52 }),
21637
+ /* @__PURE__ */ jsxs47(View54, { style: styles56.identityText, children: [
21638
+ /* @__PURE__ */ jsx70(Text44, { style: [styles56.orgName, { color: colors.text }], numberOfLines: 2, children: brandName }),
21639
+ email ? /* @__PURE__ */ jsx70(Text44, { style: [styles56.email, { color: colors.textSecondary }], numberOfLines: 1, children: email }) : null
20860
21640
  ] })
20861
21641
  ] }),
20862
- onBack ? /* @__PURE__ */ jsxs46(
20863
- TouchableOpacity23,
21642
+ switchProfile ? /* @__PURE__ */ jsxs47(
21643
+ TouchableOpacity24,
20864
21644
  {
20865
- style: [styles54.actionRow, { backgroundColor: withAlpha(onBack === "signout" ? colors.error : colors.primary, 0.1) }],
21645
+ style: [styles56.actionRow, { backgroundColor: withAlpha(colors.primary, 0.1) }],
21646
+ onPress: () => {
21647
+ onClose();
21648
+ switchProfile();
21649
+ },
21650
+ activeOpacity: 0.7,
21651
+ accessibilityRole: "button",
21652
+ children: [
21653
+ /* @__PURE__ */ jsx70(Svg3, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx70(
21654
+ Path3,
21655
+ {
21656
+ d: "M16 3h5v5 M21 3l-7 7 M8 21H3v-5 M3 21l7-7",
21657
+ stroke: colors.primary,
21658
+ strokeWidth: 2,
21659
+ strokeLinecap: "round",
21660
+ strokeLinejoin: "round"
21661
+ }
21662
+ ) }),
21663
+ /* @__PURE__ */ jsx70(Text44, { style: [styles56.actionLabel, { color: colors.primary }], children: t("switchProfile") })
21664
+ ]
21665
+ }
21666
+ ) : null,
21667
+ onBack ? /* @__PURE__ */ jsxs47(
21668
+ TouchableOpacity24,
21669
+ {
21670
+ style: [styles56.actionRow, { backgroundColor: withAlpha(onBack === "signout" ? colors.error : colors.primary, 0.1) }],
20866
21671
  onPress: handleAction,
20867
21672
  activeOpacity: 0.7,
20868
21673
  accessibilityRole: "button",
20869
21674
  children: [
20870
- /* @__PURE__ */ jsx66(Svg3, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", children: onBack === "signout" ? /* @__PURE__ */ jsx66(
21675
+ /* @__PURE__ */ jsx70(Svg3, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", children: onBack === "signout" ? /* @__PURE__ */ jsx70(
20871
21676
  Path3,
20872
21677
  {
20873
21678
  d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4 M16 17l5-5-5-5 M21 12H9",
@@ -20876,7 +21681,7 @@ var UserOrgMenu = ({ visible, onClose, onBack }) => {
20876
21681
  strokeLinecap: "round",
20877
21682
  strokeLinejoin: "round"
20878
21683
  }
20879
- ) : /* @__PURE__ */ jsx66(
21684
+ ) : /* @__PURE__ */ jsx70(
20880
21685
  Path3,
20881
21686
  {
20882
21687
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20886,13 +21691,13 @@ var UserOrgMenu = ({ visible, onClose, onBack }) => {
20886
21691
  strokeLinejoin: "round"
20887
21692
  }
20888
21693
  ) }),
20889
- /* @__PURE__ */ jsx66(Text43, { style: [styles54.actionLabel, { color: onBack === "signout" ? colors.error : colors.primary }], children: onBack === "signout" ? t("signOut") || "Sign Out" : t("back") || "Back" })
21694
+ /* @__PURE__ */ jsx70(Text44, { style: [styles56.actionLabel, { color: onBack === "signout" ? colors.error : colors.primary }], children: onBack === "signout" ? t("signOut") || "Sign Out" : t("back") || "Back" })
20890
21695
  ]
20891
21696
  }
20892
21697
  ) : null
20893
21698
  ] });
20894
21699
  };
20895
- var styles54 = StyleSheet55.create({
21700
+ var styles56 = StyleSheet57.create({
20896
21701
  identity: {
20897
21702
  flexDirection: "row",
20898
21703
  alignItems: "center",
@@ -20933,33 +21738,33 @@ var styles54 = StyleSheet55.create({
20933
21738
  });
20934
21739
 
20935
21740
  // src/RedactoPrivacyCenter/components/Navbar.tsx
20936
- import { Fragment as Fragment19, jsx as jsx67, jsxs as jsxs47 } from "react/jsx-runtime";
21741
+ import { Fragment as Fragment19, jsx as jsx71, jsxs as jsxs48 } from "react/jsx-runtime";
20937
21742
  function Navbar({ mode = "primary", onBack }) {
20938
- const { t } = useTranslation30();
21743
+ const { t } = useTranslation32();
20939
21744
  const { currentPage, navigateTo } = useInternalNavigation();
20940
21745
  const { organizationName, email } = useAuth();
20941
21746
  const { colors, branding } = useTheme();
20942
- const [locale, setLocale] = useState25(i18n_default.language || "en");
20943
- const [menuOpen, setMenuOpen] = useState25(false);
21747
+ const [locale, setLocale] = useState26(i18n_default.language || "en");
21748
+ const [menuOpen, setMenuOpen] = useState26(false);
20944
21749
  const unreadCount = useUnreadCount();
20945
21750
  const { status: pageStatus } = usePageStatus();
20946
21751
  const pageChrome = PAGE_CHROME_BY_PAGE[currentPage] || PAGE_CHROME_BY_PAGE["consent-manager"];
20947
21752
  const isDetail = mode === "detail";
20948
- useEffect21(() => {
21753
+ useEffect22(() => {
20949
21754
  const handleLanguageChanged = () => setLocale(i18n_default.language);
20950
21755
  i18n_default.on("languageChanged", handleLanguageChanged);
20951
21756
  return () => {
20952
21757
  i18n_default.off("languageChanged", handleLanguageChanged);
20953
21758
  };
20954
21759
  }, []);
20955
- const handleLanguageChange = useCallback14((value) => {
21760
+ const handleLanguageChange = useCallback15((value) => {
20956
21761
  i18n_default.changeLanguage(value);
20957
21762
  }, []);
20958
21763
  const brandLabel = (branding == null ? void 0 : branding.brand_name) || organizationName || t("privacyCenter") || "Privacy Center";
20959
21764
  const accountLabel = brandLabel || email || t("account") || "Account";
20960
- const brandLockup = /* @__PURE__ */ jsxs47(View53, { style: styles55.brandRow, children: [
20961
- /* @__PURE__ */ jsx67(PCAvatar, { name: organizationName || brandLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 }),
20962
- /* @__PURE__ */ jsx67(Text44, { style: [styles55.brandText, { color: colors.text }], numberOfLines: 1, children: brandLabel })
21765
+ const brandLockup = /* @__PURE__ */ jsxs48(View55, { style: styles57.brandRow, children: [
21766
+ /* @__PURE__ */ jsx71(PCAvatar, { name: organizationName || brandLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 }),
21767
+ /* @__PURE__ */ jsx71(Text45, { style: [styles57.brandText, { color: colors.text }], numberOfLines: 1, children: brandLabel })
20963
21768
  ] });
20964
21769
  const handleDetailBack = () => {
20965
21770
  if (currentPage === "case-details") {
@@ -20971,26 +21776,26 @@ function Navbar({ mode = "primary", onBack }) {
20971
21776
  }
20972
21777
  };
20973
21778
  if (isDetail) {
20974
- return /* @__PURE__ */ jsxs47(Fragment19, { children: [
20975
- /* @__PURE__ */ jsx67(
20976
- View53,
21779
+ return /* @__PURE__ */ jsxs48(Fragment19, { children: [
21780
+ /* @__PURE__ */ jsx71(
21781
+ View55,
20977
21782
  {
20978
21783
  style: [
20979
- styles55.container,
20980
- styles55.detailContainer,
21784
+ styles57.container,
21785
+ styles57.detailContainer,
20981
21786
  { backgroundColor: colors.background, borderBottomColor: colors.border, paddingTop: TOP_INSET + spacing.xs }
20982
21787
  ],
20983
- children: /* @__PURE__ */ jsxs47(View53, { style: styles55.detailRow, children: [
20984
- /* @__PURE__ */ jsx67(
20985
- TouchableOpacity24,
21788
+ children: /* @__PURE__ */ jsxs48(View55, { style: styles57.detailRow, children: [
21789
+ /* @__PURE__ */ jsx71(
21790
+ TouchableOpacity25,
20986
21791
  {
20987
- style: styles55.backButton,
21792
+ style: styles57.backButton,
20988
21793
  onPress: handleDetailBack,
20989
21794
  activeOpacity: 0.7,
20990
21795
  hitSlop: DEFAULT_HIT_SLOP,
20991
21796
  accessibilityRole: "button",
20992
21797
  accessibilityLabel: t("back") || "Back",
20993
- children: /* @__PURE__ */ jsx67(Svg4, { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx67(
21798
+ children: /* @__PURE__ */ jsx71(Svg4, { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx71(
20994
21799
  Path4,
20995
21800
  {
20996
21801
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -21002,36 +21807,36 @@ function Navbar({ mode = "primary", onBack }) {
21002
21807
  ) })
21003
21808
  }
21004
21809
  ),
21005
- /* @__PURE__ */ jsxs47(View53, { style: styles55.detailTitleWrap, children: [
21006
- /* @__PURE__ */ jsx67(Text44, { style: [styles55.detailTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
21007
- pageStatus ? /* @__PURE__ */ jsx67(PCBadge, { status: pageStatus.tone, label: pageStatus.label }) : null
21810
+ /* @__PURE__ */ jsxs48(View55, { style: styles57.detailTitleWrap, children: [
21811
+ /* @__PURE__ */ jsx71(Text45, { style: [styles57.detailTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
21812
+ pageStatus ? /* @__PURE__ */ jsx71(PCBadge, { status: pageStatus.tone, label: pageStatus.label }) : null
21008
21813
  ] })
21009
21814
  ] })
21010
21815
  }
21011
21816
  ),
21012
- /* @__PURE__ */ jsx67(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21817
+ /* @__PURE__ */ jsx71(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21013
21818
  ] });
21014
21819
  }
21015
- return /* @__PURE__ */ jsxs47(Fragment19, { children: [
21016
- /* @__PURE__ */ jsxs47(
21017
- View53,
21820
+ return /* @__PURE__ */ jsxs48(Fragment19, { children: [
21821
+ /* @__PURE__ */ jsxs48(
21822
+ View55,
21018
21823
  {
21019
21824
  style: [
21020
- styles55.container,
21825
+ styles57.container,
21021
21826
  { backgroundColor: colors.background, borderBottomColor: colors.border, paddingTop: TOP_INSET + spacing.xs }
21022
21827
  ],
21023
21828
  children: [
21024
- /* @__PURE__ */ jsxs47(View53, { style: styles55.appBar, children: [
21025
- onBack ? /* @__PURE__ */ jsx67(
21026
- TouchableOpacity24,
21829
+ /* @__PURE__ */ jsxs48(View55, { style: styles57.appBar, children: [
21830
+ onBack ? /* @__PURE__ */ jsx71(
21831
+ TouchableOpacity25,
21027
21832
  {
21028
- style: styles55.backButton,
21833
+ style: styles57.backButton,
21029
21834
  onPress: () => navigateBack(onBack),
21030
21835
  activeOpacity: 0.7,
21031
21836
  hitSlop: DEFAULT_HIT_SLOP,
21032
21837
  accessibilityRole: "button",
21033
21838
  accessibilityLabel: onBack === "back" ? t("back") || "Back" : t("signOut") || "Sign Out",
21034
- children: /* @__PURE__ */ jsx67(Svg4, { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx67(
21839
+ children: /* @__PURE__ */ jsx71(Svg4, { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx71(
21035
21840
  Path4,
21036
21841
  {
21037
21842
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -21043,39 +21848,39 @@ function Navbar({ mode = "primary", onBack }) {
21043
21848
  ) })
21044
21849
  }
21045
21850
  ) : null,
21046
- /* @__PURE__ */ jsx67(View53, { style: styles55.brandWrap, children: (branding == null ? void 0 : branding.logo_url) ? /* @__PURE__ */ jsx67(BrandImage, { uri: branding.logo_url, height: 34, maxWidth: 170, fallback: brandLockup }) : brandLockup }),
21047
- /* @__PURE__ */ jsxs47(View53, { style: styles55.actions, children: [
21048
- /* @__PURE__ */ jsx67(NotificationBell, { count: unreadCount, onPress: () => navigateTo("notifications") }),
21049
- /* @__PURE__ */ jsx67(PCSelect, { value: locale, options: languageOptions, onChange: handleLanguageChange, placeholder: t("language"), compact: true }),
21050
- /* @__PURE__ */ jsx67(
21051
- TouchableOpacity24,
21851
+ /* @__PURE__ */ jsx71(View55, { style: styles57.brandWrap, children: (branding == null ? void 0 : branding.logo_url) ? /* @__PURE__ */ jsx71(BrandImage, { uri: branding.logo_url, height: 34, maxWidth: 170, fallback: brandLockup }) : brandLockup }),
21852
+ /* @__PURE__ */ jsxs48(View55, { style: styles57.actions, children: [
21853
+ /* @__PURE__ */ jsx71(NotificationBell, { count: unreadCount, onPress: () => navigateTo("notifications") }),
21854
+ /* @__PURE__ */ jsx71(PCSelect, { value: locale, options: languageOptions, onChange: handleLanguageChange, placeholder: t("language"), compact: true }),
21855
+ /* @__PURE__ */ jsx71(
21856
+ TouchableOpacity25,
21052
21857
  {
21053
- style: styles55.avatarButton,
21858
+ style: styles57.avatarButton,
21054
21859
  onPress: () => setMenuOpen(true),
21055
21860
  activeOpacity: 0.7,
21056
21861
  hitSlop: DEFAULT_HIT_SLOP,
21057
21862
  accessibilityRole: "button",
21058
21863
  accessibilityLabel: accountLabel,
21059
- children: /* @__PURE__ */ jsx67(PCAvatar, { name: organizationName || accountLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 })
21864
+ children: /* @__PURE__ */ jsx71(PCAvatar, { name: organizationName || accountLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 })
21060
21865
  }
21061
21866
  )
21062
21867
  ] })
21063
21868
  ] }),
21064
- /* @__PURE__ */ jsx67(View53, { style: styles55.pageHeader, children: /* @__PURE__ */ jsxs47(View53, { style: styles55.titleRow, children: [
21065
- /* @__PURE__ */ jsx67(Text44, { style: [styles55.pageTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
21066
- pageStatus ? /* @__PURE__ */ jsx67(PCBadge, { status: pageStatus.tone, label: pageStatus.label }) : null
21869
+ /* @__PURE__ */ jsx71(View55, { style: styles57.pageHeader, children: /* @__PURE__ */ jsxs48(View55, { style: styles57.titleRow, children: [
21870
+ /* @__PURE__ */ jsx71(Text45, { style: [styles57.pageTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
21871
+ pageStatus ? /* @__PURE__ */ jsx71(PCBadge, { status: pageStatus.tone, label: pageStatus.label }) : null
21067
21872
  ] }) })
21068
21873
  ]
21069
21874
  }
21070
21875
  ),
21071
- /* @__PURE__ */ jsx67(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21876
+ /* @__PURE__ */ jsx71(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21072
21877
  ] });
21073
21878
  }
21074
- var styles55 = StyleSheet56.create({
21879
+ var styles57 = StyleSheet58.create({
21075
21880
  container: {
21076
21881
  paddingHorizontal: spacing.lg,
21077
21882
  paddingBottom: spacing.md,
21078
- borderBottomWidth: StyleSheet56.hairlineWidth
21883
+ borderBottomWidth: StyleSheet58.hairlineWidth
21079
21884
  },
21080
21885
  detailContainer: {
21081
21886
  paddingBottom: spacing.sm
@@ -21155,10 +21960,10 @@ var styles55 = StyleSheet56.create({
21155
21960
  });
21156
21961
 
21157
21962
  // src/RedactoPrivacyCenter/components/BottomTabBar.tsx
21158
- import { useState as useState26 } from "react";
21159
- import { Animated as Animated14, StyleSheet as StyleSheet57, Text as Text45, TouchableOpacity as TouchableOpacity25, View as View54 } from "react-native";
21160
- import { useTranslation as useTranslation31 } from "react-i18next";
21161
- import { jsx as jsx68, jsxs as jsxs48 } from "react/jsx-runtime";
21963
+ import { useState as useState27 } from "react";
21964
+ import { Animated as Animated14, StyleSheet as StyleSheet59, Text as Text46, TouchableOpacity as TouchableOpacity26, View as View56 } from "react-native";
21965
+ import { useTranslation as useTranslation33 } from "react-i18next";
21966
+ import { jsx as jsx72, jsxs as jsxs49 } from "react/jsx-runtime";
21162
21967
  var TAB_ITEMS = [
21163
21968
  { page: "consent-manager", labelKey: "consentManager", fallback: "Consents", icon: "shield-check" },
21164
21969
  { page: "form", labelKey: "grievanceRequests", fallback: "Requests", icon: "message-circle-warning" },
@@ -21169,10 +21974,10 @@ var PAD_H = spacing.lg;
21169
21974
  var PILL_WIDTH = 56;
21170
21975
  var PILL_HEIGHT = 34;
21171
21976
  function BottomTabBar({ showFooter = true }) {
21172
- const { t } = useTranslation31();
21977
+ const { t } = useTranslation33();
21173
21978
  const { currentPage, navigateTo } = useInternalNavigation();
21174
21979
  const { colors } = useTheme();
21175
- const [rowWidth, setRowWidth] = useState26(0);
21980
+ const [rowWidth, setRowWidth] = useState27(0);
21176
21981
  const innerWidth = Math.max(0, rowWidth - PAD_H * 2);
21177
21982
  const tabWidth = innerWidth > 0 ? innerWidth / TAB_ITEMS.length : 0;
21178
21983
  const activeIndex = TAB_ITEMS.findIndex(
@@ -21180,13 +21985,13 @@ function BottomTabBar({ showFooter = true }) {
21180
21985
  );
21181
21986
  const { translateX } = useAnimatedTabIndicator(Math.max(0, activeIndex), tabWidth);
21182
21987
  const onLayout = (e) => setRowWidth(e.nativeEvent.layout.width);
21183
- return /* @__PURE__ */ jsxs48(View54, { style: [styles56.wrapper, { backgroundColor: colors.canvasSubtle, borderTopColor: colors.hairline }], children: [
21184
- /* @__PURE__ */ jsxs48(View54, { style: styles56.container, onLayout, children: [
21185
- tabWidth > 0 && activeIndex >= 0 ? /* @__PURE__ */ jsx68(
21988
+ return /* @__PURE__ */ jsxs49(View56, { style: [styles58.wrapper, { backgroundColor: colors.canvasSubtle, borderTopColor: colors.hairline }], children: [
21989
+ /* @__PURE__ */ jsxs49(View56, { style: styles58.container, onLayout, children: [
21990
+ tabWidth > 0 && activeIndex >= 0 ? /* @__PURE__ */ jsx72(
21186
21991
  Animated14.View,
21187
21992
  {
21188
21993
  style: [
21189
- styles56.pill,
21994
+ styles58.pill,
21190
21995
  {
21191
21996
  width: PILL_WIDTH,
21192
21997
  left: PAD_H + (tabWidth - PILL_WIDTH) / 2,
@@ -21199,17 +22004,17 @@ function BottomTabBar({ showFooter = true }) {
21199
22004
  TAB_ITEMS.map((item) => {
21200
22005
  const isActive = currentPage === item.page || item.page === "form" && currentPage === "case-details";
21201
22006
  const label = t(item.labelKey) || item.fallback;
21202
- return /* @__PURE__ */ jsxs48(
21203
- TouchableOpacity25,
22007
+ return /* @__PURE__ */ jsxs49(
22008
+ TouchableOpacity26,
21204
22009
  {
21205
- style: styles56.tab,
22010
+ style: styles58.tab,
21206
22011
  onPress: () => navigateTo(item.page),
21207
22012
  activeOpacity: 0.7,
21208
22013
  accessibilityRole: "tab",
21209
22014
  accessibilityState: { selected: isActive },
21210
22015
  accessibilityLabel: label,
21211
22016
  children: [
21212
- /* @__PURE__ */ jsx68(View54, { style: styles56.iconWrap, children: /* @__PURE__ */ jsx68(
22017
+ /* @__PURE__ */ jsx72(View56, { style: styles58.iconWrap, children: /* @__PURE__ */ jsx72(
21213
22018
  Icon,
21214
22019
  {
21215
22020
  name: item.icon,
@@ -21218,10 +22023,10 @@ function BottomTabBar({ showFooter = true }) {
21218
22023
  strokeWidth: isActive ? 2.1 : 1.85
21219
22024
  }
21220
22025
  ) }),
21221
- /* @__PURE__ */ jsx68(
21222
- Text45,
22026
+ /* @__PURE__ */ jsx72(
22027
+ Text46,
21223
22028
  {
21224
- style: [styles56.tabLabel, { color: isActive ? colors.primary : colors.textSecondary }],
22029
+ style: [styles58.tabLabel, { color: isActive ? colors.primary : colors.textSecondary }],
21225
22030
  numberOfLines: 1,
21226
22031
  children: label
21227
22032
  }
@@ -21232,13 +22037,13 @@ function BottomTabBar({ showFooter = true }) {
21232
22037
  );
21233
22038
  })
21234
22039
  ] }),
21235
- showFooter ? /* @__PURE__ */ jsx68(Footer, { inline: true }) : null,
21236
- /* @__PURE__ */ jsx68(View54, { style: { height: BOTTOM_INSET } })
22040
+ showFooter ? /* @__PURE__ */ jsx72(Footer, { inline: true }) : null,
22041
+ /* @__PURE__ */ jsx72(View56, { style: { height: BOTTOM_INSET } })
21237
22042
  ] });
21238
22043
  }
21239
- var styles56 = StyleSheet57.create({
22044
+ var styles58 = StyleSheet59.create({
21240
22045
  wrapper: {
21241
- borderTopWidth: StyleSheet57.hairlineWidth
22046
+ borderTopWidth: StyleSheet59.hairlineWidth
21242
22047
  },
21243
22048
  container: {
21244
22049
  flexDirection: "row",