@redacto.io/consent-sdk-react-native 5.0.0-beta.0 → 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,7 +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;
14763
+ var FORM_PICKER_GROUP_LIMIT = 100;
14764
+ var LEGACY_PRODUCT_GROUP_UUID = "__legacy_flat_purposes__";
14327
14765
  var POLL_INTERVAL = 3e4;
14328
14766
  var NOTIFICATION_PAGE_SIZE = 10;
14329
14767
  var TAB_TO_CATEGORY = {
@@ -14432,7 +14870,7 @@ var ModifyConsentModal = ({
14432
14870
  action: "revoke",
14433
14871
  buttonLabel: t("revokeConsent"),
14434
14872
  buttonColor: colors.error,
14435
- warningMessage: t("revokeConsentWarning"),
14873
+ warningMessage: selectedRecord.revoke_warning_message || t("revokeConsentWarning"),
14436
14874
  description: nominatorLabel ? t("aboutToModifyConsentOnBehalf", { nominator: nominatorLabel }) : t("aboutToModifyConsent")
14437
14875
  };
14438
14876
  }
@@ -15103,7 +15541,8 @@ function ConsentManager() {
15103
15541
  dataElements: (_b = selectedRecord == null ? void 0 : selectedRecord.data_elements) == null ? void 0 : _b.map((de) => ({
15104
15542
  uuid: de.uuid,
15105
15543
  selected: de.selected
15106
- }))
15544
+ })),
15545
+ language: langParam
15107
15546
  });
15108
15547
  setIsModalOpen(false);
15109
15548
  setSelectedRecord(null);
@@ -15115,7 +15554,7 @@ function ConsentManager() {
15115
15554
  setIsManageLoading(false);
15116
15555
  }
15117
15556
  },
15118
- [organizationId, workspaceId, email, authContext, consentClient, selectedRecord, fetchData, t]
15557
+ [organizationId, workspaceId, email, authContext, consentClient, selectedRecord, langParam, fetchData, t]
15119
15558
  );
15120
15559
  const handleExport = useCallback6(async () => {
15121
15560
  if (!consentData.length) return;
@@ -15478,6 +15917,7 @@ function ActivitiesList() {
15478
15917
  () => ({ accessToken, refreshToken, onError, updateTokens }),
15479
15918
  [accessToken, refreshToken, onError, updateTokens]
15480
15919
  );
15920
+ const { langParam } = useCurrentLanguage();
15481
15921
  const [activities, setActivities] = useState14([]);
15482
15922
  const [totalCount, setTotalCount] = useState14(0);
15483
15923
  const [isLoading, setIsLoading] = useState14(true);
@@ -15489,7 +15929,7 @@ function ActivitiesList() {
15489
15929
  var _a3, _b, _c;
15490
15930
  if (!organizationId || !workspaceId) return;
15491
15931
  try {
15492
- const response = await fetchActivities(organizationId, workspaceId, nextOffset, PAGE_SIZE, authContext, consentClient);
15932
+ const response = await fetchActivities(organizationId, workspaceId, nextOffset, PAGE_SIZE, authContext, consentClient, langParam);
15493
15933
  if (!response) return;
15494
15934
  const rows = (_a3 = response.data) != null ? _a3 : [];
15495
15935
  setActivities((prev) => append ? [...prev, ...rows] : rows);
@@ -15500,7 +15940,7 @@ function ActivitiesList() {
15500
15940
  if (!append) setActivities([]);
15501
15941
  }
15502
15942
  },
15503
- [organizationId, workspaceId, authContext, consentClient]
15943
+ [organizationId, workspaceId, authContext, consentClient, langParam]
15504
15944
  );
15505
15945
  useEffect12(() => {
15506
15946
  setIsLoading(true);
@@ -15639,10 +16079,10 @@ import { useTranslation as useTranslation13 } from "react-i18next";
15639
16079
  // src/RedactoPrivacyCenter/lib/dateGroup.ts
15640
16080
  import { useCallback as useCallback8 } from "react";
15641
16081
  import { useTranslation as useTranslation12 } from "react-i18next";
15642
- function monthKey(ts) {
16082
+ function monthKey(ts, locale) {
15643
16083
  if (!ts) return "";
15644
16084
  try {
15645
- return new Date(ts).toLocaleDateString(void 0, { month: "long", year: "numeric" });
16085
+ return new Date(ts).toLocaleDateString(locale || void 0, { month: "long", year: "numeric" });
15646
16086
  } catch {
15647
16087
  return "";
15648
16088
  }
@@ -15718,7 +16158,7 @@ function groupByTime(items, getTs, classify) {
15718
16158
  );
15719
16159
  }
15720
16160
  function useRelativeDate() {
15721
- const { t } = useTranslation12();
16161
+ const { t, i18n: i18n2 } = useTranslation12();
15722
16162
  return useCallback8(
15723
16163
  (ts) => {
15724
16164
  if (!ts) return "";
@@ -15731,7 +16171,7 @@ function useRelativeDate() {
15731
16171
  if (dayDiff <= 0) return t("today", { defaultValue: "Today" });
15732
16172
  if (dayDiff === 1) return t("yesterday", { defaultValue: "Yesterday" });
15733
16173
  if (dayDiff < 7) return t("daysAgo", { count: dayDiff, defaultValue: "{{count}} days ago" });
15734
- return d.toLocaleDateString(void 0, {
16174
+ return d.toLocaleDateString(i18n2.language || void 0, {
15735
16175
  month: "short",
15736
16176
  day: "numeric",
15737
16177
  ...d.getFullYear() !== now.getFullYear() ? { year: "numeric" } : {}
@@ -15740,10 +16180,28 @@ function useRelativeDate() {
15740
16180
  return ts;
15741
16181
  }
15742
16182
  },
15743
- [t]
16183
+ [t, i18n2.language]
15744
16184
  );
15745
16185
  }
15746
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
+
15747
16205
  // src/RedactoPrivacyCenter/components/ReceiptsList.tsx
15748
16206
  import { Fragment as Fragment7, jsx as jsx41, jsxs as jsxs25 } from "react/jsx-runtime";
15749
16207
  var PAGE_SIZE2 = 10;
@@ -15779,11 +16237,10 @@ function receiptBadgeStatus(eventType) {
15779
16237
  if (v.includes("EXPIR")) return "warning";
15780
16238
  return "secondary";
15781
16239
  }
15782
- var ReceiptRow = React15.memo(({ item, colors, downloading, onDownload, downloadLabel, dateLabel }) => {
16240
+ var ReceiptRow = React15.memo(({ item, colors, downloading, onDownload, downloadLabel, dateLabel, eventLabel }) => {
15783
16241
  const product = item.product_name_display || item.product_name || "";
15784
- const event = item.event_type_display || item.event_type || "";
15785
- const primary = product || event || "-";
15786
- const badgeLabel = event || "-";
16242
+ const primary = product || eventLabel || "-";
16243
+ const badgeLabel = eventLabel || "-";
15787
16244
  return /* @__PURE__ */ jsxs25(View30, { style: styles31.row, children: [
15788
16245
  /* @__PURE__ */ jsx41(NameAvatar, { name: primary, seed: item.uuid || primary, size: "sm" }),
15789
16246
  /* @__PURE__ */ jsxs25(View30, { style: styles31.body, children: [
@@ -15810,7 +16267,7 @@ var ReceiptRow = React15.memo(({ item, colors, downloading, onDownload, download
15810
16267
  });
15811
16268
  ReceiptRow.displayName = "ReceiptRow";
15812
16269
  function ReceiptsList() {
15813
- const { t } = useTranslation13();
16270
+ const { t, i18n: i18n2 } = useTranslation13();
15814
16271
  const { accessToken, refreshToken, organizationId, workspaceId, updateTokens, onError } = useAuth();
15815
16272
  const { consentClient } = useBaseUrl();
15816
16273
  const { colors } = useTheme();
@@ -15895,14 +16352,18 @@ function ReceiptsList() {
15895
16352
  const sections = useMemo13(() => {
15896
16353
  const map = /* @__PURE__ */ new Map();
15897
16354
  for (const r of receipts) {
15898
- const key = monthKey(r.created_at);
16355
+ const key = monthKey(r.created_at, i18n2.language);
15899
16356
  const arr = map.get(key);
15900
16357
  if (arr) arr.push(r);
15901
16358
  else map.set(key, [r]);
15902
16359
  }
15903
16360
  return Array.from(map, ([title, data]) => ({ title, data }));
15904
- }, [receipts]);
16361
+ }, [receipts, i18n2.language]);
15905
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
+ };
15906
16367
  const handleScroll = useCallback9(
15907
16368
  (e) => {
15908
16369
  const { layoutMeasurement, contentOffset, contentSize } = e.nativeEvent;
@@ -15984,7 +16445,8 @@ function ReceiptsList() {
15984
16445
  downloading: downloadingUuid === item.uuid,
15985
16446
  onDownload: handleDownload,
15986
16447
  downloadLabel,
15987
- dateLabel: relativeLabel(item.created_at)
16448
+ dateLabel: relativeLabel(item.created_at),
16449
+ eventLabel: eventLabelFor(item)
15988
16450
  }
15989
16451
  )
15990
16452
  ] }, `${item.uuid || item.created_at}-${index}`)) }, section2.title)),
@@ -16140,6 +16602,25 @@ var uploadFileWithS2S = async ({
16140
16602
  }
16141
16603
  };
16142
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
+
16143
16624
  // src/RedactoPrivacyCenter/lib/filePicker.ts
16144
16625
  import { Alert as Alert4 } from "react-native";
16145
16626
  async function pickFile() {
@@ -16303,6 +16784,54 @@ var styles32 = StyleSheet33.create({
16303
16784
 
16304
16785
  // src/RedactoPrivacyCenter/components/groupHelpers.ts
16305
16786
  var productGroupKey = (group) => group.nominator ? `${group.product_uuid}:${group.nominator.uuid}` : group.product_uuid;
16787
+ var consentGroupToFormProductGroup = (group) => {
16788
+ var _a3;
16789
+ return {
16790
+ product_uuid: group.product_uuid,
16791
+ product_name: group.product_name,
16792
+ product_description: group.product_description,
16793
+ nominator: group.nominator,
16794
+ purposes: ((_a3 = group.purposes) != null ? _a3 : []).map(purposeItemToFormPurpose)
16795
+ };
16796
+ };
16797
+ var purposeItemToFormPurpose = (purpose) => {
16798
+ var _a3, _b, _c, _d, _e, _f;
16799
+ return {
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 : "",
16805
+ name: purpose.name,
16806
+ description: (_e = purpose.description) != null ? _e : "",
16807
+ industries: "",
16808
+ selected: false,
16809
+ given_consent: false,
16810
+ status: purpose.status,
16811
+ validity: null,
16812
+ enabled: true,
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))
16824
+ };
16825
+ };
16826
+ var consentDataElementToFormDataElement = (element) => ({
16827
+ uuid: element.uuid,
16828
+ name: element.name,
16829
+ description: "",
16830
+ enabled: element.enabled,
16831
+ required: element.required,
16832
+ given_consent: element.selected,
16833
+ selected: element.selected
16834
+ });
16306
16835
  var buildGroupPurposes = (group) => group.purposes.filter((p) => p !== null && p !== void 0).map((p) => {
16307
16836
  const validDataElements = Array.isArray(p.data_elements) ? p.data_elements.filter((de) => de !== null && de !== void 0 && Boolean(de.uuid)).map((de) => ({ ...de, selected: false })) : [];
16308
16837
  return {
@@ -16328,12 +16857,6 @@ var buildGroupDataElements = (group) => {
16328
16857
  // src/RedactoPrivacyCenter/components/Form.tsx
16329
16858
  import { Fragment as Fragment9, jsx as jsx43, jsxs as jsxs27 } from "react/jsx-runtime";
16330
16859
  var TOTAL_STEPS = 3;
16331
- var PRODUCT_SCOPED_REQUEST_TYPES = /* @__PURE__ */ new Set([
16332
- "ACCESS" /* ACCESS */,
16333
- "erasure" /* ERASURE */,
16334
- "CORRECTION" /* CORRECTION */
16335
- ]);
16336
- var isProductScopedRequestType = (rt) => PRODUCT_SCOPED_REQUEST_TYPES.has(rt);
16337
16860
  function Form({ onCreateRequest }) {
16338
16861
  const { t } = useTranslation15();
16339
16862
  const { accessToken, refreshToken, email, organizationId, workspaceId, updateTokens, onError } = useAuth();
@@ -16374,23 +16897,78 @@ function Form({ onCreateRequest }) {
16374
16897
  });
16375
16898
  const [uploadedDocs, setUploadedDocs] = useState16([]);
16376
16899
  const [isUploading, setIsUploading] = useState16(false);
16900
+ const withUserConsentPickerGroups = useCallback10(
16901
+ async (form, language) => {
16902
+ var _a3, _b;
16903
+ if (!organizationId || !workspaceId) {
16904
+ return form;
16905
+ }
16906
+ const consents = await fetchUserConsents({
16907
+ organizationId,
16908
+ workspaceId,
16909
+ // No status filter: include every status (active / expired / withdrawn
16910
+ // / declined), matching Python form/data, so a DSAR can target products
16911
+ // the user no longer actively consents to.
16912
+ limit: FORM_PICKER_GROUP_LIMIT,
16913
+ nominatedLimit: FORM_PICKER_GROUP_LIMIT,
16914
+ language,
16915
+ authContext,
16916
+ consentClient
16917
+ });
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) {
16921
+ return form;
16922
+ }
16923
+ return {
16924
+ ...form,
16925
+ direct_groups: direct.map(consentGroupToFormProductGroup),
16926
+ nominated_groups: nominated.map(consentGroupToFormProductGroup)
16927
+ };
16928
+ },
16929
+ [organizationId, workspaceId, authContext, consentClient]
16930
+ );
16377
16931
  useEffect14(() => {
16378
16932
  if (!organizationId || !workspaceId || !contact) return;
16933
+ let isCancelled = false;
16379
16934
  setIsLoading(true);
16380
- getFormData(organizationId, workspaceId, contact, false, false, authContext, consentClient, langParam).then((data) => {
16381
- if (data) setFormDataResponse(data);
16935
+ getFormData(organizationId, workspaceId, contact, false, false, authContext, consentClient, langParam).then(async (data) => {
16936
+ if (!data) return;
16937
+ const withGroups = await withUserConsentPickerGroups(data, langParam);
16938
+ if (!isCancelled) setFormDataResponse(withGroups);
16382
16939
  }).catch((error) => {
16383
16940
  console.warn("Error fetching form data:", error);
16384
- }).finally(() => setIsLoading(false));
16385
- }, [organizationId, workspaceId, contact, authContext, consentClient, langParam]);
16941
+ }).finally(() => {
16942
+ if (!isCancelled) setIsLoading(false);
16943
+ });
16944
+ return () => {
16945
+ isCancelled = true;
16946
+ };
16947
+ }, [
16948
+ organizationId,
16949
+ workspaceId,
16950
+ contact,
16951
+ authContext,
16952
+ consentClient,
16953
+ langParam,
16954
+ withUserConsentPickerGroups
16955
+ ]);
16386
16956
  const allGroups = useMemo14(() => {
16387
16957
  var _a3, _b;
16388
16958
  if (!formDataResponse) return [];
16389
- return [
16959
+ const groups = [
16390
16960
  ...(_a3 = formDataResponse.direct_groups) != null ? _a3 : [],
16391
16961
  ...(_b = formDataResponse.nominated_groups) != null ? _b : []
16392
16962
  ];
16393
- }, [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]);
16394
16972
  const skipProductStep = allGroups.length === 1;
16395
16973
  const selectedGroup = useMemo14(() => {
16396
16974
  var _a3, _b;
@@ -16422,7 +17000,7 @@ function Form({ onCreateRequest }) {
16422
17000
  setSelectedProductKey(null);
16423
17001
  }
16424
17002
  setNominationData({ nominee_email: "", nominee_mobile: "" });
16425
- if (requestType === "grievance" /* GRIEVANCE */ && grievanceOptions.length > 0) {
17003
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */) && grievanceOptions.length > 0) {
16426
17004
  const resetGrievances = grievanceOptions.reduce(
16427
17005
  (acc, option) => {
16428
17006
  acc[option.value] = false;
@@ -16451,12 +17029,10 @@ function Form({ onCreateRequest }) {
16451
17029
  () => groupPurposes.filter((p) => selectedPurposes.has(p.uuid)).map((p) => p.name).filter(Boolean),
16452
17030
  [groupPurposes, selectedPurposes]
16453
17031
  );
16454
- const selectedErasurePurposeNames = useMemo14(() => {
16455
- if (selectedErasurePurposeList.length === 0 || selectedErasurePurposeList.length > MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL) {
16456
- return t("revokeConsentModalYourPurposes");
16457
- }
16458
- return selectedErasurePurposeList.join(", ");
16459
- }, [selectedErasurePurposeList, t]);
17032
+ const selectedErasurePurposeNames = useMemo14(
17033
+ () => resolveErasurePurposeNames(selectedErasurePurposeList, t("revokeConsentModalYourPurposes")),
17034
+ [selectedErasurePurposeList, t]
17035
+ );
16460
17036
  const togglePurpose = useCallback10(
16461
17037
  (purpose) => {
16462
17038
  const uuid = purpose.uuid;
@@ -16563,7 +17139,7 @@ function Form({ onCreateRequest }) {
16563
17139
  if (isProductScopedRequestType(requestType)) {
16564
17140
  if (allGroups.length === 0) return false;
16565
17141
  if (!selectedGroup) return false;
16566
- if (requestType === "CORRECTION" /* CORRECTION */) {
17142
+ if (isRequestType(requestType, "CORRECTION" /* CORRECTION */)) {
16567
17143
  if (selectedCorrectionFields.size === 0) return false;
16568
17144
  return Array.from(selectedCorrectionFields).every((fieldUuid) => {
16569
17145
  var _a3, _b;
@@ -16571,15 +17147,15 @@ function Form({ onCreateRequest }) {
16571
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()));
16572
17148
  });
16573
17149
  }
16574
- if (requestType === "ACCESS" /* ACCESS */ || requestType === "erasure" /* ERASURE */) {
17150
+ if (isRequestType(requestType, "ACCESS" /* ACCESS */) || isErasureRequestType(requestType)) {
16575
17151
  return selectedPurposes.size > 0;
16576
17152
  }
16577
17153
  return false;
16578
17154
  }
16579
- if (requestType === "grievance" /* GRIEVANCE */) {
17155
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */)) {
16580
17156
  return Object.values(selectedGrievances).some(Boolean);
16581
17157
  }
16582
- if (requestType === "nomination" /* NOMINATION */) {
17158
+ if (isRequestType(requestType, "nomination" /* NOMINATION */)) {
16583
17159
  return Boolean(nominationData.nominee_email);
16584
17160
  }
16585
17161
  return false;
@@ -16593,9 +17169,17 @@ function Form({ onCreateRequest }) {
16593
17169
  selectedGrievances,
16594
17170
  nominationData
16595
17171
  ]);
16596
- const isFormValid = useMemo14(() => detailsValid && confirmChecked, [detailsValid, confirmChecked]);
17172
+ const isFormValid = useMemo14(
17173
+ () => Boolean(contact.trim()) && detailsValid && confirmChecked,
17174
+ [contact, detailsValid, confirmChecked]
17175
+ );
16597
17176
  const handleUpload = useCallback10(async () => {
16598
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
+ }
16599
17183
  try {
16600
17184
  const file = await pickFile();
16601
17185
  if (!file) return;
@@ -16612,11 +17196,11 @@ function Form({ onCreateRequest }) {
16612
17196
  "payload",
16613
17197
  JSON.stringify({
16614
17198
  organization_uuid: organizationId || "",
16615
- space: `privacy/${docUuid}`,
17199
+ space: `privacy/${caseUuid}`,
16616
17200
  uuid: docUuid,
16617
17201
  is_public: true,
16618
17202
  allow_ai_processing: true,
16619
- metadata: { group_by: "privacy", product: "privacy_center" }
17203
+ metadata: { group_by: "privacy", case_uuid: caseUuid, product: "privacy_center" }
16620
17204
  })
16621
17205
  );
16622
17206
  const result = await uploadFileWithS2S({
@@ -16636,18 +17220,28 @@ function Form({ onCreateRequest }) {
16636
17220
  } finally {
16637
17221
  setIsUploading(false);
16638
17222
  }
16639
- }, [organizationId, workspaceId, authContext, consentClient, baseUrl, t]);
17223
+ }, [organizationId, workspaceId, authContext, consentClient, baseUrl, t, formDataResponse]);
16640
17224
  const removeUploadedDoc = useCallback10((uuid) => {
16641
17225
  setUploadedDocs((prev) => prev.filter((d) => d.uuid !== uuid));
16642
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
+ );
16643
17233
  const handleSubmit = useCallback10(async (revoke = false) => {
16644
- var _a3, _b, _c, _d;
16645
- if (!organizationId || !workspaceId || !contact || !requestType || !formDataResponse) return;
17234
+ var _a3;
17235
+ if (!organizationId || !workspaceId || !contact || !requestType || !formDataResponse) {
17236
+ alertSubmitFailed();
17237
+ return;
17238
+ }
16646
17239
  setRevokeConsentOnFulfilment(revoke);
16647
17240
  setIsSubmitting(true);
16648
17241
  try {
16649
17242
  const isProductScoped = isProductScopedRequestType(requestType);
16650
- 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;
16651
17245
  const updatePurposes = Array.from(selectedPurposes).map((uuid) => ({
16652
17246
  purpose_uuid: uuid,
16653
17247
  data_element_uuids: Array.from(selectedDataElements.get(uuid) || [])
@@ -16668,27 +17262,27 @@ function Form({ onCreateRequest }) {
16668
17262
  purposes: updatePurposes,
16669
17263
  correction_data: correctionData,
16670
17264
  grievance_types: grievanceTypes,
16671
- ...requestType === "nomination" /* NOMINATION */ ? { nomination_data: nominationData } : {}
17265
+ ...isRequestType(requestType, "nomination" /* NOMINATION */) ? { nomination_data: nominationData } : {}
16672
17266
  },
16673
- time_period: requestType === "ACCESS" /* ACCESS */ ? parseInt(timePeriod || "30", 10) : 0,
17267
+ time_period: isRequestType(requestType, "ACCESS" /* ACCESS */) ? parseInt(timePeriod || "30", 10) : 0,
16674
17268
  requestor_note: additionalNote || "",
16675
- ...requestType === "erasure" /* ERASURE */ ? { revoke_consent_on_fulfilment: revoke } : {},
17269
+ ...erasureConsentPayload(requestType, revoke),
16676
17270
  ...anchorGroup ? { product_uuid: anchorGroup.product_uuid } : {},
16677
17271
  ...(anchorGroup == null ? void 0 : anchorGroup.nominator) ? { data_principal_uuid: anchorGroup.nominator.uuid } : {}
16678
17272
  };
16679
17273
  const response = await createCaseRequest(organizationId, workspaceId, request, false, false, authContext, consentClient);
16680
- const responseAny = response;
16681
- 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;
16682
17276
  if (newCaseId) {
16683
17277
  setCaseId(newCaseId);
16684
- setSubmittedProductName((_d = anchorGroup == null ? void 0 : anchorGroup.product_name) != null ? _d : "");
17278
+ setSubmittedProductName((_a3 = anchorGroup == null ? void 0 : anchorGroup.product_name) != null ? _a3 : "");
16685
17279
  setIsSubmitted(true);
16686
17280
  } else {
16687
- Alert5.alert(t("submit"), t("unableToSubmit") || "Unable to submit request. Please try again.");
17281
+ alertSubmitFailed();
16688
17282
  }
16689
17283
  } catch (error) {
16690
17284
  console.warn("Error submitting request:", error);
16691
- Alert5.alert(t("submit"), (error == null ? void 0 : error.message) || t("unableToSubmit") || "Unable to submit request.");
17285
+ alertSubmitFailed(error == null ? void 0 : error.message);
16692
17286
  } finally {
16693
17287
  setIsSubmitting(false);
16694
17288
  }
@@ -16711,11 +17305,13 @@ function Form({ onCreateRequest }) {
16711
17305
  consentClient,
16712
17306
  groupDataElements,
16713
17307
  uploadedDocs,
16714
- t
17308
+ alertSubmitFailed
16715
17309
  ]);
16716
17310
  const handleSubmitClick = useCallback10(() => {
16717
- if (!isFormValid) return;
16718
- if (requestType === "erasure" /* ERASURE */) {
17311
+ if (!isFormValid) {
17312
+ return;
17313
+ }
17314
+ if (isErasureRequestType(requestType)) {
16719
17315
  setIsErasureConsentModalOpen(true);
16720
17316
  return;
16721
17317
  }
@@ -16804,7 +17400,7 @@ function Form({ onCreateRequest }) {
16804
17400
  if (groupPurposes.length === 0) {
16805
17401
  return /* @__PURE__ */ jsx43(Text25, { style: [styles33.placeholder, { color: colors.textSecondary }], children: t("noPurposesAvailable") || "No purposes available" });
16806
17402
  }
16807
- const isErasure = requestType === "erasure" /* ERASURE */;
17403
+ const isErasure = isErasureRequestType(requestType);
16808
17404
  const allPurposesSelected = groupPurposes.every(
16809
17405
  (p) => (p.data_elements || []).every((de) => {
16810
17406
  var _a3;
@@ -16924,18 +17520,18 @@ function Form({ onCreateRequest }) {
16924
17520
  ] }),
16925
17521
  selectedGroup ? /* @__PURE__ */ jsxs27(View32, { style: styles33.section, children: [
16926
17522
  /* @__PURE__ */ jsx43(Text25, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("requestDetails") }),
16927
- /* @__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() })
16928
17524
  ] }) : /* @__PURE__ */ jsxs27(View32, { style: [styles33.hintCard, { backgroundColor: colors.surfaceAlt }], children: [
16929
17525
  /* @__PURE__ */ jsx43(Icon, { name: "circle-alert", size: 18, color: colors.textSecondary }),
16930
17526
  /* @__PURE__ */ jsx43(Text25, { style: [styles33.hintText, { color: colors.textSecondary }], children: t("selectProductFirst", { defaultValue: "Select a product to continue" }) })
16931
17527
  ] }),
16932
- requestType === "ACCESS" /* ACCESS */ && selectedGroup ? /* @__PURE__ */ jsxs27(View32, { style: styles33.section, children: [
17528
+ isRequestType(requestType, "ACCESS" /* ACCESS */) && selectedGroup ? /* @__PURE__ */ jsxs27(View32, { style: styles33.section, children: [
16933
17529
  /* @__PURE__ */ jsx43(Text25, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("timePeriod") }),
16934
17530
  /* @__PURE__ */ jsx43(PCSelect, { value: timePeriod, options: timePeriodOptions, onChange: setTimePeriod, placeholder: t("timePeriod") })
16935
17531
  ] }) : null
16936
17532
  ] });
16937
17533
  }
16938
- if (requestType === "grievance" /* GRIEVANCE */) {
17534
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */)) {
16939
17535
  if (grievanceOptions.length === 0) {
16940
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" }) });
16941
17537
  }
@@ -16951,7 +17547,7 @@ function Form({ onCreateRequest }) {
16951
17547
  ] })
16952
17548
  ] }) });
16953
17549
  }
16954
- if (requestType === "nomination" /* NOMINATION */) {
17550
+ if (isRequestType(requestType, "nomination" /* NOMINATION */)) {
16955
17551
  return /* @__PURE__ */ jsx43(View32, { style: styles33.stepBody, children: /* @__PURE__ */ jsxs27(View32, { style: styles33.section, children: [
16956
17552
  /* @__PURE__ */ jsx43(Text25, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("enterNomineeDetails") }),
16957
17553
  /* @__PURE__ */ jsxs27(View32, { style: [styles33.sectionCard, elevation.card, { backgroundColor: colors.surface }], children: [
@@ -18016,6 +18612,7 @@ function useUnreadCount() {
18016
18612
  const loadRef = useRef8();
18017
18613
  loadRef.current = async () => {
18018
18614
  if (!organizationId || !workspaceId) return;
18615
+ if (isRefreshBlocked(authContext)) return;
18019
18616
  const res = await fetchUnreadCount(organizationId, workspaceId, authContext, consentClient);
18020
18617
  if (res && typeof res.count === "number") setCount(res.count);
18021
18618
  };
@@ -18341,17 +18938,255 @@ function PrivacyCenterEmptyState() {
18341
18938
  return /* @__PURE__ */ jsx49(PCEmpty, { iconName: "shield", title: t("noDataTitle"), description: t("noDataDescription") });
18342
18939
  }
18343
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
+
18344
19179
  // src/RedactoPrivacyCenter/components/CaseDetails/CaseDetailsPage.tsx
18345
- import { useState as useState23, useMemo as useMemo20, useEffect as useEffect18 } from "react";
18346
- import { View as View45, Text as Text37, StyleSheet as StyleSheet47, ActivityIndicator as ActivityIndicator8, Platform as Platform7 } from "react-native";
18347
- 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";
18348
19183
 
18349
19184
  // src/RedactoPrivacyCenter/components/CaseDetails/RequestDetailsTab.tsx
18350
- import { View as View38, Text as Text30, ScrollView as ScrollView8, StyleSheet as StyleSheet40 } from "react-native";
18351
- import { useTranslation as useTranslation20 } from "react-i18next";
18352
- 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";
18353
19188
  function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18354
- const { t } = useTranslation20();
19189
+ const { t } = useTranslation22();
18355
19190
  const { colors } = useTheme();
18356
19191
  const { listBottom } = usePrivacyCenterInsets({ hasFooter: true });
18357
19192
  const details = selectedCase.request_details;
@@ -18383,36 +19218,36 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18383
19218
  }
18384
19219
  const description = selectedCase.description_display || selectedCase.description;
18385
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);
18386
- return /* @__PURE__ */ jsxs32(ScrollView8, { style: [styles39.container, { backgroundColor: colors.canvasSubtle }], contentContainerStyle: [styles39.content, { flexGrow: 1, paddingBottom: listBottom }], showsVerticalScrollIndicator: false, children: [
18387
- /* @__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) => {
18388
19223
  const isLast = i === steps.length - 1;
18389
- return /* @__PURE__ */ jsxs32(View38, { style: styles39.stepRow, children: [
18390
- /* @__PURE__ */ jsxs32(View38, { style: styles39.gutter, children: [
18391
- /* @__PURE__ */ jsx50(
18392
- View38,
19224
+ return /* @__PURE__ */ jsxs33(View40, { style: styles41.stepRow, children: [
19225
+ /* @__PURE__ */ jsxs33(View40, { style: styles41.gutter, children: [
19226
+ /* @__PURE__ */ jsx54(
19227
+ View40,
18393
19228
  {
18394
19229
  style: [
18395
- styles39.dot,
19230
+ styles41.dot,
18396
19231
  step.state === "upcoming" ? { backgroundColor: colors.canvasSubtle, borderWidth: 2, borderColor: step.danger ? colors.error : colors.border } : { backgroundColor: step.color }
18397
19232
  ],
18398
- 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
18399
19234
  }
18400
19235
  ),
18401
- !isLast ? /* @__PURE__ */ jsx50(View38, { style: [styles39.connector, { backgroundColor: colors.border }] }) : null
19236
+ !isLast ? /* @__PURE__ */ jsx54(View40, { style: [styles41.connector, { backgroundColor: colors.border }] }) : null
18402
19237
  ] }),
18403
- /* @__PURE__ */ jsxs32(View38, { style: [styles39.stepContent, isLast && styles39.stepContentLast], children: [
18404
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.stepLabel, { color: step.danger ? colors.error : colors.text }], children: step.label }),
18405
- 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
18406
19241
  ] })
18407
19242
  ] }, `${step.label}-${i}`);
18408
19243
  }) }),
18409
- hasDetails ? /* @__PURE__ */ jsxs32(View38, { style: [styles39.card, elevation.card, { backgroundColor: colors.surface }], children: [
18410
- description ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18411
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("descriptionLabel") || "Description" }),
18412
- /* @__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 })
18413
19248
  ] }) : null,
18414
- (details == null ? void 0 : details.purposes) && details.purposes.length > 0 ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18415
- /* @__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" }),
18416
19251
  details.purposes.map((rawP, idx) => {
18417
19252
  const p = (rawP == null ? void 0 : rawP.purpose) ? rawP.purpose : rawP;
18418
19253
  const purposeId = (p == null ? void 0 : p.uuid) || (p == null ? void 0 : p.purpose_uuid) || (rawP == null ? void 0 : rawP.purpose_uuid) || idx;
@@ -18420,10 +19255,10 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18420
19255
  const purposeDescription = (p == null ? void 0 : p.description) || (rawP == null ? void 0 : rawP.description);
18421
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)) : [];
18422
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 : [];
18423
- return /* @__PURE__ */ jsxs32(View38, { style: [styles39.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: StyleSheet40.hairlineWidth }], children: [
18424
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.itemTitle, { color: colors.text }], children: purposeName }),
18425
- purposeDescription ? /* @__PURE__ */ jsx50(Text30, { style: [styles39.itemDesc, { color: colors.textSecondary }], numberOfLines: 3, children: purposeDescription }) : null,
18426
- 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: [
18427
19262
  dataElementUuids.length,
18428
19263
  " ",
18429
19264
  t("dataElements") || "data elements"
@@ -18431,44 +19266,44 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18431
19266
  ] }, purposeId);
18432
19267
  })
18433
19268
  ] }) : null,
18434
- (details == null ? void 0 : details.correction_data) && details.correction_data.length > 0 ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18435
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("correctionData") || "Correction" }),
18436
- details.correction_data.map((item, idx) => /* @__PURE__ */ jsxs32(View38, { style: [styles39.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: StyleSheet40.hairlineWidth }], children: [
18437
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.itemTitle, { color: colors.text }], children: item.name }),
18438
- /* @__PURE__ */ jsxs32(View38, { style: styles39.correctionValues, children: [
18439
- /* @__PURE__ */ jsxs32(View38, { style: styles39.correctionValue, children: [
18440
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.correctionLabel, { color: colors.textSecondary }], children: t("currentValue") || "Current" }),
18441
- /* @__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 || "-" })
18442
19277
  ] }),
18443
- /* @__PURE__ */ jsx50(Icon, { name: "chevron-right", size: 16, color: colors.textSecondary, strokeWidth: 2.2 }),
18444
- /* @__PURE__ */ jsxs32(View38, { style: styles39.correctionValue, children: [
18445
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.correctionLabel, { color: colors.textSecondary }], children: t("newValue") || "New" }),
18446
- /* @__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 || "-" })
18447
19282
  ] })
18448
19283
  ] })
18449
19284
  ] }, idx))
18450
19285
  ] }) : null,
18451
- (details == null ? void 0 : details.grievance_types) && details.grievance_types.length > 0 ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18452
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("grievanceTypes") || "Grievance" }),
18453
- /* @__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)) })
18454
19289
  ] }) : null,
18455
- (details == null ? void 0 : details.nomination_data) ? /* @__PURE__ */ jsxs32(View38, { style: styles39.block, children: [
18456
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("nominationData") || "Nomination" }),
18457
- details.nomination_data.nominee_email ? /* @__PURE__ */ jsxs32(View38, { style: styles39.kvRow, children: [
18458
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.kvLabel, { color: colors.textSecondary }], children: t("email") || "Email" }),
18459
- /* @__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 })
18460
19295
  ] }) : null,
18461
- details.nomination_data.nominee_mobile ? /* @__PURE__ */ jsxs32(View38, { style: styles39.kvRow, children: [
18462
- /* @__PURE__ */ jsx50(Text30, { style: [styles39.kvLabel, { color: colors.textSecondary }], children: t("mobile") || "Mobile" }),
18463
- /* @__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 })
18464
19299
  ] }) : null
18465
19300
  ] }) : null
18466
19301
  ] }) : null,
18467
- /* @__PURE__ */ jsx50(View38, { style: { marginTop: "auto" }, children: /* @__PURE__ */ jsx50(Footer, {}) })
19302
+ /* @__PURE__ */ jsx54(View40, { style: { marginTop: "auto" }, children: /* @__PURE__ */ jsx54(Footer, {}) })
18468
19303
  ] });
18469
19304
  }
18470
19305
  var DOT = 22;
18471
- var styles39 = StyleSheet40.create({
19306
+ var styles41 = StyleSheet42.create({
18472
19307
  container: {
18473
19308
  flex: 1
18474
19309
  },
@@ -18589,21 +19424,21 @@ var styles39 = StyleSheet40.create({
18589
19424
  });
18590
19425
 
18591
19426
  // src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
18592
- import { useState as useState22, useRef as useRef10, useEffect as useEffect17, useCallback as useCallback11, useMemo as useMemo19 } from "react";
18593
- import { View as View44, Text as Text36, FlatList as FlatList2, StyleSheet as StyleSheet46, ActivityIndicator as ActivityIndicator7 } from "react-native";
18594
- 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";
18595
19430
 
18596
19431
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx
18597
- import React22 from "react";
18598
- import { useTranslation as useTranslation22 } from "react-i18next";
19432
+ import React23 from "react";
19433
+ import { useTranslation as useTranslation24 } from "react-i18next";
18599
19434
 
18600
19435
  // src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx
18601
- import React21 from "react";
18602
- 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";
18603
19438
 
18604
19439
  // src/RedactoPrivacyCenter/components/CaseDetails/AttachmentCard.tsx
18605
- import { View as View39, Text as Text31, TouchableOpacity as TouchableOpacity15, Linking, StyleSheet as StyleSheet41 } from "react-native";
18606
- 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";
18607
19442
  function AttachmentCard({ doc }) {
18608
19443
  const { colors } = useTheme();
18609
19444
  const downloadUrl = getDownloadUrl(doc.file_url);
@@ -18612,28 +19447,28 @@ function AttachmentCard({ doc }) {
18612
19447
  Linking.openURL(downloadUrl);
18613
19448
  }
18614
19449
  };
18615
- return /* @__PURE__ */ jsxs33(
18616
- TouchableOpacity15,
19450
+ return /* @__PURE__ */ jsxs34(
19451
+ TouchableOpacity16,
18617
19452
  {
18618
- style: [styles40.container, { backgroundColor: colors.surface, borderColor: colors.border }],
19453
+ style: [styles42.container, { backgroundColor: colors.surface, borderColor: colors.border }],
18619
19454
  onPress: handlePress,
18620
19455
  disabled: !downloadUrl,
18621
19456
  activeOpacity: 0.7,
18622
19457
  children: [
18623
- /* @__PURE__ */ jsx51(Icon, { name: "file-text", size: 18, color: colors.textSecondary }),
18624
- /* @__PURE__ */ jsxs33(View39, { style: styles40.info, children: [
18625
- /* @__PURE__ */ jsx51(Text31, { style: [styles40.fileName, { color: colors.text }], numberOfLines: 1, children: doc.file_name || "Document" }),
18626
- 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
18627
19462
  ] })
18628
19463
  ]
18629
19464
  }
18630
19465
  );
18631
19466
  }
18632
- var styles40 = StyleSheet41.create({
19467
+ var styles42 = StyleSheet43.create({
18633
19468
  container: {
18634
19469
  flexDirection: "row",
18635
19470
  alignItems: "center",
18636
- borderWidth: StyleSheet41.hairlineWidth,
19471
+ borderWidth: StyleSheet43.hairlineWidth,
18637
19472
  borderRadius: radii.md,
18638
19473
  paddingHorizontal: spacing.sm + 2,
18639
19474
  paddingVertical: spacing.sm,
@@ -18653,11 +19488,11 @@ var styles40 = StyleSheet41.create({
18653
19488
  });
18654
19489
 
18655
19490
  // src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx
18656
- import { jsx as jsx52, jsxs as jsxs34 } from "react/jsx-runtime";
19491
+ import { jsx as jsx56, jsxs as jsxs35 } from "react/jsx-runtime";
18657
19492
  var AVATAR_SIZE = 28;
18658
19493
  var AVATAR_GUTTER = 36;
18659
19494
  function TeamAvatar({ tint }) {
18660
- 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 }) });
18661
19496
  }
18662
19497
  function ChatBubbleImpl({
18663
19498
  message,
@@ -18684,28 +19519,28 @@ function ChatBubbleImpl({
18684
19519
  borderBottomRightRadius: BUBBLE_RADIUS,
18685
19520
  borderBottomLeftRadius: tailRadius
18686
19521
  };
18687
- const bubble = /* @__PURE__ */ jsxs34(View40, { style: [styles41.bubble, bubbleStyle], children: [
18688
- !isPrincipal && isFirstInGroup ? /* @__PURE__ */ jsx52(Text32, { style: [styles41.bubbleSender, { color: colors.primary }], numberOfLines: 1, children: senderLabel }) : null,
18689
- message.body ? /* @__PURE__ */ jsx52(Text32, { style: [styles41.body, { color: isPrincipal ? colors.primaryText : colors.text }], children: message.body }) : null,
18690
- 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
18691
19526
  ] });
18692
- return /* @__PURE__ */ jsxs34(
18693
- View40,
19527
+ return /* @__PURE__ */ jsxs35(
19528
+ View42,
18694
19529
  {
18695
19530
  style: [
18696
- styles41.row,
18697
- isPrincipal ? styles41.rowRight : styles41.rowLeft,
19531
+ styles43.row,
19532
+ isPrincipal ? styles43.rowRight : styles43.rowLeft,
18698
19533
  { marginTop: isFirstInGroup ? spacing.md : 2 }
18699
19534
  ],
18700
19535
  children: [
18701
- !isPrincipal ? /* @__PURE__ */ jsx52(View40, { style: styles41.avatarSlot, children: isFirstInGroup ? /* @__PURE__ */ jsx52(TeamAvatar, { tint: colors.primary }) : null }) : null,
18702
- /* @__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: [
18703
19538
  bubble,
18704
- isLastInGroup ? /* @__PURE__ */ jsx52(
18705
- Text32,
19539
+ isLastInGroup ? /* @__PURE__ */ jsx56(
19540
+ Text33,
18706
19541
  {
18707
19542
  style: [
18708
- styles41.timestamp,
19543
+ styles43.timestamp,
18709
19544
  { color: colors.textSecondary, textAlign: isPrincipal ? "right" : "left" }
18710
19545
  ],
18711
19546
  children: formatMessageTime(timestamp)
@@ -18716,8 +19551,8 @@ function ChatBubbleImpl({
18716
19551
  }
18717
19552
  );
18718
19553
  }
18719
- var ChatBubble = React21.memo(ChatBubbleImpl);
18720
- var styles41 = StyleSheet42.create({
19554
+ var ChatBubble = React22.memo(ChatBubbleImpl);
19555
+ var styles43 = StyleSheet44.create({
18721
19556
  row: {
18722
19557
  flexDirection: "row",
18723
19558
  paddingHorizontal: spacing.md,
@@ -18777,9 +19612,9 @@ var styles41 = StyleSheet42.create({
18777
19612
  });
18778
19613
 
18779
19614
  // src/RedactoPrivacyCenter/components/CaseDetails/DocumentRequestCard.tsx
18780
- import { View as View41, Text as Text33, TouchableOpacity as TouchableOpacity16, StyleSheet as StyleSheet43 } from "react-native";
18781
- import { useTranslation as useTranslation21 } from "react-i18next";
18782
- 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";
18783
19618
  var STATUS_BADGE_MAP = {
18784
19619
  pending: "warning",
18785
19620
  under_review: "info",
@@ -18799,20 +19634,20 @@ function humanize(value) {
18799
19634
  }
18800
19635
  function DocumentRequestCard({ message, onUpload, isSubmitting, isCaseFinalized = false }) {
18801
19636
  var _a3;
18802
- const { t } = useTranslation21();
19637
+ const { t } = useTranslation23();
18803
19638
  const { colors } = useTheme();
18804
19639
  const meta = message.document_request_metadata;
18805
19640
  if (!meta) return null;
18806
19641
  const status = meta.document_request_status;
18807
19642
  const canUpload = (status === "pending" || status === "replacement_requested") && !isCaseFinalized;
18808
19643
  const requestEventUuid = meta.document_request_uuid;
18809
- return /* @__PURE__ */ jsxs35(View41, { style: [styles42.container, { borderColor: colors.border, backgroundColor: colors.surface }], children: [
18810
- /* @__PURE__ */ jsxs35(View41, { style: styles42.header, children: [
18811
- /* @__PURE__ */ jsxs35(View41, { style: styles42.titleRow, children: [
18812
- /* @__PURE__ */ jsx53(Icon, { name: "file-check", size: 16, color: colors.primary, strokeWidth: 2 }),
18813
- /* @__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" })
18814
19649
  ] }),
18815
- /* @__PURE__ */ jsx53(
19650
+ /* @__PURE__ */ jsx57(
18816
19651
  PCBadge,
18817
19652
  {
18818
19653
  status: STATUS_BADGE_MAP[status] || "info",
@@ -18820,30 +19655,30 @@ function DocumentRequestCard({ message, onUpload, isSubmitting, isCaseFinalized
18820
19655
  }
18821
19656
  )
18822
19657
  ] }),
18823
- 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", {
18824
19659
  accepted: meta.accepted_document,
18825
19660
  defaultValue: `Accepted: ${meta.accepted_document}`
18826
19661
  }) }) : null,
18827
- meta.rejection_reason ? /* @__PURE__ */ jsxs35(View41, { style: [styles42.rejectionBox, { backgroundColor: colors.errorSoft }], children: [
18828
- /* @__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: [
18829
19664
  t("rejectionReasonLabel") || "Rejection reason",
18830
19665
  ":"
18831
19666
  ] }),
18832
- /* @__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 })
18833
19668
  ] }) : null,
18834
- canUpload && requestEventUuid ? /* @__PURE__ */ jsx53(
18835
- TouchableOpacity16,
19669
+ canUpload && requestEventUuid ? /* @__PURE__ */ jsx57(
19670
+ TouchableOpacity17,
18836
19671
  {
18837
- style: [styles42.uploadButton, { backgroundColor: colors.primary }],
19672
+ style: [styles44.uploadButton, { backgroundColor: colors.primary }],
18838
19673
  onPress: () => onUpload(requestEventUuid),
18839
19674
  disabled: isSubmitting,
18840
19675
  activeOpacity: 0.7,
18841
- 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" })
18842
19677
  }
18843
19678
  ) : null
18844
19679
  ] });
18845
19680
  }
18846
- var styles42 = StyleSheet43.create({
19681
+ var styles44 = StyleSheet45.create({
18847
19682
  container: {
18848
19683
  borderWidth: 1.5,
18849
19684
  borderStyle: "dashed",
@@ -18896,20 +19731,20 @@ var styles42 = StyleSheet43.create({
18896
19731
  });
18897
19732
 
18898
19733
  // src/RedactoPrivacyCenter/components/CaseDetails/StatusEvent.tsx
18899
- import { StyleSheet as StyleSheet44, Text as Text34, View as View42 } from "react-native";
18900
- 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";
18901
19736
  function StatusEvent({ icon, color, bgColor, borderColor, text, subText, timestamp }) {
18902
19737
  const { colors } = useTheme();
18903
- return /* @__PURE__ */ jsxs36(View42, { style: [styles43.container, { backgroundColor: bgColor }], children: [
18904
- /* @__PURE__ */ jsx54(View42, { style: [styles43.iconBubble, { backgroundColor: `${color}1F` }], children: icon }),
18905
- /* @__PURE__ */ jsxs36(View42, { style: styles43.textContainer, children: [
18906
- /* @__PURE__ */ jsx54(Text34, { style: [styles43.text, { color }], children: text }),
18907
- 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
18908
19743
  ] }),
18909
- /* @__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) })
18910
19745
  ] });
18911
19746
  }
18912
- var styles43 = StyleSheet44.create({
19747
+ var styles45 = StyleSheet46.create({
18913
19748
  container: {
18914
19749
  flexDirection: "row",
18915
19750
  alignItems: "center",
@@ -18948,10 +19783,10 @@ var styles43 = StyleSheet44.create({
18948
19783
  });
18949
19784
 
18950
19785
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx
18951
- import { Fragment as Fragment12, jsx as jsx55, jsxs as jsxs37 } from "react/jsx-runtime";
18952
- var CheckIcon = ({ color }) => /* @__PURE__ */ jsx55(Icon, { name: "check", size: 14, color, strokeWidth: 2.6 });
18953
- var XIcon = ({ color }) => /* @__PURE__ */ jsx55(Icon, { name: "x", size: 14, color, strokeWidth: 2.6 });
18954
- 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 });
18955
19790
  function MessageItemImpl({
18956
19791
  message,
18957
19792
  onUploadForRequest,
@@ -18961,14 +19796,14 @@ function MessageItemImpl({
18961
19796
  isLastInGroup = true
18962
19797
  }) {
18963
19798
  var _a3, _b;
18964
- const { t } = useTranslation22();
19799
+ const { t } = useTranslation24();
18965
19800
  const isPrincipal = message.sender_role === "data_principal";
18966
19801
  const senderLabel = isPrincipal ? t("senderYou") || "You" : t("senderPrivacyTeam") || "Privacy Team";
18967
19802
  switch (message.message_type) {
18968
19803
  case "message_sent":
18969
19804
  case "document_submitted":
18970
19805
  case "document_replaced":
18971
- return /* @__PURE__ */ jsx55(
19806
+ return /* @__PURE__ */ jsx59(
18972
19807
  ChatBubble,
18973
19808
  {
18974
19809
  message,
@@ -18980,8 +19815,8 @@ function MessageItemImpl({
18980
19815
  }
18981
19816
  );
18982
19817
  case "document_requested":
18983
- return /* @__PURE__ */ jsxs37(Fragment12, { children: [
18984
- /* @__PURE__ */ jsx55(
19818
+ return /* @__PURE__ */ jsxs38(Fragment12, { children: [
19819
+ /* @__PURE__ */ jsx59(
18985
19820
  ChatBubble,
18986
19821
  {
18987
19822
  message,
@@ -18992,7 +19827,7 @@ function MessageItemImpl({
18992
19827
  isLastInGroup
18993
19828
  }
18994
19829
  ),
18995
- /* @__PURE__ */ jsx55(
19830
+ /* @__PURE__ */ jsx59(
18996
19831
  DocumentRequestCard,
18997
19832
  {
18998
19833
  message,
@@ -19003,10 +19838,10 @@ function MessageItemImpl({
19003
19838
  )
19004
19839
  ] });
19005
19840
  case "document_approved":
19006
- return /* @__PURE__ */ jsx55(
19841
+ return /* @__PURE__ */ jsx59(
19007
19842
  StatusEvent,
19008
19843
  {
19009
- icon: /* @__PURE__ */ jsx55(CheckIcon, { color: "#059669" }),
19844
+ icon: /* @__PURE__ */ jsx59(CheckIcon, { color: "#059669" }),
19010
19845
  color: "#059669",
19011
19846
  bgColor: "rgba(16, 185, 129, 0.08)",
19012
19847
  borderColor: "rgba(16, 185, 129, 0.2)",
@@ -19015,10 +19850,10 @@ function MessageItemImpl({
19015
19850
  }
19016
19851
  );
19017
19852
  case "document_rejected":
19018
- return /* @__PURE__ */ jsx55(
19853
+ return /* @__PURE__ */ jsx59(
19019
19854
  StatusEvent,
19020
19855
  {
19021
- icon: /* @__PURE__ */ jsx55(XIcon, { color: "#DC2626" }),
19856
+ icon: /* @__PURE__ */ jsx59(XIcon, { color: "#DC2626" }),
19022
19857
  color: "#DC2626",
19023
19858
  bgColor: "rgba(220, 38, 38, 0.08)",
19024
19859
  borderColor: "rgba(220, 38, 38, 0.2)",
@@ -19028,10 +19863,10 @@ function MessageItemImpl({
19028
19863
  }
19029
19864
  );
19030
19865
  case "document_replacement_requested":
19031
- return /* @__PURE__ */ jsx55(
19866
+ return /* @__PURE__ */ jsx59(
19032
19867
  StatusEvent,
19033
19868
  {
19034
- icon: /* @__PURE__ */ jsx55(RefreshIcon, { color: "#D97706" }),
19869
+ icon: /* @__PURE__ */ jsx59(RefreshIcon, { color: "#D97706" }),
19035
19870
  color: "#D97706",
19036
19871
  bgColor: "rgba(245, 158, 11, 0.08)",
19037
19872
  borderColor: "rgba(245, 158, 11, 0.2)",
@@ -19041,7 +19876,7 @@ function MessageItemImpl({
19041
19876
  }
19042
19877
  );
19043
19878
  default:
19044
- return /* @__PURE__ */ jsx55(
19879
+ return /* @__PURE__ */ jsx59(
19045
19880
  ChatBubble,
19046
19881
  {
19047
19882
  message,
@@ -19054,22 +19889,22 @@ function MessageItemImpl({
19054
19889
  );
19055
19890
  }
19056
19891
  }
19057
- var MessageItem = React22.memo(MessageItemImpl);
19892
+ var MessageItem = React23.memo(MessageItemImpl);
19058
19893
 
19059
19894
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageComposer.tsx
19060
- import { useEffect as useEffect16, useRef as useRef9 } from "react";
19895
+ import { useEffect as useEffect17, useRef as useRef9 } from "react";
19061
19896
  import {
19062
19897
  ActivityIndicator as ActivityIndicator6,
19063
19898
  Animated as Animated12,
19064
19899
  Easing as Easing3,
19065
- StyleSheet as StyleSheet45,
19066
- Text as Text35,
19900
+ StyleSheet as StyleSheet47,
19901
+ Text as Text36,
19067
19902
  TextInput as TextInput3,
19068
- TouchableOpacity as TouchableOpacity17,
19069
- View as View43
19903
+ TouchableOpacity as TouchableOpacity18,
19904
+ View as View45
19070
19905
  } from "react-native";
19071
- import { useTranslation as useTranslation23 } from "react-i18next";
19072
- 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";
19073
19908
  function MessageComposer({
19074
19909
  messageText,
19075
19910
  onMessageTextChange,
@@ -19081,11 +19916,11 @@ function MessageComposer({
19081
19916
  isUploading,
19082
19917
  isCaseFinalized = false
19083
19918
  }) {
19084
- const { t } = useTranslation23();
19919
+ const { t } = useTranslation25();
19085
19920
  const { colors } = useTheme();
19086
19921
  const canSend = (messageText.trim().length > 0 || pendingUpload) && !isSending && !isUploading && !isCaseFinalized;
19087
19922
  const activate = useRef9(new Animated12.Value(canSend ? 1 : 0)).current;
19088
- useEffect16(() => {
19923
+ useEffect17(() => {
19089
19924
  Animated12.timing(activate, {
19090
19925
  toValue: canSend ? 1 : 0,
19091
19926
  duration: 180,
@@ -19105,7 +19940,7 @@ function MessageComposer({
19105
19940
  Animated12.spring(pressScale, { toValue: 1, useNativeDriver: true, speed: 20, bounciness: 6 }).start();
19106
19941
  };
19107
19942
  const pillIn = useRef9(new Animated12.Value(0)).current;
19108
- useEffect16(() => {
19943
+ useEffect17(() => {
19109
19944
  Animated12.timing(pillIn, {
19110
19945
  toValue: pendingUpload ? 1 : 0,
19111
19946
  duration: 220,
@@ -19115,12 +19950,12 @@ function MessageComposer({
19115
19950
  }, [pendingUpload, pillIn]);
19116
19951
  const pillOpacity = pillIn;
19117
19952
  const pillTranslateY = pillIn.interpolate({ inputRange: [0, 1], outputRange: [8, 0] });
19118
- return /* @__PURE__ */ jsxs38(View43, { style: [styles44.container, { borderTopColor: colors.hairline, backgroundColor: colors.canvasSubtle, paddingBottom: spacing.sm }], children: [
19119
- 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(
19120
19955
  Animated12.View,
19121
19956
  {
19122
19957
  style: [
19123
- styles44.uploadPill,
19958
+ styles46.uploadPill,
19124
19959
  {
19125
19960
  backgroundColor: colors.primarySoft,
19126
19961
  opacity: pillOpacity,
@@ -19128,34 +19963,34 @@ function MessageComposer({
19128
19963
  }
19129
19964
  ],
19130
19965
  children: [
19131
- /* @__PURE__ */ jsx56(Icon, { name: "file", size: 14, color: colors.primary }),
19132
- /* @__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: [
19133
19968
  pendingUpload.file_name,
19134
19969
  " (",
19135
19970
  formatFileSize(pendingUpload.file_size),
19136
19971
  ")"
19137
19972
  ] }),
19138
- /* @__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 }) })
19139
19974
  ]
19140
19975
  }
19141
19976
  ),
19142
- /* @__PURE__ */ jsxs38(View43, { style: [styles44.pill, { backgroundColor: colors.surface, borderColor: colors.border }, isCaseFinalized && styles44.pillDisabled], children: [
19143
- /* @__PURE__ */ jsx56(
19144
- TouchableOpacity17,
19977
+ /* @__PURE__ */ jsxs39(View45, { style: [styles46.pill, { backgroundColor: colors.surface, borderColor: colors.border }, isCaseFinalized && styles46.pillDisabled], children: [
19978
+ /* @__PURE__ */ jsx60(
19979
+ TouchableOpacity18,
19145
19980
  {
19146
- style: styles44.attachButton,
19981
+ style: styles46.attachButton,
19147
19982
  onPress: onAttachClick,
19148
19983
  disabled: isUploading || isCaseFinalized,
19149
19984
  activeOpacity: 0.6,
19150
19985
  hitSlop: DEFAULT_HIT_SLOP,
19151
19986
  accessibilityLabel: t("uploadFile") || "Attach file",
19152
- 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 })
19153
19988
  }
19154
19989
  ),
19155
- /* @__PURE__ */ jsx56(
19990
+ /* @__PURE__ */ jsx60(
19156
19991
  TextInput3,
19157
19992
  {
19158
- style: [styles44.input, { color: colors.text }],
19993
+ style: [styles46.input, { color: colors.text }],
19159
19994
  value: messageText,
19160
19995
  onChangeText: onMessageTextChange,
19161
19996
  placeholder: t("messageInputPlaceholder", { defaultValue: "Message\u2026" }),
@@ -19165,8 +20000,8 @@ function MessageComposer({
19165
20000
  editable: !isSending && !isCaseFinalized
19166
20001
  }
19167
20002
  ),
19168
- /* @__PURE__ */ jsx56(Animated12.View, { style: { transform: [{ scale: pressScale }] }, children: /* @__PURE__ */ jsx56(
19169
- TouchableOpacity17,
20003
+ /* @__PURE__ */ jsx60(Animated12.View, { style: { transform: [{ scale: pressScale }] }, children: /* @__PURE__ */ jsx60(
20004
+ TouchableOpacity18,
19170
20005
  {
19171
20006
  onPress: onSend,
19172
20007
  onPressIn: handlePressIn,
@@ -19174,15 +20009,15 @@ function MessageComposer({
19174
20009
  disabled: !canSend,
19175
20010
  activeOpacity: 0.85,
19176
20011
  accessibilityLabel: t("send") || "Send",
19177
- 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 }) }) })
19178
20013
  }
19179
20014
  ) })
19180
20015
  ] })
19181
20016
  ] });
19182
20017
  }
19183
- var styles44 = StyleSheet45.create({
20018
+ var styles46 = StyleSheet47.create({
19184
20019
  container: {
19185
- borderTopWidth: StyleSheet45.hairlineWidth,
20020
+ borderTopWidth: StyleSheet47.hairlineWidth,
19186
20021
  paddingHorizontal: spacing.md,
19187
20022
  paddingVertical: spacing.sm
19188
20023
  },
@@ -19205,7 +20040,7 @@ var styles44 = StyleSheet45.create({
19205
20040
  pill: {
19206
20041
  flexDirection: "row",
19207
20042
  alignItems: "center",
19208
- borderWidth: StyleSheet45.hairlineWidth,
20043
+ borderWidth: StyleSheet47.hairlineWidth,
19209
20044
  borderRadius: radii.xxl + 4,
19210
20045
  paddingHorizontal: spacing.xs + 2,
19211
20046
  paddingVertical: spacing.xs,
@@ -19244,7 +20079,7 @@ var styles44 = StyleSheet45.create({
19244
20079
  });
19245
20080
 
19246
20081
  // src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
19247
- 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";
19248
20083
  var STREAK_GAP_MS = 5 * 60 * 1e3;
19249
20084
  function isStreakBoundary(a, b) {
19250
20085
  if (!a || !b) return true;
@@ -19274,7 +20109,7 @@ function sameDay(a, b) {
19274
20109
  }
19275
20110
  var MESSAGE_POLL_INTERVAL = 3e4;
19276
20111
  function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19277
- const { t } = useTranslation24();
20112
+ const { t } = useTranslation26();
19278
20113
  const { accessToken, refreshToken, email, organizationId, workspaceId, onError, updateTokens } = useAuth();
19279
20114
  const { consentClient } = useBaseUrl();
19280
20115
  const { colors } = useTheme();
@@ -19290,13 +20125,13 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19290
20125
  caseUuid,
19291
20126
  authContext
19292
20127
  );
19293
- const [messageText, setMessageText] = useState22("");
19294
- const [pendingUpload, setPendingUpload] = useState22(null);
19295
- const [isSending, setIsSending] = useState22(false);
19296
- const [isUploading, setIsUploading] = useState22(false);
19297
- 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);
19298
20133
  const flatListRef = useRef10(null);
19299
- useEffect17(() => {
20134
+ useEffect18(() => {
19300
20135
  if (messages && messages.length > 0) {
19301
20136
  setTimeout(() => {
19302
20137
  var _a3;
@@ -19306,14 +20141,17 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19306
20141
  }, [messages == null ? void 0 : messages.length]);
19307
20142
  const refetchRef = useRef10(refetch);
19308
20143
  refetchRef.current = refetch;
19309
- useEffect17(() => {
20144
+ const authContextRef = useRef10(authContext);
20145
+ authContextRef.current = authContext;
20146
+ useEffect18(() => {
19310
20147
  if (isCaseFinalized) return;
19311
20148
  const id = setInterval(() => {
20149
+ if (isRefreshBlocked(authContextRef.current)) return;
19312
20150
  refetchRef.current();
19313
20151
  }, MESSAGE_POLL_INTERVAL);
19314
20152
  return () => clearInterval(id);
19315
20153
  }, [isCaseFinalized]);
19316
- const handleSend = useCallback11(async () => {
20154
+ const handleSend = useCallback12(async () => {
19317
20155
  if (isCaseFinalized) return;
19318
20156
  if (!messageText.trim() && !pendingUpload) return;
19319
20157
  if (!organizationId || !workspaceId) return;
@@ -19338,7 +20176,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19338
20176
  setIsSending(false);
19339
20177
  }
19340
20178
  }, [isCaseFinalized, messageText, pendingUpload, organizationId, workspaceId, caseUuid, authContext, consentClient, refetch]);
19341
- const handleAttach = useCallback11(async () => {
20179
+ const handleAttach = useCallback12(async () => {
19342
20180
  if (isCaseFinalized) return;
19343
20181
  if (!organizationId || !workspaceId) return;
19344
20182
  try {
@@ -19373,7 +20211,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19373
20211
  setIsUploading(false);
19374
20212
  }
19375
20213
  }, [isCaseFinalized, organizationId, workspaceId, caseUuid, authContext, consentClient]);
19376
- const handleUploadForRequest = useCallback11((_requestEventUuid) => {
20214
+ const handleUploadForRequest = useCallback12((_requestEventUuid) => {
19377
20215
  handleAttach();
19378
20216
  }, [handleAttach]);
19379
20217
  const messagesList = useMemo19(() => {
@@ -19385,17 +20223,17 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19385
20223
  });
19386
20224
  return list;
19387
20225
  }, [messages]);
19388
- const keyExtractor = useCallback11((item) => item.uuid, []);
19389
- const renderMessage = useCallback11(
20226
+ const keyExtractor = useCallback12((item) => item.uuid, []);
20227
+ const renderMessage = useCallback12(
19390
20228
  ({ item, index }) => {
19391
20229
  const prev = index > 0 ? messagesList[index - 1] : void 0;
19392
20230
  const next = index < messagesList.length - 1 ? messagesList[index + 1] : void 0;
19393
20231
  const isFirstInGroup = isStreakBoundary(prev, item);
19394
20232
  const isLastInGroup = isStreakBoundary(item, next);
19395
20233
  const dateSeparator = getDateSeparator(prev == null ? void 0 : prev.created_at, item.created_at, t);
19396
- return /* @__PURE__ */ jsxs39(Fragment13, { children: [
19397
- 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,
19398
- /* @__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(
19399
20237
  MessageItem,
19400
20238
  {
19401
20239
  message: item,
@@ -19411,32 +20249,32 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19411
20249
  [messagesList, handleUploadForRequest, isSubmittingForRequest, isCaseFinalized, colors, t]
19412
20250
  );
19413
20251
  if (isLoading) {
19414
- 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 }) });
19415
20253
  }
19416
20254
  if (error) {
19417
- 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" }) });
19418
20256
  }
19419
- return /* @__PURE__ */ jsxs39(View44, { style: [styles45.container, { backgroundColor: colors.canvasSubtle }], children: [
19420
- /* @__PURE__ */ jsxs39(View44, { style: styles45.secureRow, children: [
19421
- /* @__PURE__ */ jsx57(Icon, { name: "lock", size: 12, color: colors.textSecondary, strokeWidth: 2.2 }),
19422
- /* @__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"}` })
19423
20261
  ] }),
19424
- /* @__PURE__ */ jsx57(
20262
+ /* @__PURE__ */ jsx61(
19425
20263
  FlatList2,
19426
20264
  {
19427
20265
  ref: flatListRef,
19428
- style: styles45.list,
20266
+ style: styles47.list,
19429
20267
  data: messagesList,
19430
20268
  keyExtractor,
19431
20269
  renderItem: renderMessage,
19432
20270
  contentContainerStyle: [
19433
- styles45.messagesList,
19434
- messagesList.length ? styles45.messagesListFill : styles45.messagesListCenter
20271
+ styles47.messagesList,
20272
+ messagesList.length ? styles47.messagesListFill : styles47.messagesListCenter
19435
20273
  ],
19436
- ListEmptyComponent: /* @__PURE__ */ jsxs39(View44, { style: styles45.emptyContainer, children: [
19437
- /* @__PURE__ */ jsx57(View44, { style: [styles45.emptyIconWrap, { backgroundColor: colors.primarySoft }], children: /* @__PURE__ */ jsx57(Icon, { name: "messages-square", size: 28, color: colors.primary, strokeWidth: 2 }) }),
19438
- /* @__PURE__ */ jsx57(Text36, { style: [styles45.emptyTitle, { color: colors.text }], children: t("noMessagesYet") || "No messages yet" }),
19439
- /* @__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") })
19440
20278
  ] }),
19441
20279
  onContentSizeChange: () => {
19442
20280
  var _a3;
@@ -19448,7 +20286,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19448
20286
  removeClippedSubviews: true
19449
20287
  }
19450
20288
  ),
19451
- /* @__PURE__ */ jsx57(
20289
+ /* @__PURE__ */ jsx61(
19452
20290
  MessageComposer,
19453
20291
  {
19454
20292
  messageText,
@@ -19464,7 +20302,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19464
20302
  )
19465
20303
  ] });
19466
20304
  }
19467
- var styles45 = StyleSheet46.create({
20305
+ var styles47 = StyleSheet48.create({
19468
20306
  container: {
19469
20307
  flex: 1
19470
20308
  },
@@ -19547,16 +20385,16 @@ var styles45 = StyleSheet46.create({
19547
20385
  });
19548
20386
 
19549
20387
  // src/RedactoPrivacyCenter/components/CaseDetails/CaseDetailsPage.tsx
19550
- import { jsx as jsx58, jsxs as jsxs40 } from "react/jsx-runtime";
20388
+ import { jsx as jsx62, jsxs as jsxs41 } from "react/jsx-runtime";
19551
20389
  function CaseDetailsPage() {
19552
20390
  var _a3, _b;
19553
- const { t } = useTranslation25();
20391
+ const { t } = useTranslation27();
19554
20392
  const { navigateTo, selectedCase, setSelectedCase, pendingCaseUuid } = useInternalNavigation();
19555
20393
  const { accessToken, refreshToken, email, organizationId, workspaceId, onError, updateTokens } = useAuth();
19556
20394
  const { colors } = useTheme();
19557
20395
  const { keyboardOffset } = usePrivacyCenterInsets();
19558
20396
  const requestTypeLabels = useRequestTypeLabels();
19559
- const [activeTab, setActiveTab] = useState23("request-details");
20397
+ const [activeTab, setActiveTab] = useState24("request-details");
19560
20398
  const authContext = useMemo20(() => ({
19561
20399
  accessToken,
19562
20400
  refreshToken,
@@ -19570,7 +20408,7 @@ function CaseDetailsPage() {
19570
20408
  email != null ? email : void 0,
19571
20409
  authContext
19572
20410
  );
19573
- useEffect18(() => {
20411
+ useEffect19(() => {
19574
20412
  if (!cases) return;
19575
20413
  if (cases.length === 0) {
19576
20414
  navigateTo("form");
@@ -19584,33 +20422,33 @@ function CaseDetailsPage() {
19584
20422
  navigateTo("form");
19585
20423
  }
19586
20424
  }, [cases, targetUuid, setSelectedCase, navigateTo]);
19587
- useEffect18(() => {
20425
+ useEffect19(() => {
19588
20426
  if (!selectedCase && !targetUuid && !isLoading) {
19589
20427
  navigateTo("form");
19590
20428
  }
19591
20429
  }, [selectedCase, targetUuid, isLoading, navigateTo]);
19592
20430
  if (!selectedCase) {
19593
- 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" }) });
19594
20432
  }
19595
20433
  const requestTypeLabel = requestTypeLabels[(_b = selectedCase.request_type) == null ? void 0 : _b.toUpperCase()] || selectedCase.request_type_display || formatCaseStatus(selectedCase.request_type || "");
19596
20434
  const tabs = [
19597
20435
  { id: "request-details", label: t("requestDetails") || "Request Details" },
19598
20436
  { id: "messages", label: t("messages") || "Messages" }
19599
20437
  ];
19600
- return /* @__PURE__ */ jsxs40(
20438
+ return /* @__PURE__ */ jsxs41(
19601
20439
  KeyboardAvoidingViewCompat,
19602
20440
  {
19603
- style: [styles46.container, { backgroundColor: colors.canvasSubtle }],
20441
+ style: [styles48.container, { backgroundColor: colors.canvasSubtle }],
19604
20442
  behavior: "padding",
19605
20443
  keyboardVerticalOffset: Platform7.OS === "ios" ? keyboardOffset : 0,
19606
20444
  children: [
19607
- /* @__PURE__ */ jsxs40(View45, { style: styles46.headerWrap, children: [
19608
- /* @__PURE__ */ jsx58(View45, { style: [styles46.heroCard, elevation.card, { backgroundColor: colors.surface }], children: /* @__PURE__ */ jsxs40(View45, { style: styles46.heroInner, children: [
19609
- /* @__PURE__ */ jsx58(View45, { style: [styles46.accent, { backgroundColor: getCaseStatusColor(selectedCase.status, colors) }] }),
19610
- /* @__PURE__ */ jsxs40(View45, { style: styles46.heroBody, children: [
19611
- /* @__PURE__ */ jsxs40(View45, { style: styles46.heroTopRow, children: [
19612
- /* @__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 }) }),
19613
- /* @__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(
19614
20452
  PCBadge,
19615
20453
  {
19616
20454
  status: getCaseStatusVariant(selectedCase.status),
@@ -19619,10 +20457,10 @@ function CaseDetailsPage() {
19619
20457
  }
19620
20458
  )
19621
20459
  ] }),
19622
- /* @__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 })
19623
20461
  ] })
19624
20462
  ] }) }),
19625
- /* @__PURE__ */ jsx58(
20463
+ /* @__PURE__ */ jsx62(
19626
20464
  Segmented,
19627
20465
  {
19628
20466
  options: tabs.map((tab) => ({ value: tab.id, label: tab.label })),
@@ -19631,18 +20469,18 @@ function CaseDetailsPage() {
19631
20469
  }
19632
20470
  )
19633
20471
  ] }),
19634
- /* @__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(
19635
20473
  RequestDetailsTab,
19636
20474
  {
19637
20475
  selectedCase,
19638
20476
  requestTypeLabel
19639
20477
  }
19640
- ) : /* @__PURE__ */ jsx58(MessagesTab, { caseUuid: selectedCase.uuid, isCaseFinalized: isTerminalCaseStatus(selectedCase.status) }) })
20478
+ ) : /* @__PURE__ */ jsx62(MessagesTab, { caseUuid: selectedCase.uuid, isCaseFinalized: isTerminalCaseStatus(selectedCase.status) }) })
19641
20479
  ]
19642
20480
  }
19643
20481
  );
19644
20482
  }
19645
- var styles46 = StyleSheet47.create({
20483
+ var styles48 = StyleSheet49.create({
19646
20484
  container: {
19647
20485
  flex: 1
19648
20486
  },
@@ -19707,36 +20545,36 @@ var styles46 = StyleSheet47.create({
19707
20545
  });
19708
20546
 
19709
20547
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationsScreen.tsx
19710
- import { useCallback as useCallback13, useEffect as useEffect19, useMemo as useMemo23, useRef as useRef12, useState as useState24 } from "react";
19711
- import { FlatList as FlatList3, RefreshControl as RefreshControl5, StyleSheet as StyleSheet52, Text as Text41, TouchableOpacity as TouchableOpacity21, View as View49 } from "react-native";
19712
- 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";
19713
20551
 
19714
20552
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx
19715
- import { StyleSheet as StyleSheet51, Text as Text40, TouchableOpacity as TouchableOpacity20, View as View48 } from "react-native";
19716
- 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";
19717
20555
 
19718
20556
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationCTAButton.tsx
19719
- import { StyleSheet as StyleSheet48, Text as Text38, TouchableOpacity as TouchableOpacity18 } from "react-native";
19720
- 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";
19721
20559
  var NotificationCTAButton = ({ cta, onPress }) => {
19722
20560
  const { colors } = useTheme();
19723
20561
  const tone = cta.style === "danger" ? colors.error : colors.primary;
19724
20562
  const isPrimary = cta.style === "primary" || cta.style === "danger";
19725
- return /* @__PURE__ */ jsx59(
19726
- TouchableOpacity18,
20563
+ return /* @__PURE__ */ jsx63(
20564
+ TouchableOpacity19,
19727
20565
  {
19728
20566
  onPress,
19729
20567
  activeOpacity: 0.7,
19730
20568
  style: [
19731
- styles47.button,
20569
+ styles49.button,
19732
20570
  isPrimary ? { backgroundColor: tone } : { backgroundColor: colors.primarySoft }
19733
20571
  ],
19734
20572
  accessibilityRole: "button",
19735
- 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 })
19736
20574
  }
19737
20575
  );
19738
20576
  };
19739
- var styles47 = StyleSheet48.create({
20577
+ var styles49 = StyleSheet50.create({
19740
20578
  button: {
19741
20579
  paddingHorizontal: spacing.lg,
19742
20580
  paddingVertical: spacing.sm,
@@ -19751,8 +20589,8 @@ var styles47 = StyleSheet48.create({
19751
20589
  });
19752
20590
 
19753
20591
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationIcon.tsx
19754
- import { StyleSheet as StyleSheet49, View as View46 } from "react-native";
19755
- 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";
19756
20594
  var CATEGORY_ICON = {
19757
20595
  guardian: "user-round",
19758
20596
  consent: "clock",
@@ -19765,18 +20603,18 @@ var NotificationIcon = ({ notificationType, size = 40 }) => {
19765
20603
  var _a3;
19766
20604
  const category = (_a3 = TYPE_TO_ICON_CATEGORY[notificationType]) != null ? _a3 : "system";
19767
20605
  const color = ICON_COLORS[category];
19768
- return /* @__PURE__ */ jsx60(
19769
- View46,
20606
+ return /* @__PURE__ */ jsx64(
20607
+ View48,
19770
20608
  {
19771
20609
  style: [
19772
- styles48.wrap,
20610
+ styles50.wrap,
19773
20611
  { width: size, height: size, borderRadius: radii.md, backgroundColor: withAlpha(color, 0.13) }
19774
20612
  ],
19775
- 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 })
19776
20614
  }
19777
20615
  );
19778
20616
  };
19779
- var styles48 = StyleSheet49.create({
20617
+ var styles50 = StyleSheet51.create({
19780
20618
  wrap: {
19781
20619
  alignItems: "center",
19782
20620
  justifyContent: "center"
@@ -19785,8 +20623,8 @@ var styles48 = StyleSheet49.create({
19785
20623
 
19786
20624
  // src/RedactoPrivacyCenter/components/NotificationHub/SwipeableRow.tsx
19787
20625
  import { useMemo as useMemo21, useRef as useRef11 } from "react";
19788
- import { Animated as Animated13, PanResponder as PanResponder2, StyleSheet as StyleSheet50, Text as Text39, TouchableOpacity as TouchableOpacity19, View as View47 } from "react-native";
19789
- 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";
19790
20628
  var ACTION_WIDTH = 80;
19791
20629
  var CLAIM_THRESHOLD = 8;
19792
20630
  var SwipeableRow = ({ actions, background, children }) => {
@@ -19825,37 +20663,37 @@ var SwipeableRow = ({ actions, background, children }) => {
19825
20663
  [maxOpen]
19826
20664
  );
19827
20665
  if (actions.length === 0) {
19828
- return /* @__PURE__ */ jsx61(Fragment14, { children });
20666
+ return /* @__PURE__ */ jsx65(Fragment14, { children });
19829
20667
  }
19830
20668
  const runAction = (action) => {
19831
20669
  settle(0);
19832
20670
  action.onPress();
19833
20671
  };
19834
- return /* @__PURE__ */ jsxs41(View47, { style: styles49.root, children: [
19835
- /* @__PURE__ */ jsx61(View47, { style: styles49.actionsLayer, pointerEvents: "box-none", children: actions.map((action) => /* @__PURE__ */ jsxs41(
19836
- 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,
19837
20675
  {
19838
- style: [styles49.action, { width: ACTION_WIDTH, backgroundColor: toneColor2[action.tone] }],
20676
+ style: [styles51.action, { width: ACTION_WIDTH, backgroundColor: toneColor2[action.tone] }],
19839
20677
  onPress: () => runAction(action),
19840
20678
  activeOpacity: 0.85,
19841
20679
  accessibilityRole: "button",
19842
20680
  accessibilityLabel: action.label,
19843
20681
  children: [
19844
- /* @__PURE__ */ jsx61(Icon, { name: action.icon, size: 20, color: colors.primaryText, strokeWidth: 2.2 }),
19845
- /* @__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 })
19846
20684
  ]
19847
20685
  },
19848
20686
  action.key
19849
20687
  )) }),
19850
- /* @__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 })
19851
20689
  ] });
19852
20690
  };
19853
- var styles49 = StyleSheet50.create({
20691
+ var styles51 = StyleSheet52.create({
19854
20692
  root: {
19855
20693
  position: "relative"
19856
20694
  },
19857
20695
  actionsLayer: {
19858
- ...StyleSheet50.absoluteFillObject,
20696
+ ...StyleSheet52.absoluteFillObject,
19859
20697
  flexDirection: "row",
19860
20698
  justifyContent: "flex-end"
19861
20699
  },
@@ -19888,10 +20726,10 @@ var formatTimeAgo = (dateString, t) => {
19888
20726
  };
19889
20727
 
19890
20728
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx
19891
- 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";
19892
20730
  var NotificationRow = ({ notification, onPress, onMarkRead, onAcknowledge }) => {
19893
20731
  var _a3, _b;
19894
- const { t } = useTranslation26();
20732
+ const { t } = useTranslation28();
19895
20733
  const { colors } = useTheme();
19896
20734
  const isUnread = !notification.is_read;
19897
20735
  const statusLabel = notification.status_label_display || notification.status_label;
@@ -19918,35 +20756,35 @@ var NotificationRow = ({ notification, onPress, onMarkRead, onAcknowledge }) =>
19918
20756
  onPress: onAcknowledge
19919
20757
  });
19920
20758
  }
19921
- return /* @__PURE__ */ jsx62(SwipeableRow, { actions, background: colors.surface, children: /* @__PURE__ */ jsxs42(TouchableOpacity20, { onPress, activeOpacity: 0.6, accessibilityRole: "button", style: styles50.row, children: [
19922
- isUnread ? /* @__PURE__ */ jsx62(View48, { style: [styles50.accent, { backgroundColor: accent }] }) : null,
19923
- /* @__PURE__ */ jsx62(NotificationIcon, { notificationType: notification.notification_type, size: 36 }),
19924
- /* @__PURE__ */ jsxs42(View48, { style: styles50.content, children: [
19925
- /* @__PURE__ */ jsxs42(View48, { style: styles50.titleRow, children: [
19926
- /* @__PURE__ */ jsx62(
19927
- 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,
19928
20766
  {
19929
- style: [styles50.title, { color: colors.text, fontWeight: isUnread ? "700" : "600" }],
20767
+ style: [styles52.title, { color: colors.text, fontWeight: isUnread ? "700" : "600" }],
19930
20768
  numberOfLines: 2,
19931
20769
  children: notification.title
19932
20770
  }
19933
20771
  ),
19934
- isUnread ? /* @__PURE__ */ jsx62(View48, { style: [styles50.unreadDot, { backgroundColor: colors.primary }] }) : null
20772
+ isUnread ? /* @__PURE__ */ jsx66(View50, { style: [styles52.unreadDot, { backgroundColor: colors.primary }] }) : null
19935
20773
  ] }),
19936
- /* @__PURE__ */ jsxs42(View48, { style: styles50.metaRow, children: [
19937
- statusLabel ? /* @__PURE__ */ jsxs42(Fragment15, { children: [
19938
- /* @__PURE__ */ jsx62(View48, { style: [styles50.statusDot, { backgroundColor: accent }] }),
19939
- /* @__PURE__ */ jsx62(Text40, { style: [styles50.metaText, { color: colors.textSecondary }], numberOfLines: 1, children: statusLabel }),
19940
- /* @__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" })
19941
20779
  ] }) : null,
19942
- /* @__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) })
19943
20781
  ] }),
19944
- 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
19945
20783
  ] }),
19946
- /* @__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 }) })
19947
20785
  ] }) });
19948
20786
  };
19949
- var styles50 = StyleSheet51.create({
20787
+ var styles52 = StyleSheet53.create({
19950
20788
  row: {
19951
20789
  flexDirection: "row",
19952
20790
  alignItems: "center",
@@ -20009,7 +20847,7 @@ var styles50 = StyleSheet51.create({
20009
20847
  });
20010
20848
 
20011
20849
  // src/RedactoPrivacyCenter/components/NotificationHub/useNotificationActions.ts
20012
- import { useCallback as useCallback12, useMemo as useMemo22 } from "react";
20850
+ import { useCallback as useCallback13, useMemo as useMemo22 } from "react";
20013
20851
  import { Linking as Linking2 } from "react-native";
20014
20852
  var useNotificationActions = () => {
20015
20853
  const { navigateTo, setSelectedCase } = useInternalNavigation();
@@ -20020,14 +20858,14 @@ var useNotificationActions = () => {
20020
20858
  () => ({ accessToken, refreshToken, onError, updateTokens }),
20021
20859
  [accessToken, refreshToken, onError, updateTokens]
20022
20860
  );
20023
- const hasAcknowledgeCTA = useCallback12(
20861
+ const hasAcknowledgeCTA = useCallback13(
20024
20862
  (notification) => {
20025
20863
  var _a3, _b;
20026
20864
  return (_b = (_a3 = notification.ctas) == null ? void 0 : _a3.some((cta) => cta.action_type === "acknowledge")) != null ? _b : false;
20027
20865
  },
20028
20866
  []
20029
20867
  );
20030
- const handleMarkRead = useCallback12(
20868
+ const handleMarkRead = useCallback13(
20031
20869
  async (notificationUuid) => {
20032
20870
  if (!organizationId || !workspaceId) return false;
20033
20871
  const result = await markNotificationRead(organizationId, workspaceId, notificationUuid, authContext, consentClient);
@@ -20035,12 +20873,12 @@ var useNotificationActions = () => {
20035
20873
  },
20036
20874
  [organizationId, workspaceId, authContext, consentClient]
20037
20875
  );
20038
- const handleMarkAllRead = useCallback12(async () => {
20876
+ const handleMarkAllRead = useCallback13(async () => {
20039
20877
  if (!organizationId || !workspaceId) return false;
20040
20878
  const result = await markAllRead(organizationId, workspaceId, authContext, consentClient);
20041
20879
  return result !== null;
20042
20880
  }, [organizationId, workspaceId, authContext, consentClient]);
20043
- const handleAcknowledge = useCallback12(
20881
+ const handleAcknowledge = useCallback13(
20044
20882
  async (notificationUuid) => {
20045
20883
  if (!organizationId || !workspaceId) return false;
20046
20884
  const result = await acknowledgeNotification(organizationId, workspaceId, notificationUuid, authContext, consentClient);
@@ -20048,7 +20886,7 @@ var useNotificationActions = () => {
20048
20886
  },
20049
20887
  [organizationId, workspaceId, authContext, consentClient]
20050
20888
  );
20051
- const handleCTAClick = useCallback12(
20889
+ const handleCTAClick = useCallback13(
20052
20890
  async (notification, cta) => {
20053
20891
  var _a3;
20054
20892
  if (cta.action_type === "acknowledge") {
@@ -20105,7 +20943,7 @@ var useNotificationActions = () => {
20105
20943
  };
20106
20944
 
20107
20945
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationsScreen.tsx
20108
- 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";
20109
20947
  var EMPTY_SUMMARY = { total: 0, unread: 0, action_needed: 0, acknowledged: 0 };
20110
20948
  var READ_FILTER_TO_PARAM = {
20111
20949
  all: void 0,
@@ -20113,7 +20951,7 @@ var READ_FILTER_TO_PARAM = {
20113
20951
  read: true
20114
20952
  };
20115
20953
  var NotificationsScreen = () => {
20116
- const { t } = useTranslation27();
20954
+ const { t } = useTranslation29();
20117
20955
  const { colors } = useTheme();
20118
20956
  const { langParam } = useCurrentLanguage();
20119
20957
  const { listBottom } = usePrivacyCenterInsets();
@@ -20130,15 +20968,15 @@ var NotificationsScreen = () => {
20130
20968
  handleAcknowledge,
20131
20969
  handleCTAClick
20132
20970
  } = useNotificationActions();
20133
- const [notifications, setNotifications] = useState24([]);
20134
- const [summary, setSummary] = useState24(EMPTY_SUMMARY);
20135
- const [activeTab, setActiveTab] = useState24("all");
20136
- const [readFilter, setReadFilter] = useState24("all");
20137
- const [isLoading, setIsLoading] = useState24(true);
20138
- const [isRefreshing2, setIsRefreshing] = useState24(false);
20139
- 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);
20140
20978
  const isFiltered = activeTab !== "all" || readFilter !== "all";
20141
- const loadNotifications = useCallback13(
20979
+ const loadNotifications = useCallback14(
20142
20980
  async (includeSummary = false, silent = false) => {
20143
20981
  if (!organizationId || !workspaceId) return;
20144
20982
  if (!silent) setIsLoading(true);
@@ -20168,18 +21006,21 @@ var NotificationsScreen = () => {
20168
21006
  },
20169
21007
  [organizationId, workspaceId, activeTab, readFilter, authContext, consentClient, langParam]
20170
21008
  );
20171
- useEffect19(() => {
21009
+ useEffect20(() => {
20172
21010
  loadNotifications(true);
20173
21011
  }, [loadNotifications]);
20174
21012
  const loadRef = useRef12(loadNotifications);
20175
21013
  loadRef.current = loadNotifications;
20176
- useEffect19(() => {
21014
+ const authContextRef = useRef12(authContext);
21015
+ authContextRef.current = authContext;
21016
+ useEffect20(() => {
20177
21017
  const id = setInterval(() => {
21018
+ if (isRefreshBlocked(authContextRef.current)) return;
20178
21019
  loadRef.current(false, true);
20179
21020
  }, POLL_INTERVAL);
20180
21021
  return () => clearInterval(id);
20181
21022
  }, []);
20182
- const onNotificationClick = useCallback13(
21023
+ const onNotificationClick = useCallback14(
20183
21024
  async (notification) => {
20184
21025
  const shouldMarkRead = !notification.is_read;
20185
21026
  const shouldAutoAcknowledge = !notification.is_acknowledged && !hasAcknowledgeCTA(notification);
@@ -20200,7 +21041,7 @@ var NotificationsScreen = () => {
20200
21041
  },
20201
21042
  [hasAcknowledgeCTA, handleAcknowledge, handleMarkRead]
20202
21043
  );
20203
- const onRowPress = useCallback13(
21044
+ const onRowPress = useCallback14(
20204
21045
  async (notification) => {
20205
21046
  var _a3;
20206
21047
  const linkCta = (_a3 = notification.ctas) == null ? void 0 : _a3.find((cta) => cta.action_type === "link" && cta.url);
@@ -20218,7 +21059,7 @@ var NotificationsScreen = () => {
20218
21059
  },
20219
21060
  [handleCTAClick, onNotificationClick]
20220
21061
  );
20221
- const onMarkReadRow = useCallback13(
21062
+ const onMarkReadRow = useCallback14(
20222
21063
  async (notification) => {
20223
21064
  if (notification.is_read) return;
20224
21065
  const ok = await handleMarkRead(notification.uuid);
@@ -20228,7 +21069,7 @@ var NotificationsScreen = () => {
20228
21069
  },
20229
21070
  [handleMarkRead]
20230
21071
  );
20231
- const onAcknowledgeRow = useCallback13(
21072
+ const onAcknowledgeRow = useCallback14(
20232
21073
  async (notification) => {
20233
21074
  if (notification.is_acknowledged) return;
20234
21075
  const ok = await handleAcknowledge(notification.uuid);
@@ -20245,7 +21086,14 @@ var NotificationsScreen = () => {
20245
21086
  },
20246
21087
  [handleAcknowledge]
20247
21088
  );
20248
- 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(() => {
20249
21097
  setIsRefreshing(true);
20250
21098
  loadNotifications(true, true);
20251
21099
  }, [loadNotifications]);
@@ -20253,14 +21101,14 @@ var NotificationsScreen = () => {
20253
21101
  () => groupByTime(notifications, (item) => item.created_at, classifyTime),
20254
21102
  [notifications, classifyTime]
20255
21103
  );
20256
- const header = /* @__PURE__ */ jsxs43(View49, { style: styles51.header, children: [
20257
- /* @__PURE__ */ jsxs43(View49, { style: styles51.titleRow, children: [
20258
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.screenTitle, { color: colors.text }], children: t("notifications", { defaultValue: "Notifications" }) }),
20259
- /* @__PURE__ */ jsx63(
20260
- 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,
20261
21109
  {
20262
21110
  style: [
20263
- styles51.filterBtn,
21111
+ styles53.filterBtn,
20264
21112
  {
20265
21113
  backgroundColor: isFiltered ? colors.primarySoft : colors.surface,
20266
21114
  borderColor: isFiltered ? colors.primary : colors.border
@@ -20269,30 +21117,30 @@ var NotificationsScreen = () => {
20269
21117
  onPress: () => setFilterOpen(true),
20270
21118
  accessibilityRole: "button",
20271
21119
  accessibilityLabel: t("filter") || "Filter",
20272
- 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 })
20273
21121
  }
20274
21122
  )
20275
21123
  ] }),
20276
- summary.unread > 0 ? /* @__PURE__ */ jsxs43(TouchableOpacity21, { style: styles51.markAllBtn, onPress: handleMarkAllRead, activeOpacity: 0.7, accessibilityRole: "button", children: [
20277
- /* @__PURE__ */ jsx63(Icon, { name: "check-check", size: 15, color: colors.primary, strokeWidth: 2.2 }),
20278
- /* @__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" })
20279
21127
  ] }) : null
20280
21128
  ] });
20281
- return /* @__PURE__ */ jsxs43(Fragment16, { children: [
20282
- /* @__PURE__ */ jsx63(
21129
+ return /* @__PURE__ */ jsxs44(Fragment16, { children: [
21130
+ /* @__PURE__ */ jsx67(
20283
21131
  FlatList3,
20284
21132
  {
20285
21133
  data: sections,
20286
21134
  keyExtractor: (section2) => section2.key,
20287
- style: [styles51.list, { backgroundColor: colors.canvasSubtle }],
20288
- contentContainerStyle: [styles51.listContent, { flexGrow: 1, paddingBottom: listBottom }],
21135
+ style: [styles53.list, { backgroundColor: colors.canvasSubtle }],
21136
+ contentContainerStyle: [styles53.listContent, { flexGrow: 1, paddingBottom: listBottom }],
20289
21137
  ListHeaderComponent: header,
20290
21138
  showsVerticalScrollIndicator: false,
20291
- refreshControl: /* @__PURE__ */ jsx63(RefreshControl5, { refreshing: isRefreshing2, onRefresh, tintColor: colors.primary, colors: [colors.primary] }),
20292
- renderItem: ({ item: section2 }) => /* @__PURE__ */ jsxs43(View49, { style: styles51.section, children: [
20293
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.sectionTitle, { color: colors.textSecondary }], children: section2.title }),
20294
- /* @__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: [
20295
- /* @__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(
20296
21144
  NotificationRow,
20297
21145
  {
20298
21146
  notification: item,
@@ -20301,19 +21149,19 @@ var NotificationsScreen = () => {
20301
21149
  onAcknowledge: () => onAcknowledgeRow(item)
20302
21150
  }
20303
21151
  ),
20304
- 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
20305
21153
  ] }, item.uuid)) }) })
20306
21154
  ] }),
20307
- 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: [
20308
- /* @__PURE__ */ jsxs43(View49, { style: styles51.skeletonRow, children: [
20309
- /* @__PURE__ */ jsx63(Skeleton, { width: 36, height: 36, radius: radii.md }),
20310
- /* @__PURE__ */ jsxs43(View49, { style: styles51.skeletonLines, children: [
20311
- /* @__PURE__ */ jsx63(Skeleton, { width: "70%", height: 13 }),
20312
- /* @__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 })
20313
21161
  ] })
20314
21162
  ] }),
20315
- i < 3 ? /* @__PURE__ */ jsx63(View49, { style: [styles51.separator, { backgroundColor: colors.hairline }] }) : null
20316
- ] }, 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(
20317
21165
  PCEmpty,
20318
21166
  {
20319
21167
  iconName: "circle-check",
@@ -20322,14 +21170,14 @@ var NotificationsScreen = () => {
20322
21170
  }
20323
21171
  ) }),
20324
21172
  ListFooterComponentStyle: { marginTop: "auto" },
20325
- ListFooterComponent: /* @__PURE__ */ jsx63(Footer, {})
21173
+ ListFooterComponent: /* @__PURE__ */ jsx67(Footer, {})
20326
21174
  }
20327
21175
  ),
20328
- /* @__PURE__ */ jsx63(BottomSheet, { visible: filterOpen, onClose: () => setFilterOpen(false), title: t("filter") || "Filter", children: /* @__PURE__ */ jsxs43(View49, { style: styles51.filterSheet, children: [
20329
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.filterGroupLabel, { color: colors.textSecondary }], children: t("category", { defaultValue: "Category" }) }),
20330
- /* @__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) => {
20331
21179
  const selected = tab.key === activeTab;
20332
- return /* @__PURE__ */ jsx63(
21180
+ return /* @__PURE__ */ jsx67(
20333
21181
  FilterChip,
20334
21182
  {
20335
21183
  label: tab.label,
@@ -20339,12 +21187,12 @@ var NotificationsScreen = () => {
20339
21187
  tab.key
20340
21188
  );
20341
21189
  }) }),
20342
- /* @__PURE__ */ jsx63(Text41, { style: [styles51.filterGroupLabel, { color: colors.textSecondary, marginTop: spacing.lg }], children: t("readStatus", { defaultValue: "Status" }) }),
20343
- /* @__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: [
20344
21192
  { key: "all", label: t("all") || "All" },
20345
21193
  { key: "unread", label: t("unread") || "Unread" },
20346
21194
  { key: "read", label: t("read", { defaultValue: "Read" }) }
20347
- ].map((opt) => /* @__PURE__ */ jsx63(
21195
+ ].map((opt) => /* @__PURE__ */ jsx67(
20348
21196
  FilterChip,
20349
21197
  {
20350
21198
  label: opt.label,
@@ -20353,13 +21201,13 @@ var NotificationsScreen = () => {
20353
21201
  },
20354
21202
  opt.key
20355
21203
  )) }),
20356
- /* @__PURE__ */ jsx63(
20357
- TouchableOpacity21,
21204
+ /* @__PURE__ */ jsx67(
21205
+ TouchableOpacity22,
20358
21206
  {
20359
- style: [styles51.applyBtn, { backgroundColor: colors.primary }],
21207
+ style: [styles53.applyBtn, { backgroundColor: colors.primary }],
20360
21208
  onPress: () => setFilterOpen(false),
20361
21209
  accessibilityRole: "button",
20362
- 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" }) })
20363
21211
  }
20364
21212
  )
20365
21213
  ] }) })
@@ -20367,25 +21215,25 @@ var NotificationsScreen = () => {
20367
21215
  };
20368
21216
  var FilterChip = ({ label, selected, onPress }) => {
20369
21217
  const { colors } = useTheme();
20370
- return /* @__PURE__ */ jsx63(
20371
- TouchableOpacity21,
21218
+ return /* @__PURE__ */ jsx67(
21219
+ TouchableOpacity22,
20372
21220
  {
20373
21221
  onPress,
20374
21222
  activeOpacity: 0.7,
20375
21223
  accessibilityRole: "button",
20376
21224
  accessibilityState: { selected },
20377
21225
  style: [
20378
- styles51.chip,
21226
+ styles53.chip,
20379
21227
  {
20380
21228
  backgroundColor: selected ? colors.primary : colors.surfaceAlt,
20381
21229
  borderColor: selected ? colors.primary : colors.border
20382
21230
  }
20383
21231
  ],
20384
- 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 })
20385
21233
  }
20386
21234
  );
20387
21235
  };
20388
- var styles51 = StyleSheet52.create({
21236
+ var styles53 = StyleSheet54.create({
20389
21237
  list: {
20390
21238
  flex: 1
20391
21239
  },
@@ -20419,7 +21267,7 @@ var styles51 = StyleSheet52.create({
20419
21267
  filterBtn: {
20420
21268
  width: 40,
20421
21269
  height: 40,
20422
- borderWidth: StyleSheet52.hairlineWidth,
21270
+ borderWidth: StyleSheet54.hairlineWidth,
20423
21271
  borderRadius: radii.md,
20424
21272
  justifyContent: "center",
20425
21273
  alignItems: "center"
@@ -20440,7 +21288,7 @@ var styles51 = StyleSheet52.create({
20440
21288
  overflow: "hidden"
20441
21289
  },
20442
21290
  separator: {
20443
- height: StyleSheet52.hairlineWidth,
21291
+ height: StyleSheet54.hairlineWidth,
20444
21292
  marginLeft: spacing.lg + 36 + spacing.md
20445
21293
  },
20446
21294
  emptyWrap: {
@@ -20478,7 +21326,7 @@ var styles51 = StyleSheet52.create({
20478
21326
  justifyContent: "center",
20479
21327
  paddingHorizontal: spacing.lg,
20480
21328
  borderRadius: radii.pill,
20481
- borderWidth: StyleSheet52.hairlineWidth
21329
+ borderWidth: StyleSheet54.hairlineWidth
20482
21330
  },
20483
21331
  chipLabel: {
20484
21332
  ...typography.label
@@ -20497,7 +21345,7 @@ var styles51 = StyleSheet52.create({
20497
21345
  });
20498
21346
 
20499
21347
  // src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx
20500
- 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";
20501
21349
  var privacyCenterQueryClient = new QueryClient();
20502
21350
  function PrivacyCenterContent({ onBack }) {
20503
21351
  const { currentPage } = useInternalNavigation();
@@ -20507,24 +21355,24 @@ function PrivacyCenterContent({ onBack }) {
20507
21355
  const chromeMode = getPageChromeMode(currentPage);
20508
21356
  const canvasIsLight = isLightColor(colors.canvasSubtle);
20509
21357
  const barStyle = canvasIsLight ? "dark-content" : "light-content";
20510
- useEffect20(() => {
21358
+ useEffect21(() => {
20511
21359
  StatusBar2.setBarStyle(barStyle, true);
20512
21360
  if (Platform8.OS === "android") {
20513
21361
  setNavBarIconStyle(canvasIsLight ? "dark" : "light");
20514
21362
  }
20515
21363
  }, [barStyle, canvasIsLight]);
20516
- return /* @__PURE__ */ jsxs44(View50, { style: [styles52.container, { backgroundColor: colors.canvasSubtle }], children: [
20517
- /* @__PURE__ */ jsx64(StatusBar2, { barStyle, translucent: true }),
20518
- /* @__PURE__ */ jsx64(View50, { style: styles52.mainColumn, children: brandingLoading ? /* @__PURE__ */ jsx64(PCLoader, {}) : /* @__PURE__ */ jsxs44(Fragment17, { children: [
20519
- /* @__PURE__ */ jsx64(SlimTopBar, { mode: chromeMode, onBack }),
20520
- /* @__PURE__ */ jsx64(View50, { style: [styles52.content, { paddingBottom: insets.bottom }], children: status === "checking" ? /* @__PURE__ */ jsx64(PCLoader, {}) : status === "empty" ? /* @__PURE__ */ jsx64(PrivacyCenterEmptyState, {}) : /* @__PURE__ */ jsxs44(Fragment17, { children: [
20521
- currentPage === "home" && /* @__PURE__ */ jsx64(HomeHub, {}),
20522
- currentPage === "consent-manager" && /* @__PURE__ */ jsx64(ConsentManager, {}),
20523
- currentPage === "form" && /* @__PURE__ */ jsx64(FormPage, {}),
20524
- currentPage === "activity" && /* @__PURE__ */ jsx64(ActivitiesList, {}),
20525
- currentPage === "receipts" && /* @__PURE__ */ jsx64(ReceiptsList, {}),
20526
- currentPage === "case-details" && /* @__PURE__ */ jsx64(CaseDetailsPage, {}),
20527
- 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, {})
20528
21376
  ] }) })
20529
21377
  ] }) })
20530
21378
  ] });
@@ -20538,22 +21386,34 @@ function RedactoPrivacyCenter({
20538
21386
  theme: _theme,
20539
21387
  accessToken,
20540
21388
  refreshToken,
21389
+ token,
21390
+ email,
21391
+ mobile,
21392
+ ucic,
21393
+ organisationUuid,
21394
+ workspaceUuid,
20541
21395
  onError,
20542
21396
  initialPage = "home",
20543
21397
  initialCaseUuid,
20544
21398
  onBack
20545
21399
  }) {
20546
- 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(
20547
21401
  AuthProvider,
20548
21402
  {
20549
- accessToken,
20550
- 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,
20551
21411
  onError,
20552
- 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 }) }) }) }) })
20553
21413
  }
20554
21414
  ) }) }) }) }) }) });
20555
21415
  }
20556
- var styles52 = StyleSheet53.create({
21416
+ var styles54 = StyleSheet55.create({
20557
21417
  container: {
20558
21418
  flex: 1
20559
21419
  },
@@ -20568,78 +21428,78 @@ var styles52 = StyleSheet53.create({
20568
21428
 
20569
21429
  // src/RedactoPrivacyCenter/components/SideMenu.tsx
20570
21430
  import {
20571
- StyleSheet as StyleSheet54,
20572
- Text as Text42,
20573
- TouchableOpacity as TouchableOpacity22,
20574
- View as View51
21431
+ StyleSheet as StyleSheet56,
21432
+ Text as Text43,
21433
+ TouchableOpacity as TouchableOpacity23,
21434
+ View as View53
20575
21435
  } from "react-native";
20576
- import { useTranslation as useTranslation28 } from "react-i18next";
21436
+ import { useTranslation as useTranslation30 } from "react-i18next";
20577
21437
  import Svg2, { Path as Path2 } from "react-native-svg";
20578
- 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";
20579
21439
  var MENU_ITEMS = [
20580
21440
  { page: "consent-manager", labelKey: "consentManager", fallback: "Consent Manager", icon: "shield-check" },
20581
21441
  { page: "form", labelKey: "grievanceRequests", fallback: "Privacy Requests", icon: "message-circle-warning" },
20582
21442
  { page: "activity", labelKey: "activity", fallback: "Activity", icon: "activity" }
20583
21443
  ];
20584
21444
  function SideMenu({ onBack } = {}) {
20585
- const { t } = useTranslation28();
21445
+ const { t } = useTranslation30();
20586
21446
  const { currentPage, navigateTo } = useInternalNavigation();
20587
21447
  const { organizationName, email } = useAuth();
20588
21448
  const { colors } = useTheme();
20589
21449
  const orgInitial = organizationName ? organizationName.charAt(0).toUpperCase() : "R";
20590
21450
  const displayName = organizationName || "Organization";
20591
- return /* @__PURE__ */ jsxs45(View51, { style: [styles53.container, { backgroundColor: colors.surface }], children: [
20592
- /* @__PURE__ */ jsxs45(View51, { style: styles53.orgSection, children: [
20593
- /* @__PURE__ */ jsx65(View51, { style: [styles53.avatar, { backgroundColor: colors.primary }], children: /* @__PURE__ */ jsx65(Text42, { style: [styles53.avatarText, { color: colors.primaryText }], children: orgInitial }) }),
20594
- /* @__PURE__ */ jsxs45(View51, { style: styles53.orgInfo, children: [
20595
- /* @__PURE__ */ jsx65(Text42, { style: [styles53.orgName, { color: colors.text }], numberOfLines: 1, children: displayName }),
20596
- 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
20597
21457
  ] })
20598
21458
  ] }),
20599
- /* @__PURE__ */ jsx65(View51, { style: [styles53.divider, { backgroundColor: colors.border }] }),
20600
- /* @__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) => {
20601
21461
  const isActive = currentPage === item.page || item.page === "form" && currentPage === "case-details";
20602
- return /* @__PURE__ */ jsxs45(
20603
- TouchableOpacity22,
21462
+ return /* @__PURE__ */ jsxs46(
21463
+ TouchableOpacity23,
20604
21464
  {
20605
21465
  style: [
20606
- styles53.menuItem,
20607
- isActive && [styles53.menuItemActive, { backgroundColor: `${colors.primary}14` }]
21466
+ styles55.menuItem,
21467
+ isActive && [styles55.menuItemActive, { backgroundColor: `${colors.primary}14` }]
20608
21468
  ],
20609
21469
  onPress: () => navigateTo(item.page),
20610
21470
  activeOpacity: 0.7,
20611
21471
  accessibilityRole: "button",
20612
21472
  accessibilityState: { selected: isActive },
20613
21473
  children: [
20614
- /* @__PURE__ */ jsx65(View51, { style: styles53.menuIconWrap, children: /* @__PURE__ */ jsx65(Icon, { name: item.icon, size: 18, color: isActive ? colors.primary : colors.textSecondary }) }),
20615
- /* @__PURE__ */ jsx65(
20616
- 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,
20617
21477
  {
20618
21478
  style: [
20619
- styles53.menuLabel,
21479
+ styles55.menuLabel,
20620
21480
  { color: isActive ? colors.primary : colors.text },
20621
- isActive && styles53.menuLabelActive
21481
+ isActive && styles55.menuLabelActive
20622
21482
  ],
20623
21483
  children: t(item.labelKey) || item.fallback
20624
21484
  }
20625
21485
  ),
20626
- isActive ? /* @__PURE__ */ jsx65(View51, { style: [styles53.activeIndicator, { backgroundColor: colors.primary }] }) : null
21486
+ isActive ? /* @__PURE__ */ jsx69(View53, { style: [styles55.activeIndicator, { backgroundColor: colors.primary }] }) : null
20627
21487
  ]
20628
21488
  },
20629
21489
  item.page
20630
21490
  );
20631
21491
  }) }),
20632
- onBack ? /* @__PURE__ */ jsxs45(Fragment18, { children: [
20633
- /* @__PURE__ */ jsx65(View51, { style: { flex: 1 } }),
20634
- /* @__PURE__ */ jsx65(View51, { style: [styles53.divider, { backgroundColor: colors.border }] }),
20635
- /* @__PURE__ */ jsxs45(
20636
- 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,
20637
21497
  {
20638
- style: styles53.backBtn,
21498
+ style: styles55.backBtn,
20639
21499
  onPress: () => navigateBack(onBack),
20640
21500
  activeOpacity: 0.7,
20641
21501
  children: [
20642
- /* @__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(
20643
21503
  Path2,
20644
21504
  {
20645
21505
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20648,7 +21508,7 @@ function SideMenu({ onBack } = {}) {
20648
21508
  strokeLinecap: "round",
20649
21509
  strokeLinejoin: "round"
20650
21510
  }
20651
- ) : /* @__PURE__ */ jsx65(
21511
+ ) : /* @__PURE__ */ jsx69(
20652
21512
  Path2,
20653
21513
  {
20654
21514
  d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4 M16 17l5-5-5-5 M21 12H9",
@@ -20658,14 +21518,14 @@ function SideMenu({ onBack } = {}) {
20658
21518
  strokeLinejoin: "round"
20659
21519
  }
20660
21520
  ) }),
20661
- /* @__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" })
20662
21522
  ]
20663
21523
  }
20664
21524
  )
20665
21525
  ] }) : null
20666
21526
  ] });
20667
21527
  }
20668
- var styles53 = StyleSheet54.create({
21528
+ var styles55 = StyleSheet56.create({
20669
21529
  container: {
20670
21530
  flex: 1,
20671
21531
  paddingTop: 12
@@ -20751,42 +21611,68 @@ var styles53 = StyleSheet54.create({
20751
21611
  });
20752
21612
 
20753
21613
  // src/RedactoPrivacyCenter/components/Navbar.tsx
20754
- import { useCallback as useCallback14, useEffect as useEffect21, useState as useState25 } from "react";
20755
- import { StyleSheet as StyleSheet56, Text as Text44, TouchableOpacity as TouchableOpacity24, View as View53 } from "react-native";
20756
- 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";
20757
21617
  import Svg4, { Path as Path4 } from "react-native-svg";
20758
21618
 
20759
21619
  // src/RedactoPrivacyCenter/components/UserOrgMenu.tsx
20760
- import { Image as Image4, StyleSheet as StyleSheet55, Text as Text43, TouchableOpacity as TouchableOpacity23, View as View52 } from "react-native";
20761
- 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";
20762
21622
  import Svg3, { Path as Path3 } from "react-native-svg";
20763
- import { jsx as jsx66, jsxs as jsxs46 } from "react/jsx-runtime";
21623
+ import { jsx as jsx70, jsxs as jsxs47 } from "react/jsx-runtime";
20764
21624
  var UserOrgMenu = ({ visible, onClose, onBack }) => {
20765
- const { t } = useTranslation29();
21625
+ const { t } = useTranslation31();
20766
21626
  const { organizationName, email } = useAuth();
20767
21627
  const { colors, branding } = useTheme();
21628
+ const { switchProfile } = useProfileSwitch();
20768
21629
  const brandName = (branding == null ? void 0 : branding.brand_name) || organizationName || t("privacyCenter") || "Privacy Center";
20769
21630
  const handleAction = () => {
20770
21631
  onClose();
20771
21632
  navigateBack(onBack);
20772
21633
  };
20773
- return /* @__PURE__ */ jsxs46(BottomSheet, { visible, onClose, title: t("account") || "Account", children: [
20774
- /* @__PURE__ */ jsxs46(View52, { style: styles54.identity, children: [
20775
- (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 }),
20776
- /* @__PURE__ */ jsxs46(View52, { style: styles54.identityText, children: [
20777
- /* @__PURE__ */ jsx66(Text43, { style: [styles54.orgName, { color: colors.text }], numberOfLines: 2, children: brandName }),
20778
- 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
20779
21640
  ] })
20780
21641
  ] }),
20781
- onBack ? /* @__PURE__ */ jsxs46(
20782
- TouchableOpacity23,
21642
+ switchProfile ? /* @__PURE__ */ jsxs47(
21643
+ TouchableOpacity24,
20783
21644
  {
20784
- 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) }],
20785
21671
  onPress: handleAction,
20786
21672
  activeOpacity: 0.7,
20787
21673
  accessibilityRole: "button",
20788
21674
  children: [
20789
- /* @__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(
20790
21676
  Path3,
20791
21677
  {
20792
21678
  d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4 M16 17l5-5-5-5 M21 12H9",
@@ -20795,7 +21681,7 @@ var UserOrgMenu = ({ visible, onClose, onBack }) => {
20795
21681
  strokeLinecap: "round",
20796
21682
  strokeLinejoin: "round"
20797
21683
  }
20798
- ) : /* @__PURE__ */ jsx66(
21684
+ ) : /* @__PURE__ */ jsx70(
20799
21685
  Path3,
20800
21686
  {
20801
21687
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20805,13 +21691,13 @@ var UserOrgMenu = ({ visible, onClose, onBack }) => {
20805
21691
  strokeLinejoin: "round"
20806
21692
  }
20807
21693
  ) }),
20808
- /* @__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" })
20809
21695
  ]
20810
21696
  }
20811
21697
  ) : null
20812
21698
  ] });
20813
21699
  };
20814
- var styles54 = StyleSheet55.create({
21700
+ var styles56 = StyleSheet57.create({
20815
21701
  identity: {
20816
21702
  flexDirection: "row",
20817
21703
  alignItems: "center",
@@ -20852,33 +21738,33 @@ var styles54 = StyleSheet55.create({
20852
21738
  });
20853
21739
 
20854
21740
  // src/RedactoPrivacyCenter/components/Navbar.tsx
20855
- 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";
20856
21742
  function Navbar({ mode = "primary", onBack }) {
20857
- const { t } = useTranslation30();
21743
+ const { t } = useTranslation32();
20858
21744
  const { currentPage, navigateTo } = useInternalNavigation();
20859
21745
  const { organizationName, email } = useAuth();
20860
21746
  const { colors, branding } = useTheme();
20861
- const [locale, setLocale] = useState25(i18n_default.language || "en");
20862
- const [menuOpen, setMenuOpen] = useState25(false);
21747
+ const [locale, setLocale] = useState26(i18n_default.language || "en");
21748
+ const [menuOpen, setMenuOpen] = useState26(false);
20863
21749
  const unreadCount = useUnreadCount();
20864
21750
  const { status: pageStatus } = usePageStatus();
20865
21751
  const pageChrome = PAGE_CHROME_BY_PAGE[currentPage] || PAGE_CHROME_BY_PAGE["consent-manager"];
20866
21752
  const isDetail = mode === "detail";
20867
- useEffect21(() => {
21753
+ useEffect22(() => {
20868
21754
  const handleLanguageChanged = () => setLocale(i18n_default.language);
20869
21755
  i18n_default.on("languageChanged", handleLanguageChanged);
20870
21756
  return () => {
20871
21757
  i18n_default.off("languageChanged", handleLanguageChanged);
20872
21758
  };
20873
21759
  }, []);
20874
- const handleLanguageChange = useCallback14((value) => {
21760
+ const handleLanguageChange = useCallback15((value) => {
20875
21761
  i18n_default.changeLanguage(value);
20876
21762
  }, []);
20877
21763
  const brandLabel = (branding == null ? void 0 : branding.brand_name) || organizationName || t("privacyCenter") || "Privacy Center";
20878
21764
  const accountLabel = brandLabel || email || t("account") || "Account";
20879
- const brandLockup = /* @__PURE__ */ jsxs47(View53, { style: styles55.brandRow, children: [
20880
- /* @__PURE__ */ jsx67(PCAvatar, { name: organizationName || brandLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 }),
20881
- /* @__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 })
20882
21768
  ] });
20883
21769
  const handleDetailBack = () => {
20884
21770
  if (currentPage === "case-details") {
@@ -20890,26 +21776,26 @@ function Navbar({ mode = "primary", onBack }) {
20890
21776
  }
20891
21777
  };
20892
21778
  if (isDetail) {
20893
- return /* @__PURE__ */ jsxs47(Fragment19, { children: [
20894
- /* @__PURE__ */ jsx67(
20895
- View53,
21779
+ return /* @__PURE__ */ jsxs48(Fragment19, { children: [
21780
+ /* @__PURE__ */ jsx71(
21781
+ View55,
20896
21782
  {
20897
21783
  style: [
20898
- styles55.container,
20899
- styles55.detailContainer,
21784
+ styles57.container,
21785
+ styles57.detailContainer,
20900
21786
  { backgroundColor: colors.background, borderBottomColor: colors.border, paddingTop: TOP_INSET + spacing.xs }
20901
21787
  ],
20902
- children: /* @__PURE__ */ jsxs47(View53, { style: styles55.detailRow, children: [
20903
- /* @__PURE__ */ jsx67(
20904
- TouchableOpacity24,
21788
+ children: /* @__PURE__ */ jsxs48(View55, { style: styles57.detailRow, children: [
21789
+ /* @__PURE__ */ jsx71(
21790
+ TouchableOpacity25,
20905
21791
  {
20906
- style: styles55.backButton,
21792
+ style: styles57.backButton,
20907
21793
  onPress: handleDetailBack,
20908
21794
  activeOpacity: 0.7,
20909
21795
  hitSlop: DEFAULT_HIT_SLOP,
20910
21796
  accessibilityRole: "button",
20911
21797
  accessibilityLabel: t("back") || "Back",
20912
- 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(
20913
21799
  Path4,
20914
21800
  {
20915
21801
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20921,36 +21807,36 @@ function Navbar({ mode = "primary", onBack }) {
20921
21807
  ) })
20922
21808
  }
20923
21809
  ),
20924
- /* @__PURE__ */ jsxs47(View53, { style: styles55.detailTitleWrap, children: [
20925
- /* @__PURE__ */ jsx67(Text44, { style: [styles55.detailTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
20926
- 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
20927
21813
  ] })
20928
21814
  ] })
20929
21815
  }
20930
21816
  ),
20931
- /* @__PURE__ */ jsx67(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21817
+ /* @__PURE__ */ jsx71(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
20932
21818
  ] });
20933
21819
  }
20934
- return /* @__PURE__ */ jsxs47(Fragment19, { children: [
20935
- /* @__PURE__ */ jsxs47(
20936
- View53,
21820
+ return /* @__PURE__ */ jsxs48(Fragment19, { children: [
21821
+ /* @__PURE__ */ jsxs48(
21822
+ View55,
20937
21823
  {
20938
21824
  style: [
20939
- styles55.container,
21825
+ styles57.container,
20940
21826
  { backgroundColor: colors.background, borderBottomColor: colors.border, paddingTop: TOP_INSET + spacing.xs }
20941
21827
  ],
20942
21828
  children: [
20943
- /* @__PURE__ */ jsxs47(View53, { style: styles55.appBar, children: [
20944
- onBack ? /* @__PURE__ */ jsx67(
20945
- TouchableOpacity24,
21829
+ /* @__PURE__ */ jsxs48(View55, { style: styles57.appBar, children: [
21830
+ onBack ? /* @__PURE__ */ jsx71(
21831
+ TouchableOpacity25,
20946
21832
  {
20947
- style: styles55.backButton,
21833
+ style: styles57.backButton,
20948
21834
  onPress: () => navigateBack(onBack),
20949
21835
  activeOpacity: 0.7,
20950
21836
  hitSlop: DEFAULT_HIT_SLOP,
20951
21837
  accessibilityRole: "button",
20952
21838
  accessibilityLabel: onBack === "back" ? t("back") || "Back" : t("signOut") || "Sign Out",
20953
- 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(
20954
21840
  Path4,
20955
21841
  {
20956
21842
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20962,39 +21848,39 @@ function Navbar({ mode = "primary", onBack }) {
20962
21848
  ) })
20963
21849
  }
20964
21850
  ) : null,
20965
- /* @__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 }),
20966
- /* @__PURE__ */ jsxs47(View53, { style: styles55.actions, children: [
20967
- /* @__PURE__ */ jsx67(NotificationBell, { count: unreadCount, onPress: () => navigateTo("notifications") }),
20968
- /* @__PURE__ */ jsx67(PCSelect, { value: locale, options: languageOptions, onChange: handleLanguageChange, placeholder: t("language"), compact: true }),
20969
- /* @__PURE__ */ jsx67(
20970
- 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,
20971
21857
  {
20972
- style: styles55.avatarButton,
21858
+ style: styles57.avatarButton,
20973
21859
  onPress: () => setMenuOpen(true),
20974
21860
  activeOpacity: 0.7,
20975
21861
  hitSlop: DEFAULT_HIT_SLOP,
20976
21862
  accessibilityRole: "button",
20977
21863
  accessibilityLabel: accountLabel,
20978
- 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 })
20979
21865
  }
20980
21866
  )
20981
21867
  ] })
20982
21868
  ] }),
20983
- /* @__PURE__ */ jsx67(View53, { style: styles55.pageHeader, children: /* @__PURE__ */ jsxs47(View53, { style: styles55.titleRow, children: [
20984
- /* @__PURE__ */ jsx67(Text44, { style: [styles55.pageTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
20985
- 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
20986
21872
  ] }) })
20987
21873
  ]
20988
21874
  }
20989
21875
  ),
20990
- /* @__PURE__ */ jsx67(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21876
+ /* @__PURE__ */ jsx71(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
20991
21877
  ] });
20992
21878
  }
20993
- var styles55 = StyleSheet56.create({
21879
+ var styles57 = StyleSheet58.create({
20994
21880
  container: {
20995
21881
  paddingHorizontal: spacing.lg,
20996
21882
  paddingBottom: spacing.md,
20997
- borderBottomWidth: StyleSheet56.hairlineWidth
21883
+ borderBottomWidth: StyleSheet58.hairlineWidth
20998
21884
  },
20999
21885
  detailContainer: {
21000
21886
  paddingBottom: spacing.sm
@@ -21074,10 +21960,10 @@ var styles55 = StyleSheet56.create({
21074
21960
  });
21075
21961
 
21076
21962
  // src/RedactoPrivacyCenter/components/BottomTabBar.tsx
21077
- import { useState as useState26 } from "react";
21078
- import { Animated as Animated14, StyleSheet as StyleSheet57, Text as Text45, TouchableOpacity as TouchableOpacity25, View as View54 } from "react-native";
21079
- import { useTranslation as useTranslation31 } from "react-i18next";
21080
- 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";
21081
21967
  var TAB_ITEMS = [
21082
21968
  { page: "consent-manager", labelKey: "consentManager", fallback: "Consents", icon: "shield-check" },
21083
21969
  { page: "form", labelKey: "grievanceRequests", fallback: "Requests", icon: "message-circle-warning" },
@@ -21088,10 +21974,10 @@ var PAD_H = spacing.lg;
21088
21974
  var PILL_WIDTH = 56;
21089
21975
  var PILL_HEIGHT = 34;
21090
21976
  function BottomTabBar({ showFooter = true }) {
21091
- const { t } = useTranslation31();
21977
+ const { t } = useTranslation33();
21092
21978
  const { currentPage, navigateTo } = useInternalNavigation();
21093
21979
  const { colors } = useTheme();
21094
- const [rowWidth, setRowWidth] = useState26(0);
21980
+ const [rowWidth, setRowWidth] = useState27(0);
21095
21981
  const innerWidth = Math.max(0, rowWidth - PAD_H * 2);
21096
21982
  const tabWidth = innerWidth > 0 ? innerWidth / TAB_ITEMS.length : 0;
21097
21983
  const activeIndex = TAB_ITEMS.findIndex(
@@ -21099,13 +21985,13 @@ function BottomTabBar({ showFooter = true }) {
21099
21985
  );
21100
21986
  const { translateX } = useAnimatedTabIndicator(Math.max(0, activeIndex), tabWidth);
21101
21987
  const onLayout = (e) => setRowWidth(e.nativeEvent.layout.width);
21102
- return /* @__PURE__ */ jsxs48(View54, { style: [styles56.wrapper, { backgroundColor: colors.canvasSubtle, borderTopColor: colors.hairline }], children: [
21103
- /* @__PURE__ */ jsxs48(View54, { style: styles56.container, onLayout, children: [
21104
- 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(
21105
21991
  Animated14.View,
21106
21992
  {
21107
21993
  style: [
21108
- styles56.pill,
21994
+ styles58.pill,
21109
21995
  {
21110
21996
  width: PILL_WIDTH,
21111
21997
  left: PAD_H + (tabWidth - PILL_WIDTH) / 2,
@@ -21118,17 +22004,17 @@ function BottomTabBar({ showFooter = true }) {
21118
22004
  TAB_ITEMS.map((item) => {
21119
22005
  const isActive = currentPage === item.page || item.page === "form" && currentPage === "case-details";
21120
22006
  const label = t(item.labelKey) || item.fallback;
21121
- return /* @__PURE__ */ jsxs48(
21122
- TouchableOpacity25,
22007
+ return /* @__PURE__ */ jsxs49(
22008
+ TouchableOpacity26,
21123
22009
  {
21124
- style: styles56.tab,
22010
+ style: styles58.tab,
21125
22011
  onPress: () => navigateTo(item.page),
21126
22012
  activeOpacity: 0.7,
21127
22013
  accessibilityRole: "tab",
21128
22014
  accessibilityState: { selected: isActive },
21129
22015
  accessibilityLabel: label,
21130
22016
  children: [
21131
- /* @__PURE__ */ jsx68(View54, { style: styles56.iconWrap, children: /* @__PURE__ */ jsx68(
22017
+ /* @__PURE__ */ jsx72(View56, { style: styles58.iconWrap, children: /* @__PURE__ */ jsx72(
21132
22018
  Icon,
21133
22019
  {
21134
22020
  name: item.icon,
@@ -21137,10 +22023,10 @@ function BottomTabBar({ showFooter = true }) {
21137
22023
  strokeWidth: isActive ? 2.1 : 1.85
21138
22024
  }
21139
22025
  ) }),
21140
- /* @__PURE__ */ jsx68(
21141
- Text45,
22026
+ /* @__PURE__ */ jsx72(
22027
+ Text46,
21142
22028
  {
21143
- style: [styles56.tabLabel, { color: isActive ? colors.primary : colors.textSecondary }],
22029
+ style: [styles58.tabLabel, { color: isActive ? colors.primary : colors.textSecondary }],
21144
22030
  numberOfLines: 1,
21145
22031
  children: label
21146
22032
  }
@@ -21151,13 +22037,13 @@ function BottomTabBar({ showFooter = true }) {
21151
22037
  );
21152
22038
  })
21153
22039
  ] }),
21154
- showFooter ? /* @__PURE__ */ jsx68(Footer, { inline: true }) : null,
21155
- /* @__PURE__ */ jsx68(View54, { style: { height: BOTTOM_INSET } })
22040
+ showFooter ? /* @__PURE__ */ jsx72(Footer, { inline: true }) : null,
22041
+ /* @__PURE__ */ jsx72(View56, { style: { height: BOTTOM_INSET } })
21156
22042
  ] });
21157
22043
  }
21158
- var styles56 = StyleSheet57.create({
22044
+ var styles58 = StyleSheet59.create({
21159
22045
  wrapper: {
21160
- borderTopWidth: StyleSheet57.hairlineWidth
22046
+ borderTopWidth: StyleSheet59.hairlineWidth
21161
22047
  },
21162
22048
  container: {
21163
22049
  flexDirection: "row",