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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -121,10 +121,10 @@ __export(privacy_center_exports, {
121
121
  module.exports = __toCommonJS(privacy_center_exports);
122
122
 
123
123
  // src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx
124
- var import_react43 = require("react");
124
+ var import_react45 = require("react");
125
125
  var import_react_query2 = require("@tanstack/react-query");
126
- var import_react_i18next29 = require("react-i18next");
127
- var import_react_native64 = require("react-native");
126
+ var import_react_i18next31 = require("react-i18next");
127
+ var import_react_native66 = require("react-native");
128
128
 
129
129
  // src/RedactoPrivacyCenter/lib/i18n.ts
130
130
  var import_i18next = __toESM(require("i18next"));
@@ -541,7 +541,14 @@ var translation_default = {
541
541
  submittingAs: "Submitting as {{email}}",
542
542
  tapToChooseFile: "Tap to choose a file",
543
543
  view: "View",
544
- whatDoYouNeed: "What do you need?"
544
+ whatDoYouNeed: "What do you need?",
545
+ sessionExpiredTitle: "Your session has expired",
546
+ sessionExpiredDescription: "Please sign in again to continue.",
547
+ chooseYourProfile: "Choose your profile",
548
+ loginIdentifierLinkedToMultipleProfiles: "The login identifier is linked to more than one profile. Choose the one you want to view.",
549
+ userIdLabel: "User ID: {{id}}",
550
+ signingInEllipsis: "Signing in\u2026",
551
+ switchProfile: "Switch profile"
545
552
  };
546
553
 
547
554
  // src/RedactoPrivacyCenter/locales/as/translation.json
@@ -955,7 +962,14 @@ var translation_default2 = {
955
962
  submittingAs: "{{email}} \u09B9\u09BF\u099A\u09BE\u09AA\u09C7 \u09A6\u09BE\u0996\u09BF\u09B2 \u0995\u09F0\u09BF \u0986\u099B\u09C7",
956
963
  tapToChooseFile: "\u09AB\u09BE\u0987\u09B2 \u09AC\u09BE\u099B\u09BF\u09AC\u09B2\u09C8 \u099F\u09BF\u09AA\u0995",
957
964
  view: "\u099A\u09BE\u0993\u0995",
958
- whatDoYouNeed: "\u0986\u09AA\u09CB\u09A8\u09BE\u0995 \u0995\u09BF \u09B2\u09BE\u0997\u09C7?"
965
+ whatDoYouNeed: "\u0986\u09AA\u09CB\u09A8\u09BE\u0995 \u0995\u09BF \u09B2\u09BE\u0997\u09C7?",
966
+ sessionExpiredTitle: "\u0986\u09AA\u09CB\u09A8\u09BE\u09F0 \u099B\u09C7\u099A\u09A8 \u09B6\u09C7\u09B7 \u09B9\u09C8\u099B\u09C7",
967
+ 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",
968
+ chooseYourProfile: "\u0986\u09AA\u09CB\u09A8\u09BE\u09F0 \u09AA\u09CD\u09F0'\u09AB\u09BE\u0987\u09B2 \u09AC\u09BE\u099B\u09A8\u09BF \u0995\u09F0\u0995",
969
+ 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",
970
+ userIdLabel: "\u09AC\u09CD\u09AF\u09F1\u09B9\u09BE\u09F0\u0995\u09BE\u09F0\u09C0 \u0986\u0987\u09A1\u09BF: {{id}}",
971
+ signingInEllipsis: "\u099B\u09BE\u0987\u09A8 \u0987\u09A8 \u09B9\u09C8 \u0986\u099B\u09C7\u2026",
972
+ switchProfile: "\u09AA\u09CD\u09F0'\u09AB\u09BE\u0987\u09B2 \u09B8\u09B2\u09A8\u09BF \u0995\u09F0\u0995"
959
973
  };
960
974
 
961
975
  // src/RedactoPrivacyCenter/locales/bn/translation.json
@@ -1369,7 +1383,14 @@ var translation_default3 = {
1369
1383
  submittingAs: "{{email}} \u09B9\u09BF\u09B8\u09BE\u09AC\u09C7 \u099C\u09AE\u09BE \u09A6\u09C7\u0993\u09AF\u09BC\u09BE \u09B9\u099A\u09CD\u099B\u09C7",
1370
1384
  tapToChooseFile: "\u09AB\u09BE\u0987\u09B2 \u09AC\u09C7\u099B\u09C7 \u09A8\u09BF\u09A4\u09C7 \u099F\u09CD\u09AF\u09BE\u09AA \u0995\u09B0\u09C1\u09A8",
1371
1385
  view: "\u09A6\u09C7\u0996\u09C1\u09A8",
1372
- whatDoYouNeed: "\u0986\u09AA\u09A8\u09BE\u09B0 \u0995\u09C0 \u09AA\u09CD\u09B0\u09AF\u09BC\u09CB\u099C\u09A8?"
1386
+ whatDoYouNeed: "\u0986\u09AA\u09A8\u09BE\u09B0 \u0995\u09C0 \u09AA\u09CD\u09B0\u09AF\u09BC\u09CB\u099C\u09A8?",
1387
+ 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",
1388
+ 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",
1389
+ chooseYourProfile: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u09AC\u09C7\u099B\u09C7 \u09A8\u09BF\u09A8",
1390
+ 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",
1391
+ userIdLabel: "\u09AC\u09CD\u09AF\u09AC\u09B9\u09BE\u09B0\u0995\u09BE\u09B0\u09C0\u09B0 \u0986\u0987\u09A1\u09BF: {{id}}",
1392
+ signingInEllipsis: "\u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u09B9\u099A\u09CD\u099B\u09C7\u2026",
1393
+ switchProfile: "\u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09A8 \u0995\u09B0\u09C1\u09A8"
1373
1394
  };
1374
1395
 
1375
1396
  // src/RedactoPrivacyCenter/locales/brx/translation.json
@@ -1783,7 +1804,14 @@ var translation_default4 = {
1783
1804
  submittingAs: "{{email}} \u092E\u0939\u0930\u0948 \u0917\u0925\u093E\u092F\u0917\u093E\u0938\u093F\u0928\u094B",
1784
1805
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u0938\u093E\u092F\u0916\u0928\u094B \u091F\u0947\u092C \u0916\u093E\u0932\u093E\u092E",
1785
1806
  view: "\u0928\u093E\u092F",
1786
- whatDoYouNeed: "\u0928\u094B\u0902\u0925\u093E\u0902\u0928\u094B \u092E\u093E \u0917\u094B\u0928\u093E\u0902?"
1807
+ whatDoYouNeed: "\u0928\u094B\u0902\u0925\u093E\u0902\u0928\u094B \u092E\u093E \u0917\u094B\u0928\u093E\u0902?",
1808
+ sessionExpiredTitle: "\u0928\u094B\u0902\u0925\u093E\u0902\u0928\u093F \u0938\u0947\u0938\u0928 \u091C\u094B\u092C\u092C\u093E\u092F",
1809
+ 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",
1810
+ chooseYourProfile: "\u0928\u094B\u0902\u0925\u093E\u0902\u0928\u093F \u092A\u094D\u0930\u092B\u093E\u0907\u0932 \u0938\u093E\u092F\u0916",
1811
+ 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",
1812
+ userIdLabel: "\u092F\u0942\u091C\u0930 \u0906\u0908\u0921\u0940: {{id}}",
1813
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u091C\u093E\u092F\u0917\u093E\u0938\u093F\u0928\u094B \u0926\u0902\u2026",
1814
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u0938\u094B\u0932\u093E\u092F"
1787
1815
  };
1788
1816
 
1789
1817
  // src/RedactoPrivacyCenter/locales/doi/translation.json
@@ -2197,7 +2225,14 @@ var translation_default5 = {
2197
2225
  submittingAs: "{{email}} \u0926\u0947 \u0930\u0942\u092A \u091A \u091C\u092E\u093E\u0902 \u0915\u0930\u0926\u0947",
2198
2226
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u091A\u0941\u0928\u0928\u0947 \u0906\u0938\u094D\u0924\u0948 \u091F\u0948\u092A \u0915\u0930\u094B",
2199
2227
  view: "\u0926\u093F\u0915\u094D\u0916\u094B",
2200
- whatDoYouNeed: "\u0924\u0941\u0938\u0947\u0902 \u0915\u0947\u0939\u094D \u091A\u093E\u0939\u093F\u0926\u093E?"
2228
+ whatDoYouNeed: "\u0924\u0941\u0938\u0947\u0902 \u0915\u0947\u0939\u094D \u091A\u093E\u0939\u093F\u0926\u093E?",
2229
+ sessionExpiredTitle: "\u0924\u0941\u0902\u0926\u093E \u0938\u0924\u094D\u0930 \u0916\u0924\u092E \u0939\u094B\u0908 \u0917\u0947\u0906 \u0910",
2230
+ 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",
2231
+ chooseYourProfile: "\u0905\u092A\u0928\u0940 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u091A\u0941\u0928\u094B",
2232
+ 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",
2233
+ userIdLabel: "\u092A\u094D\u0930\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0906\u0908\u0921\u0940: {{id}}",
2234
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0939\u094B\u0906 \u0915\u0930\u0926\u093E \u0910\u2026",
2235
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u092C\u0926\u0932\u094B"
2201
2236
  };
2202
2237
 
2203
2238
  // src/RedactoPrivacyCenter/locales/gom/translation.json
@@ -2611,7 +2646,14 @@ var translation_default6 = {
2611
2646
  submittingAs: "{{email}} \u092E\u094D\u0939\u0942\u0923 \u0938\u093E\u0926\u0930 \u0915\u0930\u0924\u093E",
2612
2647
  tapToChooseFile: "\u092B\u093E\u092F\u0932 \u0928\u093F\u0935\u0921\u092A\u093E\u0915 \u091F\u0945\u092A \u0915\u0930\u093E\u0924",
2613
2648
  view: "\u092A\u0933\u092F\u093E\u0924",
2614
- whatDoYouNeed: "\u0924\u0941\u092E\u0915\u093E\u0902 \u0915\u093F\u0924\u0947\u0902 \u091C\u093E\u092F?"
2649
+ whatDoYouNeed: "\u0924\u0941\u092E\u0915\u093E\u0902 \u0915\u093F\u0924\u0947\u0902 \u091C\u093E\u092F?",
2650
+ sessionExpiredTitle: "\u0924\u0941\u092E\u091A\u0947\u0902 \u0938\u0924\u094D\u0930 \u0938\u094B\u0902\u092A\u0932\u093E\u0902",
2651
+ 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.",
2652
+ chooseYourProfile: "\u0924\u0941\u092E\u091A\u0947\u0902 \u092A\u094D\u0930\u094B\u092B\u093E\u092F\u0932 \u0928\u093F\u0935\u0921\u093E\u0924",
2653
+ 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.",
2654
+ userIdLabel: "\u0935\u093E\u092A\u0930\u092A\u0940 \u0906\u092F\u0921\u0940: {{id}}",
2655
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u091C\u093E\u0935\u0928 \u0906\u0938\u093E\u2026",
2656
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u092F\u0932 \u092C\u0926\u0932\u093E"
2615
2657
  };
2616
2658
 
2617
2659
  // src/RedactoPrivacyCenter/locales/gu/translation.json
@@ -3025,7 +3067,14 @@ var translation_default7 = {
3025
3067
  submittingAs: "{{email}} \u0AA4\u0AB0\u0AC0\u0A95\u0AC7 \u0AB8\u0AAC\u0AAE\u0ABF\u0A9F \u0A95\u0AB0\u0AC0 \u0AB0\u0AB9\u0ACD\u0AAF\u0ABE \u0A9B\u0ACB",
3026
3068
  tapToChooseFile: "\u0AAB\u0ABE\u0A87\u0AB2 \u0AAA\u0AB8\u0A82\u0AA6 \u0A95\u0AB0\u0AB5\u0ABE \u0A9F\u0AC5\u0AAA \u0A95\u0AB0\u0ACB",
3027
3069
  view: "\u0A9C\u0AC1\u0A93",
3028
- whatDoYouNeed: "\u0AA4\u0AAE\u0AA8\u0AC7 \u0AB6\u0AC1\u0A82 \u0A9C\u0ACB\u0A88\u0A8F \u0A9B\u0AC7?"
3070
+ whatDoYouNeed: "\u0AA4\u0AAE\u0AA8\u0AC7 \u0AB6\u0AC1\u0A82 \u0A9C\u0ACB\u0A88\u0A8F \u0A9B\u0AC7?",
3071
+ 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",
3072
+ 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.",
3073
+ chooseYourProfile: "\u0AA4\u0AAE\u0ABE\u0AB0\u0AC0 \u0AAA\u0ACD\u0AB0\u0ACB\u0AAB\u0ABE\u0A87\u0AB2 \u0AAA\u0AB8\u0A82\u0AA6 \u0A95\u0AB0\u0ACB",
3074
+ 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.",
3075
+ userIdLabel: "\u0AB5\u0AAA\u0AB0\u0ABE\u0AB6\u0A95\u0AB0\u0ACD\u0AA4\u0ABE \u0A86\u0A88\u0AA1\u0AC0: {{id}}",
3076
+ signingInEllipsis: "\u0AB8\u0ABE\u0A87\u0AA8 \u0A87\u0AA8 \u0AA5\u0A88 \u0AB0\u0AB9\u0ACD\u0AAF\u0AC1\u0A82 \u0A9B\u0AC7\u2026",
3077
+ switchProfile: "\u0AAA\u0ACD\u0AB0\u0ACB\u0AAB\u0ABE\u0A87\u0AB2 \u0AAC\u0AA6\u0AB2\u0ACB"
3029
3078
  };
3030
3079
 
3031
3080
  // src/RedactoPrivacyCenter/locales/hi/translation.json
@@ -3439,7 +3488,14 @@ var translation_default8 = {
3439
3488
  submittingAs: "{{email}} \u0915\u0947 \u0930\u0942\u092A \u092E\u0947\u0902 \u0938\u092C\u092E\u093F\u091F \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902",
3440
3489
  tapToChooseFile: "\u092B\u093C\u093E\u0907\u0932 \u091A\u0941\u0928\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u091F\u0948\u092A \u0915\u0930\u0947\u0902",
3441
3490
  view: "\u0926\u0947\u0916\u0947\u0902",
3442
- whatDoYouNeed: "\u0906\u092A\u0915\u094B \u0915\u094D\u092F\u093E \u091A\u093E\u0939\u093F\u090F?"
3491
+ whatDoYouNeed: "\u0906\u092A\u0915\u094B \u0915\u094D\u092F\u093E \u091A\u093E\u0939\u093F\u090F?",
3492
+ sessionExpiredTitle: "\u0906\u092A\u0915\u093E \u0938\u0924\u094D\u0930 \u0938\u092E\u093E\u092A\u094D\u0924 \u0939\u094B \u0917\u092F\u093E \u0939\u0948",
3493
+ 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",
3494
+ chooseYourProfile: "\u0905\u092A\u0928\u0940 \u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932 \u091A\u0941\u0928\u0947\u0902",
3495
+ 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",
3496
+ userIdLabel: "\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0906\u0908\u0921\u0940: {{id}}",
3497
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
3498
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932 \u092C\u0926\u0932\u0947\u0902"
3443
3499
  };
3444
3500
 
3445
3501
  // src/RedactoPrivacyCenter/locales/kn/translation.json
@@ -3853,7 +3909,14 @@ var translation_default9 = {
3853
3909
  submittingAs: "{{email}} \u0C86\u0C97\u0CBF \u0CB8\u0CB2\u0CCD\u0CB2\u0CBF\u0CB8\u0CB2\u0CBE\u0C97\u0CC1\u0CA4\u0CCD\u0CA4\u0CBF\u0CA6\u0CC6",
3854
3910
  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",
3855
3911
  view: "\u0CB5\u0CC0\u0C95\u0CCD\u0CB7\u0CBF\u0CB8\u0CBF",
3856
- whatDoYouNeed: "\u0CA8\u0CBF\u0CAE\u0C97\u0CC6 \u0C8F\u0CA8\u0CC1 \u0CAC\u0CC7\u0C95\u0CC1?"
3912
+ whatDoYouNeed: "\u0CA8\u0CBF\u0CAE\u0C97\u0CC6 \u0C8F\u0CA8\u0CC1 \u0CAC\u0CC7\u0C95\u0CC1?",
3913
+ sessionExpiredTitle: "\u0CA8\u0CBF\u0CAE\u0CCD\u0CAE \u0CB8\u0CC6\u0CB7\u0CA8\u0CCD \u0C85\u0CB5\u0CA7\u0CBF \u0CAE\u0CC1\u0C97\u0CBF\u0CA6\u0CBF\u0CA6\u0CC6",
3914
+ 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.",
3915
+ chooseYourProfile: "\u0CA8\u0CBF\u0CAE\u0CCD\u0CAE \u0CAA\u0CCD\u0CB0\u0CCA\u0CAB\u0CC8\u0CB2\u0CCD \u0C86\u0CAF\u0CCD\u0C95\u0CC6\u0CAE\u0CBE\u0CA1\u0CBF",
3916
+ 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.",
3917
+ userIdLabel: "\u0CAC\u0CB3\u0C95\u0CC6\u0CA6\u0CBE\u0CB0 \u0C90\u0CA1\u0CBF: {{id}}",
3918
+ signingInEllipsis: "\u0CB8\u0CC8\u0CA8\u0CCD \u0C87\u0CA8\u0CCD \u0C86\u0C97\u0CC1\u0CA4\u0CCD\u0CA4\u0CBF\u0CA6\u0CC6\u2026",
3919
+ switchProfile: "\u0CAA\u0CCD\u0CB0\u0CCA\u0CAB\u0CC8\u0CB2\u0CCD \u0CAC\u0CA6\u0CB2\u0CBE\u0CAF\u0CBF\u0CB8\u0CBF"
3857
3920
  };
3858
3921
 
3859
3922
  // src/RedactoPrivacyCenter/locales/ks/translation.json
@@ -4267,7 +4330,14 @@ var translation_default10 = {
4267
4330
  submittingAs: "{{email}} \u067E\u0620\u0658\u0679\u06BE \u062C\u0645\u0639 \u06A9\u0631\u0627\u0646",
4268
4331
  tapToChooseFile: "\u0641\u0627\u06CC\u0644 \u0698\u0627\u0631\u0646\u06C1 \u062E\u0672\u0637\u0631\u0655 \u0679\u06CC\u067E \u06A9\u0631\u06CC\u0648",
4269
4332
  view: "\u0648\u064F\u0686\u06BE\u0650\u0648",
4270
- whatDoYouNeed: "\u062A\u0648\u06C1\u0650 \u06A9\u06CC\u0627 \u0636\u0631\u0648\u0631\u062A \u0686\u06BE\u064F\u061F"
4333
+ whatDoYouNeed: "\u062A\u0648\u06C1\u0650 \u06A9\u06CC\u0627 \u0636\u0631\u0648\u0631\u062A \u0686\u06BE\u064F\u061F",
4334
+ sessionExpiredTitle: "\u062A\u064F\u06C1\u0646\u065B\u062F \u0633\u06CC\u0634\u064E\u0646 \u062E\u062A\u0645 \u06AF\u06C4\u0645\u064F\u062A",
4335
+ 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",
4336
+ chooseYourProfile: "\u067E\u0646\u0646\u06C1\u0655 \u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u0698\u0627\u0631\u0655\u0648",
4337
+ 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",
4338
+ userIdLabel: "\u0635\u0627\u0631\u0641 \u0622\u0626\u06CC \u0688\u06CC: {{id}}",
4339
+ signingInEllipsis: "\u0633\u0627\u0626\u0646 \u0627\u0650\u0646 \u06AF\u0698\u06BE\u0627\u0646 \u0686\u06BE\u064F\u2026",
4340
+ switchProfile: "\u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u0628\u062F\u0644\u0627\u0648"
4271
4341
  };
4272
4342
 
4273
4343
  // src/RedactoPrivacyCenter/locales/mai/translation.json
@@ -4681,7 +4751,14 @@ var translation_default11 = {
4681
4751
  submittingAs: "{{email}} \u0930\u0942\u092A\u092E\u0947 \u091C\u092E\u093E \u0915\u093D \u0930\u0939\u0932 \u091B\u0940",
4682
4752
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u091A\u0941\u0928\u092C\u093E\u0915 \u0932\u0947\u0932 \u091F\u0948\u092A \u0915\u0930\u0942",
4683
4753
  view: "\u0926\u0947\u0916\u0942",
4684
- whatDoYouNeed: "\u0905\u0939\u093E\u0901\u0915\u0947\u0901 \u0915\u0940 \u091A\u093E\u0939\u0940?"
4754
+ whatDoYouNeed: "\u0905\u0939\u093E\u0901\u0915\u0947\u0901 \u0915\u0940 \u091A\u093E\u0939\u0940?",
4755
+ sessionExpiredTitle: "\u0905\u0939\u093E\u0901\u0915 \u0938\u0924\u094D\u0930 \u0938\u092E\u093E\u092A\u094D\u0924 \u092D\u093D \u0917\u0947\u0932 \u0905\u091B\u093F",
4756
+ 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",
4757
+ chooseYourProfile: "\u0905\u092A\u0928 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u091A\u0941\u0928\u0942",
4758
+ 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",
4759
+ userIdLabel: "\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0906\u0907\u0921\u0940: {{id}}",
4760
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u092D' \u0930\u0939\u0932 \u0905\u091B\u093F\u2026",
4761
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u092C\u0926\u0932\u0942"
4685
4762
  };
4686
4763
 
4687
4764
  // src/RedactoPrivacyCenter/locales/ml/translation.json
@@ -5095,7 +5172,14 @@ var translation_default12 = {
5095
5172
  submittingAs: "{{email}} \u0D06\u0D2F\u0D3F \u0D38\u0D2E\u0D7C\u0D2A\u0D4D\u0D2A\u0D3F\u0D15\u0D4D\u0D15\u0D41\u0D28\u0D4D\u0D28\u0D41",
5096
5173
  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",
5097
5174
  view: "\u0D15\u0D3E\u0D23\u0D41\u0D15",
5098
- 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?"
5175
+ 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?",
5176
+ 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",
5177
+ 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.",
5178
+ 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",
5179
+ 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.",
5180
+ userIdLabel: "\u0D09\u0D2A\u0D2F\u0D4B\u0D15\u0D4D\u0D24\u0D43 \u0D10\u0D21\u0D3F: {{id}}",
5181
+ signingInEllipsis: "\u0D38\u0D48\u0D7B \u0D07\u0D7B \u0D1A\u0D46\u0D2F\u0D4D\u0D2F\u0D41\u0D28\u0D4D\u0D28\u0D41\u2026",
5182
+ switchProfile: "\u0D2A\u0D4D\u0D30\u0D4A\u0D2B\u0D48\u0D7D \u0D2E\u0D3E\u0D31\u0D4D\u0D31\u0D41\u0D15"
5099
5183
  };
5100
5184
 
5101
5185
  // src/RedactoPrivacyCenter/locales/mni-Mtei/translation.json
@@ -5509,7 +5593,14 @@ var translation_default13 = {
5509
5593
  submittingAs: "{{email}} \uABD1\uABE3\uABCF\uABC5 \uABCA\uABE5\uABD2\uABE0\uABC2\uABE4",
5510
5594
  tapToChooseFile: "\uABD0\uABE5\uABCF\uABDC \uABC8\uABDF\uABC5\uABD5 \uABC7\uABE6\uABDE \uABC7\uABE7",
5511
5595
  view: "\uABCC\uABE6\uABE1\uABCE",
5512
- whatDoYouNeed: "\uABD1\uABD7\uABE3\uABDD\uABD7 \uABC0\uABD4\uABE4 \uABC7\uABC9\uABE5\uABCF\uABD0\uABD7\uABD5\uABD2\uABE6?"
5596
+ whatDoYouNeed: "\uABD1\uABD7\uABE3\uABDD\uABD7 \uABC0\uABD4\uABE4 \uABC7\uABC9\uABE5\uABCF\uABD0\uABD7\uABD5\uABD2\uABE6?",
5597
+ sessionExpiredTitle: "\uABD1\uABD7\uABE3\uABDD\uABD2\uABE4 \uABC1\uABE6\uABC1\uABDF \uABC2\uABE3\uABCF\uABD4\uABE6",
5598
+ 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",
5599
+ chooseYourProfile: "\u09A8\u09B9\u09BE\u0995\u09CD\u0995\u09C0 \u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u0996\u09A8\u09AC\u09BF\u09AF\u09BC\u09C1",
5600
+ 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",
5601
+ userIdLabel: "\uABC3\uABE4\uABD1\uABE3\uABCF\uABD5 \uABD1\uABE5\uABCF\uABD7\uABE4: {{id}}",
5602
+ signingInEllipsis: "\u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u09A4\u09CC\u09B0\u09BF\u2026",
5603
+ switchProfile: "\u09AA\u09CD\u09B0\u09CB\u09AB\u09BE\u0987\u09B2 \u09B9\u09CB\u0982\u09A6\u09CB\u0995-\u0989"
5513
5604
  };
5514
5605
 
5515
5606
  // src/RedactoPrivacyCenter/locales/mr/translation.json
@@ -5923,7 +6014,14 @@ var translation_default14 = {
5923
6014
  submittingAs: "{{email}} \u092E\u094D\u0939\u0923\u0942\u0928 \u0938\u092C\u092E\u093F\u091F \u0915\u0930\u0924 \u0906\u0939\u0947",
5924
6015
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u0928\u093F\u0935\u0921\u0923\u094D\u092F\u093E\u0938\u093E\u0920\u0940 \u091F\u0945\u092A \u0915\u0930\u093E",
5925
6016
  view: "\u092A\u0939\u093E",
5926
- whatDoYouNeed: "\u0924\u0941\u092E\u094D\u0939\u093E\u0932\u093E \u0915\u093E\u092F \u0939\u0935\u0947 \u0906\u0939\u0947?"
6017
+ whatDoYouNeed: "\u0924\u0941\u092E\u094D\u0939\u093E\u0932\u093E \u0915\u093E\u092F \u0939\u0935\u0947 \u0906\u0939\u0947?",
6018
+ sessionExpiredTitle: "\u0924\u0941\u092E\u091A\u0947 \u0938\u0924\u094D\u0930 \u0938\u0902\u092A\u0932\u0947 \u0906\u0939\u0947",
6019
+ 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.",
6020
+ chooseYourProfile: "\u0924\u0941\u092E\u091A\u0940 \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u0928\u093F\u0935\u0921\u093E",
6021
+ 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.",
6022
+ userIdLabel: "\u0935\u093E\u092A\u0930\u0915\u0930\u094D\u0924\u093E \u0906\u092F\u0921\u0940: {{id}}",
6023
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0924 \u0906\u0939\u0947\u2026",
6024
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u092C\u0926\u0932\u093E"
5927
6025
  };
5928
6026
 
5929
6027
  // src/RedactoPrivacyCenter/locales/ne/translation.json
@@ -6337,7 +6435,14 @@ var translation_default15 = {
6337
6435
  submittingAs: "{{email}} \u0915\u094B \u0930\u0942\u092A\u092E\u093E \u092A\u0947\u0936 \u0917\u0930\u094D\u0926\u0948",
6338
6436
  tapToChooseFile: "\u092B\u093E\u0907\u0932 \u091B\u093E\u0928\u094D\u0928 \u091F\u094D\u092F\u093E\u092A \u0917\u0930\u094D\u0928\u0941\u0939\u094B\u0938\u094D",
6339
6437
  view: "\u0939\u0947\u0930\u094D\u0928\u0941\u0939\u094B\u0938\u094D",
6340
- whatDoYouNeed: "\u0924\u092A\u093E\u0908\u0902\u0932\u093E\u0908 \u0915\u0947 \u091A\u093E\u0939\u093F\u0928\u094D\u091B?"
6438
+ whatDoYouNeed: "\u0924\u092A\u093E\u0908\u0902\u0932\u093E\u0908 \u0915\u0947 \u091A\u093E\u0939\u093F\u0928\u094D\u091B?",
6439
+ sessionExpiredTitle: "\u0924\u092A\u093E\u0908\u0902\u0915\u094B \u0938\u0924\u094D\u0930 \u0938\u092E\u093E\u092A\u094D\u0924 \u092D\u090F\u0915\u094B \u091B",
6440
+ 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",
6441
+ chooseYourProfile: "\u0906\u092B\u094D\u0928\u094B \u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u091B\u093E\u0928\u094D\u0928\u0941\u0939\u094B\u0938\u094D",
6442
+ 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",
6443
+ userIdLabel: "\u092A\u094D\u0930\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0906\u0908\u0921\u0940: {{id}}",
6444
+ signingInEllipsis: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0939\u0941\u0901\u0926\u0948\u091B\u2026",
6445
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093E\u0907\u0932 \u092C\u0926\u0932\u094D\u0928\u0941\u0939\u094B\u0938\u094D"
6341
6446
  };
6342
6447
 
6343
6448
  // src/RedactoPrivacyCenter/locales/or/translation.json
@@ -6751,7 +6856,14 @@ var translation_default16 = {
6751
6856
  submittingAs: "{{email}} \u0B2D\u0B3E\u0B2C\u0B47 \u0B26\u0B3E\u0B16\u0B32 \u0B15\u0B30\u0B41\u0B1B\u0B28\u0B4D\u0B24\u0B3F",
6752
6857
  tapToChooseFile: "\u0B2B\u0B3E\u0B07\u0B32 \u0B2C\u0B3E\u0B1B\u0B3F\u0B2C\u0B3E\u0B15\u0B41 \u0B1F\u0B4D\u0B5F\u0B3E\u0B2A \u0B15\u0B30\u0B28\u0B4D\u0B24\u0B41",
6753
6858
  view: "\u0B26\u0B47\u0B16\u0B28\u0B4D\u0B24\u0B41",
6754
- whatDoYouNeed: "\u0B06\u0B2A\u0B23 \u0B15\u0B23 \u0B1A\u0B3E\u0B39\u0B3E\u0B28\u0B4D\u0B24\u0B3F?"
6859
+ whatDoYouNeed: "\u0B06\u0B2A\u0B23 \u0B15\u0B23 \u0B1A\u0B3E\u0B39\u0B3E\u0B28\u0B4D\u0B24\u0B3F?",
6860
+ 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",
6861
+ 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",
6862
+ chooseYourProfile: "\u0B06\u0B2A\u0B23\u0B19\u0B4D\u0B15 \u0B2A\u0B4D\u0B30\u0B4B\u0B2B\u0B3E\u0B07\u0B32\u0B4D \u0B2C\u0B3E\u0B1B\u0B28\u0B4D\u0B24\u0B41",
6863
+ 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",
6864
+ userIdLabel: "\u0B2C\u0B4D\u0B5F\u0B2C\u0B39\u0B3E\u0B30\u0B15\u0B3E\u0B30\u0B40 \u0B06\u0B07\u0B21\u0B3F: {{id}}",
6865
+ signingInEllipsis: "\u0B38\u0B3E\u0B07\u0B28\u0B4D \u0B07\u0B28\u0B4D \u0B39\u0B47\u0B09\u0B1B\u0B3F\u2026",
6866
+ switchProfile: "\u0B2A\u0B4D\u0B30\u0B4B\u0B2B\u0B3E\u0B07\u0B32\u0B4D \u0B2C\u0B26\u0B33\u0B3E\u0B28\u0B4D\u0B24\u0B41"
6755
6867
  };
6756
6868
 
6757
6869
  // src/RedactoPrivacyCenter/locales/pa/translation.json
@@ -7165,7 +7277,14 @@ var translation_default17 = {
7165
7277
  submittingAs: "{{email}} \u0A35\u0A1C\u0A4B\u0A02 \u0A38\u0A2C\u0A2E\u0A3F\u0A1F \u0A15\u0A30 \u0A30\u0A39\u0A47 \u0A39\u0A4B",
7166
7278
  tapToChooseFile: "\u0A2B\u0A3E\u0A08\u0A32 \u0A1A\u0A41\u0A23\u0A28 \u0A32\u0A08 \u0A1F\u0A48\u0A2A \u0A15\u0A30\u0A4B",
7167
7279
  view: "\u0A26\u0A47\u0A16\u0A4B",
7168
- whatDoYouNeed: "\u0A24\u0A41\u0A39\u0A3E\u0A28\u0A42\u0A70 \u0A15\u0A40 \u0A1A\u0A3E\u0A39\u0A40\u0A26\u0A3E \u0A39\u0A48?"
7280
+ whatDoYouNeed: "\u0A24\u0A41\u0A39\u0A3E\u0A28\u0A42\u0A70 \u0A15\u0A40 \u0A1A\u0A3E\u0A39\u0A40\u0A26\u0A3E \u0A39\u0A48?",
7281
+ sessionExpiredTitle: "\u0A24\u0A41\u0A39\u0A3E\u0A21\u0A3E \u0A38\u0A48\u0A38\u0A3C\u0A28 \u0A38\u0A2E\u0A3E\u0A2A\u0A24 \u0A39\u0A4B \u0A17\u0A3F\u0A06 \u0A39\u0A48",
7282
+ 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",
7283
+ chooseYourProfile: "\u0A06\u0A2A\u0A23\u0A40 \u0A2A\u0A4D\u0A30\u0A4B\u0A2B\u0A3E\u0A08\u0A32 \u0A1A\u0A41\u0A23\u0A4B",
7284
+ 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",
7285
+ userIdLabel: "\u0A09\u0A2A\u0A2F\u0A4B\u0A17\u0A15\u0A30\u0A24\u0A3E \u0A06\u0A08\u0A21\u0A40: {{id}}",
7286
+ signingInEllipsis: "\u0A38\u0A3E\u0A08\u0A28 \u0A07\u0A28 \u0A39\u0A4B \u0A30\u0A3F\u0A39\u0A3E \u0A39\u0A48\u2026",
7287
+ switchProfile: "\u0A2A\u0A4D\u0A30\u0A4B\u0A2B\u0A3E\u0A08\u0A32 \u0A2C\u0A26\u0A32\u0A4B"
7169
7288
  };
7170
7289
 
7171
7290
  // src/RedactoPrivacyCenter/locales/sa/translation.json
@@ -7579,7 +7698,14 @@ var translation_default18 = {
7579
7698
  submittingAs: "{{email}} \u0907\u0924\u093F \u0938\u092E\u0930\u094D\u092A\u092F\u0928\u094D",
7580
7699
  tapToChooseFile: "\u0938\u091E\u094D\u091A\u093F\u0915\u093E\u0902 \u091A\u0947\u0924\u0941\u0902 \u0938\u094D\u092A\u0943\u0936\u0924\u0941",
7581
7700
  view: "\u092A\u0936\u094D\u092F",
7582
- whatDoYouNeed: "\u092D\u0935\u0924\u0903 \u0915\u093F\u092E\u094D \u0906\u0935\u0936\u094D\u092F\u0915\u092E\u094D?"
7701
+ whatDoYouNeed: "\u092D\u0935\u0924\u0903 \u0915\u093F\u092E\u094D \u0906\u0935\u0936\u094D\u092F\u0915\u092E\u094D?",
7702
+ sessionExpiredTitle: "\u092D\u0935\u0924\u0903 \u0938\u0924\u094D\u0930\u0902 \u0938\u092E\u093E\u092A\u094D\u0924\u092E\u094D",
7703
+ 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",
7704
+ chooseYourProfile: "\u0938\u094D\u0935\u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932\u0902 \u091A\u093F\u0928\u094B\u0924\u0941",
7705
+ 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",
7706
+ userIdLabel: "\u0909\u092A\u092F\u094B\u0915\u094D\u0924\u0943-\u0906\u092F\u0921\u0940: {{id}}",
7707
+ signingInEllipsis: "\u092A\u094D\u0930\u0935\u0947\u0936\u0903 \u0915\u094D\u0930\u093F\u092F\u0924\u0947\u2026",
7708
+ switchProfile: "\u092A\u094D\u0930\u094B\u092B\u093C\u093E\u0907\u0932\u0902 \u092A\u0930\u093F\u0935\u0930\u094D\u0924\u092F\u0924\u0941"
7583
7709
  };
7584
7710
 
7585
7711
  // src/RedactoPrivacyCenter/locales/sat/translation.json
@@ -7993,7 +8119,14 @@ var translation_default19 = {
7993
8119
  submittingAs: "{{email}} \u1C5E\u1C6E\u1C60\u1C5F\u1C5B\u1C6E \u1C61\u1C5A\u1C62\u1C5F \u1C6E\u1C6B\u1C5F",
7994
8120
  tapToChooseFile: "\u1C6F\u1C77\u1C5F\u1C6D\u1C64\u1C5E \u1C75\u1C5F\u1C6A\u1C77\u1C5F\u1C63 \u1C5E\u1C5F\u1C79\u1C5C\u1C64\u1C6B \u1C74\u1C6E\u1C6F \u1C62\u1C6E",
7995
8121
  view: "\u1C67\u1C6E\u1C5E \u1C62\u1C6E",
7996
- whatDoYouNeed: "\u1C5F\u1C62 \u1C6A\u1C6E\u1C6B \u1C5E\u1C5F\u1C79\u1C60\u1C5B\u1C64?"
8122
+ whatDoYouNeed: "\u1C5F\u1C62 \u1C6A\u1C6E\u1C6B \u1C5E\u1C5F\u1C79\u1C60\u1C5B\u1C64?",
8123
+ sessionExpiredTitle: "\u1C5F\u1C62\u1C5F\u1C5C \u1C65\u1C6E\u1C65\u1C5A\u1C71 \u1C62\u1C69\u1C6A\u1C5F\u1C79\u1C6B\u1C6E\u1C71\u1C5F",
8124
+ 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",
8125
+ chooseYourProfile: "\u1C5F\u1C62\u1C5F\u1C5C \u1C6F\u1C68\u1C73\u1C6F\u1C77\u1C5F\u1C6D\u1C64\u1C5E \u1C75\u1C5F\u1C6A\u1C77\u1C5F\u1C63 \u1C62\u1C6E",
8126
+ 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",
8127
+ userIdLabel: "\u1C75\u1C6E\u1C75\u1C77\u1C5F\u1C68\u1C64\u1C6D\u1C5F\u1C79 \u1C5F\u1C6D\u1C70\u1C64: {{id}}",
8128
+ signingInEllipsis: "\u1C65\u1C5F\u1C6D\u1C64\u1C71 \u1C64\u1C71 \u1C6E\u1C6B\u1C5F\u1C6D\u2026",
8129
+ switchProfile: "\u1C6F\u1C68\u1C73\u1C6F\u1C77\u1C5F\u1C6D\u1C64\u1C5E \u1C75\u1C5A\u1C6B\u1C5A\u1C5E \u1C62\u1C6E"
7997
8130
  };
7998
8131
 
7999
8132
  // src/RedactoPrivacyCenter/locales/sd/translation.json
@@ -8407,7 +8540,14 @@ var translation_default20 = {
8407
8540
  submittingAs: "{{email}} \u0637\u0648\u0631 \u062C\u0645\u0639 \u06AA\u0631\u064A \u0631\u0647\u064A\u0627 \u0622\u0647\u064A\u0648",
8408
8541
  tapToChooseFile: "\u0641\u0627\u0626\u0644 \u0686\u0648\u0646\u068A\u06BB \u0644\u0627\u0621\u0650 \u067D\u064A\u067E \u06AA\u0631\u064A\u0648",
8409
8542
  view: "\u068F\u0633\u0648",
8410
- whatDoYouNeed: "\u062A\u0648\u0647\u0627\u0646 \u06A9\u064A \u0687\u0627 \u06AF\u0647\u0631\u062C\u064A\u061F"
8543
+ whatDoYouNeed: "\u062A\u0648\u0647\u0627\u0646 \u06A9\u064A \u0687\u0627 \u06AF\u0647\u0631\u062C\u064A\u061F",
8544
+ sessionExpiredTitle: "\u062A\u0648\u0647\u0627\u0646 \u062C\u0648 \u0633\u064A\u0634\u0646 \u062E\u062A\u0645 \u067F\u064A \u0648\u064A\u0648 \u0622\u0647\u064A",
8545
+ 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.",
8546
+ chooseYourProfile: "\u067E\u0646\u0647\u0646\u062C\u0648 \u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u0686\u0648\u0646\u068A\u064A\u0648",
8547
+ 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.",
8548
+ userIdLabel: "\u064A\u0648\u0632\u0631 \u0622\u0626\u064A\u068A\u064A: {{id}}",
8549
+ signingInEllipsis: "\u0633\u0627\u0626\u0646 \u0627\u0646 \u067F\u064A \u0631\u0647\u064A\u0648 \u0622\u0647\u064A\u2026",
8550
+ switchProfile: "\u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u062A\u0628\u062F\u064A\u0644 \u06AA\u0631\u064A\u0648"
8411
8551
  };
8412
8552
 
8413
8553
  // src/RedactoPrivacyCenter/locales/ta/translation.json
@@ -8821,7 +8961,14 @@ var translation_default21 = {
8821
8961
  submittingAs: "{{email}} \u0B86\u0B95 \u0B9A\u0BAE\u0BB0\u0BCD\u0BAA\u0BCD\u0BAA\u0BBF\u0B95\u0BCD\u0B95\u0BBF\u0BB1\u0BC0\u0BB0\u0BCD\u0B95\u0BB3\u0BCD",
8822
8962
  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",
8823
8963
  view: "\u0BAA\u0BBE\u0BB0\u0BCD",
8824
- whatDoYouNeed: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA9\u0BCD\u0BA9 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD?"
8964
+ whatDoYouNeed: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA9\u0BCD\u0BA9 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD?",
8965
+ 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",
8966
+ 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.",
8967
+ 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",
8968
+ 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.",
8969
+ userIdLabel: "\u0BAA\u0BAF\u0BA9\u0BB0\u0BCD \u0B90\u0B9F\u0BBF: {{id}}",
8970
+ signingInEllipsis: "\u0B89\u0BB3\u0BCD\u0BA8\u0BC1\u0BB4\u0BC8\u0B95\u0BBF\u0BB1\u0BA4\u0BC1\u2026",
8971
+ switchProfile: "\u0B9A\u0BC1\u0BAF\u0BB5\u0BBF\u0BB5\u0BB0\u0BA4\u0BCD\u0BA4\u0BC8 \u0BAE\u0BBE\u0BB1\u0BCD\u0BB1\u0BC1"
8825
8972
  };
8826
8973
 
8827
8974
  // src/RedactoPrivacyCenter/locales/te/translation.json
@@ -9235,7 +9382,14 @@ var translation_default22 = {
9235
9382
  submittingAs: "{{email}} \u0C17\u0C3E \u0C38\u0C2E\u0C30\u0C4D\u0C2A\u0C3F\u0C38\u0C4D\u0C24\u0C41\u0C28\u0C4D\u0C28\u0C3E\u0C30\u0C41",
9236
9383
  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",
9237
9384
  view: "\u0C35\u0C40\u0C15\u0C4D\u0C37\u0C3F\u0C02\u0C1A\u0C02\u0C21\u0C3F",
9238
- whatDoYouNeed: "\u0C2E\u0C40\u0C15\u0C41 \u0C0F\u0C2E\u0C3F \u0C15\u0C3E\u0C35\u0C3E\u0C32\u0C3F?"
9385
+ whatDoYouNeed: "\u0C2E\u0C40\u0C15\u0C41 \u0C0F\u0C2E\u0C3F \u0C15\u0C3E\u0C35\u0C3E\u0C32\u0C3F?",
9386
+ sessionExpiredTitle: "\u0C2E\u0C40 \u0C38\u0C46\u0C37\u0C28\u0C4D \u0C17\u0C21\u0C41\u0C35\u0C41 \u0C2E\u0C41\u0C17\u0C3F\u0C38\u0C3F\u0C02\u0C26\u0C3F",
9387
+ 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.",
9388
+ chooseYourProfile: "\u0C2E\u0C40 \u0C2A\u0C4D\u0C30\u0C4A\u0C2B\u0C48\u0C32\u0C4D\u200C\u0C28\u0C41 \u0C0E\u0C02\u0C1A\u0C41\u0C15\u0C4B\u0C02\u0C21\u0C3F",
9389
+ 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.",
9390
+ userIdLabel: "\u0C35\u0C3F\u0C28\u0C3F\u0C2F\u0C4B\u0C17\u0C26\u0C3E\u0C30\u0C41 \u0C10\u0C21\u0C3F: {{id}}",
9391
+ signingInEllipsis: "\u0C38\u0C48\u0C28\u0C4D \u0C07\u0C28\u0C4D \u0C05\u0C35\u0C41\u0C24\u0C4B\u0C02\u0C26\u0C3F\u2026",
9392
+ switchProfile: "\u0C2A\u0C4D\u0C30\u0C4A\u0C2B\u0C48\u0C32\u0C4D\u200C\u0C28\u0C41 \u0C2E\u0C3E\u0C30\u0C4D\u0C1A\u0C02\u0C21\u0C3F"
9239
9393
  };
9240
9394
 
9241
9395
  // src/RedactoPrivacyCenter/locales/ur/translation.json
@@ -9649,7 +9803,14 @@ var translation_default23 = {
9649
9803
  submittingAs: "{{email}} \u06A9\u06D2 \u0637\u0648\u0631 \u067E\u0631 \u062C\u0645\u0639 \u06A9\u0631 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA",
9650
9804
  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",
9651
9805
  view: "\u062F\u06CC\u06A9\u06BE\u06CC\u06BA",
9652
- whatDoYouNeed: "\u0622\u067E \u06A9\u0648 \u06A9\u06CC\u0627 \u0686\u0627\u06C1\u06CC\u06D2\u061F"
9806
+ whatDoYouNeed: "\u0622\u067E \u06A9\u0648 \u06A9\u06CC\u0627 \u0686\u0627\u06C1\u06CC\u06D2\u061F",
9807
+ sessionExpiredTitle: "\u0622\u067E \u06A9\u0627 \u0633\u06CC\u0634\u0646 \u062E\u062A\u0645 \u06C1\u0648 \u06AF\u06CC\u0627 \u06C1\u06D2",
9808
+ 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",
9809
+ chooseYourProfile: "\u0627\u067E\u0646\u06CC \u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u0645\u0646\u062A\u062E\u0628 \u06A9\u0631\u06CC\u06BA",
9810
+ 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",
9811
+ userIdLabel: "\u0635\u0627\u0631\u0641 \u0622\u0626\u06CC \u0688\u06CC: {{id}}",
9812
+ signingInEllipsis: "\u0633\u0627\u0626\u0646 \u0627\u0646 \u06C1\u0648 \u0631\u06C1\u0627 \u06C1\u06D2\u2026",
9813
+ switchProfile: "\u067E\u0631\u0648\u0641\u0627\u0626\u0644 \u062A\u0628\u062F\u06CC\u0644 \u06A9\u0631\u06CC\u06BA"
9653
9814
  };
9654
9815
 
9655
9816
  // src/RedactoPrivacyCenter/lib/locales.ts
@@ -9863,7 +10024,57 @@ function useSafeInsets() {
9863
10024
  // src/RedactoPrivacyCenter/context/BaseUrlContext.tsx
9864
10025
  var import_react2 = require("react");
9865
10026
 
10027
+ // src/shared/sandbox.ts
10028
+ var SANDBOX_TOKEN_HEADER = "X-Consent-Token";
10029
+
10030
+ // src/RedactoPrivacyCenter/lib/sandbox.ts
10031
+ var sandboxConfig = null;
10032
+ var setSandboxConfig = (config) => {
10033
+ sandboxConfig = config;
10034
+ };
10035
+ var getSandboxConfig = () => sandboxConfig;
10036
+ var isSandboxMode = () => sandboxConfig !== null;
10037
+ var sandboxAuthHeaders = () => {
10038
+ if (!sandboxConfig) {
10039
+ return null;
10040
+ }
10041
+ return {
10042
+ [SANDBOX_TOKEN_HEADER]: sandboxConfig.token
10043
+ };
10044
+ };
10045
+ var sandboxBodyIdentity = () => {
10046
+ if (!sandboxConfig) {
10047
+ return null;
10048
+ }
10049
+ if (sandboxConfig.ucic) {
10050
+ return { org_user_id: sandboxConfig.ucic };
10051
+ }
10052
+ return sandboxConfig.subject.includes("@") ? { primary_email: sandboxConfig.subject } : { primary_mobile: sandboxConfig.subject };
10053
+ };
10054
+ var sandboxQueryIdentity = () => sandboxBodyIdentity();
10055
+ var sandboxContact = () => sandboxConfig ? sandboxConfig.ucic || sandboxConfig.subject : null;
10056
+
9866
10057
  // src/RedactoPrivacyCenter/api/fetcher.ts
10058
+ var ApiError = class _ApiError extends Error {
10059
+ constructor(message, options = {}) {
10060
+ super(message);
10061
+ this.name = "ApiError";
10062
+ this.status = options.status;
10063
+ this.detail = options.detail;
10064
+ Object.setPrototypeOf(this, _ApiError.prototype);
10065
+ }
10066
+ };
10067
+ var TERMINAL_REFRESH_STATUSES = /* @__PURE__ */ new Set([400, 401, 403, 422]);
10068
+ function isTerminalRefreshError(error) {
10069
+ const e = error;
10070
+ if (!e) return false;
10071
+ if (typeof e.status === "number") {
10072
+ return TERMINAL_REFRESH_STATUSES.has(e.status);
10073
+ }
10074
+ const message = (typeof e.message === "string" ? e.message : "").toLowerCase();
10075
+ if (!message) return false;
10076
+ 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]");
10077
+ }
9867
10078
  async function apiFetch(url, options = {}) {
9868
10079
  const { getAuthToken, headers = {}, ...fetchOptions } = options;
9869
10080
  const requestHeaders = new Headers();
@@ -9888,11 +10099,18 @@ async function apiFetch(url, options = {}) {
9888
10099
  }
9889
10100
  }
9890
10101
  if (getAuthToken) {
9891
- const token = await getAuthToken();
9892
- if (token) {
9893
- const trimmedToken = token.trim();
9894
- requestHeaders.set("X-Auth-Token", trimmedToken);
9895
- requestHeaders.set("x-auth-token", trimmedToken);
10102
+ const sandboxHeaders = sandboxAuthHeaders();
10103
+ if (sandboxHeaders) {
10104
+ Object.entries(sandboxHeaders).forEach(([key, value]) => {
10105
+ requestHeaders.set(key, value);
10106
+ });
10107
+ } else {
10108
+ const token = await getAuthToken();
10109
+ if (token) {
10110
+ const trimmedToken = token.trim();
10111
+ requestHeaders.set("X-Auth-Token", trimmedToken);
10112
+ requestHeaders.set("x-auth-token", trimmedToken);
10113
+ }
9896
10114
  }
9897
10115
  }
9898
10116
  const fetchOptionsFinal = {
@@ -9921,7 +10139,7 @@ async function apiFetch(url, options = {}) {
9921
10139
  } catch {
9922
10140
  }
9923
10141
  }
9924
- throw new Error(errorMessage);
10142
+ throw new ApiError(errorMessage, { status: response.status });
9925
10143
  }
9926
10144
  const contentLength = response.headers.get("Content-Length");
9927
10145
  const contentType = response.headers.get("Content-Type") || "";
@@ -9983,14 +10201,29 @@ function arrayBufferToBase64(buffer) {
9983
10201
  return result;
9984
10202
  }
9985
10203
  function createConsentClient(baseUrl, ledgerBaseUrl) {
9986
- const useLedger = Boolean(ledgerBaseUrl);
10204
+ const ledgerConfigured = Boolean(ledgerBaseUrl);
10205
+ const useLedger = () => ledgerConfigured && !isSandboxMode();
9987
10206
  const ledgerBase = (ledgerBaseUrl != null ? ledgerBaseUrl : "").replace(/\/$/, "");
9988
10207
  function ledgerUrl(baseRequest, path) {
9989
- if (!useLedger) {
10208
+ if (!useLedger()) {
9990
10209
  throw new Error("ledgerUrl called without a configured ledgerBaseUrl");
9991
10210
  }
9992
10211
  return `${ledgerBase}/public/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}${path}`;
9993
10212
  }
10213
+ function appendSandboxIdentity(queryParams) {
10214
+ const identity = sandboxQueryIdentity();
10215
+ if (identity) {
10216
+ Object.entries(identity).forEach(([key, value]) => {
10217
+ queryParams.append(key, value);
10218
+ });
10219
+ }
10220
+ }
10221
+ function sandboxIdentitySuffix() {
10222
+ const queryParams = new URLSearchParams();
10223
+ appendSandboxIdentity(queryParams);
10224
+ const queryString = queryParams.toString();
10225
+ return queryString ? `?${queryString}` : "";
10226
+ }
9994
10227
  async function privacyCenterApiFetch(url, options) {
9995
10228
  const { authToken, getAuthToken, headers = {}, ...fetchOptions } = options;
9996
10229
  const requestHeaders = new Headers();
@@ -10014,11 +10247,18 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10014
10247
  );
10015
10248
  }
10016
10249
  }
10017
- const token = authToken || (getAuthToken ? await getAuthToken() : null);
10018
- if (token) {
10019
- const trimmedToken = token.trim();
10020
- const bearerToken = trimmedToken.startsWith("Bearer ") ? trimmedToken : `Bearer ${trimmedToken}`;
10021
- requestHeaders.set("Authorization", bearerToken);
10250
+ const sandboxHeaders = sandboxAuthHeaders();
10251
+ if (sandboxHeaders) {
10252
+ Object.entries(sandboxHeaders).forEach(([key, value]) => {
10253
+ requestHeaders.set(key, value);
10254
+ });
10255
+ } else {
10256
+ const token = authToken || (getAuthToken ? await getAuthToken() : null);
10257
+ if (token) {
10258
+ const trimmedToken = token.trim();
10259
+ const bearerToken = trimmedToken.startsWith("Bearer ") ? trimmedToken : `Bearer ${trimmedToken}`;
10260
+ requestHeaders.set("Authorization", bearerToken);
10261
+ }
10022
10262
  }
10023
10263
  const fetchOptionsFinal = {
10024
10264
  ...fetchOptions,
@@ -10099,18 +10339,20 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10099
10339
  async createCaseRequest(baseRequest, payload, authToken, options) {
10100
10340
  const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/case`;
10101
10341
  const { useSessionAuth = false, getAuthToken, ...fetchOptions } = options || {};
10342
+ const contact = sandboxContact();
10343
+ const requestPayload = contact && payload && typeof payload === "object" ? { ...payload, contact } : payload;
10102
10344
  if (useSessionAuth) {
10103
10345
  return apiFetch(url, {
10104
10346
  ...fetchOptions,
10105
10347
  method: "POST",
10106
- body: JSON.stringify(payload),
10348
+ body: JSON.stringify(requestPayload),
10107
10349
  getAuthToken
10108
10350
  });
10109
10351
  }
10110
10352
  return privacyCenterApiFetch(url, {
10111
10353
  ...fetchOptions,
10112
10354
  method: "POST",
10113
- body: JSON.stringify(payload),
10355
+ body: JSON.stringify(requestPayload),
10114
10356
  authToken: authToken || baseRequest.authToken
10115
10357
  });
10116
10358
  },
@@ -10191,9 +10433,10 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10191
10433
  if (params.status) queryParams.append("status", params.status);
10192
10434
  if (params.product_uuid) queryParams.append("product_uuid", params.product_uuid);
10193
10435
  if (params.language) queryParams.append("language", params.language);
10436
+ appendSandboxIdentity(queryParams);
10194
10437
  const queryString = queryParams.toString();
10195
10438
  const consentsSuffix = `/user-consents${queryString ? `?${queryString}` : ""}`;
10196
- const url = useLedger ? ledgerUrl(baseRequest, consentsSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${consentsSuffix}`;
10439
+ const url = useLedger() ? ledgerUrl(baseRequest, consentsSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${consentsSuffix}`;
10197
10440
  return privacyCenterApiFetch(url, {
10198
10441
  ...options,
10199
10442
  method: "GET",
@@ -10212,9 +10455,10 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10212
10455
  if (params.search) queryParams.append("search", params.search);
10213
10456
  if (params.language) queryParams.append("language", params.language);
10214
10457
  if (params.nominator_uuid) queryParams.append("nominator_uuid", params.nominator_uuid);
10458
+ appendSandboxIdentity(queryParams);
10215
10459
  const queryString = queryParams.toString();
10216
10460
  const purposesSuffix = `/user-consents/${productUuid}/purposes${queryString ? `?${queryString}` : ""}`;
10217
- const url = useLedger ? ledgerUrl(baseRequest, purposesSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${purposesSuffix}`;
10461
+ const url = useLedger() ? ledgerUrl(baseRequest, purposesSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${purposesSuffix}`;
10218
10462
  return privacyCenterApiFetch(url, {
10219
10463
  ...options,
10220
10464
  method: "GET",
@@ -10235,16 +10479,23 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10235
10479
  * Without a ledger, the legacy Python `/manage-consent?status=` endpoint is
10236
10480
  * used with its `{ purpose_uuid, contact, ... }` payload.
10237
10481
  */
10238
- async manageConsent(baseRequest, purposeId, contact, status, authToken, options, nominatorContact, dataElementUuids, noticeUuid, dataElements) {
10239
- if (!useLedger) {
10482
+ async manageConsent(baseRequest, purposeId, contact, status, authToken, options, nominatorContact, dataElementUuids, noticeUuid, dataElements, language) {
10483
+ if (!useLedger()) {
10240
10484
  const url2 = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/manage-consent?status=${status}`;
10241
- const body2 = { purpose_uuid: purposeId, contact };
10485
+ const sandboxSingleContact = sandboxContact();
10486
+ const body2 = {
10487
+ purpose_uuid: purposeId,
10488
+ contact: sandboxSingleContact != null ? sandboxSingleContact : contact
10489
+ };
10242
10490
  if (nominatorContact) {
10243
10491
  body2.nominator_contact = nominatorContact;
10244
10492
  }
10245
10493
  if (Array.isArray(dataElementUuids) && dataElementUuids.length > 0) {
10246
10494
  body2.data_element_uuids = dataElementUuids;
10247
10495
  }
10496
+ if (language) {
10497
+ body2.language = language;
10498
+ }
10248
10499
  return privacyCenterApiFetch(url2, {
10249
10500
  ...options,
10250
10501
  method: "POST",
@@ -10279,7 +10530,8 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10279
10530
  selected: purposeSelected,
10280
10531
  data_elements: elements
10281
10532
  }
10282
- ]
10533
+ ],
10534
+ ...language ? { language } : {}
10283
10535
  };
10284
10536
  const url = ledgerUrl(baseRequest, "/submit-consent");
10285
10537
  return privacyCenterApiFetch(url, {
@@ -10297,6 +10549,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10297
10549
  if (offset !== void 0) queryParams.append("offset", offset.toString());
10298
10550
  if (limit !== void 0) queryParams.append("limit", limit.toString());
10299
10551
  if (language) queryParams.append("language", language);
10552
+ appendSandboxIdentity(queryParams);
10300
10553
  const queryString = queryParams.toString();
10301
10554
  const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/activities${queryString ? `?${queryString}` : ""}`;
10302
10555
  return privacyCenterApiFetch(url, {
@@ -10304,6 +10557,32 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10304
10557
  authToken: authToken || baseRequest.authToken
10305
10558
  });
10306
10559
  },
10560
+ /**
10561
+ * List all data principals that share this session's contact
10562
+ * (shared-contact profile picker). Identity is derived server-side from the
10563
+ * JWT — the caller sends nothing but its bearer token.
10564
+ */
10565
+ async listIdentities(baseRequest, authToken, options) {
10566
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/identities`;
10567
+ return privacyCenterApiFetch(url, {
10568
+ ...options,
10569
+ authToken: authToken || baseRequest.authToken
10570
+ });
10571
+ },
10572
+ /**
10573
+ * Re-scope the session to a chosen principal uuid (must be one of the
10574
+ * principals sharing this session's contact). Returns fresh access/refresh
10575
+ * tokens scoped to that principal.
10576
+ */
10577
+ async selectPrincipal(baseRequest, principalUuid, authToken, options) {
10578
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/identities/select`;
10579
+ return privacyCenterApiFetch(url, {
10580
+ ...options,
10581
+ method: "POST",
10582
+ body: JSON.stringify({ uuid: principalUuid }),
10583
+ authToken: authToken || baseRequest.authToken
10584
+ });
10585
+ },
10307
10586
  /**
10308
10587
  * Get receipts (privacy center)
10309
10588
  */
@@ -10317,9 +10596,10 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10317
10596
  if (params.created_before) queryParams.append("created_before", params.created_before);
10318
10597
  if (params.notice_uuid) queryParams.append("notice_uuid", params.notice_uuid);
10319
10598
  if (params.language) queryParams.append("language", params.language);
10599
+ appendSandboxIdentity(queryParams);
10320
10600
  const queryString = queryParams.toString();
10321
10601
  const receiptsSuffix = `/receipts${queryString ? `?${queryString}` : ""}`;
10322
- const url = useLedger ? ledgerUrl(baseRequest, receiptsSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${receiptsSuffix}`;
10602
+ const url = useLedger() ? ledgerUrl(baseRequest, receiptsSuffix) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${receiptsSuffix}`;
10323
10603
  return privacyCenterApiFetch(url, {
10324
10604
  ...options,
10325
10605
  method: "GET",
@@ -10333,11 +10613,16 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10333
10613
  * the RN UI writes to a temp file to open/share. 404 => not found.
10334
10614
  */
10335
10615
  async getReceiptPdf(baseRequest, receiptUuid, authToken) {
10336
- const url = useLedger ? ledgerUrl(baseRequest, `/receipts/${receiptUuid}/download`) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/receipts/${receiptUuid}/pdf`;
10616
+ const url = useLedger() ? ledgerUrl(baseRequest, `/receipts/${receiptUuid}/download`) : `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/receipts/${receiptUuid}/pdf`;
10337
10617
  const token = authToken || baseRequest.authToken;
10338
10618
  const requestHeaders = new Headers();
10339
10619
  requestHeaders.set("Accept", "application/pdf");
10340
- if (token) {
10620
+ const sandboxHeaders = sandboxAuthHeaders();
10621
+ if (sandboxHeaders) {
10622
+ Object.entries(sandboxHeaders).forEach(([key, value]) => {
10623
+ requestHeaders.set(key, value);
10624
+ });
10625
+ } else if (token) {
10341
10626
  const trimmedToken = token.trim();
10342
10627
  const bearerToken = trimmedToken.startsWith("Bearer ") ? trimmedToken : `Bearer ${trimmedToken}`;
10343
10628
  requestHeaders.set("Authorization", bearerToken);
@@ -10363,6 +10648,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10363
10648
  if (offset !== void 0) queryParams.append("offset", offset.toString());
10364
10649
  if (limit !== void 0) queryParams.append("limit", limit.toString());
10365
10650
  if (language) queryParams.append("language", language);
10651
+ appendSandboxIdentity(queryParams);
10366
10652
  const queryString = queryParams.toString();
10367
10653
  const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases?${queryString}`;
10368
10654
  return privacyCenterApiFetch(url, {
@@ -10374,7 +10660,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10374
10660
  * Get case messages (privacy center)
10375
10661
  */
10376
10662
  async getCaseMessages(baseRequest, caseUuid, authToken, options) {
10377
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/messages`;
10663
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/messages${sandboxIdentitySuffix()}`;
10378
10664
  return privacyCenterApiFetch(url, {
10379
10665
  ...options,
10380
10666
  authToken: authToken || baseRequest.authToken
@@ -10384,7 +10670,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10384
10670
  * Send a message in a case (privacy center)
10385
10671
  */
10386
10672
  async sendCaseMessage(baseRequest, caseUuid, body, documentUuids, authToken, options) {
10387
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/messages`;
10673
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/messages${sandboxIdentitySuffix()}`;
10388
10674
  return privacyCenterApiFetch(url, {
10389
10675
  ...options,
10390
10676
  method: "POST",
@@ -10396,7 +10682,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10396
10682
  * Upload a document for a case (privacy center)
10397
10683
  */
10398
10684
  async uploadCaseDocument(baseRequest, caseUuid, formData, authToken, options) {
10399
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/upload-document`;
10685
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/cases/${caseUuid}/upload-document${sandboxIdentitySuffix()}`;
10400
10686
  return privacyCenterApiFetch(url, {
10401
10687
  ...options,
10402
10688
  method: "POST",
@@ -10429,6 +10715,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10429
10715
  if ((params == null ? void 0 : params.limit) !== void 0) queryParams.append("limit", params.limit.toString());
10430
10716
  if (params == null ? void 0 : params.include_summary) queryParams.append("include_summary", "true");
10431
10717
  if (params == null ? void 0 : params.language) queryParams.append("language", params.language);
10718
+ appendSandboxIdentity(queryParams);
10432
10719
  const queryString = queryParams.toString();
10433
10720
  const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${queryString ? `?${queryString}` : ""}`;
10434
10721
  return privacyCenterApiFetch(url, {
@@ -10440,7 +10727,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10440
10727
  * Get notification summary (aggregated counts only)
10441
10728
  */
10442
10729
  async getNotificationSummary(baseRequest, authToken) {
10443
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/summary`;
10730
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/summary${sandboxIdentitySuffix()}`;
10444
10731
  return privacyCenterApiFetch(url, {
10445
10732
  method: "GET",
10446
10733
  authToken: authToken || baseRequest.authToken
@@ -10450,7 +10737,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10450
10737
  * Get unread notification count (lightweight, for the header badge)
10451
10738
  */
10452
10739
  async getUnreadCount(baseRequest, authToken) {
10453
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/unread-count`;
10740
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/unread-count${sandboxIdentitySuffix()}`;
10454
10741
  return privacyCenterApiFetch(url, {
10455
10742
  method: "GET",
10456
10743
  authToken: authToken || baseRequest.authToken
@@ -10460,7 +10747,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10460
10747
  * Mark a single notification as read
10461
10748
  */
10462
10749
  async markNotificationRead(baseRequest, notificationUuid, authToken) {
10463
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${notificationUuid}/read`;
10750
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${notificationUuid}/read${sandboxIdentitySuffix()}`;
10464
10751
  return privacyCenterApiFetch(url, {
10465
10752
  method: "PATCH",
10466
10753
  authToken: authToken || baseRequest.authToken
@@ -10470,7 +10757,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10470
10757
  * Mark all notifications as read
10471
10758
  */
10472
10759
  async markAllNotificationsRead(baseRequest, authToken) {
10473
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/mark-all-read`;
10760
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/mark-all-read${sandboxIdentitySuffix()}`;
10474
10761
  return privacyCenterApiFetch(url, {
10475
10762
  method: "POST",
10476
10763
  authToken: authToken || baseRequest.authToken
@@ -10480,7 +10767,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
10480
10767
  * Acknowledge a notification (sets is_read and is_acknowledged to true)
10481
10768
  */
10482
10769
  async acknowledgeNotification(baseRequest, notificationUuid, authToken) {
10483
- const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${notificationUuid}/acknowledge`;
10770
+ const url = `${baseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center/notifications/${notificationUuid}/acknowledge${sandboxIdentitySuffix()}`;
10484
10771
  return privacyCenterApiFetch(url, {
10485
10772
  method: "POST",
10486
10773
  authToken: authToken || baseRequest.authToken
@@ -10719,7 +11006,8 @@ async function manageConsentServer(params) {
10719
11006
  params.nominatorContact,
10720
11007
  params.dataElementUuids,
10721
11008
  params.noticeUuid,
10722
- params.dataElements
11009
+ params.dataElements,
11010
+ params.language
10723
11011
  );
10724
11012
  if (result && typeof result === "object" && "success" in result) {
10725
11013
  return Boolean(result.success);
@@ -11210,7 +11498,8 @@ var manageConsent = async ({
11210
11498
  nominatorContact,
11211
11499
  dataElementUuids,
11212
11500
  noticeUuid,
11213
- dataElements
11501
+ dataElements,
11502
+ language
11214
11503
  }) => {
11215
11504
  try {
11216
11505
  const accessToken = await ensureValidToken(organizationId, workspaceId, void 0, authContext, consentClient);
@@ -11228,7 +11517,8 @@ var manageConsent = async ({
11228
11517
  nominatorContact,
11229
11518
  dataElementUuids,
11230
11519
  noticeUuid,
11231
- dataElements
11520
+ dataElements,
11521
+ language
11232
11522
  });
11233
11523
  return result;
11234
11524
  } catch (error) {
@@ -11249,7 +11539,8 @@ var manageConsent = async ({
11249
11539
  nominatorContact,
11250
11540
  dataElementUuids,
11251
11541
  noticeUuid,
11252
- dataElements
11542
+ dataElements,
11543
+ language
11253
11544
  });
11254
11545
  }
11255
11546
  console.error(`Error ${action} consent:`, error);
@@ -11588,6 +11879,40 @@ var acknowledgeNotification = async (organizationId, workspaceId, notificationUu
11588
11879
  var isRefreshing = false;
11589
11880
  var refreshPromise = null;
11590
11881
  var TOKEN_EXPIRY_BUFFER_SECONDS = 30;
11882
+ var deadRefreshToken = null;
11883
+ var transientRefreshFailureUntil = 0;
11884
+ var transientRefreshBackoffMs = 0;
11885
+ var MIN_REFRESH_BACKOFF_MS = 3e4;
11886
+ var MAX_REFRESH_BACKOFF_MS = 3e5;
11887
+ var sessionExpiredListener = null;
11888
+ var setSessionExpiredListener = (fn) => {
11889
+ sessionExpiredListener = fn;
11890
+ };
11891
+ var notifySessionExpired = () => {
11892
+ sessionExpiredListener == null ? void 0 : sessionExpiredListener();
11893
+ };
11894
+ var activeRefreshToken = (authContext) => (authContext == null ? void 0 : authContext.refreshToken) || getStoredValue("refresh_token") || null;
11895
+ var isRefreshBlocked = (authContext) => {
11896
+ const active = activeRefreshToken(authContext);
11897
+ if (active !== null && active === deadRefreshToken) return true;
11898
+ return Date.now() < transientRefreshFailureUntil;
11899
+ };
11900
+ var noteTransientRefreshFailure = () => {
11901
+ transientRefreshBackoffMs = Math.min(
11902
+ Math.max(transientRefreshBackoffMs * 2, MIN_REFRESH_BACKOFF_MS),
11903
+ MAX_REFRESH_BACKOFF_MS
11904
+ );
11905
+ transientRefreshFailureUntil = Date.now() + transientRefreshBackoffMs;
11906
+ };
11907
+ var markRefreshTokenDead = (token) => {
11908
+ if (token) deadRefreshToken = token;
11909
+ notifySessionExpired();
11910
+ };
11911
+ var resetRefreshCircuit = () => {
11912
+ deadRefreshToken = null;
11913
+ transientRefreshFailureUntil = 0;
11914
+ transientRefreshBackoffMs = 0;
11915
+ };
11591
11916
  var tokenStore = {};
11592
11917
  var getStoredValue = (key) => {
11593
11918
  var _a3;
@@ -11643,6 +11968,18 @@ var decodeJwtToken = (token) => {
11643
11968
  return null;
11644
11969
  }
11645
11970
  };
11971
+ var resolveContactFromJwt = (decoded) => {
11972
+ if (!decoded) {
11973
+ return null;
11974
+ }
11975
+ const userData = decoded.user_data || {};
11976
+ const candidate = decoded.contact || decoded.primary_email || userData.primary_email || userData.primary_mobile || userData.org_user_id;
11977
+ if (typeof candidate !== "string") {
11978
+ return null;
11979
+ }
11980
+ const contact = candidate.trim();
11981
+ return contact === "" ? null : contact;
11982
+ };
11646
11983
  var isJwtExpired = (token, bufferSeconds = 30) => {
11647
11984
  if (!token || typeof token !== "string") return true;
11648
11985
  try {
@@ -11669,11 +12006,16 @@ var compareEmails = (email1, email2) => {
11669
12006
  return decodeURIComponent(email1.trim()).toLowerCase() === email2.trim().toLowerCase();
11670
12007
  };
11671
12008
  var ensureValidToken = async (organizationId, workspaceId, _slug, authContext, consentClient) => {
12009
+ const sandbox = getSandboxConfig();
12010
+ if (sandbox) {
12011
+ return sandbox.token;
12012
+ }
11672
12013
  const accessToken = (authContext == null ? void 0 : authContext.accessToken) || getStoredValue("access_token");
11673
12014
  if (accessToken && typeof accessToken === "string" && accessToken.trim() !== "" && !isJwtExpired(accessToken, TOKEN_EXPIRY_BUFFER_SECONDS)) {
11674
12015
  return accessToken;
11675
12016
  }
11676
12017
  if (isRefreshing && refreshPromise) return refreshPromise;
12018
+ if (isRefreshBlocked(authContext)) return null;
11677
12019
  isRefreshing = true;
11678
12020
  refreshPromise = performTokenRefresh(
11679
12021
  organizationId,
@@ -11701,6 +12043,7 @@ var performTokenRefresh = async (organizationId, workspaceId, authContext, conse
11701
12043
  if (!refreshToken || typeof refreshToken !== "string" || refreshToken.trim() === "") {
11702
12044
  if (authContext == null ? void 0 : authContext.onError)
11703
12045
  authContext.onError(new Error("No refresh token available"));
12046
+ notifySessionExpired();
11704
12047
  signOutPrivacyCenter();
11705
12048
  return null;
11706
12049
  }
@@ -11730,11 +12073,13 @@ var performTokenRefresh = async (organizationId, workspaceId, authContext, conse
11730
12073
  if (newRefreshToken)
11731
12074
  setStoredValue("refresh_token", newRefreshToken);
11732
12075
  }
12076
+ resetRefreshCircuit();
11733
12077
  return newAccessToken;
11734
12078
  }
11735
12079
  }
11736
12080
  if (authContext == null ? void 0 : authContext.onError)
11737
12081
  authContext.onError(new Error("Refresh token expired or revoked"));
12082
+ markRefreshTokenDead(refreshToken);
11738
12083
  signOutPrivacyCenter();
11739
12084
  return null;
11740
12085
  } catch (error) {
@@ -11742,7 +12087,12 @@ var performTokenRefresh = async (organizationId, workspaceId, authContext, conse
11742
12087
  authContext.onError(
11743
12088
  error instanceof Error ? error : new Error(String(error))
11744
12089
  );
11745
- signOutPrivacyCenter();
12090
+ if (isTerminalRefreshError(error)) {
12091
+ markRefreshTokenDead(refreshToken);
12092
+ signOutPrivacyCenter();
12093
+ } else {
12094
+ noteTransientRefreshFailure();
12095
+ }
11746
12096
  return null;
11747
12097
  }
11748
12098
  };
@@ -11770,6 +12120,23 @@ var formatDateTime = (timestamp) => {
11770
12120
  hours = hours % 12 || 12;
11771
12121
  return `${month} ${day}, ${year} at ${hours}:${minutes} ${ampm}`;
11772
12122
  };
12123
+ var extractCaseRef = (response) => {
12124
+ if (!response || typeof response !== "object") {
12125
+ return null;
12126
+ }
12127
+ const wrapper = response;
12128
+ const candidates = [wrapper.detail, response];
12129
+ for (const candidate of candidates) {
12130
+ if (!candidate || typeof candidate !== "object") {
12131
+ continue;
12132
+ }
12133
+ const { case_id: caseId, uuid } = candidate;
12134
+ if (caseId || uuid) {
12135
+ return { case_id: caseId != null ? caseId : "", uuid: uuid != null ? uuid : "" };
12136
+ }
12137
+ }
12138
+ return null;
12139
+ };
11773
12140
  var generateUuid = () => {
11774
12141
  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
11775
12142
  const r = Math.random() * 16 | 0;
@@ -11789,10 +12156,10 @@ function extractJwtAuthData(token) {
11789
12156
  if (!decoded) {
11790
12157
  return { email: null, organizationId: null, workspaceId: null, organizationName: null };
11791
12158
  }
11792
- const userData = decoded.user_data;
11793
- 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;
12159
+ const contact = resolveContactFromJwt(decoded);
11794
12160
  return {
11795
- email: typeof userEmail === "string" ? userEmail : null,
12161
+ // `resolveContactFromJwt` already returns a trimmed, non-empty string or null.
12162
+ email: contact,
11796
12163
  organizationId: decoded.organisation_uuid || null,
11797
12164
  workspaceId: decoded.workspace_uuid || null,
11798
12165
  organizationName: decoded.organisation_name || null
@@ -11801,20 +12168,82 @@ function extractJwtAuthData(token) {
11801
12168
  function syncJwtDataToStore(token) {
11802
12169
  const authData = extractJwtAuthData(token);
11803
12170
  setStoredValue("access_token", token);
11804
- if (authData.email) setStoredValue("email", authData.email);
12171
+ if (authData.email) {
12172
+ setStoredValue("email", authData.email);
12173
+ } else {
12174
+ removeStoredValue("email");
12175
+ }
11805
12176
  if (authData.organizationId) setStoredValue("pc_org_id", authData.organizationId);
11806
12177
  if (authData.workspaceId) setStoredValue("pc_workspace_id", authData.workspaceId);
11807
12178
  return authData;
11808
12179
  }
11809
- function AuthProvider({ children, accessToken: initialAccessToken, refreshToken: initialRefreshToken, onError }) {
11810
- const initialAuth = extractJwtAuthData(initialAccessToken);
12180
+ function configureSandbox(props) {
12181
+ var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
12182
+ const token = (_a3 = props.token) == null ? void 0 : _a3.trim();
12183
+ if (!token) {
12184
+ setSandboxConfig(null);
12185
+ return null;
12186
+ }
12187
+ const organisationUuid = (_c = (_b = props.organisationUuid) == null ? void 0 : _b.trim()) != null ? _c : "";
12188
+ const workspaceUuid = (_e = (_d = props.workspaceUuid) == null ? void 0 : _d.trim()) != null ? _e : "";
12189
+ const ucic = (_g = (_f = props.sandboxUcic) == null ? void 0 : _f.trim()) != null ? _g : "";
12190
+ const subject = (_i = (_h = props.sandboxSubject) == null ? void 0 : _h.trim()) != null ? _i : "";
12191
+ const slug = (_k = (_j = props.slug) == null ? void 0 : _j.trim()) != null ? _k : "";
12192
+ if (!organisationUuid || !workspaceUuid) {
12193
+ throw new Error("Sandbox mode requires organisationUuid and workspaceUuid props");
12194
+ }
12195
+ if (!ucic && !subject) {
12196
+ throw new Error("Sandbox mode requires a UCIC, email, or mobile");
12197
+ }
12198
+ setSandboxConfig({
12199
+ token,
12200
+ ucic: ucic || void 0,
12201
+ subject,
12202
+ organisationUuid,
12203
+ workspaceUuid,
12204
+ slug
12205
+ });
12206
+ const contact = ucic || subject;
12207
+ setStoredValue("access_token", token);
12208
+ if (organisationUuid) setStoredValue("pc_org_id", organisationUuid);
12209
+ if (workspaceUuid) setStoredValue("pc_workspace_id", workspaceUuid);
12210
+ if (contact) setStoredValue("email", contact);
12211
+ return {
12212
+ email: contact || null,
12213
+ organizationId: organisationUuid || null,
12214
+ workspaceId: workspaceUuid || null,
12215
+ organizationName: null
12216
+ };
12217
+ }
12218
+ function AuthProvider(props) {
12219
+ const {
12220
+ children,
12221
+ accessToken: initialAccessToken,
12222
+ refreshToken: initialRefreshToken,
12223
+ token: sandboxToken,
12224
+ sandboxUcic,
12225
+ sandboxSubject,
12226
+ organisationUuid,
12227
+ workspaceUuid,
12228
+ slug,
12229
+ onError
12230
+ } = props;
12231
+ const [sandboxAuth] = (0, import_react3.useState)(() => configureSandbox(props));
12232
+ const sandboxActive = sandboxAuth !== null;
12233
+ const initialAuth = sandboxAuth != null ? sandboxAuth : extractJwtAuthData(initialAccessToken);
11811
12234
  const [accessToken, setAccessToken] = (0, import_react3.useState)(() => {
12235
+ if (sandboxActive) {
12236
+ return sandboxToken != null ? sandboxToken : "";
12237
+ }
11812
12238
  if (initialAccessToken && initialAccessToken.trim() !== "") {
11813
12239
  syncJwtDataToStore(initialAccessToken);
11814
12240
  }
11815
12241
  return initialAccessToken;
11816
12242
  });
11817
12243
  const [refreshToken, setRefreshToken] = (0, import_react3.useState)(() => {
12244
+ if (sandboxActive) {
12245
+ return "";
12246
+ }
11818
12247
  if (initialRefreshToken && initialRefreshToken.trim() !== "") {
11819
12248
  setStoredValue("refresh_token", initialRefreshToken);
11820
12249
  }
@@ -11825,6 +12254,20 @@ function AuthProvider({ children, accessToken: initialAccessToken, refreshToken:
11825
12254
  const [workspaceId, setWorkspaceId] = (0, import_react3.useState)(initialAuth.workspaceId);
11826
12255
  const [organizationName, setOrganizationName] = (0, import_react3.useState)(initialAuth.organizationName);
11827
12256
  (0, import_react3.useEffect)(() => {
12257
+ if (!sandboxActive) {
12258
+ return;
12259
+ }
12260
+ const seeded = configureSandbox(props);
12261
+ if (seeded) {
12262
+ setEmail(seeded.email);
12263
+ setOrganizationId(seeded.organizationId);
12264
+ setWorkspaceId(seeded.workspaceId);
12265
+ setOrganizationName(seeded.organizationName);
12266
+ }
12267
+ return () => setSandboxConfig(null);
12268
+ }, [sandboxActive, sandboxToken, sandboxUcic, sandboxSubject, organisationUuid, workspaceUuid, slug]);
12269
+ (0, import_react3.useEffect)(() => {
12270
+ if (sandboxActive) return;
11828
12271
  if (accessToken) {
11829
12272
  const authData = syncJwtDataToStore(accessToken);
11830
12273
  setEmail(authData.email);
@@ -11832,11 +12275,13 @@ function AuthProvider({ children, accessToken: initialAccessToken, refreshToken:
11832
12275
  setWorkspaceId(authData.workspaceId);
11833
12276
  setOrganizationName(authData.organizationName);
11834
12277
  }
11835
- }, [accessToken]);
12278
+ }, [accessToken, sandboxActive]);
11836
12279
  (0, import_react3.useEffect)(() => {
12280
+ if (sandboxActive) return;
11837
12281
  if (refreshToken) setStoredValue("refresh_token", refreshToken);
11838
- }, [refreshToken]);
12282
+ }, [refreshToken, sandboxActive]);
11839
12283
  (0, import_react3.useEffect)(() => {
12284
+ if (sandboxActive) return;
11840
12285
  setAccessToken(initialAccessToken);
11841
12286
  if (initialAccessToken && initialAccessToken.trim() !== "") {
11842
12287
  const authData = syncJwtDataToStore(initialAccessToken);
@@ -11845,10 +12290,11 @@ function AuthProvider({ children, accessToken: initialAccessToken, refreshToken:
11845
12290
  setWorkspaceId(authData.workspaceId);
11846
12291
  setOrganizationName(authData.organizationName);
11847
12292
  }
11848
- }, [initialAccessToken]);
12293
+ }, [initialAccessToken, sandboxActive]);
11849
12294
  (0, import_react3.useEffect)(() => {
12295
+ if (sandboxActive) return;
11850
12296
  setRefreshToken(initialRefreshToken);
11851
- }, [initialRefreshToken]);
12297
+ }, [initialRefreshToken, sandboxActive]);
11852
12298
  const updateTokens = (0, import_react3.useCallback)((newAccessToken, newRefreshToken) => {
11853
12299
  setAccessToken(newAccessToken);
11854
12300
  if (newRefreshToken) setRefreshToken(newRefreshToken);
@@ -12091,8 +12537,17 @@ function DataAvailabilityProvider({ children }) {
12091
12537
  mountedRef.current = false;
12092
12538
  };
12093
12539
  }, []);
12540
+ (0, import_react7.useEffect)(() => {
12541
+ setSessionExpiredListener(() => {
12542
+ if (!mountedRef.current) return;
12543
+ runIdRef.current += 1;
12544
+ setStatus("session-expired");
12545
+ });
12546
+ return () => setSessionExpiredListener(null);
12547
+ }, []);
12094
12548
  const runCheck = (0, import_react7.useCallback)(async () => {
12095
12549
  if (!organizationId || !workspaceId) return;
12550
+ if (isRefreshBlocked(authContext)) return;
12096
12551
  const runId = ++runIdRef.current;
12097
12552
  setStatus("checking");
12098
12553
  const contact = email;
@@ -14120,7 +14575,7 @@ var import_react_i18next11 = require("react-i18next");
14120
14575
 
14121
14576
  // src/RedactoPrivacyCenter/lib/consentManagerUtils.ts
14122
14577
  function purposeItemToUserConsent(purpose, group) {
14123
- var _a3, _b, _c, _d;
14578
+ var _a3, _b, _c, _d, _e;
14124
14579
  return {
14125
14580
  purpose_uuid: purpose.purpose_uuid,
14126
14581
  purpose: purpose.name,
@@ -14133,7 +14588,9 @@ function purposeItemToUserConsent(purpose, group) {
14133
14588
  product_uuid: group.product_uuid,
14134
14589
  product_name: group.product_name,
14135
14590
  product_description: group.product_description,
14136
- nominator_info: (_d = group.nominator) != null ? _d : void 0
14591
+ nominator_info: (_d = group.nominator) != null ? _d : void 0,
14592
+ revoke_warning_message: (_e = purpose.revoke_warning_message) != null ? _e : null,
14593
+ notice_uuid: purpose.notice_uuid
14137
14594
  };
14138
14595
  }
14139
14596
  function getDisplayProductGroups(detail, tab) {
@@ -14211,7 +14668,7 @@ var ConsentStatusEnum = /* @__PURE__ */ ((ConsentStatusEnum2) => {
14211
14668
  return ConsentStatusEnum2;
14212
14669
  })(ConsentStatusEnum || {});
14213
14670
 
14214
- // src/RedactoPrivacyCenter/lib/constants.ts
14671
+ // src/shared/languages.ts
14215
14672
  var languageOptions = [
14216
14673
  { value: "en", label: "English" },
14217
14674
  { value: "hi", label: "\u0939\u093F\u0928\u094D\u0926\u0940 (Hindi)" },
@@ -14237,6 +14694,17 @@ var languageOptions = [
14237
14694
  { value: "ks", label: "\u0643\u0672\u0634\u064F\u0631 (Kashmiri)" },
14238
14695
  { value: "sat", label: "\u1C65\u1C5F\u1C71\u1C5B\u1C5F\u1C72\u1C64 (Santali)" }
14239
14696
  ];
14697
+ var codeByLabel = new Map(languageOptions.map((o) => [o.label, o.value]));
14698
+ var codeByLower = new Map(languageOptions.map((o) => [o.value.toLowerCase(), o.value]));
14699
+ var englishName = (label) => {
14700
+ var _a3, _b;
14701
+ return (_b = (_a3 = label.match(/\(([^)]+)\)\s*$/)) == null ? void 0 : _a3[1]) != null ? _b : label;
14702
+ };
14703
+ var codeByName = new Map(
14704
+ languageOptions.map((o) => [englishName(o.label).toLowerCase(), o.value])
14705
+ );
14706
+
14707
+ // src/RedactoPrivacyCenter/lib/constants.ts
14240
14708
  var PAGE_CHROME_BY_PAGE = {
14241
14709
  home: {
14242
14710
  titleKey: "privacyCenter",
@@ -14314,8 +14782,14 @@ var useTimePeriodOptions = () => {
14314
14782
  );
14315
14783
  };
14316
14784
  var MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL = 3;
14785
+ var PRODUCT_SCOPED_REQUEST_TYPES = [
14786
+ "ACCESS" /* ACCESS */,
14787
+ "erasure" /* ERASURE */,
14788
+ "CORRECTION" /* CORRECTION */
14789
+ ];
14317
14790
  var SEARCH_DEBOUNCE_DELAY = 500;
14318
14791
  var FORM_PICKER_GROUP_LIMIT = 100;
14792
+ var LEGACY_PRODUCT_GROUP_UUID = "__legacy_flat_purposes__";
14319
14793
  var POLL_INTERVAL = 3e4;
14320
14794
  var NOTIFICATION_PAGE_SIZE = 10;
14321
14795
  var TAB_TO_CATEGORY = {
@@ -14418,7 +14892,7 @@ var ModifyConsentModal = ({
14418
14892
  action: "revoke",
14419
14893
  buttonLabel: t("revokeConsent"),
14420
14894
  buttonColor: colors.error,
14421
- warningMessage: t("revokeConsentWarning"),
14895
+ warningMessage: selectedRecord.revoke_warning_message || t("revokeConsentWarning"),
14422
14896
  description: nominatorLabel ? t("aboutToModifyConsentOnBehalf", { nominator: nominatorLabel }) : t("aboutToModifyConsent")
14423
14897
  };
14424
14898
  }
@@ -15089,7 +15563,8 @@ function ConsentManager() {
15089
15563
  dataElements: (_b = selectedRecord == null ? void 0 : selectedRecord.data_elements) == null ? void 0 : _b.map((de) => ({
15090
15564
  uuid: de.uuid,
15091
15565
  selected: de.selected
15092
- }))
15566
+ })),
15567
+ language: langParam
15093
15568
  });
15094
15569
  setIsModalOpen(false);
15095
15570
  setSelectedRecord(null);
@@ -15101,7 +15576,7 @@ function ConsentManager() {
15101
15576
  setIsManageLoading(false);
15102
15577
  }
15103
15578
  },
15104
- [organizationId, workspaceId, email, authContext, consentClient, selectedRecord, fetchData, t]
15579
+ [organizationId, workspaceId, email, authContext, consentClient, selectedRecord, langParam, fetchData, t]
15105
15580
  );
15106
15581
  const handleExport = (0, import_react25.useCallback)(async () => {
15107
15582
  if (!consentData.length) return;
@@ -15464,6 +15939,7 @@ function ActivitiesList() {
15464
15939
  () => ({ accessToken, refreshToken, onError, updateTokens }),
15465
15940
  [accessToken, refreshToken, onError, updateTokens]
15466
15941
  );
15942
+ const { langParam } = useCurrentLanguage();
15467
15943
  const [activities, setActivities] = (0, import_react26.useState)([]);
15468
15944
  const [totalCount, setTotalCount] = (0, import_react26.useState)(0);
15469
15945
  const [isLoading, setIsLoading] = (0, import_react26.useState)(true);
@@ -15475,7 +15951,7 @@ function ActivitiesList() {
15475
15951
  var _a3, _b, _c;
15476
15952
  if (!organizationId || !workspaceId) return;
15477
15953
  try {
15478
- const response = await fetchActivities(organizationId, workspaceId, nextOffset, PAGE_SIZE, authContext, consentClient);
15954
+ const response = await fetchActivities(organizationId, workspaceId, nextOffset, PAGE_SIZE, authContext, consentClient, langParam);
15479
15955
  if (!response) return;
15480
15956
  const rows = (_a3 = response.data) != null ? _a3 : [];
15481
15957
  setActivities((prev) => append ? [...prev, ...rows] : rows);
@@ -15486,7 +15962,7 @@ function ActivitiesList() {
15486
15962
  if (!append) setActivities([]);
15487
15963
  }
15488
15964
  },
15489
- [organizationId, workspaceId, authContext, consentClient]
15965
+ [organizationId, workspaceId, authContext, consentClient, langParam]
15490
15966
  );
15491
15967
  (0, import_react26.useEffect)(() => {
15492
15968
  setIsLoading(true);
@@ -15616,10 +16092,10 @@ var import_react_i18next14 = require("react-i18next");
15616
16092
  // src/RedactoPrivacyCenter/lib/dateGroup.ts
15617
16093
  var import_react27 = require("react");
15618
16094
  var import_react_i18next13 = require("react-i18next");
15619
- function monthKey(ts) {
16095
+ function monthKey(ts, locale) {
15620
16096
  if (!ts) return "";
15621
16097
  try {
15622
- return new Date(ts).toLocaleDateString(void 0, { month: "long", year: "numeric" });
16098
+ return new Date(ts).toLocaleDateString(locale || void 0, { month: "long", year: "numeric" });
15623
16099
  } catch {
15624
16100
  return "";
15625
16101
  }
@@ -15695,7 +16171,7 @@ function groupByTime(items, getTs, classify) {
15695
16171
  );
15696
16172
  }
15697
16173
  function useRelativeDate() {
15698
- const { t } = (0, import_react_i18next13.useTranslation)();
16174
+ const { t, i18n: i18n2 } = (0, import_react_i18next13.useTranslation)();
15699
16175
  return (0, import_react27.useCallback)(
15700
16176
  (ts) => {
15701
16177
  if (!ts) return "";
@@ -15708,7 +16184,7 @@ function useRelativeDate() {
15708
16184
  if (dayDiff <= 0) return t("today", { defaultValue: "Today" });
15709
16185
  if (dayDiff === 1) return t("yesterday", { defaultValue: "Yesterday" });
15710
16186
  if (dayDiff < 7) return t("daysAgo", { count: dayDiff, defaultValue: "{{count}} days ago" });
15711
- return d.toLocaleDateString(void 0, {
16187
+ return d.toLocaleDateString(i18n2.language || void 0, {
15712
16188
  month: "short",
15713
16189
  day: "numeric",
15714
16190
  ...d.getFullYear() !== now.getFullYear() ? { year: "numeric" } : {}
@@ -15717,10 +16193,28 @@ function useRelativeDate() {
15717
16193
  return ts;
15718
16194
  }
15719
16195
  },
15720
- [t]
16196
+ [t, i18n2.language]
15721
16197
  );
15722
16198
  }
15723
16199
 
16200
+ // src/RedactoPrivacyCenter/lib/receiptEvent.ts
16201
+ function eventLabelKey(eventType) {
16202
+ const v = String(eventType || "").toUpperCase();
16203
+ if (v.includes("GRANT")) {
16204
+ return "consentGranted";
16205
+ }
16206
+ if (v.includes("WITHDRAW") || v.includes("REVOK")) {
16207
+ return "consentRevoked";
16208
+ }
16209
+ if (v.includes("DECLIN")) {
16210
+ return "consentDeclined";
16211
+ }
16212
+ if (v.includes("EXPIR")) {
16213
+ return "consentExpired";
16214
+ }
16215
+ return void 0;
16216
+ }
16217
+
15724
16218
  // src/RedactoPrivacyCenter/components/ReceiptsList.tsx
15725
16219
  var import_jsx_runtime41 = require("react/jsx-runtime");
15726
16220
  var PAGE_SIZE2 = 10;
@@ -15756,11 +16250,10 @@ function receiptBadgeStatus(eventType) {
15756
16250
  if (v.includes("EXPIR")) return "warning";
15757
16251
  return "secondary";
15758
16252
  }
15759
- var ReceiptRow = import_react28.default.memo(({ item, colors, downloading, onDownload, downloadLabel, dateLabel }) => {
16253
+ var ReceiptRow = import_react28.default.memo(({ item, colors, downloading, onDownload, downloadLabel, dateLabel, eventLabel }) => {
15760
16254
  const product = item.product_name_display || item.product_name || "";
15761
- const event = item.event_type_display || item.event_type || "";
15762
- const primary = product || event || "-";
15763
- const badgeLabel = event || "-";
16255
+ const primary = product || eventLabel || "-";
16256
+ const badgeLabel = eventLabel || "-";
15764
16257
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_react_native41.View, { style: styles31.row, children: [
15765
16258
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(NameAvatar, { name: primary, seed: item.uuid || primary, size: "sm" }),
15766
16259
  /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_react_native41.View, { style: styles31.body, children: [
@@ -15787,7 +16280,7 @@ var ReceiptRow = import_react28.default.memo(({ item, colors, downloading, onDow
15787
16280
  });
15788
16281
  ReceiptRow.displayName = "ReceiptRow";
15789
16282
  function ReceiptsList() {
15790
- const { t } = (0, import_react_i18next14.useTranslation)();
16283
+ const { t, i18n: i18n2 } = (0, import_react_i18next14.useTranslation)();
15791
16284
  const { accessToken, refreshToken, organizationId, workspaceId, updateTokens, onError } = useAuth();
15792
16285
  const { consentClient } = useBaseUrl();
15793
16286
  const { colors } = useTheme();
@@ -15872,14 +16365,18 @@ function ReceiptsList() {
15872
16365
  const sections = (0, import_react28.useMemo)(() => {
15873
16366
  const map = /* @__PURE__ */ new Map();
15874
16367
  for (const r of receipts) {
15875
- const key = monthKey(r.created_at);
16368
+ const key = monthKey(r.created_at, i18n2.language);
15876
16369
  const arr = map.get(key);
15877
16370
  if (arr) arr.push(r);
15878
16371
  else map.set(key, [r]);
15879
16372
  }
15880
16373
  return Array.from(map, ([title, data]) => ({ title, data }));
15881
- }, [receipts]);
16374
+ }, [receipts, i18n2.language]);
15882
16375
  const downloadLabel = t("download") || "Download";
16376
+ const eventLabelFor = (r) => {
16377
+ const key = eventLabelKey(r.event_type);
16378
+ return key ? t(key) : r.event_type_display || r.event_type || "-";
16379
+ };
15883
16380
  const handleScroll = (0, import_react28.useCallback)(
15884
16381
  (e) => {
15885
16382
  const { layoutMeasurement, contentOffset, contentSize } = e.nativeEvent;
@@ -15961,7 +16458,8 @@ function ReceiptsList() {
15961
16458
  downloading: downloadingUuid === item.uuid,
15962
16459
  onDownload: handleDownload,
15963
16460
  downloadLabel,
15964
- dateLabel: relativeLabel(item.created_at)
16461
+ dateLabel: relativeLabel(item.created_at),
16462
+ eventLabel: eventLabelFor(item)
15965
16463
  }
15966
16464
  )
15967
16465
  ] }, `${item.uuid || item.created_at}-${index}`)) }, section2.title)),
@@ -16109,6 +16607,25 @@ var uploadFileWithS2S = async ({
16109
16607
  }
16110
16608
  };
16111
16609
 
16610
+ // src/RedactoPrivacyCenter/lib/requestType.ts
16611
+ var isRequestType = (requestType, expected) => typeof requestType === "string" && requestType.toLowerCase() === expected.toLowerCase();
16612
+ var isProductScopedRequestType = (requestType) => PRODUCT_SCOPED_REQUEST_TYPES.some((type) => isRequestType(requestType, type));
16613
+
16614
+ // src/RedactoPrivacyCenter/lib/erasureConsent.ts
16615
+ var isErasureRequestType = (requestType) => isRequestType(requestType, "erasure" /* ERASURE */);
16616
+ var resolveErasurePurposeNames = (purposeNames, fallback) => {
16617
+ if (purposeNames.length === 0 || purposeNames.length > MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL) {
16618
+ return fallback;
16619
+ }
16620
+ return purposeNames.join(", ");
16621
+ };
16622
+ var erasureConsentPayload = (requestType, revokeConsentOnFulfilment) => {
16623
+ if (!isErasureRequestType(requestType)) {
16624
+ return {};
16625
+ }
16626
+ return { revoke_consent_on_fulfilment: revokeConsentOnFulfilment };
16627
+ };
16628
+
16112
16629
  // src/RedactoPrivacyCenter/lib/filePicker.ts
16113
16630
  var import_react_native42 = require("react-native");
16114
16631
  async function pickFile() {
@@ -16283,19 +16800,32 @@ var consentGroupToFormProductGroup = (group) => {
16283
16800
  };
16284
16801
  };
16285
16802
  var purposeItemToFormPurpose = (purpose) => {
16286
- var _a3, _b;
16803
+ var _a3, _b, _c, _d, _e, _f;
16287
16804
  return {
16288
- uuid: purpose.purpose_uuid,
16289
- purpose_uuid: purpose.purpose_uuid,
16805
+ // The ledger keys purposes as `purpose_uuid`; the legacy Python
16806
+ // user-consents payload keys some of them as `uuid`. Accept either so the
16807
+ // picker and the submitted `purpose_uuid` resolve on both backends.
16808
+ uuid: (_b = (_a3 = purpose.purpose_uuid) != null ? _a3 : purpose.uuid) != null ? _b : "",
16809
+ purpose_uuid: (_d = (_c = purpose.purpose_uuid) != null ? _c : purpose.uuid) != null ? _d : "",
16290
16810
  name: purpose.name,
16291
- description: (_a3 = purpose.description) != null ? _a3 : "",
16811
+ description: (_e = purpose.description) != null ? _e : "",
16292
16812
  industries: "",
16293
16813
  selected: false,
16294
16814
  given_consent: false,
16295
16815
  status: purpose.status,
16296
16816
  validity: null,
16297
16817
  enabled: true,
16298
- data_elements: ((_b = purpose.data_elements) != null ? _b : []).map(consentDataElementToFormDataElement)
16818
+ data_elements: ((_f = purpose.data_elements) != null ? _f : []).map(consentDataElementToFormDataElement)
16819
+ };
16820
+ };
16821
+ var legacyFlatGroup = (form, label) => {
16822
+ var _a3;
16823
+ return {
16824
+ product_uuid: LEGACY_PRODUCT_GROUP_UUID,
16825
+ product_name: label,
16826
+ product_description: null,
16827
+ nominator: null,
16828
+ purposes: ((_a3 = form.purposes) != null ? _a3 : []).map((wrapper) => wrapper == null ? void 0 : wrapper.purpose).filter((purpose) => Boolean(purpose))
16299
16829
  };
16300
16830
  };
16301
16831
  var consentDataElementToFormDataElement = (element) => ({
@@ -16332,16 +16862,10 @@ var buildGroupDataElements = (group) => {
16332
16862
  // src/RedactoPrivacyCenter/components/Form.tsx
16333
16863
  var import_jsx_runtime43 = require("react/jsx-runtime");
16334
16864
  var TOTAL_STEPS = 3;
16335
- var PRODUCT_SCOPED_REQUEST_TYPES = /* @__PURE__ */ new Set([
16336
- "ACCESS" /* ACCESS */,
16337
- "erasure" /* ERASURE */,
16338
- "CORRECTION" /* CORRECTION */
16339
- ]);
16340
- var isProductScopedRequestType = (rt) => PRODUCT_SCOPED_REQUEST_TYPES.has(rt);
16341
16865
  function Form({ onCreateRequest }) {
16342
16866
  const { t } = (0, import_react_i18next16.useTranslation)();
16343
16867
  const { accessToken, refreshToken, email, organizationId, workspaceId, updateTokens, onError } = useAuth();
16344
- const { consentClient, baseUrl, ledgerBaseUrl } = useBaseUrl();
16868
+ const { consentClient, baseUrl } = useBaseUrl();
16345
16869
  const { colors } = useTheme();
16346
16870
  const requestTypeLabels = useRequestTypeLabels();
16347
16871
  const timePeriodOptions = useTimePeriodOptions();
@@ -16378,10 +16902,10 @@ function Form({ onCreateRequest }) {
16378
16902
  });
16379
16903
  const [uploadedDocs, setUploadedDocs] = (0, import_react29.useState)([]);
16380
16904
  const [isUploading, setIsUploading] = (0, import_react29.useState)(false);
16381
- const withLedgerPickerGroups = (0, import_react29.useCallback)(
16905
+ const withUserConsentPickerGroups = (0, import_react29.useCallback)(
16382
16906
  async (form, language) => {
16383
16907
  var _a3, _b;
16384
- if (!ledgerBaseUrl || !organizationId || !workspaceId) {
16908
+ if (!organizationId || !workspaceId) {
16385
16909
  return form;
16386
16910
  }
16387
16911
  const consents = await fetchUserConsents({
@@ -16396,16 +16920,18 @@ function Form({ onCreateRequest }) {
16396
16920
  authContext,
16397
16921
  consentClient
16398
16922
  });
16399
- if (!consents) {
16923
+ const direct = (_a3 = consents == null ? void 0 : consents.direct) != null ? _a3 : [];
16924
+ const nominated = (_b = consents == null ? void 0 : consents.nominated) != null ? _b : [];
16925
+ if (direct.length === 0 && nominated.length === 0) {
16400
16926
  return form;
16401
16927
  }
16402
16928
  return {
16403
16929
  ...form,
16404
- direct_groups: ((_a3 = consents.direct) != null ? _a3 : []).map(consentGroupToFormProductGroup),
16405
- nominated_groups: ((_b = consents.nominated) != null ? _b : []).map(consentGroupToFormProductGroup)
16930
+ direct_groups: direct.map(consentGroupToFormProductGroup),
16931
+ nominated_groups: nominated.map(consentGroupToFormProductGroup)
16406
16932
  };
16407
16933
  },
16408
- [ledgerBaseUrl, organizationId, workspaceId, authContext, consentClient]
16934
+ [organizationId, workspaceId, authContext, consentClient]
16409
16935
  );
16410
16936
  (0, import_react29.useEffect)(() => {
16411
16937
  if (!organizationId || !workspaceId || !contact) return;
@@ -16413,7 +16939,7 @@ function Form({ onCreateRequest }) {
16413
16939
  setIsLoading(true);
16414
16940
  getFormData(organizationId, workspaceId, contact, false, false, authContext, consentClient, langParam).then(async (data) => {
16415
16941
  if (!data) return;
16416
- const withGroups = await withLedgerPickerGroups(data, langParam);
16942
+ const withGroups = await withUserConsentPickerGroups(data, langParam);
16417
16943
  if (!isCancelled) setFormDataResponse(withGroups);
16418
16944
  }).catch((error) => {
16419
16945
  console.warn("Error fetching form data:", error);
@@ -16430,16 +16956,24 @@ function Form({ onCreateRequest }) {
16430
16956
  authContext,
16431
16957
  consentClient,
16432
16958
  langParam,
16433
- withLedgerPickerGroups
16959
+ withUserConsentPickerGroups
16434
16960
  ]);
16435
16961
  const allGroups = (0, import_react29.useMemo)(() => {
16436
16962
  var _a3, _b;
16437
16963
  if (!formDataResponse) return [];
16438
- return [
16964
+ const groups = [
16439
16965
  ...(_a3 = formDataResponse.direct_groups) != null ? _a3 : [],
16440
16966
  ...(_b = formDataResponse.nominated_groups) != null ? _b : []
16441
16967
  ];
16442
- }, [formDataResponse]);
16968
+ if (groups.length > 0) {
16969
+ return groups;
16970
+ }
16971
+ const flatGroup = legacyFlatGroup(formDataResponse, t("yourData"));
16972
+ if (buildGroupPurposes(flatGroup).length === 0) {
16973
+ return [];
16974
+ }
16975
+ return [flatGroup];
16976
+ }, [formDataResponse, t]);
16443
16977
  const skipProductStep = allGroups.length === 1;
16444
16978
  const selectedGroup = (0, import_react29.useMemo)(() => {
16445
16979
  var _a3, _b;
@@ -16471,7 +17005,7 @@ function Form({ onCreateRequest }) {
16471
17005
  setSelectedProductKey(null);
16472
17006
  }
16473
17007
  setNominationData({ nominee_email: "", nominee_mobile: "" });
16474
- if (requestType === "grievance" /* GRIEVANCE */ && grievanceOptions.length > 0) {
17008
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */) && grievanceOptions.length > 0) {
16475
17009
  const resetGrievances = grievanceOptions.reduce(
16476
17010
  (acc, option) => {
16477
17011
  acc[option.value] = false;
@@ -16500,12 +17034,10 @@ function Form({ onCreateRequest }) {
16500
17034
  () => groupPurposes.filter((p) => selectedPurposes.has(p.uuid)).map((p) => p.name).filter(Boolean),
16501
17035
  [groupPurposes, selectedPurposes]
16502
17036
  );
16503
- const selectedErasurePurposeNames = (0, import_react29.useMemo)(() => {
16504
- if (selectedErasurePurposeList.length === 0 || selectedErasurePurposeList.length > MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL) {
16505
- return t("revokeConsentModalYourPurposes");
16506
- }
16507
- return selectedErasurePurposeList.join(", ");
16508
- }, [selectedErasurePurposeList, t]);
17037
+ const selectedErasurePurposeNames = (0, import_react29.useMemo)(
17038
+ () => resolveErasurePurposeNames(selectedErasurePurposeList, t("revokeConsentModalYourPurposes")),
17039
+ [selectedErasurePurposeList, t]
17040
+ );
16509
17041
  const togglePurpose = (0, import_react29.useCallback)(
16510
17042
  (purpose) => {
16511
17043
  const uuid = purpose.uuid;
@@ -16612,7 +17144,7 @@ function Form({ onCreateRequest }) {
16612
17144
  if (isProductScopedRequestType(requestType)) {
16613
17145
  if (allGroups.length === 0) return false;
16614
17146
  if (!selectedGroup) return false;
16615
- if (requestType === "CORRECTION" /* CORRECTION */) {
17147
+ if (isRequestType(requestType, "CORRECTION" /* CORRECTION */)) {
16616
17148
  if (selectedCorrectionFields.size === 0) return false;
16617
17149
  return Array.from(selectedCorrectionFields).every((fieldUuid) => {
16618
17150
  var _a3, _b;
@@ -16620,15 +17152,15 @@ function Form({ onCreateRequest }) {
16620
17152
  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()));
16621
17153
  });
16622
17154
  }
16623
- if (requestType === "ACCESS" /* ACCESS */ || requestType === "erasure" /* ERASURE */) {
17155
+ if (isRequestType(requestType, "ACCESS" /* ACCESS */) || isErasureRequestType(requestType)) {
16624
17156
  return selectedPurposes.size > 0;
16625
17157
  }
16626
17158
  return false;
16627
17159
  }
16628
- if (requestType === "grievance" /* GRIEVANCE */) {
17160
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */)) {
16629
17161
  return Object.values(selectedGrievances).some(Boolean);
16630
17162
  }
16631
- if (requestType === "nomination" /* NOMINATION */) {
17163
+ if (isRequestType(requestType, "nomination" /* NOMINATION */)) {
16632
17164
  return Boolean(nominationData.nominee_email);
16633
17165
  }
16634
17166
  return false;
@@ -16642,9 +17174,17 @@ function Form({ onCreateRequest }) {
16642
17174
  selectedGrievances,
16643
17175
  nominationData
16644
17176
  ]);
16645
- const isFormValid = (0, import_react29.useMemo)(() => detailsValid && confirmChecked, [detailsValid, confirmChecked]);
17177
+ const isFormValid = (0, import_react29.useMemo)(
17178
+ () => Boolean(contact.trim()) && detailsValid && confirmChecked,
17179
+ [contact, detailsValid, confirmChecked]
17180
+ );
16646
17181
  const handleUpload = (0, import_react29.useCallback)(async () => {
16647
17182
  if (!organizationId || !workspaceId) return;
17183
+ const caseUuid = formDataResponse == null ? void 0 : formDataResponse.uuid;
17184
+ if (!caseUuid) {
17185
+ import_react_native44.Alert.alert(t("uploadFile"), t("unableToUpload") || "Unable to upload file. Please try again.");
17186
+ return;
17187
+ }
16648
17188
  try {
16649
17189
  const file = await pickFile();
16650
17190
  if (!file) return;
@@ -16661,11 +17201,11 @@ function Form({ onCreateRequest }) {
16661
17201
  "payload",
16662
17202
  JSON.stringify({
16663
17203
  organization_uuid: organizationId || "",
16664
- space: `privacy/${docUuid}`,
17204
+ space: `privacy/${caseUuid}`,
16665
17205
  uuid: docUuid,
16666
17206
  is_public: true,
16667
17207
  allow_ai_processing: true,
16668
- metadata: { group_by: "privacy", product: "privacy_center" }
17208
+ metadata: { group_by: "privacy", case_uuid: caseUuid, product: "privacy_center" }
16669
17209
  })
16670
17210
  );
16671
17211
  const result = await uploadFileWithS2S({
@@ -16685,18 +17225,28 @@ function Form({ onCreateRequest }) {
16685
17225
  } finally {
16686
17226
  setIsUploading(false);
16687
17227
  }
16688
- }, [organizationId, workspaceId, authContext, consentClient, baseUrl, t]);
17228
+ }, [organizationId, workspaceId, authContext, consentClient, baseUrl, t, formDataResponse]);
16689
17229
  const removeUploadedDoc = (0, import_react29.useCallback)((uuid) => {
16690
17230
  setUploadedDocs((prev) => prev.filter((d) => d.uuid !== uuid));
16691
17231
  }, []);
17232
+ const alertSubmitFailed = (0, import_react29.useCallback)(
17233
+ (message) => {
17234
+ import_react_native44.Alert.alert(t("submit"), message || t("unableToSubmit") || "Unable to submit request. Please try again.");
17235
+ },
17236
+ [t]
17237
+ );
16692
17238
  const handleSubmit = (0, import_react29.useCallback)(async (revoke = false) => {
16693
- var _a3, _b, _c, _d;
16694
- if (!organizationId || !workspaceId || !contact || !requestType || !formDataResponse) return;
17239
+ var _a3;
17240
+ if (!organizationId || !workspaceId || !contact || !requestType || !formDataResponse) {
17241
+ alertSubmitFailed();
17242
+ return;
17243
+ }
16695
17244
  setRevokeConsentOnFulfilment(revoke);
16696
17245
  setIsSubmitting(true);
16697
17246
  try {
16698
17247
  const isProductScoped = isProductScopedRequestType(requestType);
16699
- const anchorGroup = isProductScoped ? selectedGroup : null;
17248
+ const isLegacyFlatSelection = (selectedGroup == null ? void 0 : selectedGroup.product_uuid) === LEGACY_PRODUCT_GROUP_UUID;
17249
+ const anchorGroup = isProductScoped && !isLegacyFlatSelection ? selectedGroup : null;
16700
17250
  const updatePurposes = Array.from(selectedPurposes).map((uuid) => ({
16701
17251
  purpose_uuid: uuid,
16702
17252
  data_element_uuids: Array.from(selectedDataElements.get(uuid) || [])
@@ -16717,27 +17267,27 @@ function Form({ onCreateRequest }) {
16717
17267
  purposes: updatePurposes,
16718
17268
  correction_data: correctionData,
16719
17269
  grievance_types: grievanceTypes,
16720
- ...requestType === "nomination" /* NOMINATION */ ? { nomination_data: nominationData } : {}
17270
+ ...isRequestType(requestType, "nomination" /* NOMINATION */) ? { nomination_data: nominationData } : {}
16721
17271
  },
16722
- time_period: requestType === "ACCESS" /* ACCESS */ ? parseInt(timePeriod || "30", 10) : 0,
17272
+ time_period: isRequestType(requestType, "ACCESS" /* ACCESS */) ? parseInt(timePeriod || "30", 10) : 0,
16723
17273
  requestor_note: additionalNote || "",
16724
- ...requestType === "erasure" /* ERASURE */ ? { revoke_consent_on_fulfilment: revoke } : {},
17274
+ ...erasureConsentPayload(requestType, revoke),
16725
17275
  ...anchorGroup ? { product_uuid: anchorGroup.product_uuid } : {},
16726
17276
  ...(anchorGroup == null ? void 0 : anchorGroup.nominator) ? { data_principal_uuid: anchorGroup.nominator.uuid } : {}
16727
17277
  };
16728
17278
  const response = await createCaseRequest(organizationId, workspaceId, request, false, false, authContext, consentClient);
16729
- const responseAny = response;
16730
- 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;
17279
+ const caseRef = extractCaseRef(response);
17280
+ const newCaseId = (caseRef == null ? void 0 : caseRef.case_id) || (caseRef == null ? void 0 : caseRef.uuid) || null;
16731
17281
  if (newCaseId) {
16732
17282
  setCaseId(newCaseId);
16733
- setSubmittedProductName((_d = anchorGroup == null ? void 0 : anchorGroup.product_name) != null ? _d : "");
17283
+ setSubmittedProductName((_a3 = anchorGroup == null ? void 0 : anchorGroup.product_name) != null ? _a3 : "");
16734
17284
  setIsSubmitted(true);
16735
17285
  } else {
16736
- import_react_native44.Alert.alert(t("submit"), t("unableToSubmit") || "Unable to submit request. Please try again.");
17286
+ alertSubmitFailed();
16737
17287
  }
16738
17288
  } catch (error) {
16739
17289
  console.warn("Error submitting request:", error);
16740
- import_react_native44.Alert.alert(t("submit"), (error == null ? void 0 : error.message) || t("unableToSubmit") || "Unable to submit request.");
17290
+ alertSubmitFailed(error == null ? void 0 : error.message);
16741
17291
  } finally {
16742
17292
  setIsSubmitting(false);
16743
17293
  }
@@ -16760,11 +17310,13 @@ function Form({ onCreateRequest }) {
16760
17310
  consentClient,
16761
17311
  groupDataElements,
16762
17312
  uploadedDocs,
16763
- t
17313
+ alertSubmitFailed
16764
17314
  ]);
16765
17315
  const handleSubmitClick = (0, import_react29.useCallback)(() => {
16766
- if (!isFormValid) return;
16767
- if (requestType === "erasure" /* ERASURE */) {
17316
+ if (!isFormValid) {
17317
+ return;
17318
+ }
17319
+ if (isErasureRequestType(requestType)) {
16768
17320
  setIsErasureConsentModalOpen(true);
16769
17321
  return;
16770
17322
  }
@@ -16853,7 +17405,7 @@ function Form({ onCreateRequest }) {
16853
17405
  if (groupPurposes.length === 0) {
16854
17406
  return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.placeholder, { color: colors.textSecondary }], children: t("noPurposesAvailable") || "No purposes available" });
16855
17407
  }
16856
- const isErasure = requestType === "erasure" /* ERASURE */;
17408
+ const isErasure = isErasureRequestType(requestType);
16857
17409
  const allPurposesSelected = groupPurposes.every(
16858
17410
  (p) => (p.data_elements || []).every((de) => {
16859
17411
  var _a3;
@@ -16973,18 +17525,18 @@ function Form({ onCreateRequest }) {
16973
17525
  ] }),
16974
17526
  selectedGroup ? /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: styles33.section, children: [
16975
17527
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("requestDetails") }),
16976
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.View, { style: [styles33.sectionCard, elevation.card, { backgroundColor: colors.surface }], children: requestType === "CORRECTION" /* CORRECTION */ ? renderCorrectionFields() : renderPurposeFields() })
17528
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.View, { style: [styles33.sectionCard, elevation.card, { backgroundColor: colors.surface }], children: isRequestType(requestType, "CORRECTION" /* CORRECTION */) ? renderCorrectionFields() : renderPurposeFields() })
16977
17529
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: [styles33.hintCard, { backgroundColor: colors.surfaceAlt }], children: [
16978
17530
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(Icon, { name: "circle-alert", size: 18, color: colors.textSecondary }),
16979
17531
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.hintText, { color: colors.textSecondary }], children: t("selectProductFirst", { defaultValue: "Select a product to continue" }) })
16980
17532
  ] }),
16981
- requestType === "ACCESS" /* ACCESS */ && selectedGroup ? /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: styles33.section, children: [
17533
+ isRequestType(requestType, "ACCESS" /* ACCESS */) && selectedGroup ? /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: styles33.section, children: [
16982
17534
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("timePeriod") }),
16983
17535
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(PCSelect, { value: timePeriod, options: timePeriodOptions, onChange: setTimePeriod, placeholder: t("timePeriod") })
16984
17536
  ] }) : null
16985
17537
  ] });
16986
17538
  }
16987
- if (requestType === "grievance" /* GRIEVANCE */) {
17539
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */)) {
16988
17540
  if (grievanceOptions.length === 0) {
16989
17541
  return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.View, { style: styles33.stepBody, children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.placeholder, { color: colors.textSecondary }], children: t("noPurposesAvailable") || "No grievance types available" }) });
16990
17542
  }
@@ -17000,7 +17552,7 @@ function Form({ onCreateRequest }) {
17000
17552
  ] })
17001
17553
  ] }) });
17002
17554
  }
17003
- if (requestType === "nomination" /* NOMINATION */) {
17555
+ if (isRequestType(requestType, "nomination" /* NOMINATION */)) {
17004
17556
  return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.View, { style: styles33.stepBody, children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: styles33.section, children: [
17005
17557
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("enterNomineeDetails") }),
17006
17558
  /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: [styles33.sectionCard, elevation.card, { backgroundColor: colors.surface }], children: [
@@ -18065,6 +18617,7 @@ function useUnreadCount() {
18065
18617
  const loadRef = (0, import_react32.useRef)();
18066
18618
  loadRef.current = async () => {
18067
18619
  if (!organizationId || !workspaceId) return;
18620
+ if (isRefreshBlocked(authContext)) return;
18068
18621
  const res = await fetchUnreadCount(organizationId, workspaceId, authContext, consentClient);
18069
18622
  if (res && typeof res.count === "number") setCount(res.count);
18070
18623
  };
@@ -18390,17 +18943,255 @@ function PrivacyCenterEmptyState() {
18390
18943
  return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(PCEmpty, { iconName: "shield", title: t("noDataTitle"), description: t("noDataDescription") });
18391
18944
  }
18392
18945
 
18946
+ // src/RedactoPrivacyCenter/components/PrivacyCenterSessionExpired.tsx
18947
+ var import_react_i18next21 = require("react-i18next");
18948
+ var import_jsx_runtime50 = require("react/jsx-runtime");
18949
+ function PrivacyCenterSessionExpired() {
18950
+ const { t } = (0, import_react_i18next21.useTranslation)();
18951
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
18952
+ PCEmpty,
18953
+ {
18954
+ iconName: "shield",
18955
+ title: t("sessionExpiredTitle"),
18956
+ description: t("sessionExpiredDescription")
18957
+ }
18958
+ );
18959
+ }
18960
+
18961
+ // src/RedactoPrivacyCenter/components/SelectUserGate.tsx
18962
+ var import_react36 = require("react");
18963
+ var import_react_native51 = require("react-native");
18964
+
18965
+ // src/RedactoPrivacyCenter/context/ProfileSwitchContext.tsx
18966
+ var import_react35 = require("react");
18967
+ var import_jsx_runtime51 = require("react/jsx-runtime");
18968
+ var ProfileSwitchContext = (0, import_react35.createContext)({
18969
+ switchProfile: null
18970
+ });
18971
+ function ProfileSwitchProvider({
18972
+ switchProfile,
18973
+ children
18974
+ }) {
18975
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ProfileSwitchContext.Provider, { value: { switchProfile }, children });
18976
+ }
18977
+ function useProfileSwitch() {
18978
+ return (0, import_react35.useContext)(ProfileSwitchContext);
18979
+ }
18980
+
18981
+ // src/RedactoPrivacyCenter/components/SelectUser.tsx
18982
+ var import_react_native50 = require("react-native");
18983
+ var import_react_i18next22 = require("react-i18next");
18984
+
18985
+ // src/RedactoPrivacyCenter/lib/identityLabels.ts
18986
+ var identityPrimaryValue = (candidate) => {
18987
+ const orgUserId = candidate.org_user_id || "";
18988
+ const email = candidate.primary_email || "";
18989
+ const mobile = candidate.primary_mobile || "";
18990
+ return { orgUserId, fallback: email || mobile || candidate.uuid };
18991
+ };
18992
+ var identitySecondaryLabels = (candidate, primaryLabel) => {
18993
+ const email = candidate.primary_email || "";
18994
+ const mobile = candidate.primary_mobile || "";
18995
+ return [email, mobile].filter(
18996
+ (value, index, all) => value !== "" && value !== primaryLabel && all.indexOf(value) === index
18997
+ );
18998
+ };
18999
+ var selectableIdentities = (candidates) => candidates.filter((candidate) => Boolean(candidate.uuid));
19000
+
19001
+ // src/RedactoPrivacyCenter/components/SelectUser.tsx
19002
+ var import_jsx_runtime52 = require("react/jsx-runtime");
19003
+ var SelectUser = ({
19004
+ candidates,
19005
+ onSelect,
19006
+ busyUuid,
19007
+ error
19008
+ }) => {
19009
+ const { t } = (0, import_react_i18next22.useTranslation)();
19010
+ const { colors } = useTheme();
19011
+ const selectable = selectableIdentities(candidates);
19012
+ const busy = busyUuid !== null;
19013
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_react_native50.ScrollView, { contentContainerStyle: styles39.container, children: [
19014
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native50.Text, { style: [typography.title, styles39.heading, { color: colors.text }], children: t("chooseYourProfile") }),
19015
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native50.Text, { style: [typography.body, styles39.subtitle, { color: colors.textSecondary }], children: t("loginIdentifierLinkedToMultipleProfiles") }),
19016
+ error ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native50.Text, { style: [typography.caption, styles39.error, { color: colors.error }], children: error }) : null,
19017
+ selectable.map((candidate) => {
19018
+ const { orgUserId, fallback } = identityPrimaryValue(candidate);
19019
+ const primaryLabel = orgUserId ? t("userIdLabel", { id: orgUserId }) : fallback;
19020
+ const secondaryLabels = identitySecondaryLabels(candidate, primaryLabel);
19021
+ const isBusy = busyUuid === candidate.uuid;
19022
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
19023
+ import_react_native50.TouchableOpacity,
19024
+ {
19025
+ accessibilityRole: "button",
19026
+ disabled: busy,
19027
+ onPress: () => onSelect(candidate.uuid),
19028
+ style: [
19029
+ styles39.row,
19030
+ {
19031
+ backgroundColor: colors.surface,
19032
+ borderColor: isBusy ? colors.primary : colors.border
19033
+ }
19034
+ ],
19035
+ children: [
19036
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_react_native50.View, { style: styles39.rowText, children: [
19037
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native50.Text, { style: [typography.label, { color: colors.text }], children: primaryLabel }),
19038
+ secondaryLabels.map((label) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
19039
+ import_react_native50.Text,
19040
+ {
19041
+ style: [typography.caption, styles39.secondary, { color: colors.textSecondary }],
19042
+ children: label
19043
+ },
19044
+ label
19045
+ ))
19046
+ ] }),
19047
+ isBusy ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native50.Text, { style: [typography.caption, { color: colors.textSecondary }], children: t("signingInEllipsis") }) : /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Icon, { name: "chevron-right", size: 18, color: colors.textSecondary })
19048
+ ]
19049
+ },
19050
+ candidate.uuid
19051
+ );
19052
+ })
19053
+ ] });
19054
+ };
19055
+ var styles39 = import_react_native50.StyleSheet.create({
19056
+ container: { padding: spacing.lg },
19057
+ heading: { textAlign: "center" },
19058
+ subtitle: { textAlign: "center", marginTop: spacing.xs, marginBottom: spacing.lg },
19059
+ error: { textAlign: "center", marginBottom: spacing.md },
19060
+ row: {
19061
+ flexDirection: "row",
19062
+ alignItems: "center",
19063
+ borderWidth: 1,
19064
+ borderRadius: radii.md,
19065
+ padding: spacing.md,
19066
+ marginBottom: spacing.sm
19067
+ },
19068
+ rowText: { flex: 1 },
19069
+ secondary: { marginTop: 2 }
19070
+ });
19071
+
19072
+ // src/RedactoPrivacyCenter/components/SelectUserGate.tsx
19073
+ var import_jsx_runtime53 = require("react/jsx-runtime");
19074
+ function SelectUserGate({ children }) {
19075
+ var _a3, _b;
19076
+ const { accessToken, organizationId, workspaceId, updateTokens } = useAuth();
19077
+ const { consentClient } = useBaseUrl();
19078
+ const { colors } = useTheme();
19079
+ const insets = useSafeInsets();
19080
+ const [phase, setPhase] = (0, import_react36.useState)("checking");
19081
+ const [candidates, setCandidates] = (0, import_react36.useState)([]);
19082
+ const [busyUuid, setBusyUuid] = (0, import_react36.useState)(null);
19083
+ const [selectError, setSelectError] = (0, import_react36.useState)(null);
19084
+ const [pinnedOrgUserId, setPinnedOrgUserId] = (0, import_react36.useState)(null);
19085
+ const tokenOrgUserId = ((_b = (_a3 = decodeJwtToken(accessToken)) == null ? void 0 : _a3.user_data) == null ? void 0 : _b.org_user_id) || "";
19086
+ (0, import_react36.useEffect)(() => {
19087
+ let cancelled = false;
19088
+ if (isSandboxMode() || !organizationId || !workspaceId || !accessToken) {
19089
+ setPhase("resolved");
19090
+ return;
19091
+ }
19092
+ const isPinned = Boolean(pinnedOrgUserId) && pinnedOrgUserId === tokenOrgUserId;
19093
+ setPhase(isPinned ? "resolved" : "checking");
19094
+ (async () => {
19095
+ var _a4;
19096
+ try {
19097
+ const res = await consentClient.listIdentities({
19098
+ organisationUuid: organizationId,
19099
+ workspaceUuid: workspaceId,
19100
+ authToken: accessToken
19101
+ });
19102
+ if (cancelled) return;
19103
+ const list = (_a4 = res == null ? void 0 : res.identities) != null ? _a4 : [];
19104
+ setCandidates(list);
19105
+ setPhase(list.length > 1 && !isPinned ? "picking" : "resolved");
19106
+ } catch {
19107
+ if (cancelled) return;
19108
+ setCandidates([]);
19109
+ setPhase("resolved");
19110
+ }
19111
+ })();
19112
+ return () => {
19113
+ cancelled = true;
19114
+ };
19115
+ }, [organizationId, workspaceId, tokenOrgUserId]);
19116
+ const handleSelect = (0, import_react36.useCallback)(
19117
+ async (principalUuid) => {
19118
+ var _a4, _b2;
19119
+ if (!principalUuid || busyUuid || !organizationId || !workspaceId) return;
19120
+ setBusyUuid(principalUuid);
19121
+ setSelectError(null);
19122
+ try {
19123
+ const res = await consentClient.selectPrincipal(
19124
+ {
19125
+ organisationUuid: organizationId,
19126
+ workspaceUuid: workspaceId,
19127
+ authToken: accessToken
19128
+ },
19129
+ principalUuid
19130
+ );
19131
+ if (!(res == null ? void 0 : res.token) || !(res == null ? void 0 : res.refresh_token)) {
19132
+ throw new Error("select-principal returned no tokens");
19133
+ }
19134
+ const pinned = ((_b2 = (_a4 = decodeJwtToken(res.token)) == null ? void 0 : _a4.user_data) == null ? void 0 : _b2.org_user_id) || null;
19135
+ setPinnedOrgUserId(pinned);
19136
+ setPhase("resolved");
19137
+ updateTokens(res.token, res.refresh_token);
19138
+ } catch (error) {
19139
+ setSelectError(
19140
+ error instanceof Error ? error.message : "Failed to switch profile"
19141
+ );
19142
+ } finally {
19143
+ setBusyUuid(null);
19144
+ }
19145
+ },
19146
+ [accessToken, busyUuid, consentClient, organizationId, workspaceId, updateTokens]
19147
+ );
19148
+ const canSwitch = candidates.length > 1;
19149
+ const switchProfile = (0, import_react36.useCallback)(() => {
19150
+ if (!canSwitch) return;
19151
+ setSelectError(null);
19152
+ setPhase("picking");
19153
+ }, [canSwitch]);
19154
+ if (phase === "checking" || phase === "picking") {
19155
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
19156
+ import_react_native51.View,
19157
+ {
19158
+ style: [
19159
+ styles40.screen,
19160
+ {
19161
+ backgroundColor: colors.canvasSubtle,
19162
+ paddingTop: insets.top,
19163
+ paddingBottom: insets.bottom
19164
+ }
19165
+ ],
19166
+ children: phase === "checking" ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(PCLoader, {}) : /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
19167
+ SelectUser,
19168
+ {
19169
+ candidates,
19170
+ onSelect: handleSelect,
19171
+ busyUuid,
19172
+ error: selectError
19173
+ }
19174
+ )
19175
+ }
19176
+ );
19177
+ }
19178
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ProfileSwitchProvider, { switchProfile: canSwitch ? switchProfile : null, children });
19179
+ }
19180
+ var styles40 = import_react_native51.StyleSheet.create({
19181
+ screen: { flex: 1 }
19182
+ });
19183
+
18393
19184
  // src/RedactoPrivacyCenter/components/CaseDetails/CaseDetailsPage.tsx
18394
- var import_react39 = require("react");
18395
- var import_react_native57 = require("react-native");
18396
- var import_react_i18next26 = require("react-i18next");
19185
+ var import_react41 = require("react");
19186
+ var import_react_native59 = require("react-native");
19187
+ var import_react_i18next28 = require("react-i18next");
18397
19188
 
18398
19189
  // src/RedactoPrivacyCenter/components/CaseDetails/RequestDetailsTab.tsx
18399
- var import_react_native50 = require("react-native");
18400
- var import_react_i18next21 = require("react-i18next");
18401
- var import_jsx_runtime50 = require("react/jsx-runtime");
19190
+ var import_react_native52 = require("react-native");
19191
+ var import_react_i18next23 = require("react-i18next");
19192
+ var import_jsx_runtime54 = require("react/jsx-runtime");
18402
19193
  function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18403
- const { t } = (0, import_react_i18next21.useTranslation)();
19194
+ const { t } = (0, import_react_i18next23.useTranslation)();
18404
19195
  const { colors } = useTheme();
18405
19196
  const { listBottom } = usePrivacyCenterInsets({ hasFooter: true });
18406
19197
  const details = selectedCase.request_details;
@@ -18432,36 +19223,36 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18432
19223
  }
18433
19224
  const description = selectedCase.description_display || selectedCase.description;
18434
19225
  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);
18435
- return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.ScrollView, { style: [styles39.container, { backgroundColor: colors.canvasSubtle }], contentContainerStyle: [styles39.content, { flexGrow: 1, paddingBottom: listBottom }], showsVerticalScrollIndicator: false, children: [
18436
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.View, { style: styles39.timeline, children: steps.map((step, i) => {
19226
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.ScrollView, { style: [styles41.container, { backgroundColor: colors.canvasSubtle }], contentContainerStyle: [styles41.content, { flexGrow: 1, paddingBottom: listBottom }], showsVerticalScrollIndicator: false, children: [
19227
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.View, { style: styles41.timeline, children: steps.map((step, i) => {
18437
19228
  const isLast = i === steps.length - 1;
18438
- return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.stepRow, children: [
18439
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.gutter, children: [
18440
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
18441
- import_react_native50.View,
19229
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.stepRow, children: [
19230
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.gutter, children: [
19231
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
19232
+ import_react_native52.View,
18442
19233
  {
18443
19234
  style: [
18444
- styles39.dot,
19235
+ styles41.dot,
18445
19236
  step.state === "upcoming" ? { backgroundColor: colors.canvasSubtle, borderWidth: 2, borderColor: step.danger ? colors.error : colors.border } : { backgroundColor: step.color }
18446
19237
  ],
18447
- children: step.state === "done" ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Icon, { name: "check", size: 11, color: colors.primaryText, strokeWidth: 3 }) : step.state === "current" ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.View, { style: [styles39.dotInner, { backgroundColor: colors.primaryText }] }) : null
19238
+ children: step.state === "done" ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Icon, { name: "check", size: 11, color: colors.primaryText, strokeWidth: 3 }) : step.state === "current" ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.View, { style: [styles41.dotInner, { backgroundColor: colors.primaryText }] }) : null
18448
19239
  }
18449
19240
  ),
18450
- !isLast ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.View, { style: [styles39.connector, { backgroundColor: colors.border }] }) : null
19241
+ !isLast ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.View, { style: [styles41.connector, { backgroundColor: colors.border }] }) : null
18451
19242
  ] }),
18452
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: [styles39.stepContent, isLast && styles39.stepContentLast], children: [
18453
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.stepLabel, { color: step.danger ? colors.error : colors.text }], children: step.label }),
18454
- step.date ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.stepDate, { color: step.danger ? colors.error : colors.textSecondary }], children: step.date }) : null
19243
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: [styles41.stepContent, isLast && styles41.stepContentLast], children: [
19244
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.stepLabel, { color: step.danger ? colors.error : colors.text }], children: step.label }),
19245
+ step.date ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.stepDate, { color: step.danger ? colors.error : colors.textSecondary }], children: step.date }) : null
18455
19246
  ] })
18456
19247
  ] }, `${step.label}-${i}`);
18457
19248
  }) }),
18458
- hasDetails ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: [styles39.card, elevation.card, { backgroundColor: colors.surface }], children: [
18459
- description ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.block, children: [
18460
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("descriptionLabel") || "Description" }),
18461
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.descriptionText, { color: colors.text }], children: description })
19249
+ hasDetails ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: [styles41.card, elevation.card, { backgroundColor: colors.surface }], children: [
19250
+ description ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.block, children: [
19251
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("descriptionLabel") || "Description" }),
19252
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.descriptionText, { color: colors.text }], children: description })
18462
19253
  ] }) : null,
18463
- (details == null ? void 0 : details.purposes) && details.purposes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.block, children: [
18464
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("purposesInvolved") || t("purposes") || "Purposes" }),
19254
+ (details == null ? void 0 : details.purposes) && details.purposes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.block, children: [
19255
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("purposesInvolved") || t("purposes") || "Purposes" }),
18465
19256
  details.purposes.map((rawP, idx) => {
18466
19257
  const p = (rawP == null ? void 0 : rawP.purpose) ? rawP.purpose : rawP;
18467
19258
  const purposeId = (p == null ? void 0 : p.uuid) || (p == null ? void 0 : p.purpose_uuid) || (rawP == null ? void 0 : rawP.purpose_uuid) || idx;
@@ -18469,10 +19260,10 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18469
19260
  const purposeDescription = (p == null ? void 0 : p.description) || (rawP == null ? void 0 : rawP.description);
18470
19261
  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)) : [];
18471
19262
  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 : [];
18472
- return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: [styles39.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: import_react_native50.StyleSheet.hairlineWidth }], children: [
18473
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.itemTitle, { color: colors.text }], children: purposeName }),
18474
- purposeDescription ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.itemDesc, { color: colors.textSecondary }], numberOfLines: 3, children: purposeDescription }) : null,
18475
- dataElements.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.View, { style: styles39.chipRow, children: dataElements.map((de) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(PCBadge, { status: "info", label: de.name }, de.uuid)) }) : dataElementUuids.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.Text, { style: [styles39.itemDesc, { color: colors.textSecondary }], children: [
19263
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: [styles41.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: import_react_native52.StyleSheet.hairlineWidth }], children: [
19264
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.itemTitle, { color: colors.text }], children: purposeName }),
19265
+ purposeDescription ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.itemDesc, { color: colors.textSecondary }], numberOfLines: 3, children: purposeDescription }) : null,
19266
+ dataElements.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.View, { style: styles41.chipRow, children: dataElements.map((de) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(PCBadge, { status: "info", label: de.name }, de.uuid)) }) : dataElementUuids.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.Text, { style: [styles41.itemDesc, { color: colors.textSecondary }], children: [
18476
19267
  dataElementUuids.length,
18477
19268
  " ",
18478
19269
  t("dataElements") || "data elements"
@@ -18480,44 +19271,44 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18480
19271
  ] }, purposeId);
18481
19272
  })
18482
19273
  ] }) : null,
18483
- (details == null ? void 0 : details.correction_data) && details.correction_data.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.block, children: [
18484
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("correctionData") || "Correction" }),
18485
- details.correction_data.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: [styles39.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: import_react_native50.StyleSheet.hairlineWidth }], children: [
18486
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.itemTitle, { color: colors.text }], children: item.name }),
18487
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.correctionValues, children: [
18488
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.correctionValue, children: [
18489
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.correctionLabel, { color: colors.textSecondary }], children: t("currentValue") || "Current" }),
18490
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.correctionText, { color: colors.text }], children: item.curr_value || "-" })
19274
+ (details == null ? void 0 : details.correction_data) && details.correction_data.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.block, children: [
19275
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("correctionData") || "Correction" }),
19276
+ details.correction_data.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: [styles41.itemRow, idx > 0 && { borderTopColor: colors.hairline, borderTopWidth: import_react_native52.StyleSheet.hairlineWidth }], children: [
19277
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.itemTitle, { color: colors.text }], children: item.name }),
19278
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.correctionValues, children: [
19279
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.correctionValue, children: [
19280
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.correctionLabel, { color: colors.textSecondary }], children: t("currentValue") || "Current" }),
19281
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.correctionText, { color: colors.text }], children: item.curr_value || "-" })
18491
19282
  ] }),
18492
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Icon, { name: "chevron-right", size: 16, color: colors.textSecondary, strokeWidth: 2.2 }),
18493
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.correctionValue, children: [
18494
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.correctionLabel, { color: colors.textSecondary }], children: t("newValue") || "New" }),
18495
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.correctionText, { color: colors.primary }], children: item.new_value || "-" })
19283
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Icon, { name: "chevron-right", size: 16, color: colors.textSecondary, strokeWidth: 2.2 }),
19284
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.correctionValue, children: [
19285
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.correctionLabel, { color: colors.textSecondary }], children: t("newValue") || "New" }),
19286
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.correctionText, { color: colors.primary }], children: item.new_value || "-" })
18496
19287
  ] })
18497
19288
  ] })
18498
19289
  ] }, idx))
18499
19290
  ] }) : null,
18500
- (details == null ? void 0 : details.grievance_types) && details.grievance_types.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.block, children: [
18501
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("grievanceTypes") || "Grievance" }),
18502
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.View, { style: styles39.chipRow, children: details.grievance_types.map((g, idx) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(PCBadge, { status: "warning", label: (g.grievance || "").replace(/_/g, " ") }, idx)) })
19291
+ (details == null ? void 0 : details.grievance_types) && details.grievance_types.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.block, children: [
19292
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("grievanceTypes") || "Grievance" }),
19293
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.View, { style: styles41.chipRow, children: details.grievance_types.map((g, idx) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(PCBadge, { status: "warning", label: (g.grievance || "").replace(/_/g, " ") }, idx)) })
18503
19294
  ] }) : null,
18504
- (details == null ? void 0 : details.nomination_data) ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.block, children: [
18505
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("nominationData") || "Nomination" }),
18506
- details.nomination_data.nominee_email ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.kvRow, children: [
18507
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.kvLabel, { color: colors.textSecondary }], children: t("email") || "Email" }),
18508
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.kvValue, { color: colors.text }], children: details.nomination_data.nominee_email })
19295
+ (details == null ? void 0 : details.nomination_data) ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.block, children: [
19296
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.blockLabel, { color: colors.textSecondary }], children: t("nominationData") || "Nomination" }),
19297
+ details.nomination_data.nominee_email ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.kvRow, children: [
19298
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.kvLabel, { color: colors.textSecondary }], children: t("email") || "Email" }),
19299
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.kvValue, { color: colors.text }], children: details.nomination_data.nominee_email })
18509
19300
  ] }) : null,
18510
- details.nomination_data.nominee_mobile ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.kvRow, children: [
18511
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.kvLabel, { color: colors.textSecondary }], children: t("mobile") || "Mobile" }),
18512
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.kvValue, { color: colors.text }], children: details.nomination_data.nominee_mobile })
19301
+ details.nomination_data.nominee_mobile ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native52.View, { style: styles41.kvRow, children: [
19302
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.kvLabel, { color: colors.textSecondary }], children: t("mobile") || "Mobile" }),
19303
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.Text, { style: [styles41.kvValue, { color: colors.text }], children: details.nomination_data.nominee_mobile })
18513
19304
  ] }) : null
18514
19305
  ] }) : null
18515
19306
  ] }) : null,
18516
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.View, { style: { marginTop: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Footer, {}) })
19307
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native52.View, { style: { marginTop: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Footer, {}) })
18517
19308
  ] });
18518
19309
  }
18519
19310
  var DOT = 22;
18520
- var styles39 = import_react_native50.StyleSheet.create({
19311
+ var styles41 = import_react_native52.StyleSheet.create({
18521
19312
  container: {
18522
19313
  flex: 1
18523
19314
  },
@@ -18638,51 +19429,51 @@ var styles39 = import_react_native50.StyleSheet.create({
18638
19429
  });
18639
19430
 
18640
19431
  // src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
18641
- var import_react38 = require("react");
18642
- var import_react_native56 = require("react-native");
18643
- var import_react_i18next25 = require("react-i18next");
19432
+ var import_react40 = require("react");
19433
+ var import_react_native58 = require("react-native");
19434
+ var import_react_i18next27 = require("react-i18next");
18644
19435
 
18645
19436
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx
18646
- var import_react36 = __toESM(require("react"));
18647
- var import_react_i18next23 = require("react-i18next");
19437
+ var import_react38 = __toESM(require("react"));
19438
+ var import_react_i18next25 = require("react-i18next");
18648
19439
 
18649
19440
  // src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx
18650
- var import_react35 = __toESM(require("react"));
18651
- var import_react_native52 = require("react-native");
19441
+ var import_react37 = __toESM(require("react"));
19442
+ var import_react_native54 = require("react-native");
18652
19443
 
18653
19444
  // src/RedactoPrivacyCenter/components/CaseDetails/AttachmentCard.tsx
18654
- var import_react_native51 = require("react-native");
18655
- var import_jsx_runtime51 = require("react/jsx-runtime");
19445
+ var import_react_native53 = require("react-native");
19446
+ var import_jsx_runtime55 = require("react/jsx-runtime");
18656
19447
  function AttachmentCard({ doc }) {
18657
19448
  const { colors } = useTheme();
18658
19449
  const downloadUrl = getDownloadUrl(doc.file_url);
18659
19450
  const handlePress = () => {
18660
19451
  if (downloadUrl) {
18661
- import_react_native51.Linking.openURL(downloadUrl);
19452
+ import_react_native53.Linking.openURL(downloadUrl);
18662
19453
  }
18663
19454
  };
18664
- return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
18665
- import_react_native51.TouchableOpacity,
19455
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
19456
+ import_react_native53.TouchableOpacity,
18666
19457
  {
18667
- style: [styles40.container, { backgroundColor: colors.surface, borderColor: colors.border }],
19458
+ style: [styles42.container, { backgroundColor: colors.surface, borderColor: colors.border }],
18668
19459
  onPress: handlePress,
18669
19460
  disabled: !downloadUrl,
18670
19461
  activeOpacity: 0.7,
18671
19462
  children: [
18672
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Icon, { name: "file-text", size: 18, color: colors.textSecondary }),
18673
- /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_react_native51.View, { style: styles40.info, children: [
18674
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_react_native51.Text, { style: [styles40.fileName, { color: colors.text }], numberOfLines: 1, children: doc.file_name || "Document" }),
18675
- doc.file_size ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_react_native51.Text, { style: [styles40.fileSize, { color: colors.textSecondary }], children: formatFileSize(doc.file_size) }) : null
19463
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Icon, { name: "file-text", size: 18, color: colors.textSecondary }),
19464
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_react_native53.View, { style: styles42.info, children: [
19465
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_react_native53.Text, { style: [styles42.fileName, { color: colors.text }], numberOfLines: 1, children: doc.file_name || "Document" }),
19466
+ doc.file_size ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_react_native53.Text, { style: [styles42.fileSize, { color: colors.textSecondary }], children: formatFileSize(doc.file_size) }) : null
18676
19467
  ] })
18677
19468
  ]
18678
19469
  }
18679
19470
  );
18680
19471
  }
18681
- var styles40 = import_react_native51.StyleSheet.create({
19472
+ var styles42 = import_react_native53.StyleSheet.create({
18682
19473
  container: {
18683
19474
  flexDirection: "row",
18684
19475
  alignItems: "center",
18685
- borderWidth: import_react_native51.StyleSheet.hairlineWidth,
19476
+ borderWidth: import_react_native53.StyleSheet.hairlineWidth,
18686
19477
  borderRadius: radii.md,
18687
19478
  paddingHorizontal: spacing.sm + 2,
18688
19479
  paddingVertical: spacing.sm,
@@ -18702,11 +19493,11 @@ var styles40 = import_react_native51.StyleSheet.create({
18702
19493
  });
18703
19494
 
18704
19495
  // src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx
18705
- var import_jsx_runtime52 = require("react/jsx-runtime");
19496
+ var import_jsx_runtime56 = require("react/jsx-runtime");
18706
19497
  var AVATAR_SIZE = 28;
18707
19498
  var AVATAR_GUTTER = 36;
18708
19499
  function TeamAvatar({ tint }) {
18709
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native52.View, { style: [styles41.avatar, { backgroundColor: withAlpha(tint, 0.13) }], children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Icon, { name: "shield-check", size: 15, color: tint, strokeWidth: 2 }) });
19500
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native54.View, { style: [styles43.avatar, { backgroundColor: withAlpha(tint, 0.13) }], children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Icon, { name: "shield-check", size: 15, color: tint, strokeWidth: 2 }) });
18710
19501
  }
18711
19502
  function ChatBubbleImpl({
18712
19503
  message,
@@ -18733,28 +19524,28 @@ function ChatBubbleImpl({
18733
19524
  borderBottomRightRadius: BUBBLE_RADIUS,
18734
19525
  borderBottomLeftRadius: tailRadius
18735
19526
  };
18736
- const bubble = /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_react_native52.View, { style: [styles41.bubble, bubbleStyle], children: [
18737
- !isPrincipal && isFirstInGroup ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native52.Text, { style: [styles41.bubbleSender, { color: colors.primary }], numberOfLines: 1, children: senderLabel }) : null,
18738
- message.body ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native52.Text, { style: [styles41.body, { color: isPrincipal ? colors.primaryText : colors.text }], children: message.body }) : null,
18739
- message.documents && message.documents.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native52.View, { style: styles41.attachments, children: message.documents.map((doc) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(AttachmentCard, { doc }, doc.uuid)) }) : null
19527
+ const bubble = /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_react_native54.View, { style: [styles43.bubble, bubbleStyle], children: [
19528
+ !isPrincipal && isFirstInGroup ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native54.Text, { style: [styles43.bubbleSender, { color: colors.primary }], numberOfLines: 1, children: senderLabel }) : null,
19529
+ message.body ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native54.Text, { style: [styles43.body, { color: isPrincipal ? colors.primaryText : colors.text }], children: message.body }) : null,
19530
+ message.documents && message.documents.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native54.View, { style: styles43.attachments, children: message.documents.map((doc) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(AttachmentCard, { doc }, doc.uuid)) }) : null
18740
19531
  ] });
18741
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
18742
- import_react_native52.View,
19532
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
19533
+ import_react_native54.View,
18743
19534
  {
18744
19535
  style: [
18745
- styles41.row,
18746
- isPrincipal ? styles41.rowRight : styles41.rowLeft,
19536
+ styles43.row,
19537
+ isPrincipal ? styles43.rowRight : styles43.rowLeft,
18747
19538
  { marginTop: isFirstInGroup ? spacing.md : 2 }
18748
19539
  ],
18749
19540
  children: [
18750
- !isPrincipal ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native52.View, { style: styles41.avatarSlot, children: isFirstInGroup ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(TeamAvatar, { tint: colors.primary }) : null }) : null,
18751
- /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_react_native52.View, { style: [styles41.column, isPrincipal ? styles41.columnRight : styles41.columnLeft], children: [
19541
+ !isPrincipal ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native54.View, { style: styles43.avatarSlot, children: isFirstInGroup ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(TeamAvatar, { tint: colors.primary }) : null }) : null,
19542
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_react_native54.View, { style: [styles43.column, isPrincipal ? styles43.columnRight : styles43.columnLeft], children: [
18752
19543
  bubble,
18753
- isLastInGroup ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
18754
- import_react_native52.Text,
19544
+ isLastInGroup ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
19545
+ import_react_native54.Text,
18755
19546
  {
18756
19547
  style: [
18757
- styles41.timestamp,
19548
+ styles43.timestamp,
18758
19549
  { color: colors.textSecondary, textAlign: isPrincipal ? "right" : "left" }
18759
19550
  ],
18760
19551
  children: formatMessageTime(timestamp)
@@ -18765,8 +19556,8 @@ function ChatBubbleImpl({
18765
19556
  }
18766
19557
  );
18767
19558
  }
18768
- var ChatBubble = import_react35.default.memo(ChatBubbleImpl);
18769
- var styles41 = import_react_native52.StyleSheet.create({
19559
+ var ChatBubble = import_react37.default.memo(ChatBubbleImpl);
19560
+ var styles43 = import_react_native54.StyleSheet.create({
18770
19561
  row: {
18771
19562
  flexDirection: "row",
18772
19563
  paddingHorizontal: spacing.md,
@@ -18826,9 +19617,9 @@ var styles41 = import_react_native52.StyleSheet.create({
18826
19617
  });
18827
19618
 
18828
19619
  // src/RedactoPrivacyCenter/components/CaseDetails/DocumentRequestCard.tsx
18829
- var import_react_native53 = require("react-native");
18830
- var import_react_i18next22 = require("react-i18next");
18831
- var import_jsx_runtime53 = require("react/jsx-runtime");
19620
+ var import_react_native55 = require("react-native");
19621
+ var import_react_i18next24 = require("react-i18next");
19622
+ var import_jsx_runtime57 = require("react/jsx-runtime");
18832
19623
  var STATUS_BADGE_MAP = {
18833
19624
  pending: "warning",
18834
19625
  under_review: "info",
@@ -18848,20 +19639,20 @@ function humanize(value) {
18848
19639
  }
18849
19640
  function DocumentRequestCard({ message, onUpload, isSubmitting, isCaseFinalized = false }) {
18850
19641
  var _a3;
18851
- const { t } = (0, import_react_i18next22.useTranslation)();
19642
+ const { t } = (0, import_react_i18next24.useTranslation)();
18852
19643
  const { colors } = useTheme();
18853
19644
  const meta = message.document_request_metadata;
18854
19645
  if (!meta) return null;
18855
19646
  const status = meta.document_request_status;
18856
19647
  const canUpload = (status === "pending" || status === "replacement_requested") && !isCaseFinalized;
18857
19648
  const requestEventUuid = meta.document_request_uuid;
18858
- return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.View, { style: [styles42.container, { borderColor: colors.border, backgroundColor: colors.surface }], children: [
18859
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.View, { style: styles42.header, children: [
18860
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.View, { style: styles42.titleRow, children: [
18861
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(Icon, { name: "file-check", size: 16, color: colors.primary, strokeWidth: 2 }),
18862
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_react_native53.Text, { style: [styles42.title, { color: colors.text }], children: meta.title || t("documentRequestedLabel") || "Document Requested" })
19649
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native55.View, { style: [styles44.container, { borderColor: colors.border, backgroundColor: colors.surface }], children: [
19650
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native55.View, { style: styles44.header, children: [
19651
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native55.View, { style: styles44.titleRow, children: [
19652
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(Icon, { name: "file-check", size: 16, color: colors.primary, strokeWidth: 2 }),
19653
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native55.Text, { style: [styles44.title, { color: colors.text }], children: meta.title || t("documentRequestedLabel") || "Document Requested" })
18863
19654
  ] }),
18864
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
19655
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
18865
19656
  PCBadge,
18866
19657
  {
18867
19658
  status: STATUS_BADGE_MAP[status] || "info",
@@ -18869,30 +19660,30 @@ function DocumentRequestCard({ message, onUpload, isSubmitting, isCaseFinalized
18869
19660
  }
18870
19661
  )
18871
19662
  ] }),
18872
- meta.accepted_document ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_react_native53.Text, { style: [styles42.accepted, { color: colors.textSecondary }], children: t("acceptedLabel", {
19663
+ meta.accepted_document ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native55.Text, { style: [styles44.accepted, { color: colors.textSecondary }], children: t("acceptedLabel", {
18873
19664
  accepted: meta.accepted_document,
18874
19665
  defaultValue: `Accepted: ${meta.accepted_document}`
18875
19666
  }) }) : null,
18876
- meta.rejection_reason ? /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.View, { style: [styles42.rejectionBox, { backgroundColor: colors.errorSoft }], children: [
18877
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.Text, { style: [styles42.rejectionLabel, { color: colors.error }], children: [
19667
+ meta.rejection_reason ? /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native55.View, { style: [styles44.rejectionBox, { backgroundColor: colors.errorSoft }], children: [
19668
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native55.Text, { style: [styles44.rejectionLabel, { color: colors.error }], children: [
18878
19669
  t("rejectionReasonLabel") || "Rejection reason",
18879
19670
  ":"
18880
19671
  ] }),
18881
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_react_native53.Text, { style: [styles42.rejectionText, { color: colors.error }], children: meta.rejection_reason })
19672
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native55.Text, { style: [styles44.rejectionText, { color: colors.error }], children: meta.rejection_reason })
18882
19673
  ] }) : null,
18883
- canUpload && requestEventUuid ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18884
- import_react_native53.TouchableOpacity,
19674
+ canUpload && requestEventUuid ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
19675
+ import_react_native55.TouchableOpacity,
18885
19676
  {
18886
- style: [styles42.uploadButton, { backgroundColor: colors.primary }],
19677
+ style: [styles44.uploadButton, { backgroundColor: colors.primary }],
18887
19678
  onPress: () => onUpload(requestEventUuid),
18888
19679
  disabled: isSubmitting,
18889
19680
  activeOpacity: 0.7,
18890
- children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_react_native53.Text, { style: [styles42.uploadButtonText, { color: colors.primaryText }], children: isSubmitting ? t("loading") || "Loading..." : t("uploadAndSubmit") || "Upload & Submit" })
19681
+ children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native55.Text, { style: [styles44.uploadButtonText, { color: colors.primaryText }], children: isSubmitting ? t("loading") || "Loading..." : t("uploadAndSubmit") || "Upload & Submit" })
18891
19682
  }
18892
19683
  ) : null
18893
19684
  ] });
18894
19685
  }
18895
- var styles42 = import_react_native53.StyleSheet.create({
19686
+ var styles44 = import_react_native55.StyleSheet.create({
18896
19687
  container: {
18897
19688
  borderWidth: 1.5,
18898
19689
  borderStyle: "dashed",
@@ -18945,20 +19736,20 @@ var styles42 = import_react_native53.StyleSheet.create({
18945
19736
  });
18946
19737
 
18947
19738
  // src/RedactoPrivacyCenter/components/CaseDetails/StatusEvent.tsx
18948
- var import_react_native54 = require("react-native");
18949
- var import_jsx_runtime54 = require("react/jsx-runtime");
19739
+ var import_react_native56 = require("react-native");
19740
+ var import_jsx_runtime58 = require("react/jsx-runtime");
18950
19741
  function StatusEvent({ icon, color, bgColor, borderColor, text, subText, timestamp }) {
18951
19742
  const { colors } = useTheme();
18952
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native54.View, { style: [styles43.container, { backgroundColor: bgColor }], children: [
18953
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native54.View, { style: [styles43.iconBubble, { backgroundColor: `${color}1F` }], children: icon }),
18954
- /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native54.View, { style: styles43.textContainer, children: [
18955
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native54.Text, { style: [styles43.text, { color }], children: text }),
18956
- subText ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native54.Text, { style: [styles43.subText, { color: colors.textSecondary }], numberOfLines: 2, children: subText }) : null
19743
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native56.View, { style: [styles45.container, { backgroundColor: bgColor }], children: [
19744
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native56.View, { style: [styles45.iconBubble, { backgroundColor: `${color}1F` }], children: icon }),
19745
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native56.View, { style: styles45.textContainer, children: [
19746
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native56.Text, { style: [styles45.text, { color }], children: text }),
19747
+ subText ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native56.Text, { style: [styles45.subText, { color: colors.textSecondary }], numberOfLines: 2, children: subText }) : null
18957
19748
  ] }),
18958
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native54.Text, { style: [styles43.timestamp, { color: colors.textSecondary }], children: formatMessageTime(timestamp) })
19749
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native56.Text, { style: [styles45.timestamp, { color: colors.textSecondary }], children: formatMessageTime(timestamp) })
18959
19750
  ] });
18960
19751
  }
18961
- var styles43 = import_react_native54.StyleSheet.create({
19752
+ var styles45 = import_react_native56.StyleSheet.create({
18962
19753
  container: {
18963
19754
  flexDirection: "row",
18964
19755
  alignItems: "center",
@@ -18997,10 +19788,10 @@ var styles43 = import_react_native54.StyleSheet.create({
18997
19788
  });
18998
19789
 
18999
19790
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx
19000
- var import_jsx_runtime55 = require("react/jsx-runtime");
19001
- var CheckIcon = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Icon, { name: "check", size: 14, color, strokeWidth: 2.6 });
19002
- var XIcon = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Icon, { name: "x", size: 14, color, strokeWidth: 2.6 });
19003
- var RefreshIcon = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Icon, { name: "refresh-cw", size: 14, color, strokeWidth: 2.2 });
19791
+ var import_jsx_runtime59 = require("react/jsx-runtime");
19792
+ var CheckIcon = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Icon, { name: "check", size: 14, color, strokeWidth: 2.6 });
19793
+ var XIcon = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Icon, { name: "x", size: 14, color, strokeWidth: 2.6 });
19794
+ var RefreshIcon = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Icon, { name: "refresh-cw", size: 14, color, strokeWidth: 2.2 });
19004
19795
  function MessageItemImpl({
19005
19796
  message,
19006
19797
  onUploadForRequest,
@@ -19010,14 +19801,14 @@ function MessageItemImpl({
19010
19801
  isLastInGroup = true
19011
19802
  }) {
19012
19803
  var _a3, _b;
19013
- const { t } = (0, import_react_i18next23.useTranslation)();
19804
+ const { t } = (0, import_react_i18next25.useTranslation)();
19014
19805
  const isPrincipal = message.sender_role === "data_principal";
19015
19806
  const senderLabel = isPrincipal ? t("senderYou") || "You" : t("senderPrivacyTeam") || "Privacy Team";
19016
19807
  switch (message.message_type) {
19017
19808
  case "message_sent":
19018
19809
  case "document_submitted":
19019
19810
  case "document_replaced":
19020
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19811
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19021
19812
  ChatBubble,
19022
19813
  {
19023
19814
  message,
@@ -19029,8 +19820,8 @@ function MessageItemImpl({
19029
19820
  }
19030
19821
  );
19031
19822
  case "document_requested":
19032
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_jsx_runtime55.Fragment, { children: [
19033
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19823
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_jsx_runtime59.Fragment, { children: [
19824
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19034
19825
  ChatBubble,
19035
19826
  {
19036
19827
  message,
@@ -19041,7 +19832,7 @@ function MessageItemImpl({
19041
19832
  isLastInGroup
19042
19833
  }
19043
19834
  ),
19044
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19835
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19045
19836
  DocumentRequestCard,
19046
19837
  {
19047
19838
  message,
@@ -19052,10 +19843,10 @@ function MessageItemImpl({
19052
19843
  )
19053
19844
  ] });
19054
19845
  case "document_approved":
19055
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19846
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19056
19847
  StatusEvent,
19057
19848
  {
19058
- icon: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(CheckIcon, { color: "#059669" }),
19849
+ icon: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(CheckIcon, { color: "#059669" }),
19059
19850
  color: "#059669",
19060
19851
  bgColor: "rgba(16, 185, 129, 0.08)",
19061
19852
  borderColor: "rgba(16, 185, 129, 0.2)",
@@ -19064,10 +19855,10 @@ function MessageItemImpl({
19064
19855
  }
19065
19856
  );
19066
19857
  case "document_rejected":
19067
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19858
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19068
19859
  StatusEvent,
19069
19860
  {
19070
- icon: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(XIcon, { color: "#DC2626" }),
19861
+ icon: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(XIcon, { color: "#DC2626" }),
19071
19862
  color: "#DC2626",
19072
19863
  bgColor: "rgba(220, 38, 38, 0.08)",
19073
19864
  borderColor: "rgba(220, 38, 38, 0.2)",
@@ -19077,10 +19868,10 @@ function MessageItemImpl({
19077
19868
  }
19078
19869
  );
19079
19870
  case "document_replacement_requested":
19080
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19871
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19081
19872
  StatusEvent,
19082
19873
  {
19083
- icon: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(RefreshIcon, { color: "#D97706" }),
19874
+ icon: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(RefreshIcon, { color: "#D97706" }),
19084
19875
  color: "#D97706",
19085
19876
  bgColor: "rgba(245, 158, 11, 0.08)",
19086
19877
  borderColor: "rgba(245, 158, 11, 0.2)",
@@ -19090,7 +19881,7 @@ function MessageItemImpl({
19090
19881
  }
19091
19882
  );
19092
19883
  default:
19093
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19884
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19094
19885
  ChatBubble,
19095
19886
  {
19096
19887
  message,
@@ -19103,13 +19894,13 @@ function MessageItemImpl({
19103
19894
  );
19104
19895
  }
19105
19896
  }
19106
- var MessageItem = import_react36.default.memo(MessageItemImpl);
19897
+ var MessageItem = import_react38.default.memo(MessageItemImpl);
19107
19898
 
19108
19899
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageComposer.tsx
19109
- var import_react37 = require("react");
19110
- var import_react_native55 = require("react-native");
19111
- var import_react_i18next24 = require("react-i18next");
19112
- var import_jsx_runtime56 = require("react/jsx-runtime");
19900
+ var import_react39 = require("react");
19901
+ var import_react_native57 = require("react-native");
19902
+ var import_react_i18next26 = require("react-i18next");
19903
+ var import_jsx_runtime60 = require("react/jsx-runtime");
19113
19904
  function MessageComposer({
19114
19905
  messageText,
19115
19906
  onMessageTextChange,
@@ -19121,15 +19912,15 @@ function MessageComposer({
19121
19912
  isUploading,
19122
19913
  isCaseFinalized = false
19123
19914
  }) {
19124
- const { t } = (0, import_react_i18next24.useTranslation)();
19915
+ const { t } = (0, import_react_i18next26.useTranslation)();
19125
19916
  const { colors } = useTheme();
19126
19917
  const canSend = (messageText.trim().length > 0 || pendingUpload) && !isSending && !isUploading && !isCaseFinalized;
19127
- const activate = (0, import_react37.useRef)(new import_react_native55.Animated.Value(canSend ? 1 : 0)).current;
19128
- (0, import_react37.useEffect)(() => {
19129
- import_react_native55.Animated.timing(activate, {
19918
+ const activate = (0, import_react39.useRef)(new import_react_native57.Animated.Value(canSend ? 1 : 0)).current;
19919
+ (0, import_react39.useEffect)(() => {
19920
+ import_react_native57.Animated.timing(activate, {
19130
19921
  toValue: canSend ? 1 : 0,
19131
19922
  duration: 180,
19132
- easing: import_react_native55.Easing.out(import_react_native55.Easing.quad),
19923
+ easing: import_react_native57.Easing.out(import_react_native57.Easing.quad),
19133
19924
  useNativeDriver: false
19134
19925
  }).start();
19135
19926
  }, [canSend, activate]);
@@ -19137,30 +19928,30 @@ function MessageComposer({
19137
19928
  inputRange: [0, 1],
19138
19929
  outputRange: [colors.border, colors.primary]
19139
19930
  });
19140
- const pressScale = (0, import_react37.useRef)(new import_react_native55.Animated.Value(1)).current;
19931
+ const pressScale = (0, import_react39.useRef)(new import_react_native57.Animated.Value(1)).current;
19141
19932
  const handlePressIn = () => {
19142
- import_react_native55.Animated.spring(pressScale, { toValue: 0.88, useNativeDriver: true, speed: 30, bounciness: 0 }).start();
19933
+ import_react_native57.Animated.spring(pressScale, { toValue: 0.88, useNativeDriver: true, speed: 30, bounciness: 0 }).start();
19143
19934
  };
19144
19935
  const handlePressOut = () => {
19145
- import_react_native55.Animated.spring(pressScale, { toValue: 1, useNativeDriver: true, speed: 20, bounciness: 6 }).start();
19936
+ import_react_native57.Animated.spring(pressScale, { toValue: 1, useNativeDriver: true, speed: 20, bounciness: 6 }).start();
19146
19937
  };
19147
- const pillIn = (0, import_react37.useRef)(new import_react_native55.Animated.Value(0)).current;
19148
- (0, import_react37.useEffect)(() => {
19149
- import_react_native55.Animated.timing(pillIn, {
19938
+ const pillIn = (0, import_react39.useRef)(new import_react_native57.Animated.Value(0)).current;
19939
+ (0, import_react39.useEffect)(() => {
19940
+ import_react_native57.Animated.timing(pillIn, {
19150
19941
  toValue: pendingUpload ? 1 : 0,
19151
19942
  duration: 220,
19152
- easing: import_react_native55.Easing.out(import_react_native55.Easing.cubic),
19943
+ easing: import_react_native57.Easing.out(import_react_native57.Easing.cubic),
19153
19944
  useNativeDriver: true
19154
19945
  }).start();
19155
19946
  }, [pendingUpload, pillIn]);
19156
19947
  const pillOpacity = pillIn;
19157
19948
  const pillTranslateY = pillIn.interpolate({ inputRange: [0, 1], outputRange: [8, 0] });
19158
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_react_native55.View, { style: [styles44.container, { borderTopColor: colors.hairline, backgroundColor: colors.canvasSubtle, paddingBottom: spacing.sm }], children: [
19159
- pendingUpload && /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
19160
- import_react_native55.Animated.View,
19949
+ return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_react_native57.View, { style: [styles46.container, { borderTopColor: colors.hairline, backgroundColor: colors.canvasSubtle, paddingBottom: spacing.sm }], children: [
19950
+ pendingUpload && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
19951
+ import_react_native57.Animated.View,
19161
19952
  {
19162
19953
  style: [
19163
- styles44.uploadPill,
19954
+ styles46.uploadPill,
19164
19955
  {
19165
19956
  backgroundColor: colors.primarySoft,
19166
19957
  opacity: pillOpacity,
@@ -19168,34 +19959,34 @@ function MessageComposer({
19168
19959
  }
19169
19960
  ],
19170
19961
  children: [
19171
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Icon, { name: "file", size: 14, color: colors.primary }),
19172
- /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_react_native55.Text, { style: [styles44.uploadFileName, { color: colors.primary }], numberOfLines: 1, children: [
19962
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(Icon, { name: "file", size: 14, color: colors.primary }),
19963
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_react_native57.Text, { style: [styles46.uploadFileName, { color: colors.primary }], numberOfLines: 1, children: [
19173
19964
  pendingUpload.file_name,
19174
19965
  " (",
19175
19966
  formatFileSize(pendingUpload.file_size),
19176
19967
  ")"
19177
19968
  ] }),
19178
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native55.TouchableOpacity, { onPress: onRemovePendingUpload, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Icon, { name: "x", size: 14, color: colors.textSecondary, strokeWidth: 2.4 }) })
19969
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_react_native57.TouchableOpacity, { onPress: onRemovePendingUpload, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(Icon, { name: "x", size: 14, color: colors.textSecondary, strokeWidth: 2.4 }) })
19179
19970
  ]
19180
19971
  }
19181
19972
  ),
19182
- /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_react_native55.View, { style: [styles44.pill, { backgroundColor: colors.surface, borderColor: colors.border }, isCaseFinalized && styles44.pillDisabled], children: [
19183
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
19184
- import_react_native55.TouchableOpacity,
19973
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_react_native57.View, { style: [styles46.pill, { backgroundColor: colors.surface, borderColor: colors.border }, isCaseFinalized && styles46.pillDisabled], children: [
19974
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
19975
+ import_react_native57.TouchableOpacity,
19185
19976
  {
19186
- style: styles44.attachButton,
19977
+ style: styles46.attachButton,
19187
19978
  onPress: onAttachClick,
19188
19979
  disabled: isUploading || isCaseFinalized,
19189
19980
  activeOpacity: 0.6,
19190
19981
  hitSlop: DEFAULT_HIT_SLOP,
19191
19982
  accessibilityLabel: t("uploadFile") || "Attach file",
19192
- children: isUploading ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native55.ActivityIndicator, { size: "small", color: colors.primary }) : /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Icon, { name: "paperclip", size: 20, color: colors.textSecondary })
19983
+ children: isUploading ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_react_native57.ActivityIndicator, { size: "small", color: colors.primary }) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(Icon, { name: "paperclip", size: 20, color: colors.textSecondary })
19193
19984
  }
19194
19985
  ),
19195
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
19196
- import_react_native55.TextInput,
19986
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
19987
+ import_react_native57.TextInput,
19197
19988
  {
19198
- style: [styles44.input, { color: colors.text }],
19989
+ style: [styles46.input, { color: colors.text }],
19199
19990
  value: messageText,
19200
19991
  onChangeText: onMessageTextChange,
19201
19992
  placeholder: t("messageInputPlaceholder", { defaultValue: "Message\u2026" }),
@@ -19205,8 +19996,8 @@ function MessageComposer({
19205
19996
  editable: !isSending && !isCaseFinalized
19206
19997
  }
19207
19998
  ),
19208
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native55.Animated.View, { style: { transform: [{ scale: pressScale }] }, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
19209
- import_react_native55.TouchableOpacity,
19999
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_react_native57.Animated.View, { style: { transform: [{ scale: pressScale }] }, children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
20000
+ import_react_native57.TouchableOpacity,
19210
20001
  {
19211
20002
  onPress: onSend,
19212
20003
  onPressIn: handlePressIn,
@@ -19214,15 +20005,15 @@ function MessageComposer({
19214
20005
  disabled: !canSend,
19215
20006
  activeOpacity: 0.85,
19216
20007
  accessibilityLabel: t("send") || "Send",
19217
- children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native55.Animated.View, { style: [styles44.sendButton, { backgroundColor: sendBgColor }], children: isSending ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native55.ActivityIndicator, { size: "small", color: colors.primaryText }) : /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native55.View, { style: styles44.sendIcon, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Icon, { name: "send", size: 18, color: canSend ? colors.primaryText : colors.textSecondary }) }) })
20008
+ children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_react_native57.Animated.View, { style: [styles46.sendButton, { backgroundColor: sendBgColor }], children: isSending ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_react_native57.ActivityIndicator, { size: "small", color: colors.primaryText }) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_react_native57.View, { style: styles46.sendIcon, children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(Icon, { name: "send", size: 18, color: canSend ? colors.primaryText : colors.textSecondary }) }) })
19218
20009
  }
19219
20010
  ) })
19220
20011
  ] })
19221
20012
  ] });
19222
20013
  }
19223
- var styles44 = import_react_native55.StyleSheet.create({
20014
+ var styles46 = import_react_native57.StyleSheet.create({
19224
20015
  container: {
19225
- borderTopWidth: import_react_native55.StyleSheet.hairlineWidth,
20016
+ borderTopWidth: import_react_native57.StyleSheet.hairlineWidth,
19226
20017
  paddingHorizontal: spacing.md,
19227
20018
  paddingVertical: spacing.sm
19228
20019
  },
@@ -19245,7 +20036,7 @@ var styles44 = import_react_native55.StyleSheet.create({
19245
20036
  pill: {
19246
20037
  flexDirection: "row",
19247
20038
  alignItems: "center",
19248
- borderWidth: import_react_native55.StyleSheet.hairlineWidth,
20039
+ borderWidth: import_react_native57.StyleSheet.hairlineWidth,
19249
20040
  borderRadius: radii.xxl + 4,
19250
20041
  paddingHorizontal: spacing.xs + 2,
19251
20042
  paddingVertical: spacing.xs,
@@ -19284,7 +20075,7 @@ var styles44 = import_react_native55.StyleSheet.create({
19284
20075
  });
19285
20076
 
19286
20077
  // src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
19287
- var import_jsx_runtime57 = require("react/jsx-runtime");
20078
+ var import_jsx_runtime61 = require("react/jsx-runtime");
19288
20079
  var STREAK_GAP_MS = 5 * 60 * 1e3;
19289
20080
  function isStreakBoundary(a, b) {
19290
20081
  if (!a || !b) return true;
@@ -19314,11 +20105,11 @@ function sameDay(a, b) {
19314
20105
  }
19315
20106
  var MESSAGE_POLL_INTERVAL = 3e4;
19316
20107
  function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19317
- const { t } = (0, import_react_i18next25.useTranslation)();
20108
+ const { t } = (0, import_react_i18next27.useTranslation)();
19318
20109
  const { accessToken, refreshToken, email, organizationId, workspaceId, onError, updateTokens } = useAuth();
19319
20110
  const { consentClient } = useBaseUrl();
19320
20111
  const { colors } = useTheme();
19321
- const authContext = (0, import_react38.useMemo)(() => ({
20112
+ const authContext = (0, import_react40.useMemo)(() => ({
19322
20113
  accessToken,
19323
20114
  refreshToken,
19324
20115
  onError,
@@ -19330,13 +20121,13 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19330
20121
  caseUuid,
19331
20122
  authContext
19332
20123
  );
19333
- const [messageText, setMessageText] = (0, import_react38.useState)("");
19334
- const [pendingUpload, setPendingUpload] = (0, import_react38.useState)(null);
19335
- const [isSending, setIsSending] = (0, import_react38.useState)(false);
19336
- const [isUploading, setIsUploading] = (0, import_react38.useState)(false);
19337
- const [isSubmittingForRequest, setIsSubmittingForRequest] = (0, import_react38.useState)(false);
19338
- const flatListRef = (0, import_react38.useRef)(null);
19339
- (0, import_react38.useEffect)(() => {
20124
+ const [messageText, setMessageText] = (0, import_react40.useState)("");
20125
+ const [pendingUpload, setPendingUpload] = (0, import_react40.useState)(null);
20126
+ const [isSending, setIsSending] = (0, import_react40.useState)(false);
20127
+ const [isUploading, setIsUploading] = (0, import_react40.useState)(false);
20128
+ const [isSubmittingForRequest, setIsSubmittingForRequest] = (0, import_react40.useState)(false);
20129
+ const flatListRef = (0, import_react40.useRef)(null);
20130
+ (0, import_react40.useEffect)(() => {
19340
20131
  if (messages && messages.length > 0) {
19341
20132
  setTimeout(() => {
19342
20133
  var _a3;
@@ -19344,16 +20135,19 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19344
20135
  }, 100);
19345
20136
  }
19346
20137
  }, [messages == null ? void 0 : messages.length]);
19347
- const refetchRef = (0, import_react38.useRef)(refetch);
20138
+ const refetchRef = (0, import_react40.useRef)(refetch);
19348
20139
  refetchRef.current = refetch;
19349
- (0, import_react38.useEffect)(() => {
20140
+ const authContextRef = (0, import_react40.useRef)(authContext);
20141
+ authContextRef.current = authContext;
20142
+ (0, import_react40.useEffect)(() => {
19350
20143
  if (isCaseFinalized) return;
19351
20144
  const id = setInterval(() => {
20145
+ if (isRefreshBlocked(authContextRef.current)) return;
19352
20146
  refetchRef.current();
19353
20147
  }, MESSAGE_POLL_INTERVAL);
19354
20148
  return () => clearInterval(id);
19355
20149
  }, [isCaseFinalized]);
19356
- const handleSend = (0, import_react38.useCallback)(async () => {
20150
+ const handleSend = (0, import_react40.useCallback)(async () => {
19357
20151
  if (isCaseFinalized) return;
19358
20152
  if (!messageText.trim() && !pendingUpload) return;
19359
20153
  if (!organizationId || !workspaceId) return;
@@ -19378,7 +20172,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19378
20172
  setIsSending(false);
19379
20173
  }
19380
20174
  }, [isCaseFinalized, messageText, pendingUpload, organizationId, workspaceId, caseUuid, authContext, consentClient, refetch]);
19381
- const handleAttach = (0, import_react38.useCallback)(async () => {
20175
+ const handleAttach = (0, import_react40.useCallback)(async () => {
19382
20176
  if (isCaseFinalized) return;
19383
20177
  if (!organizationId || !workspaceId) return;
19384
20178
  try {
@@ -19413,10 +20207,10 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19413
20207
  setIsUploading(false);
19414
20208
  }
19415
20209
  }, [isCaseFinalized, organizationId, workspaceId, caseUuid, authContext, consentClient]);
19416
- const handleUploadForRequest = (0, import_react38.useCallback)((_requestEventUuid) => {
20210
+ const handleUploadForRequest = (0, import_react40.useCallback)((_requestEventUuid) => {
19417
20211
  handleAttach();
19418
20212
  }, [handleAttach]);
19419
- const messagesList = (0, import_react38.useMemo)(() => {
20213
+ const messagesList = (0, import_react40.useMemo)(() => {
19420
20214
  const list = messages ? [...messages] : [];
19421
20215
  list.sort((a, b) => {
19422
20216
  const ta = new Date(a.created_at).getTime();
@@ -19425,17 +20219,17 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19425
20219
  });
19426
20220
  return list;
19427
20221
  }, [messages]);
19428
- const keyExtractor = (0, import_react38.useCallback)((item) => item.uuid, []);
19429
- const renderMessage = (0, import_react38.useCallback)(
20222
+ const keyExtractor = (0, import_react40.useCallback)((item) => item.uuid, []);
20223
+ const renderMessage = (0, import_react40.useCallback)(
19430
20224
  ({ item, index }) => {
19431
20225
  const prev = index > 0 ? messagesList[index - 1] : void 0;
19432
20226
  const next = index < messagesList.length - 1 ? messagesList[index + 1] : void 0;
19433
20227
  const isFirstInGroup = isStreakBoundary(prev, item);
19434
20228
  const isLastInGroup = isStreakBoundary(item, next);
19435
20229
  const dateSeparator = getDateSeparator(prev == null ? void 0 : prev.created_at, item.created_at, t);
19436
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
19437
- dateSeparator ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.View, { style: styles45.daySeparator, children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.View, { style: [styles45.dayPill, { backgroundColor: colors.surfaceAlt }], children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.Text, { style: [styles45.dayPillText, { color: colors.textSecondary }], children: dateSeparator }) }) }) : null,
19438
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
20230
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [
20231
+ dateSeparator ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.View, { style: styles47.daySeparator, children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.View, { style: [styles47.dayPill, { backgroundColor: colors.surfaceAlt }], children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.Text, { style: [styles47.dayPillText, { color: colors.textSecondary }], children: dateSeparator }) }) }) : null,
20232
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
19439
20233
  MessageItem,
19440
20234
  {
19441
20235
  message: item,
@@ -19451,32 +20245,32 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19451
20245
  [messagesList, handleUploadForRequest, isSubmittingForRequest, isCaseFinalized, colors, t]
19452
20246
  );
19453
20247
  if (isLoading) {
19454
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.View, { style: styles45.centered, children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.ActivityIndicator, { size: "large", color: colors.primary }) });
20248
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.View, { style: styles47.centered, children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.ActivityIndicator, { size: "large", color: colors.primary }) });
19455
20249
  }
19456
20250
  if (error) {
19457
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.View, { style: styles45.centered, children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.Text, { style: [styles45.errorText, { color: colors.error }], children: t("errorLoadingMessages") || "Error loading messages" }) });
20251
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.View, { style: styles47.centered, children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.Text, { style: [styles47.errorText, { color: colors.error }], children: t("errorLoadingMessages") || "Error loading messages" }) });
19458
20252
  }
19459
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native56.View, { style: [styles45.container, { backgroundColor: colors.canvasSubtle }], children: [
19460
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native56.View, { style: styles45.secureRow, children: [
19461
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(Icon, { name: "lock", size: 12, color: colors.textSecondary, strokeWidth: 2.2 }),
19462
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.Text, { 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"}` })
20253
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_react_native58.View, { style: [styles47.container, { backgroundColor: colors.canvasSubtle }], children: [
20254
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_react_native58.View, { style: styles47.secureRow, children: [
20255
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(Icon, { name: "lock", size: 12, color: colors.textSecondary, strokeWidth: 2.2 }),
20256
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.Text, { 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"}` })
19463
20257
  ] }),
19464
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
19465
- import_react_native56.FlatList,
20258
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
20259
+ import_react_native58.FlatList,
19466
20260
  {
19467
20261
  ref: flatListRef,
19468
- style: styles45.list,
20262
+ style: styles47.list,
19469
20263
  data: messagesList,
19470
20264
  keyExtractor,
19471
20265
  renderItem: renderMessage,
19472
20266
  contentContainerStyle: [
19473
- styles45.messagesList,
19474
- messagesList.length ? styles45.messagesListFill : styles45.messagesListCenter
20267
+ styles47.messagesList,
20268
+ messagesList.length ? styles47.messagesListFill : styles47.messagesListCenter
19475
20269
  ],
19476
- ListEmptyComponent: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native56.View, { style: styles45.emptyContainer, children: [
19477
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.View, { style: [styles45.emptyIconWrap, { backgroundColor: colors.primarySoft }], children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(Icon, { name: "messages-square", size: 28, color: colors.primary, strokeWidth: 2 }) }),
19478
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.Text, { style: [styles45.emptyTitle, { color: colors.text }], children: t("noMessagesYet") || "No messages yet" }),
19479
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.Text, { style: [styles45.emptySubtitle, { color: colors.textSecondary }], children: t("noMessagesYetSubtitle", "Start the conversation below") })
20270
+ ListEmptyComponent: /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_react_native58.View, { style: styles47.emptyContainer, children: [
20271
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.View, { style: [styles47.emptyIconWrap, { backgroundColor: colors.primarySoft }], children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(Icon, { name: "messages-square", size: 28, color: colors.primary, strokeWidth: 2 }) }),
20272
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.Text, { style: [styles47.emptyTitle, { color: colors.text }], children: t("noMessagesYet") || "No messages yet" }),
20273
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native58.Text, { style: [styles47.emptySubtitle, { color: colors.textSecondary }], children: t("noMessagesYetSubtitle", "Start the conversation below") })
19480
20274
  ] }),
19481
20275
  onContentSizeChange: () => {
19482
20276
  var _a3;
@@ -19488,7 +20282,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19488
20282
  removeClippedSubviews: true
19489
20283
  }
19490
20284
  ),
19491
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
20285
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
19492
20286
  MessageComposer,
19493
20287
  {
19494
20288
  messageText,
@@ -19504,7 +20298,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19504
20298
  )
19505
20299
  ] });
19506
20300
  }
19507
- var styles45 = import_react_native56.StyleSheet.create({
20301
+ var styles47 = import_react_native58.StyleSheet.create({
19508
20302
  container: {
19509
20303
  flex: 1
19510
20304
  },
@@ -19587,17 +20381,17 @@ var styles45 = import_react_native56.StyleSheet.create({
19587
20381
  });
19588
20382
 
19589
20383
  // src/RedactoPrivacyCenter/components/CaseDetails/CaseDetailsPage.tsx
19590
- var import_jsx_runtime58 = require("react/jsx-runtime");
20384
+ var import_jsx_runtime62 = require("react/jsx-runtime");
19591
20385
  function CaseDetailsPage() {
19592
20386
  var _a3, _b;
19593
- const { t } = (0, import_react_i18next26.useTranslation)();
20387
+ const { t } = (0, import_react_i18next28.useTranslation)();
19594
20388
  const { navigateTo, selectedCase, setSelectedCase, pendingCaseUuid } = useInternalNavigation();
19595
20389
  const { accessToken, refreshToken, email, organizationId, workspaceId, onError, updateTokens } = useAuth();
19596
20390
  const { colors } = useTheme();
19597
20391
  const { keyboardOffset } = usePrivacyCenterInsets();
19598
20392
  const requestTypeLabels = useRequestTypeLabels();
19599
- const [activeTab, setActiveTab] = (0, import_react39.useState)("request-details");
19600
- const authContext = (0, import_react39.useMemo)(() => ({
20393
+ const [activeTab, setActiveTab] = (0, import_react41.useState)("request-details");
20394
+ const authContext = (0, import_react41.useMemo)(() => ({
19601
20395
  accessToken,
19602
20396
  refreshToken,
19603
20397
  onError,
@@ -19610,7 +20404,7 @@ function CaseDetailsPage() {
19610
20404
  email != null ? email : void 0,
19611
20405
  authContext
19612
20406
  );
19613
- (0, import_react39.useEffect)(() => {
20407
+ (0, import_react41.useEffect)(() => {
19614
20408
  if (!cases) return;
19615
20409
  if (cases.length === 0) {
19616
20410
  navigateTo("form");
@@ -19624,33 +20418,33 @@ function CaseDetailsPage() {
19624
20418
  navigateTo("form");
19625
20419
  }
19626
20420
  }, [cases, targetUuid, setSelectedCase, navigateTo]);
19627
- (0, import_react39.useEffect)(() => {
20421
+ (0, import_react41.useEffect)(() => {
19628
20422
  if (!selectedCase && !targetUuid && !isLoading) {
19629
20423
  navigateTo("form");
19630
20424
  }
19631
20425
  }, [selectedCase, targetUuid, isLoading, navigateTo]);
19632
20426
  if (!selectedCase) {
19633
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.View, { style: styles46.centered, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.ActivityIndicator, { size: "large", color: colors.primary }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.Text, { style: [styles46.emptyText, { color: colors.textSecondary }], children: t("noCasesYet") || "No case selected" }) });
20427
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.View, { style: styles48.centered, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.ActivityIndicator, { size: "large", color: colors.primary }) : /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.Text, { style: [styles48.emptyText, { color: colors.textSecondary }], children: t("noCasesYet") || "No case selected" }) });
19634
20428
  }
19635
20429
  const requestTypeLabel = requestTypeLabels[(_b = selectedCase.request_type) == null ? void 0 : _b.toUpperCase()] || selectedCase.request_type_display || formatCaseStatus(selectedCase.request_type || "");
19636
20430
  const tabs = [
19637
20431
  { id: "request-details", label: t("requestDetails") || "Request Details" },
19638
20432
  { id: "messages", label: t("messages") || "Messages" }
19639
20433
  ];
19640
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
20434
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
19641
20435
  KeyboardAvoidingViewCompat,
19642
20436
  {
19643
- style: [styles46.container, { backgroundColor: colors.canvasSubtle }],
20437
+ style: [styles48.container, { backgroundColor: colors.canvasSubtle }],
19644
20438
  behavior: "padding",
19645
- keyboardVerticalOffset: import_react_native57.Platform.OS === "ios" ? keyboardOffset : 0,
20439
+ keyboardVerticalOffset: import_react_native59.Platform.OS === "ios" ? keyboardOffset : 0,
19646
20440
  children: [
19647
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native57.View, { style: styles46.headerWrap, children: [
19648
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.View, { style: [styles46.heroCard, elevation.card, { backgroundColor: colors.surface }], children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native57.View, { style: styles46.heroInner, children: [
19649
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.View, { style: [styles46.accent, { backgroundColor: getCaseStatusColor(selectedCase.status, colors) }] }),
19650
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native57.View, { style: styles46.heroBody, children: [
19651
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native57.View, { style: styles46.heroTopRow, children: [
19652
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.View, { style: [styles46.typeChip, { backgroundColor: withAlpha(getRequestTypeColor(selectedCase.request_type, colors), 0.12) }], children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.Text, { style: [styles46.typeChipText, { color: getRequestTypeColor(selectedCase.request_type, colors) }], numberOfLines: 1, children: requestTypeLabel }) }),
19653
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20441
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native59.View, { style: styles48.headerWrap, children: [
20442
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.View, { style: [styles48.heroCard, elevation.card, { backgroundColor: colors.surface }], children: /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native59.View, { style: styles48.heroInner, children: [
20443
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.View, { style: [styles48.accent, { backgroundColor: getCaseStatusColor(selectedCase.status, colors) }] }),
20444
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native59.View, { style: styles48.heroBody, children: [
20445
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native59.View, { style: styles48.heroTopRow, children: [
20446
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.View, { style: [styles48.typeChip, { backgroundColor: withAlpha(getRequestTypeColor(selectedCase.request_type, colors), 0.12) }], children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.Text, { style: [styles48.typeChipText, { color: getRequestTypeColor(selectedCase.request_type, colors) }], numberOfLines: 1, children: requestTypeLabel }) }),
20447
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
19654
20448
  PCBadge,
19655
20449
  {
19656
20450
  status: getCaseStatusVariant(selectedCase.status),
@@ -19659,10 +20453,10 @@ function CaseDetailsPage() {
19659
20453
  }
19660
20454
  )
19661
20455
  ] }),
19662
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.Text, { style: [styles46.caseId, { color: colors.text }], numberOfLines: 1, children: selectedCase.case_id })
20456
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.Text, { style: [styles48.caseId, { color: colors.text }], numberOfLines: 1, children: selectedCase.case_id })
19663
20457
  ] })
19664
20458
  ] }) }),
19665
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20459
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
19666
20460
  Segmented,
19667
20461
  {
19668
20462
  options: tabs.map((tab) => ({ value: tab.id, label: tab.label })),
@@ -19671,18 +20465,18 @@ function CaseDetailsPage() {
19671
20465
  }
19672
20466
  )
19673
20467
  ] }),
19674
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.View, { style: styles46.tabContent, children: activeTab === "request-details" ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20468
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native59.View, { style: styles48.tabContent, children: activeTab === "request-details" ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
19675
20469
  RequestDetailsTab,
19676
20470
  {
19677
20471
  selectedCase,
19678
20472
  requestTypeLabel
19679
20473
  }
19680
- ) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(MessagesTab, { caseUuid: selectedCase.uuid, isCaseFinalized: isTerminalCaseStatus(selectedCase.status) }) })
20474
+ ) : /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(MessagesTab, { caseUuid: selectedCase.uuid, isCaseFinalized: isTerminalCaseStatus(selectedCase.status) }) })
19681
20475
  ]
19682
20476
  }
19683
20477
  );
19684
20478
  }
19685
- var styles46 = import_react_native57.StyleSheet.create({
20479
+ var styles48 = import_react_native59.StyleSheet.create({
19686
20480
  container: {
19687
20481
  flex: 1
19688
20482
  },
@@ -19747,36 +20541,36 @@ var styles46 = import_react_native57.StyleSheet.create({
19747
20541
  });
19748
20542
 
19749
20543
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationsScreen.tsx
19750
- var import_react42 = require("react");
19751
- var import_react_native63 = require("react-native");
19752
- var import_react_i18next28 = require("react-i18next");
20544
+ var import_react44 = require("react");
20545
+ var import_react_native65 = require("react-native");
20546
+ var import_react_i18next30 = require("react-i18next");
19753
20547
 
19754
20548
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx
19755
- var import_react_native61 = require("react-native");
19756
- var import_react_i18next27 = require("react-i18next");
20549
+ var import_react_native63 = require("react-native");
20550
+ var import_react_i18next29 = require("react-i18next");
19757
20551
 
19758
20552
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationCTAButton.tsx
19759
- var import_react_native58 = require("react-native");
19760
- var import_jsx_runtime59 = require("react/jsx-runtime");
20553
+ var import_react_native60 = require("react-native");
20554
+ var import_jsx_runtime63 = require("react/jsx-runtime");
19761
20555
  var NotificationCTAButton = ({ cta, onPress }) => {
19762
20556
  const { colors } = useTheme();
19763
20557
  const tone = cta.style === "danger" ? colors.error : colors.primary;
19764
20558
  const isPrimary = cta.style === "primary" || cta.style === "danger";
19765
- return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19766
- import_react_native58.TouchableOpacity,
20559
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20560
+ import_react_native60.TouchableOpacity,
19767
20561
  {
19768
20562
  onPress,
19769
20563
  activeOpacity: 0.7,
19770
20564
  style: [
19771
- styles47.button,
20565
+ styles49.button,
19772
20566
  isPrimary ? { backgroundColor: tone } : { backgroundColor: colors.primarySoft }
19773
20567
  ],
19774
20568
  accessibilityRole: "button",
19775
- children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_react_native58.Text, { style: [styles47.label, { color: isPrimary ? colors.primaryText : colors.primary }], numberOfLines: 1, children: cta.label })
20569
+ children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native60.Text, { style: [styles49.label, { color: isPrimary ? colors.primaryText : colors.primary }], numberOfLines: 1, children: cta.label })
19776
20570
  }
19777
20571
  );
19778
20572
  };
19779
- var styles47 = import_react_native58.StyleSheet.create({
20573
+ var styles49 = import_react_native60.StyleSheet.create({
19780
20574
  button: {
19781
20575
  paddingHorizontal: spacing.lg,
19782
20576
  paddingVertical: spacing.sm,
@@ -19791,8 +20585,8 @@ var styles47 = import_react_native58.StyleSheet.create({
19791
20585
  });
19792
20586
 
19793
20587
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationIcon.tsx
19794
- var import_react_native59 = require("react-native");
19795
- var import_jsx_runtime60 = require("react/jsx-runtime");
20588
+ var import_react_native61 = require("react-native");
20589
+ var import_jsx_runtime64 = require("react/jsx-runtime");
19796
20590
  var CATEGORY_ICON = {
19797
20591
  guardian: "user-round",
19798
20592
  consent: "clock",
@@ -19805,18 +20599,18 @@ var NotificationIcon = ({ notificationType, size = 40 }) => {
19805
20599
  var _a3;
19806
20600
  const category = (_a3 = TYPE_TO_ICON_CATEGORY[notificationType]) != null ? _a3 : "system";
19807
20601
  const color = ICON_COLORS[category];
19808
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
19809
- import_react_native59.View,
20602
+ return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
20603
+ import_react_native61.View,
19810
20604
  {
19811
20605
  style: [
19812
- styles48.wrap,
20606
+ styles50.wrap,
19813
20607
  { width: size, height: size, borderRadius: radii.md, backgroundColor: withAlpha(color, 0.13) }
19814
20608
  ],
19815
- children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(Icon, { name: CATEGORY_ICON[category], size: Math.round(size * 0.5), color, strokeWidth: 2 })
20609
+ children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(Icon, { name: CATEGORY_ICON[category], size: Math.round(size * 0.5), color, strokeWidth: 2 })
19816
20610
  }
19817
20611
  );
19818
20612
  };
19819
- var styles48 = import_react_native59.StyleSheet.create({
20613
+ var styles50 = import_react_native61.StyleSheet.create({
19820
20614
  wrap: {
19821
20615
  alignItems: "center",
19822
20616
  justifyContent: "center"
@@ -19824,15 +20618,15 @@ var styles48 = import_react_native59.StyleSheet.create({
19824
20618
  });
19825
20619
 
19826
20620
  // src/RedactoPrivacyCenter/components/NotificationHub/SwipeableRow.tsx
19827
- var import_react40 = require("react");
19828
- var import_react_native60 = require("react-native");
19829
- var import_jsx_runtime61 = require("react/jsx-runtime");
20621
+ var import_react42 = require("react");
20622
+ var import_react_native62 = require("react-native");
20623
+ var import_jsx_runtime65 = require("react/jsx-runtime");
19830
20624
  var ACTION_WIDTH = 80;
19831
20625
  var CLAIM_THRESHOLD = 8;
19832
20626
  var SwipeableRow = ({ actions, background, children }) => {
19833
20627
  const { colors } = useTheme();
19834
- const translateX = (0, import_react40.useRef)(new import_react_native60.Animated.Value(0)).current;
19835
- const baseX = (0, import_react40.useRef)(0);
20628
+ const translateX = (0, import_react42.useRef)(new import_react_native62.Animated.Value(0)).current;
20629
+ const baseX = (0, import_react42.useRef)(0);
19836
20630
  const maxOpen = actions.length * ACTION_WIDTH;
19837
20631
  const toneColor2 = {
19838
20632
  primary: colors.primary,
@@ -19841,10 +20635,10 @@ var SwipeableRow = ({ actions, background, children }) => {
19841
20635
  };
19842
20636
  const settle = (to) => {
19843
20637
  baseX.current = to;
19844
- import_react_native60.Animated.spring(translateX, { toValue: to, useNativeDriver: true, bounciness: 0, speed: 18 }).start();
20638
+ import_react_native62.Animated.spring(translateX, { toValue: to, useNativeDriver: true, bounciness: 0, speed: 18 }).start();
19845
20639
  };
19846
- const panResponder = (0, import_react40.useMemo)(
19847
- () => import_react_native60.PanResponder.create({
20640
+ const panResponder = (0, import_react42.useMemo)(
20641
+ () => import_react_native62.PanResponder.create({
19848
20642
  onMoveShouldSetPanResponder: (_, g) => {
19849
20643
  const horizontal = Math.abs(g.dx) > Math.abs(g.dy) * 1.5;
19850
20644
  if (!horizontal) return false;
@@ -19865,37 +20659,37 @@ var SwipeableRow = ({ actions, background, children }) => {
19865
20659
  [maxOpen]
19866
20660
  );
19867
20661
  if (actions.length === 0) {
19868
- return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_jsx_runtime61.Fragment, { children });
20662
+ return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_jsx_runtime65.Fragment, { children });
19869
20663
  }
19870
20664
  const runAction = (action) => {
19871
20665
  settle(0);
19872
20666
  action.onPress();
19873
20667
  };
19874
- return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_react_native60.View, { style: styles49.root, children: [
19875
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native60.View, { style: styles49.actionsLayer, pointerEvents: "box-none", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
19876
- import_react_native60.TouchableOpacity,
20668
+ return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_react_native62.View, { style: styles51.root, children: [
20669
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native62.View, { style: styles51.actionsLayer, pointerEvents: "box-none", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
20670
+ import_react_native62.TouchableOpacity,
19877
20671
  {
19878
- style: [styles49.action, { width: ACTION_WIDTH, backgroundColor: toneColor2[action.tone] }],
20672
+ style: [styles51.action, { width: ACTION_WIDTH, backgroundColor: toneColor2[action.tone] }],
19879
20673
  onPress: () => runAction(action),
19880
20674
  activeOpacity: 0.85,
19881
20675
  accessibilityRole: "button",
19882
20676
  accessibilityLabel: action.label,
19883
20677
  children: [
19884
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(Icon, { name: action.icon, size: 20, color: colors.primaryText, strokeWidth: 2.2 }),
19885
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native60.Text, { style: [styles49.actionLabel, { color: colors.primaryText }], numberOfLines: 1, children: action.label })
20678
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(Icon, { name: action.icon, size: 20, color: colors.primaryText, strokeWidth: 2.2 }),
20679
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native62.Text, { style: [styles51.actionLabel, { color: colors.primaryText }], numberOfLines: 1, children: action.label })
19886
20680
  ]
19887
20681
  },
19888
20682
  action.key
19889
20683
  )) }),
19890
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react_native60.Animated.View, { style: [{ backgroundColor: background, transform: [{ translateX }] }], ...panResponder.panHandlers, children })
20684
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native62.Animated.View, { style: [{ backgroundColor: background, transform: [{ translateX }] }], ...panResponder.panHandlers, children })
19891
20685
  ] });
19892
20686
  };
19893
- var styles49 = import_react_native60.StyleSheet.create({
20687
+ var styles51 = import_react_native62.StyleSheet.create({
19894
20688
  root: {
19895
20689
  position: "relative"
19896
20690
  },
19897
20691
  actionsLayer: {
19898
- ...import_react_native60.StyleSheet.absoluteFillObject,
20692
+ ...import_react_native62.StyleSheet.absoluteFillObject,
19899
20693
  flexDirection: "row",
19900
20694
  justifyContent: "flex-end"
19901
20695
  },
@@ -19928,10 +20722,10 @@ var formatTimeAgo = (dateString, t) => {
19928
20722
  };
19929
20723
 
19930
20724
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx
19931
- var import_jsx_runtime62 = require("react/jsx-runtime");
20725
+ var import_jsx_runtime66 = require("react/jsx-runtime");
19932
20726
  var NotificationRow = ({ notification, onPress, onMarkRead, onAcknowledge }) => {
19933
20727
  var _a3, _b;
19934
- const { t } = (0, import_react_i18next27.useTranslation)();
20728
+ const { t } = (0, import_react_i18next29.useTranslation)();
19935
20729
  const { colors } = useTheme();
19936
20730
  const isUnread = !notification.is_read;
19937
20731
  const statusLabel = notification.status_label_display || notification.status_label;
@@ -19958,35 +20752,35 @@ var NotificationRow = ({ notification, onPress, onMarkRead, onAcknowledge }) =>
19958
20752
  onPress: onAcknowledge
19959
20753
  });
19960
20754
  }
19961
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(SwipeableRow, { actions, background: colors.surface, children: /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native61.TouchableOpacity, { onPress, activeOpacity: 0.6, accessibilityRole: "button", style: styles50.row, children: [
19962
- isUnread ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.View, { style: [styles50.accent, { backgroundColor: accent }] }) : null,
19963
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(NotificationIcon, { notificationType: notification.notification_type, size: 36 }),
19964
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native61.View, { style: styles50.content, children: [
19965
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native61.View, { style: styles50.titleRow, children: [
19966
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
19967
- import_react_native61.Text,
20755
+ return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(SwipeableRow, { actions, background: colors.surface, children: /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_react_native63.TouchableOpacity, { onPress, activeOpacity: 0.6, accessibilityRole: "button", style: styles52.row, children: [
20756
+ isUnread ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native63.View, { style: [styles52.accent, { backgroundColor: accent }] }) : null,
20757
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(NotificationIcon, { notificationType: notification.notification_type, size: 36 }),
20758
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_react_native63.View, { style: styles52.content, children: [
20759
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_react_native63.View, { style: styles52.titleRow, children: [
20760
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
20761
+ import_react_native63.Text,
19968
20762
  {
19969
- style: [styles50.title, { color: colors.text, fontWeight: isUnread ? "700" : "600" }],
20763
+ style: [styles52.title, { color: colors.text, fontWeight: isUnread ? "700" : "600" }],
19970
20764
  numberOfLines: 2,
19971
20765
  children: notification.title
19972
20766
  }
19973
20767
  ),
19974
- isUnread ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.View, { style: [styles50.unreadDot, { backgroundColor: colors.primary }] }) : null
20768
+ isUnread ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native63.View, { style: [styles52.unreadDot, { backgroundColor: colors.primary }] }) : null
19975
20769
  ] }),
19976
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native61.View, { style: styles50.metaRow, children: [
19977
- statusLabel ? /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_jsx_runtime62.Fragment, { children: [
19978
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.View, { style: [styles50.statusDot, { backgroundColor: accent }] }),
19979
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.Text, { style: [styles50.metaText, { color: colors.textSecondary }], numberOfLines: 1, children: statusLabel }),
19980
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.Text, { style: [styles50.metaDivider, { color: colors.textSecondary }], children: "\xB7" })
20770
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_react_native63.View, { style: styles52.metaRow, children: [
20771
+ statusLabel ? /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_jsx_runtime66.Fragment, { children: [
20772
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native63.View, { style: [styles52.statusDot, { backgroundColor: accent }] }),
20773
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native63.Text, { style: [styles52.metaText, { color: colors.textSecondary }], numberOfLines: 1, children: statusLabel }),
20774
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native63.Text, { style: [styles52.metaDivider, { color: colors.textSecondary }], children: "\xB7" })
19981
20775
  ] }) : null,
19982
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.Text, { style: [styles50.metaText, { color: colors.textSecondary }], children: formatTimeAgo(notification.created_at, t) })
20776
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native63.Text, { style: [styles52.metaText, { color: colors.textSecondary }], children: formatTimeAgo(notification.created_at, t) })
19983
20777
  ] }),
19984
- showAcknowledge && ackCta ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.View, { style: styles50.ackWrap, children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(NotificationCTAButton, { cta: ackCta, onPress: onAcknowledge }) }) : null
20778
+ showAcknowledge && ackCta ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native63.View, { style: styles52.ackWrap, children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(NotificationCTAButton, { cta: ackCta, onPress: onAcknowledge }) }) : null
19985
20779
  ] }),
19986
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.View, { style: styles50.chevron, children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(Icon, { name: "chevron-right", size: 18, color: colors.textSecondary }) })
20780
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native63.View, { style: styles52.chevron, children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(Icon, { name: "chevron-right", size: 18, color: colors.textSecondary }) })
19987
20781
  ] }) });
19988
20782
  };
19989
- var styles50 = import_react_native61.StyleSheet.create({
20783
+ var styles52 = import_react_native63.StyleSheet.create({
19990
20784
  row: {
19991
20785
  flexDirection: "row",
19992
20786
  alignItems: "center",
@@ -20049,25 +20843,25 @@ var styles50 = import_react_native61.StyleSheet.create({
20049
20843
  });
20050
20844
 
20051
20845
  // src/RedactoPrivacyCenter/components/NotificationHub/useNotificationActions.ts
20052
- var import_react41 = require("react");
20053
- var import_react_native62 = require("react-native");
20846
+ var import_react43 = require("react");
20847
+ var import_react_native64 = require("react-native");
20054
20848
  var useNotificationActions = () => {
20055
20849
  const { navigateTo, setSelectedCase } = useInternalNavigation();
20056
20850
  const { accessToken, refreshToken, onError, updateTokens, organizationId, workspaceId, email } = useAuth();
20057
20851
  const { consentClient } = useBaseUrl();
20058
20852
  const { langParam } = useCurrentLanguage();
20059
- const authContext = (0, import_react41.useMemo)(
20853
+ const authContext = (0, import_react43.useMemo)(
20060
20854
  () => ({ accessToken, refreshToken, onError, updateTokens }),
20061
20855
  [accessToken, refreshToken, onError, updateTokens]
20062
20856
  );
20063
- const hasAcknowledgeCTA = (0, import_react41.useCallback)(
20857
+ const hasAcknowledgeCTA = (0, import_react43.useCallback)(
20064
20858
  (notification) => {
20065
20859
  var _a3, _b;
20066
20860
  return (_b = (_a3 = notification.ctas) == null ? void 0 : _a3.some((cta) => cta.action_type === "acknowledge")) != null ? _b : false;
20067
20861
  },
20068
20862
  []
20069
20863
  );
20070
- const handleMarkRead = (0, import_react41.useCallback)(
20864
+ const handleMarkRead = (0, import_react43.useCallback)(
20071
20865
  async (notificationUuid) => {
20072
20866
  if (!organizationId || !workspaceId) return false;
20073
20867
  const result = await markNotificationRead(organizationId, workspaceId, notificationUuid, authContext, consentClient);
@@ -20075,12 +20869,12 @@ var useNotificationActions = () => {
20075
20869
  },
20076
20870
  [organizationId, workspaceId, authContext, consentClient]
20077
20871
  );
20078
- const handleMarkAllRead = (0, import_react41.useCallback)(async () => {
20872
+ const handleMarkAllRead = (0, import_react43.useCallback)(async () => {
20079
20873
  if (!organizationId || !workspaceId) return false;
20080
20874
  const result = await markAllRead(organizationId, workspaceId, authContext, consentClient);
20081
20875
  return result !== null;
20082
20876
  }, [organizationId, workspaceId, authContext, consentClient]);
20083
- const handleAcknowledge = (0, import_react41.useCallback)(
20877
+ const handleAcknowledge = (0, import_react43.useCallback)(
20084
20878
  async (notificationUuid) => {
20085
20879
  if (!organizationId || !workspaceId) return false;
20086
20880
  const result = await acknowledgeNotification(organizationId, workspaceId, notificationUuid, authContext, consentClient);
@@ -20088,7 +20882,7 @@ var useNotificationActions = () => {
20088
20882
  },
20089
20883
  [organizationId, workspaceId, authContext, consentClient]
20090
20884
  );
20091
- const handleCTAClick = (0, import_react41.useCallback)(
20885
+ const handleCTAClick = (0, import_react43.useCallback)(
20092
20886
  async (notification, cta) => {
20093
20887
  var _a3;
20094
20888
  if (cta.action_type === "acknowledge") {
@@ -20122,7 +20916,7 @@ var useNotificationActions = () => {
20122
20916
  const url = cta.url;
20123
20917
  if (!/^https?:\/\//i.test(url)) return null;
20124
20918
  try {
20125
- await import_react_native62.Linking.openURL(url);
20919
+ await import_react_native64.Linking.openURL(url);
20126
20920
  return "opened";
20127
20921
  } catch {
20128
20922
  return null;
@@ -20145,7 +20939,7 @@ var useNotificationActions = () => {
20145
20939
  };
20146
20940
 
20147
20941
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationsScreen.tsx
20148
- var import_jsx_runtime63 = require("react/jsx-runtime");
20942
+ var import_jsx_runtime67 = require("react/jsx-runtime");
20149
20943
  var EMPTY_SUMMARY = { total: 0, unread: 0, action_needed: 0, acknowledged: 0 };
20150
20944
  var READ_FILTER_TO_PARAM = {
20151
20945
  all: void 0,
@@ -20153,7 +20947,7 @@ var READ_FILTER_TO_PARAM = {
20153
20947
  read: true
20154
20948
  };
20155
20949
  var NotificationsScreen = () => {
20156
- const { t } = (0, import_react_i18next28.useTranslation)();
20950
+ const { t } = (0, import_react_i18next30.useTranslation)();
20157
20951
  const { colors } = useTheme();
20158
20952
  const { langParam } = useCurrentLanguage();
20159
20953
  const { listBottom } = usePrivacyCenterInsets();
@@ -20170,15 +20964,15 @@ var NotificationsScreen = () => {
20170
20964
  handleAcknowledge,
20171
20965
  handleCTAClick
20172
20966
  } = useNotificationActions();
20173
- const [notifications, setNotifications] = (0, import_react42.useState)([]);
20174
- const [summary, setSummary] = (0, import_react42.useState)(EMPTY_SUMMARY);
20175
- const [activeTab, setActiveTab] = (0, import_react42.useState)("all");
20176
- const [readFilter, setReadFilter] = (0, import_react42.useState)("all");
20177
- const [isLoading, setIsLoading] = (0, import_react42.useState)(true);
20178
- const [isRefreshing2, setIsRefreshing] = (0, import_react42.useState)(false);
20179
- const [filterOpen, setFilterOpen] = (0, import_react42.useState)(false);
20967
+ const [notifications, setNotifications] = (0, import_react44.useState)([]);
20968
+ const [summary, setSummary] = (0, import_react44.useState)(EMPTY_SUMMARY);
20969
+ const [activeTab, setActiveTab] = (0, import_react44.useState)("all");
20970
+ const [readFilter, setReadFilter] = (0, import_react44.useState)("all");
20971
+ const [isLoading, setIsLoading] = (0, import_react44.useState)(true);
20972
+ const [isRefreshing2, setIsRefreshing] = (0, import_react44.useState)(false);
20973
+ const [filterOpen, setFilterOpen] = (0, import_react44.useState)(false);
20180
20974
  const isFiltered = activeTab !== "all" || readFilter !== "all";
20181
- const loadNotifications = (0, import_react42.useCallback)(
20975
+ const loadNotifications = (0, import_react44.useCallback)(
20182
20976
  async (includeSummary = false, silent = false) => {
20183
20977
  if (!organizationId || !workspaceId) return;
20184
20978
  if (!silent) setIsLoading(true);
@@ -20208,18 +21002,21 @@ var NotificationsScreen = () => {
20208
21002
  },
20209
21003
  [organizationId, workspaceId, activeTab, readFilter, authContext, consentClient, langParam]
20210
21004
  );
20211
- (0, import_react42.useEffect)(() => {
21005
+ (0, import_react44.useEffect)(() => {
20212
21006
  loadNotifications(true);
20213
21007
  }, [loadNotifications]);
20214
- const loadRef = (0, import_react42.useRef)(loadNotifications);
21008
+ const loadRef = (0, import_react44.useRef)(loadNotifications);
20215
21009
  loadRef.current = loadNotifications;
20216
- (0, import_react42.useEffect)(() => {
21010
+ const authContextRef = (0, import_react44.useRef)(authContext);
21011
+ authContextRef.current = authContext;
21012
+ (0, import_react44.useEffect)(() => {
20217
21013
  const id = setInterval(() => {
21014
+ if (isRefreshBlocked(authContextRef.current)) return;
20218
21015
  loadRef.current(false, true);
20219
21016
  }, POLL_INTERVAL);
20220
21017
  return () => clearInterval(id);
20221
21018
  }, []);
20222
- const onNotificationClick = (0, import_react42.useCallback)(
21019
+ const onNotificationClick = (0, import_react44.useCallback)(
20223
21020
  async (notification) => {
20224
21021
  const shouldMarkRead = !notification.is_read;
20225
21022
  const shouldAutoAcknowledge = !notification.is_acknowledged && !hasAcknowledgeCTA(notification);
@@ -20240,7 +21037,7 @@ var NotificationsScreen = () => {
20240
21037
  },
20241
21038
  [hasAcknowledgeCTA, handleAcknowledge, handleMarkRead]
20242
21039
  );
20243
- const onRowPress = (0, import_react42.useCallback)(
21040
+ const onRowPress = (0, import_react44.useCallback)(
20244
21041
  async (notification) => {
20245
21042
  var _a3;
20246
21043
  const linkCta = (_a3 = notification.ctas) == null ? void 0 : _a3.find((cta) => cta.action_type === "link" && cta.url);
@@ -20258,7 +21055,7 @@ var NotificationsScreen = () => {
20258
21055
  },
20259
21056
  [handleCTAClick, onNotificationClick]
20260
21057
  );
20261
- const onMarkReadRow = (0, import_react42.useCallback)(
21058
+ const onMarkReadRow = (0, import_react44.useCallback)(
20262
21059
  async (notification) => {
20263
21060
  if (notification.is_read) return;
20264
21061
  const ok = await handleMarkRead(notification.uuid);
@@ -20268,7 +21065,7 @@ var NotificationsScreen = () => {
20268
21065
  },
20269
21066
  [handleMarkRead]
20270
21067
  );
20271
- const onAcknowledgeRow = (0, import_react42.useCallback)(
21068
+ const onAcknowledgeRow = (0, import_react44.useCallback)(
20272
21069
  async (notification) => {
20273
21070
  if (notification.is_acknowledged) return;
20274
21071
  const ok = await handleAcknowledge(notification.uuid);
@@ -20285,22 +21082,29 @@ var NotificationsScreen = () => {
20285
21082
  },
20286
21083
  [handleAcknowledge]
20287
21084
  );
20288
- const onRefresh = (0, import_react42.useCallback)(() => {
21085
+ const onMarkAllRead = (0, import_react44.useCallback)(async () => {
21086
+ const ok = await handleMarkAllRead();
21087
+ if (!ok) return;
21088
+ setNotifications((prev) => prev.map((item) => ({ ...item, is_read: true })));
21089
+ setSummary((prev) => ({ ...prev, unread: 0 }));
21090
+ if (readFilter !== "all") loadNotifications(true, true);
21091
+ }, [handleMarkAllRead, readFilter, loadNotifications]);
21092
+ const onRefresh = (0, import_react44.useCallback)(() => {
20289
21093
  setIsRefreshing(true);
20290
21094
  loadNotifications(true, true);
20291
21095
  }, [loadNotifications]);
20292
- const sections = (0, import_react42.useMemo)(
21096
+ const sections = (0, import_react44.useMemo)(
20293
21097
  () => groupByTime(notifications, (item) => item.created_at, classifyTime),
20294
21098
  [notifications, classifyTime]
20295
21099
  );
20296
- const header = /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.header, children: [
20297
- /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.titleRow, children: [
20298
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.screenTitle, { color: colors.text }], children: t("notifications", { defaultValue: "Notifications" }) }),
20299
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20300
- import_react_native63.TouchableOpacity,
21100
+ const header = /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.View, { style: styles53.header, children: [
21101
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.View, { style: styles53.titleRow, children: [
21102
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.Text, { style: [styles53.screenTitle, { color: colors.text }], children: t("notifications", { defaultValue: "Notifications" }) }),
21103
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21104
+ import_react_native65.TouchableOpacity,
20301
21105
  {
20302
21106
  style: [
20303
- styles51.filterBtn,
21107
+ styles53.filterBtn,
20304
21108
  {
20305
21109
  backgroundColor: isFiltered ? colors.primarySoft : colors.surface,
20306
21110
  borderColor: isFiltered ? colors.primary : colors.border
@@ -20309,30 +21113,30 @@ var NotificationsScreen = () => {
20309
21113
  onPress: () => setFilterOpen(true),
20310
21114
  accessibilityRole: "button",
20311
21115
  accessibilityLabel: t("filter") || "Filter",
20312
- children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Icon, { name: "sliders-horizontal", size: 18, color: isFiltered ? colors.primary : colors.text })
21116
+ children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Icon, { name: "sliders-horizontal", size: 18, color: isFiltered ? colors.primary : colors.text })
20313
21117
  }
20314
21118
  )
20315
21119
  ] }),
20316
- summary.unread > 0 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.TouchableOpacity, { style: styles51.markAllBtn, onPress: handleMarkAllRead, activeOpacity: 0.7, accessibilityRole: "button", children: [
20317
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Icon, { name: "check-check", size: 15, color: colors.primary, strokeWidth: 2.2 }),
20318
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.markAllLabel, { color: colors.primary }], children: t("markAllAsRead") || "Mark all as read" })
21120
+ summary.unread > 0 ? /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.TouchableOpacity, { style: styles53.markAllBtn, onPress: onMarkAllRead, activeOpacity: 0.7, accessibilityRole: "button", children: [
21121
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Icon, { name: "check-check", size: 15, color: colors.primary, strokeWidth: 2.2 }),
21122
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.Text, { style: [styles53.markAllLabel, { color: colors.primary }], children: t("markAllAsRead") || "Mark all as read" })
20319
21123
  ] }) : null
20320
21124
  ] });
20321
- return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_jsx_runtime63.Fragment, { children: [
20322
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20323
- import_react_native63.FlatList,
21125
+ return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
21126
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21127
+ import_react_native65.FlatList,
20324
21128
  {
20325
21129
  data: sections,
20326
21130
  keyExtractor: (section2) => section2.key,
20327
- style: [styles51.list, { backgroundColor: colors.canvasSubtle }],
20328
- contentContainerStyle: [styles51.listContent, { flexGrow: 1, paddingBottom: listBottom }],
21131
+ style: [styles53.list, { backgroundColor: colors.canvasSubtle }],
21132
+ contentContainerStyle: [styles53.listContent, { flexGrow: 1, paddingBottom: listBottom }],
20329
21133
  ListHeaderComponent: header,
20330
21134
  showsVerticalScrollIndicator: false,
20331
- refreshControl: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.RefreshControl, { refreshing: isRefreshing2, onRefresh, tintColor: colors.primary, colors: [colors.primary] }),
20332
- renderItem: ({ item: section2 }) => /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.section, children: [
20333
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.sectionTitle, { color: colors.textSecondary }], children: section2.title }),
20334
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: [styles51.cardShadow, elevation.card], children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: [styles51.cardClip, { backgroundColor: colors.surface }], children: section2.data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { children: [
20335
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
21135
+ refreshControl: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.RefreshControl, { refreshing: isRefreshing2, onRefresh, tintColor: colors.primary, colors: [colors.primary] }),
21136
+ renderItem: ({ item: section2 }) => /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.View, { style: styles53.section, children: [
21137
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.Text, { style: [styles53.sectionTitle, { color: colors.textSecondary }], children: section2.title }),
21138
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: [styles53.cardShadow, elevation.card], children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: [styles53.cardClip, { backgroundColor: colors.surface }], children: section2.data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.View, { children: [
21139
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20336
21140
  NotificationRow,
20337
21141
  {
20338
21142
  notification: item,
@@ -20341,19 +21145,19 @@ var NotificationsScreen = () => {
20341
21145
  onAcknowledge: () => onAcknowledgeRow(item)
20342
21146
  }
20343
21147
  ),
20344
- index < section2.data.length - 1 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: [styles51.separator, { backgroundColor: colors.hairline }] }) : null
21148
+ index < section2.data.length - 1 ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: [styles53.separator, { backgroundColor: colors.hairline }] }) : null
20345
21149
  ] }, item.uuid)) }) })
20346
21150
  ] }),
20347
- ListEmptyComponent: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: styles51.skeletonWrap, children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: [styles51.cardClip, elevation.card, { backgroundColor: colors.surface }], children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { children: [
20348
- /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.skeletonRow, children: [
20349
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Skeleton, { width: 36, height: 36, radius: radii.md }),
20350
- /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.skeletonLines, children: [
20351
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Skeleton, { width: "70%", height: 13 }),
20352
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Skeleton, { width: "40%", height: 10 })
21151
+ ListEmptyComponent: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: styles53.skeletonWrap, children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: [styles53.cardClip, elevation.card, { backgroundColor: colors.surface }], children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.View, { children: [
21152
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.View, { style: styles53.skeletonRow, children: [
21153
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Skeleton, { width: 36, height: 36, radius: radii.md }),
21154
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.View, { style: styles53.skeletonLines, children: [
21155
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Skeleton, { width: "70%", height: 13 }),
21156
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Skeleton, { width: "40%", height: 10 })
20353
21157
  ] })
20354
21158
  ] }),
20355
- i < 3 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: [styles51.separator, { backgroundColor: colors.hairline }] }) : null
20356
- ] }, i)) }) }) : /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: styles51.emptyWrap, children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
21159
+ i < 3 ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: [styles53.separator, { backgroundColor: colors.hairline }] }) : null
21160
+ ] }, i)) }) }) : /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: styles53.emptyWrap, children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20357
21161
  PCEmpty,
20358
21162
  {
20359
21163
  iconName: "circle-check",
@@ -20362,14 +21166,14 @@ var NotificationsScreen = () => {
20362
21166
  }
20363
21167
  ) }),
20364
21168
  ListFooterComponentStyle: { marginTop: "auto" },
20365
- ListFooterComponent: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Footer, {})
21169
+ ListFooterComponent: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Footer, {})
20366
21170
  }
20367
21171
  ),
20368
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(BottomSheet, { visible: filterOpen, onClose: () => setFilterOpen(false), title: t("filter") || "Filter", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.filterSheet, children: [
20369
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.filterGroupLabel, { color: colors.textSecondary }], children: t("category", { defaultValue: "Category" }) }),
20370
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: styles51.chipWrap, children: filterTabs.map((tab) => {
21172
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(BottomSheet, { visible: filterOpen, onClose: () => setFilterOpen(false), title: t("filter") || "Filter", children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native65.View, { style: styles53.filterSheet, children: [
21173
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.Text, { style: [styles53.filterGroupLabel, { color: colors.textSecondary }], children: t("category", { defaultValue: "Category" }) }),
21174
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: styles53.chipWrap, children: filterTabs.map((tab) => {
20371
21175
  const selected = tab.key === activeTab;
20372
- return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
21176
+ return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20373
21177
  FilterChip,
20374
21178
  {
20375
21179
  label: tab.label,
@@ -20379,12 +21183,12 @@ var NotificationsScreen = () => {
20379
21183
  tab.key
20380
21184
  );
20381
21185
  }) }),
20382
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.filterGroupLabel, { color: colors.textSecondary, marginTop: spacing.lg }], children: t("readStatus", { defaultValue: "Status" }) }),
20383
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: styles51.chipWrap, children: [
21186
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.Text, { style: [styles53.filterGroupLabel, { color: colors.textSecondary, marginTop: spacing.lg }], children: t("readStatus", { defaultValue: "Status" }) }),
21187
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.View, { style: styles53.chipWrap, children: [
20384
21188
  { key: "all", label: t("all") || "All" },
20385
21189
  { key: "unread", label: t("unread") || "Unread" },
20386
21190
  { key: "read", label: t("read", { defaultValue: "Read" }) }
20387
- ].map((opt) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
21191
+ ].map((opt) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20388
21192
  FilterChip,
20389
21193
  {
20390
21194
  label: opt.label,
@@ -20393,13 +21197,13 @@ var NotificationsScreen = () => {
20393
21197
  },
20394
21198
  opt.key
20395
21199
  )) }),
20396
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20397
- import_react_native63.TouchableOpacity,
21200
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21201
+ import_react_native65.TouchableOpacity,
20398
21202
  {
20399
- style: [styles51.applyBtn, { backgroundColor: colors.primary }],
21203
+ style: [styles53.applyBtn, { backgroundColor: colors.primary }],
20400
21204
  onPress: () => setFilterOpen(false),
20401
21205
  accessibilityRole: "button",
20402
- children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.applyLabel, { color: colors.primaryText }], children: t("done", { defaultValue: "Done" }) })
21206
+ children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.Text, { style: [styles53.applyLabel, { color: colors.primaryText }], children: t("done", { defaultValue: "Done" }) })
20403
21207
  }
20404
21208
  )
20405
21209
  ] }) })
@@ -20407,25 +21211,25 @@ var NotificationsScreen = () => {
20407
21211
  };
20408
21212
  var FilterChip = ({ label, selected, onPress }) => {
20409
21213
  const { colors } = useTheme();
20410
- return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20411
- import_react_native63.TouchableOpacity,
21214
+ return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21215
+ import_react_native65.TouchableOpacity,
20412
21216
  {
20413
21217
  onPress,
20414
21218
  activeOpacity: 0.7,
20415
21219
  accessibilityRole: "button",
20416
21220
  accessibilityState: { selected },
20417
21221
  style: [
20418
- styles51.chip,
21222
+ styles53.chip,
20419
21223
  {
20420
21224
  backgroundColor: selected ? colors.primary : colors.surfaceAlt,
20421
21225
  borderColor: selected ? colors.primary : colors.border
20422
21226
  }
20423
21227
  ],
20424
- children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.chipLabel, { color: selected ? colors.primaryText : colors.text }], children: label })
21228
+ children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native65.Text, { style: [styles53.chipLabel, { color: selected ? colors.primaryText : colors.text }], children: label })
20425
21229
  }
20426
21230
  );
20427
21231
  };
20428
- var styles51 = import_react_native63.StyleSheet.create({
21232
+ var styles53 = import_react_native65.StyleSheet.create({
20429
21233
  list: {
20430
21234
  flex: 1
20431
21235
  },
@@ -20459,7 +21263,7 @@ var styles51 = import_react_native63.StyleSheet.create({
20459
21263
  filterBtn: {
20460
21264
  width: 40,
20461
21265
  height: 40,
20462
- borderWidth: import_react_native63.StyleSheet.hairlineWidth,
21266
+ borderWidth: import_react_native65.StyleSheet.hairlineWidth,
20463
21267
  borderRadius: radii.md,
20464
21268
  justifyContent: "center",
20465
21269
  alignItems: "center"
@@ -20480,7 +21284,7 @@ var styles51 = import_react_native63.StyleSheet.create({
20480
21284
  overflow: "hidden"
20481
21285
  },
20482
21286
  separator: {
20483
- height: import_react_native63.StyleSheet.hairlineWidth,
21287
+ height: import_react_native65.StyleSheet.hairlineWidth,
20484
21288
  marginLeft: spacing.lg + 36 + spacing.md
20485
21289
  },
20486
21290
  emptyWrap: {
@@ -20518,7 +21322,7 @@ var styles51 = import_react_native63.StyleSheet.create({
20518
21322
  justifyContent: "center",
20519
21323
  paddingHorizontal: spacing.lg,
20520
21324
  borderRadius: radii.pill,
20521
- borderWidth: import_react_native63.StyleSheet.hairlineWidth
21325
+ borderWidth: import_react_native65.StyleSheet.hairlineWidth
20522
21326
  },
20523
21327
  chipLabel: {
20524
21328
  ...typography.label
@@ -20537,7 +21341,7 @@ var styles51 = import_react_native63.StyleSheet.create({
20537
21341
  });
20538
21342
 
20539
21343
  // src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx
20540
- var import_jsx_runtime64 = require("react/jsx-runtime");
21344
+ var import_jsx_runtime68 = require("react/jsx-runtime");
20541
21345
  var privacyCenterQueryClient = new import_react_query2.QueryClient();
20542
21346
  function PrivacyCenterContent({ onBack }) {
20543
21347
  const { currentPage } = useInternalNavigation();
@@ -20547,24 +21351,24 @@ function PrivacyCenterContent({ onBack }) {
20547
21351
  const chromeMode = getPageChromeMode(currentPage);
20548
21352
  const canvasIsLight = isLightColor(colors.canvasSubtle);
20549
21353
  const barStyle = canvasIsLight ? "dark-content" : "light-content";
20550
- (0, import_react43.useEffect)(() => {
20551
- import_react_native64.StatusBar.setBarStyle(barStyle, true);
20552
- if (import_react_native64.Platform.OS === "android") {
21354
+ (0, import_react45.useEffect)(() => {
21355
+ import_react_native66.StatusBar.setBarStyle(barStyle, true);
21356
+ if (import_react_native66.Platform.OS === "android") {
20553
21357
  setNavBarIconStyle(canvasIsLight ? "dark" : "light");
20554
21358
  }
20555
21359
  }, [barStyle, canvasIsLight]);
20556
- return /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)(import_react_native64.View, { style: [styles52.container, { backgroundColor: colors.canvasSubtle }], children: [
20557
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_react_native64.StatusBar, { barStyle, translucent: true }),
20558
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_react_native64.View, { style: styles52.mainColumn, children: brandingLoading ? /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(PCLoader, {}) : /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)(import_jsx_runtime64.Fragment, { children: [
20559
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(SlimTopBar, { mode: chromeMode, onBack }),
20560
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_react_native64.View, { style: [styles52.content, { paddingBottom: insets.bottom }], children: status === "checking" ? /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(PCLoader, {}) : status === "empty" ? /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(PrivacyCenterEmptyState, {}) : /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)(import_jsx_runtime64.Fragment, { children: [
20561
- currentPage === "home" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(HomeHub, {}),
20562
- currentPage === "consent-manager" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(ConsentManager, {}),
20563
- currentPage === "form" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(FormPage, {}),
20564
- currentPage === "activity" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(ActivitiesList, {}),
20565
- currentPage === "receipts" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(ReceiptsList, {}),
20566
- currentPage === "case-details" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(CaseDetailsPage, {}),
20567
- currentPage === "notifications" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(NotificationsScreen, {})
21360
+ return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_react_native66.View, { style: [styles54.container, { backgroundColor: colors.canvasSubtle }], children: [
21361
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_react_native66.StatusBar, { barStyle, translucent: true }),
21362
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_react_native66.View, { style: styles54.mainColumn, children: brandingLoading ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PCLoader, {}) : /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
21363
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(SlimTopBar, { mode: chromeMode, onBack }),
21364
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_react_native66.View, { style: [styles54.content, { paddingBottom: insets.bottom }], children: status === "checking" ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PCLoader, {}) : status === "session-expired" ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PrivacyCenterSessionExpired, {}) : status === "empty" ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PrivacyCenterEmptyState, {}) : /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
21365
+ currentPage === "home" && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(HomeHub, {}),
21366
+ currentPage === "consent-manager" && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ConsentManager, {}),
21367
+ currentPage === "form" && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(FormPage, {}),
21368
+ currentPage === "activity" && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ActivitiesList, {}),
21369
+ currentPage === "receipts" && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ReceiptsList, {}),
21370
+ currentPage === "case-details" && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(CaseDetailsPage, {}),
21371
+ currentPage === "notifications" && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(NotificationsScreen, {})
20568
21372
  ] }) })
20569
21373
  ] }) })
20570
21374
  ] });
@@ -20578,22 +21382,34 @@ function RedactoPrivacyCenter({
20578
21382
  theme: _theme,
20579
21383
  accessToken,
20580
21384
  refreshToken,
21385
+ token,
21386
+ email,
21387
+ mobile,
21388
+ ucic,
21389
+ organisationUuid,
21390
+ workspaceUuid,
20581
21391
  onError,
20582
21392
  initialPage = "home",
20583
21393
  initialCaseUuid,
20584
21394
  onBack
20585
21395
  }) {
20586
- return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(SafeAreaBoundary, { children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(KeyboardProviderCompat, { children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_react_query2.QueryClientProvider, { client: privacyCenterQueryClient, children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_react_i18next29.I18nextProvider, { i18n: i18n_default, children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(ThemeProvider, { slug, baseUrl, children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(BaseUrlProvider, { baseUrl, ledgerBaseUrl, children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
21396
+ return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(SafeAreaBoundary, { children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(KeyboardProviderCompat, { children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_react_query2.QueryClientProvider, { client: privacyCenterQueryClient, children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_react_i18next31.I18nextProvider, { i18n: i18n_default, children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ThemeProvider, { slug, baseUrl, children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(BaseUrlProvider, { baseUrl, ledgerBaseUrl, children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
20587
21397
  AuthProvider,
20588
21398
  {
20589
- accessToken,
20590
- refreshToken,
21399
+ accessToken: accessToken != null ? accessToken : "",
21400
+ refreshToken: refreshToken != null ? refreshToken : "",
21401
+ token,
21402
+ sandboxUcic: ucic,
21403
+ sandboxSubject: email || mobile,
21404
+ organisationUuid,
21405
+ workspaceUuid,
21406
+ slug,
20591
21407
  onError,
20592
- children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(NavigationProvider, { initialPage, initialPendingCaseUuid: initialCaseUuid != null ? initialCaseUuid : null, children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(DataAvailabilityProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(PageStatusProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(PrivacyCenterContent, { onBack }) }) }) })
21408
+ children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(NavigationProvider, { initialPage, initialPendingCaseUuid: initialCaseUuid != null ? initialCaseUuid : null, children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(SelectUserGate, { children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(DataAvailabilityProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PageStatusProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PrivacyCenterContent, { onBack }) }) }) }) })
20593
21409
  }
20594
21410
  ) }) }) }) }) }) });
20595
21411
  }
20596
- var styles52 = import_react_native64.StyleSheet.create({
21412
+ var styles54 = import_react_native66.StyleSheet.create({
20597
21413
  container: {
20598
21414
  flex: 1
20599
21415
  },
@@ -20607,74 +21423,74 @@ var styles52 = import_react_native64.StyleSheet.create({
20607
21423
  });
20608
21424
 
20609
21425
  // src/RedactoPrivacyCenter/components/SideMenu.tsx
20610
- var import_react_native65 = require("react-native");
20611
- var import_react_i18next30 = require("react-i18next");
21426
+ var import_react_native67 = require("react-native");
21427
+ var import_react_i18next32 = require("react-i18next");
20612
21428
  var import_react_native_svg4 = __toESM(require("react-native-svg"));
20613
- var import_jsx_runtime65 = require("react/jsx-runtime");
21429
+ var import_jsx_runtime69 = require("react/jsx-runtime");
20614
21430
  var MENU_ITEMS = [
20615
21431
  { page: "consent-manager", labelKey: "consentManager", fallback: "Consent Manager", icon: "shield-check" },
20616
21432
  { page: "form", labelKey: "grievanceRequests", fallback: "Privacy Requests", icon: "message-circle-warning" },
20617
21433
  { page: "activity", labelKey: "activity", fallback: "Activity", icon: "activity" }
20618
21434
  ];
20619
21435
  function SideMenu({ onBack } = {}) {
20620
- const { t } = (0, import_react_i18next30.useTranslation)();
21436
+ const { t } = (0, import_react_i18next32.useTranslation)();
20621
21437
  const { currentPage, navigateTo } = useInternalNavigation();
20622
21438
  const { organizationName, email } = useAuth();
20623
21439
  const { colors } = useTheme();
20624
21440
  const orgInitial = organizationName ? organizationName.charAt(0).toUpperCase() : "R";
20625
21441
  const displayName = organizationName || "Organization";
20626
- return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_react_native65.View, { style: [styles53.container, { backgroundColor: colors.surface }], children: [
20627
- /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_react_native65.View, { style: styles53.orgSection, children: [
20628
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: [styles53.avatar, { backgroundColor: colors.primary }], children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.Text, { style: [styles53.avatarText, { color: colors.primaryText }], children: orgInitial }) }),
20629
- /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_react_native65.View, { style: styles53.orgInfo, children: [
20630
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.Text, { style: [styles53.orgName, { color: colors.text }], numberOfLines: 1, children: displayName }),
20631
- email ? /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.Text, { style: [styles53.orgEmail, { color: colors.textSecondary }], numberOfLines: 1, children: email }) : null
21442
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_react_native67.View, { style: [styles55.container, { backgroundColor: colors.surface }], children: [
21443
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_react_native67.View, { style: styles55.orgSection, children: [
21444
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.View, { style: [styles55.avatar, { backgroundColor: colors.primary }], children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.Text, { style: [styles55.avatarText, { color: colors.primaryText }], children: orgInitial }) }),
21445
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_react_native67.View, { style: styles55.orgInfo, children: [
21446
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.Text, { style: [styles55.orgName, { color: colors.text }], numberOfLines: 1, children: displayName }),
21447
+ email ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.Text, { style: [styles55.orgEmail, { color: colors.textSecondary }], numberOfLines: 1, children: email }) : null
20632
21448
  ] })
20633
21449
  ] }),
20634
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: [styles53.divider, { backgroundColor: colors.border }] }),
20635
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: styles53.menuSection, children: MENU_ITEMS.map((item) => {
21450
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.View, { style: [styles55.divider, { backgroundColor: colors.border }] }),
21451
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.View, { style: styles55.menuSection, children: MENU_ITEMS.map((item) => {
20636
21452
  const isActive = currentPage === item.page || item.page === "form" && currentPage === "case-details";
20637
- return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
20638
- import_react_native65.TouchableOpacity,
21453
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
21454
+ import_react_native67.TouchableOpacity,
20639
21455
  {
20640
21456
  style: [
20641
- styles53.menuItem,
20642
- isActive && [styles53.menuItemActive, { backgroundColor: `${colors.primary}14` }]
21457
+ styles55.menuItem,
21458
+ isActive && [styles55.menuItemActive, { backgroundColor: `${colors.primary}14` }]
20643
21459
  ],
20644
21460
  onPress: () => navigateTo(item.page),
20645
21461
  activeOpacity: 0.7,
20646
21462
  accessibilityRole: "button",
20647
21463
  accessibilityState: { selected: isActive },
20648
21464
  children: [
20649
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: styles53.menuIconWrap, children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(Icon, { name: item.icon, size: 18, color: isActive ? colors.primary : colors.textSecondary }) }),
20650
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
20651
- import_react_native65.Text,
21465
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.View, { style: styles55.menuIconWrap, children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Icon, { name: item.icon, size: 18, color: isActive ? colors.primary : colors.textSecondary }) }),
21466
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
21467
+ import_react_native67.Text,
20652
21468
  {
20653
21469
  style: [
20654
- styles53.menuLabel,
21470
+ styles55.menuLabel,
20655
21471
  { color: isActive ? colors.primary : colors.text },
20656
- isActive && styles53.menuLabelActive
21472
+ isActive && styles55.menuLabelActive
20657
21473
  ],
20658
21474
  children: t(item.labelKey) || item.fallback
20659
21475
  }
20660
21476
  ),
20661
- isActive ? /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: [styles53.activeIndicator, { backgroundColor: colors.primary }] }) : null
21477
+ isActive ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.View, { style: [styles55.activeIndicator, { backgroundColor: colors.primary }] }) : null
20662
21478
  ]
20663
21479
  },
20664
21480
  item.page
20665
21481
  );
20666
21482
  }) }),
20667
- onBack ? /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_jsx_runtime65.Fragment, { children: [
20668
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: { flex: 1 } }),
20669
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: [styles53.divider, { backgroundColor: colors.border }] }),
20670
- /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
20671
- import_react_native65.TouchableOpacity,
21483
+ onBack ? /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
21484
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.View, { style: { flex: 1 } }),
21485
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.View, { style: [styles55.divider, { backgroundColor: colors.border }] }),
21486
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
21487
+ import_react_native67.TouchableOpacity,
20672
21488
  {
20673
- style: styles53.backBtn,
21489
+ style: styles55.backBtn,
20674
21490
  onPress: () => navigateBack(onBack),
20675
21491
  activeOpacity: 0.7,
20676
21492
  children: [
20677
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native_svg4.default, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", children: onBack === "back" ? /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
21493
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native_svg4.default, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", children: onBack === "back" ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
20678
21494
  import_react_native_svg4.Path,
20679
21495
  {
20680
21496
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20683,7 +21499,7 @@ function SideMenu({ onBack } = {}) {
20683
21499
  strokeLinecap: "round",
20684
21500
  strokeLinejoin: "round"
20685
21501
  }
20686
- ) : /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
21502
+ ) : /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
20687
21503
  import_react_native_svg4.Path,
20688
21504
  {
20689
21505
  d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4 M16 17l5-5-5-5 M21 12H9",
@@ -20693,14 +21509,14 @@ function SideMenu({ onBack } = {}) {
20693
21509
  strokeLinejoin: "round"
20694
21510
  }
20695
21511
  ) }),
20696
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.Text, { style: [styles53.backBtnLabel, { color: colors.textSecondary }], children: onBack === "back" ? t("back") || "Back" : t("signOut") || "Sign Out" })
21512
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_react_native67.Text, { style: [styles55.backBtnLabel, { color: colors.textSecondary }], children: onBack === "back" ? t("back") || "Back" : t("signOut") || "Sign Out" })
20697
21513
  ]
20698
21514
  }
20699
21515
  )
20700
21516
  ] }) : null
20701
21517
  ] });
20702
21518
  }
20703
- var styles53 = import_react_native65.StyleSheet.create({
21519
+ var styles55 = import_react_native67.StyleSheet.create({
20704
21520
  container: {
20705
21521
  flex: 1,
20706
21522
  paddingTop: 12
@@ -20786,42 +21602,68 @@ var styles53 = import_react_native65.StyleSheet.create({
20786
21602
  });
20787
21603
 
20788
21604
  // src/RedactoPrivacyCenter/components/Navbar.tsx
20789
- var import_react44 = require("react");
20790
- var import_react_native67 = require("react-native");
20791
- var import_react_i18next32 = require("react-i18next");
21605
+ var import_react46 = require("react");
21606
+ var import_react_native69 = require("react-native");
21607
+ var import_react_i18next34 = require("react-i18next");
20792
21608
  var import_react_native_svg6 = __toESM(require("react-native-svg"));
20793
21609
 
20794
21610
  // src/RedactoPrivacyCenter/components/UserOrgMenu.tsx
20795
- var import_react_native66 = require("react-native");
20796
- var import_react_i18next31 = require("react-i18next");
21611
+ var import_react_native68 = require("react-native");
21612
+ var import_react_i18next33 = require("react-i18next");
20797
21613
  var import_react_native_svg5 = __toESM(require("react-native-svg"));
20798
- var import_jsx_runtime66 = require("react/jsx-runtime");
21614
+ var import_jsx_runtime70 = require("react/jsx-runtime");
20799
21615
  var UserOrgMenu = ({ visible, onClose, onBack }) => {
20800
- const { t } = (0, import_react_i18next31.useTranslation)();
21616
+ const { t } = (0, import_react_i18next33.useTranslation)();
20801
21617
  const { organizationName, email } = useAuth();
20802
21618
  const { colors, branding } = useTheme();
21619
+ const { switchProfile } = useProfileSwitch();
20803
21620
  const brandName = (branding == null ? void 0 : branding.brand_name) || organizationName || t("privacyCenter") || "Privacy Center";
20804
21621
  const handleAction = () => {
20805
21622
  onClose();
20806
21623
  navigateBack(onBack);
20807
21624
  };
20808
- return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(BottomSheet, { visible, onClose, title: t("account") || "Account", children: [
20809
- /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_react_native66.View, { style: styles54.identity, children: [
20810
- (branding == null ? void 0 : branding.logo_url) ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native66.Image, { source: { uri: branding.logo_url }, style: styles54.logo, resizeMode: "contain" }) : /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(PCAvatar, { name: organizationName || brandName, imageUrl: branding == null ? void 0 : branding.icon_url, size: 52 }),
20811
- /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_react_native66.View, { style: styles54.identityText, children: [
20812
- /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native66.Text, { style: [styles54.orgName, { color: colors.text }], numberOfLines: 2, children: brandName }),
20813
- email ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native66.Text, { style: [styles54.email, { color: colors.textSecondary }], numberOfLines: 1, children: email }) : null
21625
+ return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(BottomSheet, { visible, onClose, title: t("account") || "Account", children: [
21626
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(import_react_native68.View, { style: styles56.identity, children: [
21627
+ (branding == null ? void 0 : branding.logo_url) ? /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_react_native68.Image, { source: { uri: branding.logo_url }, style: styles56.logo, resizeMode: "contain" }) : /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(PCAvatar, { name: organizationName || brandName, imageUrl: branding == null ? void 0 : branding.icon_url, size: 52 }),
21628
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(import_react_native68.View, { style: styles56.identityText, children: [
21629
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_react_native68.Text, { style: [styles56.orgName, { color: colors.text }], numberOfLines: 2, children: brandName }),
21630
+ email ? /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_react_native68.Text, { style: [styles56.email, { color: colors.textSecondary }], numberOfLines: 1, children: email }) : null
20814
21631
  ] })
20815
21632
  ] }),
20816
- onBack ? /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
20817
- import_react_native66.TouchableOpacity,
21633
+ switchProfile ? /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(
21634
+ import_react_native68.TouchableOpacity,
21635
+ {
21636
+ style: [styles56.actionRow, { backgroundColor: withAlpha(colors.primary, 0.1) }],
21637
+ onPress: () => {
21638
+ onClose();
21639
+ switchProfile();
21640
+ },
21641
+ activeOpacity: 0.7,
21642
+ accessibilityRole: "button",
21643
+ children: [
21644
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_react_native_svg5.default, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
21645
+ import_react_native_svg5.Path,
21646
+ {
21647
+ d: "M16 3h5v5 M21 3l-7 7 M8 21H3v-5 M3 21l7-7",
21648
+ stroke: colors.primary,
21649
+ strokeWidth: 2,
21650
+ strokeLinecap: "round",
21651
+ strokeLinejoin: "round"
21652
+ }
21653
+ ) }),
21654
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_react_native68.Text, { style: [styles56.actionLabel, { color: colors.primary }], children: t("switchProfile") })
21655
+ ]
21656
+ }
21657
+ ) : null,
21658
+ onBack ? /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(
21659
+ import_react_native68.TouchableOpacity,
20818
21660
  {
20819
- style: [styles54.actionRow, { backgroundColor: withAlpha(onBack === "signout" ? colors.error : colors.primary, 0.1) }],
21661
+ style: [styles56.actionRow, { backgroundColor: withAlpha(onBack === "signout" ? colors.error : colors.primary, 0.1) }],
20820
21662
  onPress: handleAction,
20821
21663
  activeOpacity: 0.7,
20822
21664
  accessibilityRole: "button",
20823
21665
  children: [
20824
- /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native_svg5.default, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", children: onBack === "signout" ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
21666
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_react_native_svg5.default, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", children: onBack === "signout" ? /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
20825
21667
  import_react_native_svg5.Path,
20826
21668
  {
20827
21669
  d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4 M16 17l5-5-5-5 M21 12H9",
@@ -20830,7 +21672,7 @@ var UserOrgMenu = ({ visible, onClose, onBack }) => {
20830
21672
  strokeLinecap: "round",
20831
21673
  strokeLinejoin: "round"
20832
21674
  }
20833
- ) : /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
21675
+ ) : /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
20834
21676
  import_react_native_svg5.Path,
20835
21677
  {
20836
21678
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20840,13 +21682,13 @@ var UserOrgMenu = ({ visible, onClose, onBack }) => {
20840
21682
  strokeLinejoin: "round"
20841
21683
  }
20842
21684
  ) }),
20843
- /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native66.Text, { style: [styles54.actionLabel, { color: onBack === "signout" ? colors.error : colors.primary }], children: onBack === "signout" ? t("signOut") || "Sign Out" : t("back") || "Back" })
21685
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(import_react_native68.Text, { style: [styles56.actionLabel, { color: onBack === "signout" ? colors.error : colors.primary }], children: onBack === "signout" ? t("signOut") || "Sign Out" : t("back") || "Back" })
20844
21686
  ]
20845
21687
  }
20846
21688
  ) : null
20847
21689
  ] });
20848
21690
  };
20849
- var styles54 = import_react_native66.StyleSheet.create({
21691
+ var styles56 = import_react_native68.StyleSheet.create({
20850
21692
  identity: {
20851
21693
  flexDirection: "row",
20852
21694
  alignItems: "center",
@@ -20887,33 +21729,33 @@ var styles54 = import_react_native66.StyleSheet.create({
20887
21729
  });
20888
21730
 
20889
21731
  // src/RedactoPrivacyCenter/components/Navbar.tsx
20890
- var import_jsx_runtime67 = require("react/jsx-runtime");
21732
+ var import_jsx_runtime71 = require("react/jsx-runtime");
20891
21733
  function Navbar({ mode = "primary", onBack }) {
20892
- const { t } = (0, import_react_i18next32.useTranslation)();
21734
+ const { t } = (0, import_react_i18next34.useTranslation)();
20893
21735
  const { currentPage, navigateTo } = useInternalNavigation();
20894
21736
  const { organizationName, email } = useAuth();
20895
21737
  const { colors, branding } = useTheme();
20896
- const [locale, setLocale] = (0, import_react44.useState)(i18n_default.language || "en");
20897
- const [menuOpen, setMenuOpen] = (0, import_react44.useState)(false);
21738
+ const [locale, setLocale] = (0, import_react46.useState)(i18n_default.language || "en");
21739
+ const [menuOpen, setMenuOpen] = (0, import_react46.useState)(false);
20898
21740
  const unreadCount = useUnreadCount();
20899
21741
  const { status: pageStatus } = usePageStatus();
20900
21742
  const pageChrome = PAGE_CHROME_BY_PAGE[currentPage] || PAGE_CHROME_BY_PAGE["consent-manager"];
20901
21743
  const isDetail = mode === "detail";
20902
- (0, import_react44.useEffect)(() => {
21744
+ (0, import_react46.useEffect)(() => {
20903
21745
  const handleLanguageChanged = () => setLocale(i18n_default.language);
20904
21746
  i18n_default.on("languageChanged", handleLanguageChanged);
20905
21747
  return () => {
20906
21748
  i18n_default.off("languageChanged", handleLanguageChanged);
20907
21749
  };
20908
21750
  }, []);
20909
- const handleLanguageChange = (0, import_react44.useCallback)((value) => {
21751
+ const handleLanguageChange = (0, import_react46.useCallback)((value) => {
20910
21752
  i18n_default.changeLanguage(value);
20911
21753
  }, []);
20912
21754
  const brandLabel = (branding == null ? void 0 : branding.brand_name) || organizationName || t("privacyCenter") || "Privacy Center";
20913
21755
  const accountLabel = brandLabel || email || t("account") || "Account";
20914
- const brandLockup = /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.brandRow, children: [
20915
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PCAvatar, { name: organizationName || brandLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 }),
20916
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native67.Text, { style: [styles55.brandText, { color: colors.text }], numberOfLines: 1, children: brandLabel })
21756
+ const brandLockup = /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react_native69.View, { style: styles57.brandRow, children: [
21757
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(PCAvatar, { name: organizationName || brandLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 }),
21758
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react_native69.Text, { style: [styles57.brandText, { color: colors.text }], numberOfLines: 1, children: brandLabel })
20917
21759
  ] });
20918
21760
  const handleDetailBack = () => {
20919
21761
  if (currentPage === "case-details") {
@@ -20925,26 +21767,26 @@ function Navbar({ mode = "primary", onBack }) {
20925
21767
  }
20926
21768
  };
20927
21769
  if (isDetail) {
20928
- return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
20929
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20930
- import_react_native67.View,
21770
+ return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_jsx_runtime71.Fragment, { children: [
21771
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
21772
+ import_react_native69.View,
20931
21773
  {
20932
21774
  style: [
20933
- styles55.container,
20934
- styles55.detailContainer,
21775
+ styles57.container,
21776
+ styles57.detailContainer,
20935
21777
  { backgroundColor: colors.background, borderBottomColor: colors.border, paddingTop: TOP_INSET + spacing.xs }
20936
21778
  ],
20937
- children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.detailRow, children: [
20938
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20939
- import_react_native67.TouchableOpacity,
21779
+ children: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react_native69.View, { style: styles57.detailRow, children: [
21780
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
21781
+ import_react_native69.TouchableOpacity,
20940
21782
  {
20941
- style: styles55.backButton,
21783
+ style: styles57.backButton,
20942
21784
  onPress: handleDetailBack,
20943
21785
  activeOpacity: 0.7,
20944
21786
  hitSlop: DEFAULT_HIT_SLOP,
20945
21787
  accessibilityRole: "button",
20946
21788
  accessibilityLabel: t("back") || "Back",
20947
- children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native_svg6.default, { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21789
+ children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react_native_svg6.default, { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
20948
21790
  import_react_native_svg6.Path,
20949
21791
  {
20950
21792
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20956,36 +21798,36 @@ function Navbar({ mode = "primary", onBack }) {
20956
21798
  ) })
20957
21799
  }
20958
21800
  ),
20959
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.detailTitleWrap, children: [
20960
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native67.Text, { style: [styles55.detailTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
20961
- pageStatus ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PCBadge, { status: pageStatus.tone, label: pageStatus.label }) : null
21801
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react_native69.View, { style: styles57.detailTitleWrap, children: [
21802
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react_native69.Text, { style: [styles57.detailTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
21803
+ pageStatus ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(PCBadge, { status: pageStatus.tone, label: pageStatus.label }) : null
20962
21804
  ] })
20963
21805
  ] })
20964
21806
  }
20965
21807
  ),
20966
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21808
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
20967
21809
  ] });
20968
21810
  }
20969
- return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
20970
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
20971
- import_react_native67.View,
21811
+ return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_jsx_runtime71.Fragment, { children: [
21812
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
21813
+ import_react_native69.View,
20972
21814
  {
20973
21815
  style: [
20974
- styles55.container,
21816
+ styles57.container,
20975
21817
  { backgroundColor: colors.background, borderBottomColor: colors.border, paddingTop: TOP_INSET + spacing.xs }
20976
21818
  ],
20977
21819
  children: [
20978
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.appBar, children: [
20979
- onBack ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20980
- import_react_native67.TouchableOpacity,
21820
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react_native69.View, { style: styles57.appBar, children: [
21821
+ onBack ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
21822
+ import_react_native69.TouchableOpacity,
20981
21823
  {
20982
- style: styles55.backButton,
21824
+ style: styles57.backButton,
20983
21825
  onPress: () => navigateBack(onBack),
20984
21826
  activeOpacity: 0.7,
20985
21827
  hitSlop: DEFAULT_HIT_SLOP,
20986
21828
  accessibilityRole: "button",
20987
21829
  accessibilityLabel: onBack === "back" ? t("back") || "Back" : t("signOut") || "Sign Out",
20988
- children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native_svg6.default, { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21830
+ children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react_native_svg6.default, { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
20989
21831
  import_react_native_svg6.Path,
20990
21832
  {
20991
21833
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20997,39 +21839,39 @@ function Navbar({ mode = "primary", onBack }) {
20997
21839
  ) })
20998
21840
  }
20999
21841
  ) : null,
21000
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native67.View, { style: styles55.brandWrap, children: (branding == null ? void 0 : branding.logo_url) ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(BrandImage, { uri: branding.logo_url, height: 34, maxWidth: 170, fallback: brandLockup }) : brandLockup }),
21001
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.actions, children: [
21002
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(NotificationBell, { count: unreadCount, onPress: () => navigateTo("notifications") }),
21003
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PCSelect, { value: locale, options: languageOptions, onChange: handleLanguageChange, placeholder: t("language"), compact: true }),
21004
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21005
- import_react_native67.TouchableOpacity,
21842
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react_native69.View, { style: styles57.brandWrap, children: (branding == null ? void 0 : branding.logo_url) ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(BrandImage, { uri: branding.logo_url, height: 34, maxWidth: 170, fallback: brandLockup }) : brandLockup }),
21843
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react_native69.View, { style: styles57.actions, children: [
21844
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(NotificationBell, { count: unreadCount, onPress: () => navigateTo("notifications") }),
21845
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(PCSelect, { value: locale, options: languageOptions, onChange: handleLanguageChange, placeholder: t("language"), compact: true }),
21846
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
21847
+ import_react_native69.TouchableOpacity,
21006
21848
  {
21007
- style: styles55.avatarButton,
21849
+ style: styles57.avatarButton,
21008
21850
  onPress: () => setMenuOpen(true),
21009
21851
  activeOpacity: 0.7,
21010
21852
  hitSlop: DEFAULT_HIT_SLOP,
21011
21853
  accessibilityRole: "button",
21012
21854
  accessibilityLabel: accountLabel,
21013
- children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PCAvatar, { name: organizationName || accountLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 })
21855
+ children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(PCAvatar, { name: organizationName || accountLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 })
21014
21856
  }
21015
21857
  )
21016
21858
  ] })
21017
21859
  ] }),
21018
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native67.View, { style: styles55.pageHeader, children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.titleRow, children: [
21019
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native67.Text, { style: [styles55.pageTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
21020
- pageStatus ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PCBadge, { status: pageStatus.tone, label: pageStatus.label }) : null
21860
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react_native69.View, { style: styles57.pageHeader, children: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react_native69.View, { style: styles57.titleRow, children: [
21861
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react_native69.Text, { style: [styles57.pageTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
21862
+ pageStatus ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(PCBadge, { status: pageStatus.tone, label: pageStatus.label }) : null
21021
21863
  ] }) })
21022
21864
  ]
21023
21865
  }
21024
21866
  ),
21025
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21867
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(UserOrgMenu, { visible: menuOpen, onClose: () => setMenuOpen(false), onBack })
21026
21868
  ] });
21027
21869
  }
21028
- var styles55 = import_react_native67.StyleSheet.create({
21870
+ var styles57 = import_react_native69.StyleSheet.create({
21029
21871
  container: {
21030
21872
  paddingHorizontal: spacing.lg,
21031
21873
  paddingBottom: spacing.md,
21032
- borderBottomWidth: import_react_native67.StyleSheet.hairlineWidth
21874
+ borderBottomWidth: import_react_native69.StyleSheet.hairlineWidth
21033
21875
  },
21034
21876
  detailContainer: {
21035
21877
  paddingBottom: spacing.sm
@@ -21109,10 +21951,10 @@ var styles55 = import_react_native67.StyleSheet.create({
21109
21951
  });
21110
21952
 
21111
21953
  // src/RedactoPrivacyCenter/components/BottomTabBar.tsx
21112
- var import_react45 = require("react");
21113
- var import_react_native68 = require("react-native");
21114
- var import_react_i18next33 = require("react-i18next");
21115
- var import_jsx_runtime68 = require("react/jsx-runtime");
21954
+ var import_react47 = require("react");
21955
+ var import_react_native70 = require("react-native");
21956
+ var import_react_i18next35 = require("react-i18next");
21957
+ var import_jsx_runtime72 = require("react/jsx-runtime");
21116
21958
  var TAB_ITEMS = [
21117
21959
  { page: "consent-manager", labelKey: "consentManager", fallback: "Consents", icon: "shield-check" },
21118
21960
  { page: "form", labelKey: "grievanceRequests", fallback: "Requests", icon: "message-circle-warning" },
@@ -21123,10 +21965,10 @@ var PAD_H = spacing.lg;
21123
21965
  var PILL_WIDTH = 56;
21124
21966
  var PILL_HEIGHT = 34;
21125
21967
  function BottomTabBar({ showFooter = true }) {
21126
- const { t } = (0, import_react_i18next33.useTranslation)();
21968
+ const { t } = (0, import_react_i18next35.useTranslation)();
21127
21969
  const { currentPage, navigateTo } = useInternalNavigation();
21128
21970
  const { colors } = useTheme();
21129
- const [rowWidth, setRowWidth] = (0, import_react45.useState)(0);
21971
+ const [rowWidth, setRowWidth] = (0, import_react47.useState)(0);
21130
21972
  const innerWidth = Math.max(0, rowWidth - PAD_H * 2);
21131
21973
  const tabWidth = innerWidth > 0 ? innerWidth / TAB_ITEMS.length : 0;
21132
21974
  const activeIndex = TAB_ITEMS.findIndex(
@@ -21134,13 +21976,13 @@ function BottomTabBar({ showFooter = true }) {
21134
21976
  );
21135
21977
  const { translateX } = useAnimatedTabIndicator(Math.max(0, activeIndex), tabWidth);
21136
21978
  const onLayout = (e) => setRowWidth(e.nativeEvent.layout.width);
21137
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_react_native68.View, { style: [styles56.wrapper, { backgroundColor: colors.canvasSubtle, borderTopColor: colors.hairline }], children: [
21138
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_react_native68.View, { style: styles56.container, onLayout, children: [
21139
- tabWidth > 0 && activeIndex >= 0 ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
21140
- import_react_native68.Animated.View,
21979
+ return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_react_native70.View, { style: [styles58.wrapper, { backgroundColor: colors.canvasSubtle, borderTopColor: colors.hairline }], children: [
21980
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_react_native70.View, { style: styles58.container, onLayout, children: [
21981
+ tabWidth > 0 && activeIndex >= 0 ? /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
21982
+ import_react_native70.Animated.View,
21141
21983
  {
21142
21984
  style: [
21143
- styles56.pill,
21985
+ styles58.pill,
21144
21986
  {
21145
21987
  width: PILL_WIDTH,
21146
21988
  left: PAD_H + (tabWidth - PILL_WIDTH) / 2,
@@ -21153,17 +21995,17 @@ function BottomTabBar({ showFooter = true }) {
21153
21995
  TAB_ITEMS.map((item) => {
21154
21996
  const isActive = currentPage === item.page || item.page === "form" && currentPage === "case-details";
21155
21997
  const label = t(item.labelKey) || item.fallback;
21156
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
21157
- import_react_native68.TouchableOpacity,
21998
+ return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
21999
+ import_react_native70.TouchableOpacity,
21158
22000
  {
21159
- style: styles56.tab,
22001
+ style: styles58.tab,
21160
22002
  onPress: () => navigateTo(item.page),
21161
22003
  activeOpacity: 0.7,
21162
22004
  accessibilityRole: "tab",
21163
22005
  accessibilityState: { selected: isActive },
21164
22006
  accessibilityLabel: label,
21165
22007
  children: [
21166
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_react_native68.View, { style: styles56.iconWrap, children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
22008
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_react_native70.View, { style: styles58.iconWrap, children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
21167
22009
  Icon,
21168
22010
  {
21169
22011
  name: item.icon,
@@ -21172,10 +22014,10 @@ function BottomTabBar({ showFooter = true }) {
21172
22014
  strokeWidth: isActive ? 2.1 : 1.85
21173
22015
  }
21174
22016
  ) }),
21175
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
21176
- import_react_native68.Text,
22017
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
22018
+ import_react_native70.Text,
21177
22019
  {
21178
- style: [styles56.tabLabel, { color: isActive ? colors.primary : colors.textSecondary }],
22020
+ style: [styles58.tabLabel, { color: isActive ? colors.primary : colors.textSecondary }],
21179
22021
  numberOfLines: 1,
21180
22022
  children: label
21181
22023
  }
@@ -21186,13 +22028,13 @@ function BottomTabBar({ showFooter = true }) {
21186
22028
  );
21187
22029
  })
21188
22030
  ] }),
21189
- showFooter ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Footer, { inline: true }) : null,
21190
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_react_native68.View, { style: { height: BOTTOM_INSET } })
22031
+ showFooter ? /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(Footer, { inline: true }) : null,
22032
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_react_native70.View, { style: { height: BOTTOM_INSET } })
21191
22033
  ] });
21192
22034
  }
21193
- var styles56 = import_react_native68.StyleSheet.create({
22035
+ var styles58 = import_react_native70.StyleSheet.create({
21194
22036
  wrapper: {
21195
- borderTopWidth: import_react_native68.StyleSheet.hairlineWidth
22037
+ borderTopWidth: import_react_native70.StyleSheet.hairlineWidth
21196
22038
  },
21197
22039
  container: {
21198
22040
  flexDirection: "row",