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

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