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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,7 +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;
14791
+ var FORM_PICKER_GROUP_LIMIT = 100;
14792
+ var LEGACY_PRODUCT_GROUP_UUID = "__legacy_flat_purposes__";
14318
14793
  var POLL_INTERVAL = 3e4;
14319
14794
  var NOTIFICATION_PAGE_SIZE = 10;
14320
14795
  var TAB_TO_CATEGORY = {
@@ -14417,7 +14892,7 @@ var ModifyConsentModal = ({
14417
14892
  action: "revoke",
14418
14893
  buttonLabel: t("revokeConsent"),
14419
14894
  buttonColor: colors.error,
14420
- warningMessage: t("revokeConsentWarning"),
14895
+ warningMessage: selectedRecord.revoke_warning_message || t("revokeConsentWarning"),
14421
14896
  description: nominatorLabel ? t("aboutToModifyConsentOnBehalf", { nominator: nominatorLabel }) : t("aboutToModifyConsent")
14422
14897
  };
14423
14898
  }
@@ -15088,7 +15563,8 @@ function ConsentManager() {
15088
15563
  dataElements: (_b = selectedRecord == null ? void 0 : selectedRecord.data_elements) == null ? void 0 : _b.map((de) => ({
15089
15564
  uuid: de.uuid,
15090
15565
  selected: de.selected
15091
- }))
15566
+ })),
15567
+ language: langParam
15092
15568
  });
15093
15569
  setIsModalOpen(false);
15094
15570
  setSelectedRecord(null);
@@ -15100,7 +15576,7 @@ function ConsentManager() {
15100
15576
  setIsManageLoading(false);
15101
15577
  }
15102
15578
  },
15103
- [organizationId, workspaceId, email, authContext, consentClient, selectedRecord, fetchData, t]
15579
+ [organizationId, workspaceId, email, authContext, consentClient, selectedRecord, langParam, fetchData, t]
15104
15580
  );
15105
15581
  const handleExport = (0, import_react25.useCallback)(async () => {
15106
15582
  if (!consentData.length) return;
@@ -15463,6 +15939,7 @@ function ActivitiesList() {
15463
15939
  () => ({ accessToken, refreshToken, onError, updateTokens }),
15464
15940
  [accessToken, refreshToken, onError, updateTokens]
15465
15941
  );
15942
+ const { langParam } = useCurrentLanguage();
15466
15943
  const [activities, setActivities] = (0, import_react26.useState)([]);
15467
15944
  const [totalCount, setTotalCount] = (0, import_react26.useState)(0);
15468
15945
  const [isLoading, setIsLoading] = (0, import_react26.useState)(true);
@@ -15474,7 +15951,7 @@ function ActivitiesList() {
15474
15951
  var _a3, _b, _c;
15475
15952
  if (!organizationId || !workspaceId) return;
15476
15953
  try {
15477
- const response = await fetchActivities(organizationId, workspaceId, nextOffset, PAGE_SIZE, authContext, consentClient);
15954
+ const response = await fetchActivities(organizationId, workspaceId, nextOffset, PAGE_SIZE, authContext, consentClient, langParam);
15478
15955
  if (!response) return;
15479
15956
  const rows = (_a3 = response.data) != null ? _a3 : [];
15480
15957
  setActivities((prev) => append ? [...prev, ...rows] : rows);
@@ -15485,7 +15962,7 @@ function ActivitiesList() {
15485
15962
  if (!append) setActivities([]);
15486
15963
  }
15487
15964
  },
15488
- [organizationId, workspaceId, authContext, consentClient]
15965
+ [organizationId, workspaceId, authContext, consentClient, langParam]
15489
15966
  );
15490
15967
  (0, import_react26.useEffect)(() => {
15491
15968
  setIsLoading(true);
@@ -15615,10 +16092,10 @@ var import_react_i18next14 = require("react-i18next");
15615
16092
  // src/RedactoPrivacyCenter/lib/dateGroup.ts
15616
16093
  var import_react27 = require("react");
15617
16094
  var import_react_i18next13 = require("react-i18next");
15618
- function monthKey(ts) {
16095
+ function monthKey(ts, locale) {
15619
16096
  if (!ts) return "";
15620
16097
  try {
15621
- return new Date(ts).toLocaleDateString(void 0, { month: "long", year: "numeric" });
16098
+ return new Date(ts).toLocaleDateString(locale || void 0, { month: "long", year: "numeric" });
15622
16099
  } catch {
15623
16100
  return "";
15624
16101
  }
@@ -15694,7 +16171,7 @@ function groupByTime(items, getTs, classify) {
15694
16171
  );
15695
16172
  }
15696
16173
  function useRelativeDate() {
15697
- const { t } = (0, import_react_i18next13.useTranslation)();
16174
+ const { t, i18n: i18n2 } = (0, import_react_i18next13.useTranslation)();
15698
16175
  return (0, import_react27.useCallback)(
15699
16176
  (ts) => {
15700
16177
  if (!ts) return "";
@@ -15707,7 +16184,7 @@ function useRelativeDate() {
15707
16184
  if (dayDiff <= 0) return t("today", { defaultValue: "Today" });
15708
16185
  if (dayDiff === 1) return t("yesterday", { defaultValue: "Yesterday" });
15709
16186
  if (dayDiff < 7) return t("daysAgo", { count: dayDiff, defaultValue: "{{count}} days ago" });
15710
- return d.toLocaleDateString(void 0, {
16187
+ return d.toLocaleDateString(i18n2.language || void 0, {
15711
16188
  month: "short",
15712
16189
  day: "numeric",
15713
16190
  ...d.getFullYear() !== now.getFullYear() ? { year: "numeric" } : {}
@@ -15716,10 +16193,28 @@ function useRelativeDate() {
15716
16193
  return ts;
15717
16194
  }
15718
16195
  },
15719
- [t]
16196
+ [t, i18n2.language]
15720
16197
  );
15721
16198
  }
15722
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
+
15723
16218
  // src/RedactoPrivacyCenter/components/ReceiptsList.tsx
15724
16219
  var import_jsx_runtime41 = require("react/jsx-runtime");
15725
16220
  var PAGE_SIZE2 = 10;
@@ -15755,11 +16250,10 @@ function receiptBadgeStatus(eventType) {
15755
16250
  if (v.includes("EXPIR")) return "warning";
15756
16251
  return "secondary";
15757
16252
  }
15758
- 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 }) => {
15759
16254
  const product = item.product_name_display || item.product_name || "";
15760
- const event = item.event_type_display || item.event_type || "";
15761
- const primary = product || event || "-";
15762
- const badgeLabel = event || "-";
16255
+ const primary = product || eventLabel || "-";
16256
+ const badgeLabel = eventLabel || "-";
15763
16257
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_react_native41.View, { style: styles31.row, children: [
15764
16258
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(NameAvatar, { name: primary, seed: item.uuid || primary, size: "sm" }),
15765
16259
  /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_react_native41.View, { style: styles31.body, children: [
@@ -15786,7 +16280,7 @@ var ReceiptRow = import_react28.default.memo(({ item, colors, downloading, onDow
15786
16280
  });
15787
16281
  ReceiptRow.displayName = "ReceiptRow";
15788
16282
  function ReceiptsList() {
15789
- const { t } = (0, import_react_i18next14.useTranslation)();
16283
+ const { t, i18n: i18n2 } = (0, import_react_i18next14.useTranslation)();
15790
16284
  const { accessToken, refreshToken, organizationId, workspaceId, updateTokens, onError } = useAuth();
15791
16285
  const { consentClient } = useBaseUrl();
15792
16286
  const { colors } = useTheme();
@@ -15871,14 +16365,18 @@ function ReceiptsList() {
15871
16365
  const sections = (0, import_react28.useMemo)(() => {
15872
16366
  const map = /* @__PURE__ */ new Map();
15873
16367
  for (const r of receipts) {
15874
- const key = monthKey(r.created_at);
16368
+ const key = monthKey(r.created_at, i18n2.language);
15875
16369
  const arr = map.get(key);
15876
16370
  if (arr) arr.push(r);
15877
16371
  else map.set(key, [r]);
15878
16372
  }
15879
16373
  return Array.from(map, ([title, data]) => ({ title, data }));
15880
- }, [receipts]);
16374
+ }, [receipts, i18n2.language]);
15881
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
+ };
15882
16380
  const handleScroll = (0, import_react28.useCallback)(
15883
16381
  (e) => {
15884
16382
  const { layoutMeasurement, contentOffset, contentSize } = e.nativeEvent;
@@ -15960,7 +16458,8 @@ function ReceiptsList() {
15960
16458
  downloading: downloadingUuid === item.uuid,
15961
16459
  onDownload: handleDownload,
15962
16460
  downloadLabel,
15963
- dateLabel: relativeLabel(item.created_at)
16461
+ dateLabel: relativeLabel(item.created_at),
16462
+ eventLabel: eventLabelFor(item)
15964
16463
  }
15965
16464
  )
15966
16465
  ] }, `${item.uuid || item.created_at}-${index}`)) }, section2.title)),
@@ -16108,6 +16607,25 @@ var uploadFileWithS2S = async ({
16108
16607
  }
16109
16608
  };
16110
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
+
16111
16629
  // src/RedactoPrivacyCenter/lib/filePicker.ts
16112
16630
  var import_react_native42 = require("react-native");
16113
16631
  async function pickFile() {
@@ -16271,6 +16789,54 @@ var styles32 = import_react_native43.StyleSheet.create({
16271
16789
 
16272
16790
  // src/RedactoPrivacyCenter/components/groupHelpers.ts
16273
16791
  var productGroupKey = (group) => group.nominator ? `${group.product_uuid}:${group.nominator.uuid}` : group.product_uuid;
16792
+ var consentGroupToFormProductGroup = (group) => {
16793
+ var _a3;
16794
+ return {
16795
+ product_uuid: group.product_uuid,
16796
+ product_name: group.product_name,
16797
+ product_description: group.product_description,
16798
+ nominator: group.nominator,
16799
+ purposes: ((_a3 = group.purposes) != null ? _a3 : []).map(purposeItemToFormPurpose)
16800
+ };
16801
+ };
16802
+ var purposeItemToFormPurpose = (purpose) => {
16803
+ var _a3, _b, _c, _d, _e, _f;
16804
+ return {
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 : "",
16810
+ name: purpose.name,
16811
+ description: (_e = purpose.description) != null ? _e : "",
16812
+ industries: "",
16813
+ selected: false,
16814
+ given_consent: false,
16815
+ status: purpose.status,
16816
+ validity: null,
16817
+ enabled: true,
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))
16829
+ };
16830
+ };
16831
+ var consentDataElementToFormDataElement = (element) => ({
16832
+ uuid: element.uuid,
16833
+ name: element.name,
16834
+ description: "",
16835
+ enabled: element.enabled,
16836
+ required: element.required,
16837
+ given_consent: element.selected,
16838
+ selected: element.selected
16839
+ });
16274
16840
  var buildGroupPurposes = (group) => group.purposes.filter((p) => p !== null && p !== void 0).map((p) => {
16275
16841
  const validDataElements = Array.isArray(p.data_elements) ? p.data_elements.filter((de) => de !== null && de !== void 0 && Boolean(de.uuid)).map((de) => ({ ...de, selected: false })) : [];
16276
16842
  return {
@@ -16296,12 +16862,6 @@ var buildGroupDataElements = (group) => {
16296
16862
  // src/RedactoPrivacyCenter/components/Form.tsx
16297
16863
  var import_jsx_runtime43 = require("react/jsx-runtime");
16298
16864
  var TOTAL_STEPS = 3;
16299
- var PRODUCT_SCOPED_REQUEST_TYPES = /* @__PURE__ */ new Set([
16300
- "ACCESS" /* ACCESS */,
16301
- "erasure" /* ERASURE */,
16302
- "CORRECTION" /* CORRECTION */
16303
- ]);
16304
- var isProductScopedRequestType = (rt) => PRODUCT_SCOPED_REQUEST_TYPES.has(rt);
16305
16865
  function Form({ onCreateRequest }) {
16306
16866
  const { t } = (0, import_react_i18next16.useTranslation)();
16307
16867
  const { accessToken, refreshToken, email, organizationId, workspaceId, updateTokens, onError } = useAuth();
@@ -16342,23 +16902,78 @@ function Form({ onCreateRequest }) {
16342
16902
  });
16343
16903
  const [uploadedDocs, setUploadedDocs] = (0, import_react29.useState)([]);
16344
16904
  const [isUploading, setIsUploading] = (0, import_react29.useState)(false);
16905
+ const withUserConsentPickerGroups = (0, import_react29.useCallback)(
16906
+ async (form, language) => {
16907
+ var _a3, _b;
16908
+ if (!organizationId || !workspaceId) {
16909
+ return form;
16910
+ }
16911
+ const consents = await fetchUserConsents({
16912
+ organizationId,
16913
+ workspaceId,
16914
+ // No status filter: include every status (active / expired / withdrawn
16915
+ // / declined), matching Python form/data, so a DSAR can target products
16916
+ // the user no longer actively consents to.
16917
+ limit: FORM_PICKER_GROUP_LIMIT,
16918
+ nominatedLimit: FORM_PICKER_GROUP_LIMIT,
16919
+ language,
16920
+ authContext,
16921
+ consentClient
16922
+ });
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) {
16926
+ return form;
16927
+ }
16928
+ return {
16929
+ ...form,
16930
+ direct_groups: direct.map(consentGroupToFormProductGroup),
16931
+ nominated_groups: nominated.map(consentGroupToFormProductGroup)
16932
+ };
16933
+ },
16934
+ [organizationId, workspaceId, authContext, consentClient]
16935
+ );
16345
16936
  (0, import_react29.useEffect)(() => {
16346
16937
  if (!organizationId || !workspaceId || !contact) return;
16938
+ let isCancelled = false;
16347
16939
  setIsLoading(true);
16348
- getFormData(organizationId, workspaceId, contact, false, false, authContext, consentClient, langParam).then((data) => {
16349
- if (data) setFormDataResponse(data);
16940
+ getFormData(organizationId, workspaceId, contact, false, false, authContext, consentClient, langParam).then(async (data) => {
16941
+ if (!data) return;
16942
+ const withGroups = await withUserConsentPickerGroups(data, langParam);
16943
+ if (!isCancelled) setFormDataResponse(withGroups);
16350
16944
  }).catch((error) => {
16351
16945
  console.warn("Error fetching form data:", error);
16352
- }).finally(() => setIsLoading(false));
16353
- }, [organizationId, workspaceId, contact, authContext, consentClient, langParam]);
16946
+ }).finally(() => {
16947
+ if (!isCancelled) setIsLoading(false);
16948
+ });
16949
+ return () => {
16950
+ isCancelled = true;
16951
+ };
16952
+ }, [
16953
+ organizationId,
16954
+ workspaceId,
16955
+ contact,
16956
+ authContext,
16957
+ consentClient,
16958
+ langParam,
16959
+ withUserConsentPickerGroups
16960
+ ]);
16354
16961
  const allGroups = (0, import_react29.useMemo)(() => {
16355
16962
  var _a3, _b;
16356
16963
  if (!formDataResponse) return [];
16357
- return [
16964
+ const groups = [
16358
16965
  ...(_a3 = formDataResponse.direct_groups) != null ? _a3 : [],
16359
16966
  ...(_b = formDataResponse.nominated_groups) != null ? _b : []
16360
16967
  ];
16361
- }, [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]);
16362
16977
  const skipProductStep = allGroups.length === 1;
16363
16978
  const selectedGroup = (0, import_react29.useMemo)(() => {
16364
16979
  var _a3, _b;
@@ -16390,7 +17005,7 @@ function Form({ onCreateRequest }) {
16390
17005
  setSelectedProductKey(null);
16391
17006
  }
16392
17007
  setNominationData({ nominee_email: "", nominee_mobile: "" });
16393
- if (requestType === "grievance" /* GRIEVANCE */ && grievanceOptions.length > 0) {
17008
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */) && grievanceOptions.length > 0) {
16394
17009
  const resetGrievances = grievanceOptions.reduce(
16395
17010
  (acc, option) => {
16396
17011
  acc[option.value] = false;
@@ -16419,12 +17034,10 @@ function Form({ onCreateRequest }) {
16419
17034
  () => groupPurposes.filter((p) => selectedPurposes.has(p.uuid)).map((p) => p.name).filter(Boolean),
16420
17035
  [groupPurposes, selectedPurposes]
16421
17036
  );
16422
- const selectedErasurePurposeNames = (0, import_react29.useMemo)(() => {
16423
- if (selectedErasurePurposeList.length === 0 || selectedErasurePurposeList.length > MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL) {
16424
- return t("revokeConsentModalYourPurposes");
16425
- }
16426
- return selectedErasurePurposeList.join(", ");
16427
- }, [selectedErasurePurposeList, t]);
17037
+ const selectedErasurePurposeNames = (0, import_react29.useMemo)(
17038
+ () => resolveErasurePurposeNames(selectedErasurePurposeList, t("revokeConsentModalYourPurposes")),
17039
+ [selectedErasurePurposeList, t]
17040
+ );
16428
17041
  const togglePurpose = (0, import_react29.useCallback)(
16429
17042
  (purpose) => {
16430
17043
  const uuid = purpose.uuid;
@@ -16531,7 +17144,7 @@ function Form({ onCreateRequest }) {
16531
17144
  if (isProductScopedRequestType(requestType)) {
16532
17145
  if (allGroups.length === 0) return false;
16533
17146
  if (!selectedGroup) return false;
16534
- if (requestType === "CORRECTION" /* CORRECTION */) {
17147
+ if (isRequestType(requestType, "CORRECTION" /* CORRECTION */)) {
16535
17148
  if (selectedCorrectionFields.size === 0) return false;
16536
17149
  return Array.from(selectedCorrectionFields).every((fieldUuid) => {
16537
17150
  var _a3, _b;
@@ -16539,15 +17152,15 @@ function Form({ onCreateRequest }) {
16539
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()));
16540
17153
  });
16541
17154
  }
16542
- if (requestType === "ACCESS" /* ACCESS */ || requestType === "erasure" /* ERASURE */) {
17155
+ if (isRequestType(requestType, "ACCESS" /* ACCESS */) || isErasureRequestType(requestType)) {
16543
17156
  return selectedPurposes.size > 0;
16544
17157
  }
16545
17158
  return false;
16546
17159
  }
16547
- if (requestType === "grievance" /* GRIEVANCE */) {
17160
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */)) {
16548
17161
  return Object.values(selectedGrievances).some(Boolean);
16549
17162
  }
16550
- if (requestType === "nomination" /* NOMINATION */) {
17163
+ if (isRequestType(requestType, "nomination" /* NOMINATION */)) {
16551
17164
  return Boolean(nominationData.nominee_email);
16552
17165
  }
16553
17166
  return false;
@@ -16561,9 +17174,17 @@ function Form({ onCreateRequest }) {
16561
17174
  selectedGrievances,
16562
17175
  nominationData
16563
17176
  ]);
16564
- 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
+ );
16565
17181
  const handleUpload = (0, import_react29.useCallback)(async () => {
16566
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
+ }
16567
17188
  try {
16568
17189
  const file = await pickFile();
16569
17190
  if (!file) return;
@@ -16580,11 +17201,11 @@ function Form({ onCreateRequest }) {
16580
17201
  "payload",
16581
17202
  JSON.stringify({
16582
17203
  organization_uuid: organizationId || "",
16583
- space: `privacy/${docUuid}`,
17204
+ space: `privacy/${caseUuid}`,
16584
17205
  uuid: docUuid,
16585
17206
  is_public: true,
16586
17207
  allow_ai_processing: true,
16587
- metadata: { group_by: "privacy", product: "privacy_center" }
17208
+ metadata: { group_by: "privacy", case_uuid: caseUuid, product: "privacy_center" }
16588
17209
  })
16589
17210
  );
16590
17211
  const result = await uploadFileWithS2S({
@@ -16604,18 +17225,28 @@ function Form({ onCreateRequest }) {
16604
17225
  } finally {
16605
17226
  setIsUploading(false);
16606
17227
  }
16607
- }, [organizationId, workspaceId, authContext, consentClient, baseUrl, t]);
17228
+ }, [organizationId, workspaceId, authContext, consentClient, baseUrl, t, formDataResponse]);
16608
17229
  const removeUploadedDoc = (0, import_react29.useCallback)((uuid) => {
16609
17230
  setUploadedDocs((prev) => prev.filter((d) => d.uuid !== uuid));
16610
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
+ );
16611
17238
  const handleSubmit = (0, import_react29.useCallback)(async (revoke = false) => {
16612
- var _a3, _b, _c, _d;
16613
- if (!organizationId || !workspaceId || !contact || !requestType || !formDataResponse) return;
17239
+ var _a3;
17240
+ if (!organizationId || !workspaceId || !contact || !requestType || !formDataResponse) {
17241
+ alertSubmitFailed();
17242
+ return;
17243
+ }
16614
17244
  setRevokeConsentOnFulfilment(revoke);
16615
17245
  setIsSubmitting(true);
16616
17246
  try {
16617
17247
  const isProductScoped = isProductScopedRequestType(requestType);
16618
- 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;
16619
17250
  const updatePurposes = Array.from(selectedPurposes).map((uuid) => ({
16620
17251
  purpose_uuid: uuid,
16621
17252
  data_element_uuids: Array.from(selectedDataElements.get(uuid) || [])
@@ -16636,27 +17267,27 @@ function Form({ onCreateRequest }) {
16636
17267
  purposes: updatePurposes,
16637
17268
  correction_data: correctionData,
16638
17269
  grievance_types: grievanceTypes,
16639
- ...requestType === "nomination" /* NOMINATION */ ? { nomination_data: nominationData } : {}
17270
+ ...isRequestType(requestType, "nomination" /* NOMINATION */) ? { nomination_data: nominationData } : {}
16640
17271
  },
16641
- time_period: requestType === "ACCESS" /* ACCESS */ ? parseInt(timePeriod || "30", 10) : 0,
17272
+ time_period: isRequestType(requestType, "ACCESS" /* ACCESS */) ? parseInt(timePeriod || "30", 10) : 0,
16642
17273
  requestor_note: additionalNote || "",
16643
- ...requestType === "erasure" /* ERASURE */ ? { revoke_consent_on_fulfilment: revoke } : {},
17274
+ ...erasureConsentPayload(requestType, revoke),
16644
17275
  ...anchorGroup ? { product_uuid: anchorGroup.product_uuid } : {},
16645
17276
  ...(anchorGroup == null ? void 0 : anchorGroup.nominator) ? { data_principal_uuid: anchorGroup.nominator.uuid } : {}
16646
17277
  };
16647
17278
  const response = await createCaseRequest(organizationId, workspaceId, request, false, false, authContext, consentClient);
16648
- const responseAny = response;
16649
- 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;
16650
17281
  if (newCaseId) {
16651
17282
  setCaseId(newCaseId);
16652
- setSubmittedProductName((_d = anchorGroup == null ? void 0 : anchorGroup.product_name) != null ? _d : "");
17283
+ setSubmittedProductName((_a3 = anchorGroup == null ? void 0 : anchorGroup.product_name) != null ? _a3 : "");
16653
17284
  setIsSubmitted(true);
16654
17285
  } else {
16655
- import_react_native44.Alert.alert(t("submit"), t("unableToSubmit") || "Unable to submit request. Please try again.");
17286
+ alertSubmitFailed();
16656
17287
  }
16657
17288
  } catch (error) {
16658
17289
  console.warn("Error submitting request:", error);
16659
- 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);
16660
17291
  } finally {
16661
17292
  setIsSubmitting(false);
16662
17293
  }
@@ -16679,11 +17310,13 @@ function Form({ onCreateRequest }) {
16679
17310
  consentClient,
16680
17311
  groupDataElements,
16681
17312
  uploadedDocs,
16682
- t
17313
+ alertSubmitFailed
16683
17314
  ]);
16684
17315
  const handleSubmitClick = (0, import_react29.useCallback)(() => {
16685
- if (!isFormValid) return;
16686
- if (requestType === "erasure" /* ERASURE */) {
17316
+ if (!isFormValid) {
17317
+ return;
17318
+ }
17319
+ if (isErasureRequestType(requestType)) {
16687
17320
  setIsErasureConsentModalOpen(true);
16688
17321
  return;
16689
17322
  }
@@ -16772,7 +17405,7 @@ function Form({ onCreateRequest }) {
16772
17405
  if (groupPurposes.length === 0) {
16773
17406
  return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.placeholder, { color: colors.textSecondary }], children: t("noPurposesAvailable") || "No purposes available" });
16774
17407
  }
16775
- const isErasure = requestType === "erasure" /* ERASURE */;
17408
+ const isErasure = isErasureRequestType(requestType);
16776
17409
  const allPurposesSelected = groupPurposes.every(
16777
17410
  (p) => (p.data_elements || []).every((de) => {
16778
17411
  var _a3;
@@ -16892,18 +17525,18 @@ function Form({ onCreateRequest }) {
16892
17525
  ] }),
16893
17526
  selectedGroup ? /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: styles33.section, children: [
16894
17527
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("requestDetails") }),
16895
- /* @__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() })
16896
17529
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: [styles33.hintCard, { backgroundColor: colors.surfaceAlt }], children: [
16897
17530
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(Icon, { name: "circle-alert", size: 18, color: colors.textSecondary }),
16898
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" }) })
16899
17532
  ] }),
16900
- 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: [
16901
17534
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("timePeriod") }),
16902
17535
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(PCSelect, { value: timePeriod, options: timePeriodOptions, onChange: setTimePeriod, placeholder: t("timePeriod") })
16903
17536
  ] }) : null
16904
17537
  ] });
16905
17538
  }
16906
- if (requestType === "grievance" /* GRIEVANCE */) {
17539
+ if (isRequestType(requestType, "grievance" /* GRIEVANCE */)) {
16907
17540
  if (grievanceOptions.length === 0) {
16908
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" }) });
16909
17542
  }
@@ -16919,7 +17552,7 @@ function Form({ onCreateRequest }) {
16919
17552
  ] })
16920
17553
  ] }) });
16921
17554
  }
16922
- if (requestType === "nomination" /* NOMINATION */) {
17555
+ if (isRequestType(requestType, "nomination" /* NOMINATION */)) {
16923
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: [
16924
17557
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_native44.Text, { style: [styles33.sectionLabel, { color: colors.textSecondary }], children: t("enterNomineeDetails") }),
16925
17558
  /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_react_native44.View, { style: [styles33.sectionCard, elevation.card, { backgroundColor: colors.surface }], children: [
@@ -17984,6 +18617,7 @@ function useUnreadCount() {
17984
18617
  const loadRef = (0, import_react32.useRef)();
17985
18618
  loadRef.current = async () => {
17986
18619
  if (!organizationId || !workspaceId) return;
18620
+ if (isRefreshBlocked(authContext)) return;
17987
18621
  const res = await fetchUnreadCount(organizationId, workspaceId, authContext, consentClient);
17988
18622
  if (res && typeof res.count === "number") setCount(res.count);
17989
18623
  };
@@ -18309,17 +18943,255 @@ function PrivacyCenterEmptyState() {
18309
18943
  return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(PCEmpty, { iconName: "shield", title: t("noDataTitle"), description: t("noDataDescription") });
18310
18944
  }
18311
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
+
18312
19184
  // src/RedactoPrivacyCenter/components/CaseDetails/CaseDetailsPage.tsx
18313
- var import_react39 = require("react");
18314
- var import_react_native57 = require("react-native");
18315
- 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");
18316
19188
 
18317
19189
  // src/RedactoPrivacyCenter/components/CaseDetails/RequestDetailsTab.tsx
18318
- var import_react_native50 = require("react-native");
18319
- var import_react_i18next21 = require("react-i18next");
18320
- 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");
18321
19193
  function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18322
- const { t } = (0, import_react_i18next21.useTranslation)();
19194
+ const { t } = (0, import_react_i18next23.useTranslation)();
18323
19195
  const { colors } = useTheme();
18324
19196
  const { listBottom } = usePrivacyCenterInsets({ hasFooter: true });
18325
19197
  const details = selectedCase.request_details;
@@ -18351,36 +19223,36 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18351
19223
  }
18352
19224
  const description = selectedCase.description_display || selectedCase.description;
18353
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);
18354
- 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: [
18355
- /* @__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) => {
18356
19228
  const isLast = i === steps.length - 1;
18357
- return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.stepRow, children: [
18358
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.gutter, children: [
18359
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
18360
- 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,
18361
19233
  {
18362
19234
  style: [
18363
- styles39.dot,
19235
+ styles41.dot,
18364
19236
  step.state === "upcoming" ? { backgroundColor: colors.canvasSubtle, borderWidth: 2, borderColor: step.danger ? colors.error : colors.border } : { backgroundColor: step.color }
18365
19237
  ],
18366
- 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
18367
19239
  }
18368
19240
  ),
18369
- !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
18370
19242
  ] }),
18371
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: [styles39.stepContent, isLast && styles39.stepContentLast], children: [
18372
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.stepLabel, { color: step.danger ? colors.error : colors.text }], children: step.label }),
18373
- 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
18374
19246
  ] })
18375
19247
  ] }, `${step.label}-${i}`);
18376
19248
  }) }),
18377
- hasDetails ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: [styles39.card, elevation.card, { backgroundColor: colors.surface }], children: [
18378
- description ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.block, children: [
18379
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("descriptionLabel") || "Description" }),
18380
- /* @__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 })
18381
19253
  ] }) : null,
18382
- (details == null ? void 0 : details.purposes) && details.purposes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.block, children: [
18383
- /* @__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" }),
18384
19256
  details.purposes.map((rawP, idx) => {
18385
19257
  const p = (rawP == null ? void 0 : rawP.purpose) ? rawP.purpose : rawP;
18386
19258
  const purposeId = (p == null ? void 0 : p.uuid) || (p == null ? void 0 : p.purpose_uuid) || (rawP == null ? void 0 : rawP.purpose_uuid) || idx;
@@ -18388,10 +19260,10 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18388
19260
  const purposeDescription = (p == null ? void 0 : p.description) || (rawP == null ? void 0 : rawP.description);
18389
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)) : [];
18390
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 : [];
18391
- 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: [
18392
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.itemTitle, { color: colors.text }], children: purposeName }),
18393
- purposeDescription ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.itemDesc, { color: colors.textSecondary }], numberOfLines: 3, children: purposeDescription }) : null,
18394
- 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: [
18395
19267
  dataElementUuids.length,
18396
19268
  " ",
18397
19269
  t("dataElements") || "data elements"
@@ -18399,44 +19271,44 @@ function RequestDetailsTab({ selectedCase, requestTypeLabel }) {
18399
19271
  ] }, purposeId);
18400
19272
  })
18401
19273
  ] }) : null,
18402
- (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: [
18403
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("correctionData") || "Correction" }),
18404
- 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: [
18405
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.itemTitle, { color: colors.text }], children: item.name }),
18406
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.correctionValues, children: [
18407
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.correctionValue, children: [
18408
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.correctionLabel, { color: colors.textSecondary }], children: t("currentValue") || "Current" }),
18409
- /* @__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 || "-" })
18410
19282
  ] }),
18411
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Icon, { name: "chevron-right", size: 16, color: colors.textSecondary, strokeWidth: 2.2 }),
18412
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.correctionValue, children: [
18413
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.correctionLabel, { color: colors.textSecondary }], children: t("newValue") || "New" }),
18414
- /* @__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 || "-" })
18415
19287
  ] })
18416
19288
  ] })
18417
19289
  ] }, idx))
18418
19290
  ] }) : null,
18419
- (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: [
18420
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("grievanceTypes") || "Grievance" }),
18421
- /* @__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)) })
18422
19294
  ] }) : null,
18423
- (details == null ? void 0 : details.nomination_data) ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.block, children: [
18424
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.blockLabel, { color: colors.textSecondary }], children: t("nominationData") || "Nomination" }),
18425
- details.nomination_data.nominee_email ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.kvRow, children: [
18426
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.kvLabel, { color: colors.textSecondary }], children: t("email") || "Email" }),
18427
- /* @__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 })
18428
19300
  ] }) : null,
18429
- details.nomination_data.nominee_mobile ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react_native50.View, { style: styles39.kvRow, children: [
18430
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react_native50.Text, { style: [styles39.kvLabel, { color: colors.textSecondary }], children: t("mobile") || "Mobile" }),
18431
- /* @__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 })
18432
19304
  ] }) : null
18433
19305
  ] }) : null
18434
19306
  ] }) : null,
18435
- /* @__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, {}) })
18436
19308
  ] });
18437
19309
  }
18438
19310
  var DOT = 22;
18439
- var styles39 = import_react_native50.StyleSheet.create({
19311
+ var styles41 = import_react_native52.StyleSheet.create({
18440
19312
  container: {
18441
19313
  flex: 1
18442
19314
  },
@@ -18557,51 +19429,51 @@ var styles39 = import_react_native50.StyleSheet.create({
18557
19429
  });
18558
19430
 
18559
19431
  // src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
18560
- var import_react38 = require("react");
18561
- var import_react_native56 = require("react-native");
18562
- 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");
18563
19435
 
18564
19436
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx
18565
- var import_react36 = __toESM(require("react"));
18566
- var import_react_i18next23 = require("react-i18next");
19437
+ var import_react38 = __toESM(require("react"));
19438
+ var import_react_i18next25 = require("react-i18next");
18567
19439
 
18568
19440
  // src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx
18569
- var import_react35 = __toESM(require("react"));
18570
- var import_react_native52 = require("react-native");
19441
+ var import_react37 = __toESM(require("react"));
19442
+ var import_react_native54 = require("react-native");
18571
19443
 
18572
19444
  // src/RedactoPrivacyCenter/components/CaseDetails/AttachmentCard.tsx
18573
- var import_react_native51 = require("react-native");
18574
- 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");
18575
19447
  function AttachmentCard({ doc }) {
18576
19448
  const { colors } = useTheme();
18577
19449
  const downloadUrl = getDownloadUrl(doc.file_url);
18578
19450
  const handlePress = () => {
18579
19451
  if (downloadUrl) {
18580
- import_react_native51.Linking.openURL(downloadUrl);
19452
+ import_react_native53.Linking.openURL(downloadUrl);
18581
19453
  }
18582
19454
  };
18583
- return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
18584
- import_react_native51.TouchableOpacity,
19455
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
19456
+ import_react_native53.TouchableOpacity,
18585
19457
  {
18586
- style: [styles40.container, { backgroundColor: colors.surface, borderColor: colors.border }],
19458
+ style: [styles42.container, { backgroundColor: colors.surface, borderColor: colors.border }],
18587
19459
  onPress: handlePress,
18588
19460
  disabled: !downloadUrl,
18589
19461
  activeOpacity: 0.7,
18590
19462
  children: [
18591
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Icon, { name: "file-text", size: 18, color: colors.textSecondary }),
18592
- /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_react_native51.View, { style: styles40.info, children: [
18593
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_react_native51.Text, { style: [styles40.fileName, { color: colors.text }], numberOfLines: 1, children: doc.file_name || "Document" }),
18594
- 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
18595
19467
  ] })
18596
19468
  ]
18597
19469
  }
18598
19470
  );
18599
19471
  }
18600
- var styles40 = import_react_native51.StyleSheet.create({
19472
+ var styles42 = import_react_native53.StyleSheet.create({
18601
19473
  container: {
18602
19474
  flexDirection: "row",
18603
19475
  alignItems: "center",
18604
- borderWidth: import_react_native51.StyleSheet.hairlineWidth,
19476
+ borderWidth: import_react_native53.StyleSheet.hairlineWidth,
18605
19477
  borderRadius: radii.md,
18606
19478
  paddingHorizontal: spacing.sm + 2,
18607
19479
  paddingVertical: spacing.sm,
@@ -18621,11 +19493,11 @@ var styles40 = import_react_native51.StyleSheet.create({
18621
19493
  });
18622
19494
 
18623
19495
  // src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx
18624
- var import_jsx_runtime52 = require("react/jsx-runtime");
19496
+ var import_jsx_runtime56 = require("react/jsx-runtime");
18625
19497
  var AVATAR_SIZE = 28;
18626
19498
  var AVATAR_GUTTER = 36;
18627
19499
  function TeamAvatar({ tint }) {
18628
- 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 }) });
18629
19501
  }
18630
19502
  function ChatBubbleImpl({
18631
19503
  message,
@@ -18652,28 +19524,28 @@ function ChatBubbleImpl({
18652
19524
  borderBottomRightRadius: BUBBLE_RADIUS,
18653
19525
  borderBottomLeftRadius: tailRadius
18654
19526
  };
18655
- const bubble = /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_react_native52.View, { style: [styles41.bubble, bubbleStyle], children: [
18656
- !isPrincipal && isFirstInGroup ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_native52.Text, { style: [styles41.bubbleSender, { color: colors.primary }], numberOfLines: 1, children: senderLabel }) : null,
18657
- 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,
18658
- 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
18659
19531
  ] });
18660
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
18661
- import_react_native52.View,
19532
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
19533
+ import_react_native54.View,
18662
19534
  {
18663
19535
  style: [
18664
- styles41.row,
18665
- isPrincipal ? styles41.rowRight : styles41.rowLeft,
19536
+ styles43.row,
19537
+ isPrincipal ? styles43.rowRight : styles43.rowLeft,
18666
19538
  { marginTop: isFirstInGroup ? spacing.md : 2 }
18667
19539
  ],
18668
19540
  children: [
18669
- !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,
18670
- /* @__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: [
18671
19543
  bubble,
18672
- isLastInGroup ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
18673
- import_react_native52.Text,
19544
+ isLastInGroup ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
19545
+ import_react_native54.Text,
18674
19546
  {
18675
19547
  style: [
18676
- styles41.timestamp,
19548
+ styles43.timestamp,
18677
19549
  { color: colors.textSecondary, textAlign: isPrincipal ? "right" : "left" }
18678
19550
  ],
18679
19551
  children: formatMessageTime(timestamp)
@@ -18684,8 +19556,8 @@ function ChatBubbleImpl({
18684
19556
  }
18685
19557
  );
18686
19558
  }
18687
- var ChatBubble = import_react35.default.memo(ChatBubbleImpl);
18688
- var styles41 = import_react_native52.StyleSheet.create({
19559
+ var ChatBubble = import_react37.default.memo(ChatBubbleImpl);
19560
+ var styles43 = import_react_native54.StyleSheet.create({
18689
19561
  row: {
18690
19562
  flexDirection: "row",
18691
19563
  paddingHorizontal: spacing.md,
@@ -18745,9 +19617,9 @@ var styles41 = import_react_native52.StyleSheet.create({
18745
19617
  });
18746
19618
 
18747
19619
  // src/RedactoPrivacyCenter/components/CaseDetails/DocumentRequestCard.tsx
18748
- var import_react_native53 = require("react-native");
18749
- var import_react_i18next22 = require("react-i18next");
18750
- 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");
18751
19623
  var STATUS_BADGE_MAP = {
18752
19624
  pending: "warning",
18753
19625
  under_review: "info",
@@ -18767,20 +19639,20 @@ function humanize(value) {
18767
19639
  }
18768
19640
  function DocumentRequestCard({ message, onUpload, isSubmitting, isCaseFinalized = false }) {
18769
19641
  var _a3;
18770
- const { t } = (0, import_react_i18next22.useTranslation)();
19642
+ const { t } = (0, import_react_i18next24.useTranslation)();
18771
19643
  const { colors } = useTheme();
18772
19644
  const meta = message.document_request_metadata;
18773
19645
  if (!meta) return null;
18774
19646
  const status = meta.document_request_status;
18775
19647
  const canUpload = (status === "pending" || status === "replacement_requested") && !isCaseFinalized;
18776
19648
  const requestEventUuid = meta.document_request_uuid;
18777
- return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.View, { style: [styles42.container, { borderColor: colors.border, backgroundColor: colors.surface }], children: [
18778
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.View, { style: styles42.header, children: [
18779
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.View, { style: styles42.titleRow, children: [
18780
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(Icon, { name: "file-check", size: 16, color: colors.primary, strokeWidth: 2 }),
18781
- /* @__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" })
18782
19654
  ] }),
18783
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
19655
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
18784
19656
  PCBadge,
18785
19657
  {
18786
19658
  status: STATUS_BADGE_MAP[status] || "info",
@@ -18788,30 +19660,30 @@ function DocumentRequestCard({ message, onUpload, isSubmitting, isCaseFinalized
18788
19660
  }
18789
19661
  )
18790
19662
  ] }),
18791
- 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", {
18792
19664
  accepted: meta.accepted_document,
18793
19665
  defaultValue: `Accepted: ${meta.accepted_document}`
18794
19666
  }) }) : null,
18795
- meta.rejection_reason ? /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_react_native53.View, { style: [styles42.rejectionBox, { backgroundColor: colors.errorSoft }], children: [
18796
- /* @__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: [
18797
19669
  t("rejectionReasonLabel") || "Rejection reason",
18798
19670
  ":"
18799
19671
  ] }),
18800
- /* @__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 })
18801
19673
  ] }) : null,
18802
- canUpload && requestEventUuid ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18803
- import_react_native53.TouchableOpacity,
19674
+ canUpload && requestEventUuid ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
19675
+ import_react_native55.TouchableOpacity,
18804
19676
  {
18805
- style: [styles42.uploadButton, { backgroundColor: colors.primary }],
19677
+ style: [styles44.uploadButton, { backgroundColor: colors.primary }],
18806
19678
  onPress: () => onUpload(requestEventUuid),
18807
19679
  disabled: isSubmitting,
18808
19680
  activeOpacity: 0.7,
18809
- 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" })
18810
19682
  }
18811
19683
  ) : null
18812
19684
  ] });
18813
19685
  }
18814
- var styles42 = import_react_native53.StyleSheet.create({
19686
+ var styles44 = import_react_native55.StyleSheet.create({
18815
19687
  container: {
18816
19688
  borderWidth: 1.5,
18817
19689
  borderStyle: "dashed",
@@ -18864,20 +19736,20 @@ var styles42 = import_react_native53.StyleSheet.create({
18864
19736
  });
18865
19737
 
18866
19738
  // src/RedactoPrivacyCenter/components/CaseDetails/StatusEvent.tsx
18867
- var import_react_native54 = require("react-native");
18868
- 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");
18869
19741
  function StatusEvent({ icon, color, bgColor, borderColor, text, subText, timestamp }) {
18870
19742
  const { colors } = useTheme();
18871
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native54.View, { style: [styles43.container, { backgroundColor: bgColor }], children: [
18872
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native54.View, { style: [styles43.iconBubble, { backgroundColor: `${color}1F` }], children: icon }),
18873
- /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_native54.View, { style: styles43.textContainer, children: [
18874
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_native54.Text, { style: [styles43.text, { color }], children: text }),
18875
- 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
18876
19748
  ] }),
18877
- /* @__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) })
18878
19750
  ] });
18879
19751
  }
18880
- var styles43 = import_react_native54.StyleSheet.create({
19752
+ var styles45 = import_react_native56.StyleSheet.create({
18881
19753
  container: {
18882
19754
  flexDirection: "row",
18883
19755
  alignItems: "center",
@@ -18916,10 +19788,10 @@ var styles43 = import_react_native54.StyleSheet.create({
18916
19788
  });
18917
19789
 
18918
19790
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx
18919
- var import_jsx_runtime55 = require("react/jsx-runtime");
18920
- var CheckIcon = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Icon, { name: "check", size: 14, color, strokeWidth: 2.6 });
18921
- var XIcon = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Icon, { name: "x", size: 14, color, strokeWidth: 2.6 });
18922
- 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 });
18923
19795
  function MessageItemImpl({
18924
19796
  message,
18925
19797
  onUploadForRequest,
@@ -18929,14 +19801,14 @@ function MessageItemImpl({
18929
19801
  isLastInGroup = true
18930
19802
  }) {
18931
19803
  var _a3, _b;
18932
- const { t } = (0, import_react_i18next23.useTranslation)();
19804
+ const { t } = (0, import_react_i18next25.useTranslation)();
18933
19805
  const isPrincipal = message.sender_role === "data_principal";
18934
19806
  const senderLabel = isPrincipal ? t("senderYou") || "You" : t("senderPrivacyTeam") || "Privacy Team";
18935
19807
  switch (message.message_type) {
18936
19808
  case "message_sent":
18937
19809
  case "document_submitted":
18938
19810
  case "document_replaced":
18939
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19811
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
18940
19812
  ChatBubble,
18941
19813
  {
18942
19814
  message,
@@ -18948,8 +19820,8 @@ function MessageItemImpl({
18948
19820
  }
18949
19821
  );
18950
19822
  case "document_requested":
18951
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_jsx_runtime55.Fragment, { children: [
18952
- /* @__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)(
18953
19825
  ChatBubble,
18954
19826
  {
18955
19827
  message,
@@ -18960,7 +19832,7 @@ function MessageItemImpl({
18960
19832
  isLastInGroup
18961
19833
  }
18962
19834
  ),
18963
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19835
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
18964
19836
  DocumentRequestCard,
18965
19837
  {
18966
19838
  message,
@@ -18971,10 +19843,10 @@ function MessageItemImpl({
18971
19843
  )
18972
19844
  ] });
18973
19845
  case "document_approved":
18974
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19846
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
18975
19847
  StatusEvent,
18976
19848
  {
18977
- icon: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(CheckIcon, { color: "#059669" }),
19849
+ icon: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(CheckIcon, { color: "#059669" }),
18978
19850
  color: "#059669",
18979
19851
  bgColor: "rgba(16, 185, 129, 0.08)",
18980
19852
  borderColor: "rgba(16, 185, 129, 0.2)",
@@ -18983,10 +19855,10 @@ function MessageItemImpl({
18983
19855
  }
18984
19856
  );
18985
19857
  case "document_rejected":
18986
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19858
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
18987
19859
  StatusEvent,
18988
19860
  {
18989
- icon: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(XIcon, { color: "#DC2626" }),
19861
+ icon: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(XIcon, { color: "#DC2626" }),
18990
19862
  color: "#DC2626",
18991
19863
  bgColor: "rgba(220, 38, 38, 0.08)",
18992
19864
  borderColor: "rgba(220, 38, 38, 0.2)",
@@ -18996,10 +19868,10 @@ function MessageItemImpl({
18996
19868
  }
18997
19869
  );
18998
19870
  case "document_replacement_requested":
18999
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19871
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19000
19872
  StatusEvent,
19001
19873
  {
19002
- icon: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(RefreshIcon, { color: "#D97706" }),
19874
+ icon: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(RefreshIcon, { color: "#D97706" }),
19003
19875
  color: "#D97706",
19004
19876
  bgColor: "rgba(245, 158, 11, 0.08)",
19005
19877
  borderColor: "rgba(245, 158, 11, 0.2)",
@@ -19009,7 +19881,7 @@ function MessageItemImpl({
19009
19881
  }
19010
19882
  );
19011
19883
  default:
19012
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
19884
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19013
19885
  ChatBubble,
19014
19886
  {
19015
19887
  message,
@@ -19022,13 +19894,13 @@ function MessageItemImpl({
19022
19894
  );
19023
19895
  }
19024
19896
  }
19025
- var MessageItem = import_react36.default.memo(MessageItemImpl);
19897
+ var MessageItem = import_react38.default.memo(MessageItemImpl);
19026
19898
 
19027
19899
  // src/RedactoPrivacyCenter/components/CaseDetails/MessageComposer.tsx
19028
- var import_react37 = require("react");
19029
- var import_react_native55 = require("react-native");
19030
- var import_react_i18next24 = require("react-i18next");
19031
- 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");
19032
19904
  function MessageComposer({
19033
19905
  messageText,
19034
19906
  onMessageTextChange,
@@ -19040,15 +19912,15 @@ function MessageComposer({
19040
19912
  isUploading,
19041
19913
  isCaseFinalized = false
19042
19914
  }) {
19043
- const { t } = (0, import_react_i18next24.useTranslation)();
19915
+ const { t } = (0, import_react_i18next26.useTranslation)();
19044
19916
  const { colors } = useTheme();
19045
19917
  const canSend = (messageText.trim().length > 0 || pendingUpload) && !isSending && !isUploading && !isCaseFinalized;
19046
- const activate = (0, import_react37.useRef)(new import_react_native55.Animated.Value(canSend ? 1 : 0)).current;
19047
- (0, import_react37.useEffect)(() => {
19048
- 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, {
19049
19921
  toValue: canSend ? 1 : 0,
19050
19922
  duration: 180,
19051
- easing: import_react_native55.Easing.out(import_react_native55.Easing.quad),
19923
+ easing: import_react_native57.Easing.out(import_react_native57.Easing.quad),
19052
19924
  useNativeDriver: false
19053
19925
  }).start();
19054
19926
  }, [canSend, activate]);
@@ -19056,30 +19928,30 @@ function MessageComposer({
19056
19928
  inputRange: [0, 1],
19057
19929
  outputRange: [colors.border, colors.primary]
19058
19930
  });
19059
- 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;
19060
19932
  const handlePressIn = () => {
19061
- 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();
19062
19934
  };
19063
19935
  const handlePressOut = () => {
19064
- 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();
19065
19937
  };
19066
- const pillIn = (0, import_react37.useRef)(new import_react_native55.Animated.Value(0)).current;
19067
- (0, import_react37.useEffect)(() => {
19068
- 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, {
19069
19941
  toValue: pendingUpload ? 1 : 0,
19070
19942
  duration: 220,
19071
- easing: import_react_native55.Easing.out(import_react_native55.Easing.cubic),
19943
+ easing: import_react_native57.Easing.out(import_react_native57.Easing.cubic),
19072
19944
  useNativeDriver: true
19073
19945
  }).start();
19074
19946
  }, [pendingUpload, pillIn]);
19075
19947
  const pillOpacity = pillIn;
19076
19948
  const pillTranslateY = pillIn.interpolate({ inputRange: [0, 1], outputRange: [8, 0] });
19077
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_react_native55.View, { style: [styles44.container, { borderTopColor: colors.hairline, backgroundColor: colors.canvasSubtle, paddingBottom: spacing.sm }], children: [
19078
- pendingUpload && /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
19079
- 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,
19080
19952
  {
19081
19953
  style: [
19082
- styles44.uploadPill,
19954
+ styles46.uploadPill,
19083
19955
  {
19084
19956
  backgroundColor: colors.primarySoft,
19085
19957
  opacity: pillOpacity,
@@ -19087,34 +19959,34 @@ function MessageComposer({
19087
19959
  }
19088
19960
  ],
19089
19961
  children: [
19090
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Icon, { name: "file", size: 14, color: colors.primary }),
19091
- /* @__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: [
19092
19964
  pendingUpload.file_name,
19093
19965
  " (",
19094
19966
  formatFileSize(pendingUpload.file_size),
19095
19967
  ")"
19096
19968
  ] }),
19097
- /* @__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 }) })
19098
19970
  ]
19099
19971
  }
19100
19972
  ),
19101
- /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_react_native55.View, { style: [styles44.pill, { backgroundColor: colors.surface, borderColor: colors.border }, isCaseFinalized && styles44.pillDisabled], children: [
19102
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
19103
- 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,
19104
19976
  {
19105
- style: styles44.attachButton,
19977
+ style: styles46.attachButton,
19106
19978
  onPress: onAttachClick,
19107
19979
  disabled: isUploading || isCaseFinalized,
19108
19980
  activeOpacity: 0.6,
19109
19981
  hitSlop: DEFAULT_HIT_SLOP,
19110
19982
  accessibilityLabel: t("uploadFile") || "Attach file",
19111
- 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 })
19112
19984
  }
19113
19985
  ),
19114
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
19115
- import_react_native55.TextInput,
19986
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
19987
+ import_react_native57.TextInput,
19116
19988
  {
19117
- style: [styles44.input, { color: colors.text }],
19989
+ style: [styles46.input, { color: colors.text }],
19118
19990
  value: messageText,
19119
19991
  onChangeText: onMessageTextChange,
19120
19992
  placeholder: t("messageInputPlaceholder", { defaultValue: "Message\u2026" }),
@@ -19124,8 +19996,8 @@ function MessageComposer({
19124
19996
  editable: !isSending && !isCaseFinalized
19125
19997
  }
19126
19998
  ),
19127
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_react_native55.Animated.View, { style: { transform: [{ scale: pressScale }] }, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
19128
- 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,
19129
20001
  {
19130
20002
  onPress: onSend,
19131
20003
  onPressIn: handlePressIn,
@@ -19133,15 +20005,15 @@ function MessageComposer({
19133
20005
  disabled: !canSend,
19134
20006
  activeOpacity: 0.85,
19135
20007
  accessibilityLabel: t("send") || "Send",
19136
- 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 }) }) })
19137
20009
  }
19138
20010
  ) })
19139
20011
  ] })
19140
20012
  ] });
19141
20013
  }
19142
- var styles44 = import_react_native55.StyleSheet.create({
20014
+ var styles46 = import_react_native57.StyleSheet.create({
19143
20015
  container: {
19144
- borderTopWidth: import_react_native55.StyleSheet.hairlineWidth,
20016
+ borderTopWidth: import_react_native57.StyleSheet.hairlineWidth,
19145
20017
  paddingHorizontal: spacing.md,
19146
20018
  paddingVertical: spacing.sm
19147
20019
  },
@@ -19164,7 +20036,7 @@ var styles44 = import_react_native55.StyleSheet.create({
19164
20036
  pill: {
19165
20037
  flexDirection: "row",
19166
20038
  alignItems: "center",
19167
- borderWidth: import_react_native55.StyleSheet.hairlineWidth,
20039
+ borderWidth: import_react_native57.StyleSheet.hairlineWidth,
19168
20040
  borderRadius: radii.xxl + 4,
19169
20041
  paddingHorizontal: spacing.xs + 2,
19170
20042
  paddingVertical: spacing.xs,
@@ -19203,7 +20075,7 @@ var styles44 = import_react_native55.StyleSheet.create({
19203
20075
  });
19204
20076
 
19205
20077
  // src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
19206
- var import_jsx_runtime57 = require("react/jsx-runtime");
20078
+ var import_jsx_runtime61 = require("react/jsx-runtime");
19207
20079
  var STREAK_GAP_MS = 5 * 60 * 1e3;
19208
20080
  function isStreakBoundary(a, b) {
19209
20081
  if (!a || !b) return true;
@@ -19233,11 +20105,11 @@ function sameDay(a, b) {
19233
20105
  }
19234
20106
  var MESSAGE_POLL_INTERVAL = 3e4;
19235
20107
  function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19236
- const { t } = (0, import_react_i18next25.useTranslation)();
20108
+ const { t } = (0, import_react_i18next27.useTranslation)();
19237
20109
  const { accessToken, refreshToken, email, organizationId, workspaceId, onError, updateTokens } = useAuth();
19238
20110
  const { consentClient } = useBaseUrl();
19239
20111
  const { colors } = useTheme();
19240
- const authContext = (0, import_react38.useMemo)(() => ({
20112
+ const authContext = (0, import_react40.useMemo)(() => ({
19241
20113
  accessToken,
19242
20114
  refreshToken,
19243
20115
  onError,
@@ -19249,13 +20121,13 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19249
20121
  caseUuid,
19250
20122
  authContext
19251
20123
  );
19252
- const [messageText, setMessageText] = (0, import_react38.useState)("");
19253
- const [pendingUpload, setPendingUpload] = (0, import_react38.useState)(null);
19254
- const [isSending, setIsSending] = (0, import_react38.useState)(false);
19255
- const [isUploading, setIsUploading] = (0, import_react38.useState)(false);
19256
- const [isSubmittingForRequest, setIsSubmittingForRequest] = (0, import_react38.useState)(false);
19257
- const flatListRef = (0, import_react38.useRef)(null);
19258
- (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)(() => {
19259
20131
  if (messages && messages.length > 0) {
19260
20132
  setTimeout(() => {
19261
20133
  var _a3;
@@ -19263,16 +20135,19 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19263
20135
  }, 100);
19264
20136
  }
19265
20137
  }, [messages == null ? void 0 : messages.length]);
19266
- const refetchRef = (0, import_react38.useRef)(refetch);
20138
+ const refetchRef = (0, import_react40.useRef)(refetch);
19267
20139
  refetchRef.current = refetch;
19268
- (0, import_react38.useEffect)(() => {
20140
+ const authContextRef = (0, import_react40.useRef)(authContext);
20141
+ authContextRef.current = authContext;
20142
+ (0, import_react40.useEffect)(() => {
19269
20143
  if (isCaseFinalized) return;
19270
20144
  const id = setInterval(() => {
20145
+ if (isRefreshBlocked(authContextRef.current)) return;
19271
20146
  refetchRef.current();
19272
20147
  }, MESSAGE_POLL_INTERVAL);
19273
20148
  return () => clearInterval(id);
19274
20149
  }, [isCaseFinalized]);
19275
- const handleSend = (0, import_react38.useCallback)(async () => {
20150
+ const handleSend = (0, import_react40.useCallback)(async () => {
19276
20151
  if (isCaseFinalized) return;
19277
20152
  if (!messageText.trim() && !pendingUpload) return;
19278
20153
  if (!organizationId || !workspaceId) return;
@@ -19297,7 +20172,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19297
20172
  setIsSending(false);
19298
20173
  }
19299
20174
  }, [isCaseFinalized, messageText, pendingUpload, organizationId, workspaceId, caseUuid, authContext, consentClient, refetch]);
19300
- const handleAttach = (0, import_react38.useCallback)(async () => {
20175
+ const handleAttach = (0, import_react40.useCallback)(async () => {
19301
20176
  if (isCaseFinalized) return;
19302
20177
  if (!organizationId || !workspaceId) return;
19303
20178
  try {
@@ -19332,10 +20207,10 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19332
20207
  setIsUploading(false);
19333
20208
  }
19334
20209
  }, [isCaseFinalized, organizationId, workspaceId, caseUuid, authContext, consentClient]);
19335
- const handleUploadForRequest = (0, import_react38.useCallback)((_requestEventUuid) => {
20210
+ const handleUploadForRequest = (0, import_react40.useCallback)((_requestEventUuid) => {
19336
20211
  handleAttach();
19337
20212
  }, [handleAttach]);
19338
- const messagesList = (0, import_react38.useMemo)(() => {
20213
+ const messagesList = (0, import_react40.useMemo)(() => {
19339
20214
  const list = messages ? [...messages] : [];
19340
20215
  list.sort((a, b) => {
19341
20216
  const ta = new Date(a.created_at).getTime();
@@ -19344,17 +20219,17 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19344
20219
  });
19345
20220
  return list;
19346
20221
  }, [messages]);
19347
- const keyExtractor = (0, import_react38.useCallback)((item) => item.uuid, []);
19348
- const renderMessage = (0, import_react38.useCallback)(
20222
+ const keyExtractor = (0, import_react40.useCallback)((item) => item.uuid, []);
20223
+ const renderMessage = (0, import_react40.useCallback)(
19349
20224
  ({ item, index }) => {
19350
20225
  const prev = index > 0 ? messagesList[index - 1] : void 0;
19351
20226
  const next = index < messagesList.length - 1 ? messagesList[index + 1] : void 0;
19352
20227
  const isFirstInGroup = isStreakBoundary(prev, item);
19353
20228
  const isLastInGroup = isStreakBoundary(item, next);
19354
20229
  const dateSeparator = getDateSeparator(prev == null ? void 0 : prev.created_at, item.created_at, t);
19355
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
19356
- 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,
19357
- /* @__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)(
19358
20233
  MessageItem,
19359
20234
  {
19360
20235
  message: item,
@@ -19370,32 +20245,32 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19370
20245
  [messagesList, handleUploadForRequest, isSubmittingForRequest, isCaseFinalized, colors, t]
19371
20246
  );
19372
20247
  if (isLoading) {
19373
- 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 }) });
19374
20249
  }
19375
20250
  if (error) {
19376
- 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" }) });
19377
20252
  }
19378
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native56.View, { style: [styles45.container, { backgroundColor: colors.canvasSubtle }], children: [
19379
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native56.View, { style: styles45.secureRow, children: [
19380
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(Icon, { name: "lock", size: 12, color: colors.textSecondary, strokeWidth: 2.2 }),
19381
- /* @__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"}` })
19382
20257
  ] }),
19383
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
19384
- import_react_native56.FlatList,
20258
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
20259
+ import_react_native58.FlatList,
19385
20260
  {
19386
20261
  ref: flatListRef,
19387
- style: styles45.list,
20262
+ style: styles47.list,
19388
20263
  data: messagesList,
19389
20264
  keyExtractor,
19390
20265
  renderItem: renderMessage,
19391
20266
  contentContainerStyle: [
19392
- styles45.messagesList,
19393
- messagesList.length ? styles45.messagesListFill : styles45.messagesListCenter
20267
+ styles47.messagesList,
20268
+ messagesList.length ? styles47.messagesListFill : styles47.messagesListCenter
19394
20269
  ],
19395
- ListEmptyComponent: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react_native56.View, { style: styles45.emptyContainer, children: [
19396
- /* @__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 }) }),
19397
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_react_native56.Text, { style: [styles45.emptyTitle, { color: colors.text }], children: t("noMessagesYet") || "No messages yet" }),
19398
- /* @__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") })
19399
20274
  ] }),
19400
20275
  onContentSizeChange: () => {
19401
20276
  var _a3;
@@ -19407,7 +20282,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19407
20282
  removeClippedSubviews: true
19408
20283
  }
19409
20284
  ),
19410
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
20285
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
19411
20286
  MessageComposer,
19412
20287
  {
19413
20288
  messageText,
@@ -19423,7 +20298,7 @@ function MessagesTab({ caseUuid, isCaseFinalized = false }) {
19423
20298
  )
19424
20299
  ] });
19425
20300
  }
19426
- var styles45 = import_react_native56.StyleSheet.create({
20301
+ var styles47 = import_react_native58.StyleSheet.create({
19427
20302
  container: {
19428
20303
  flex: 1
19429
20304
  },
@@ -19506,17 +20381,17 @@ var styles45 = import_react_native56.StyleSheet.create({
19506
20381
  });
19507
20382
 
19508
20383
  // src/RedactoPrivacyCenter/components/CaseDetails/CaseDetailsPage.tsx
19509
- var import_jsx_runtime58 = require("react/jsx-runtime");
20384
+ var import_jsx_runtime62 = require("react/jsx-runtime");
19510
20385
  function CaseDetailsPage() {
19511
20386
  var _a3, _b;
19512
- const { t } = (0, import_react_i18next26.useTranslation)();
20387
+ const { t } = (0, import_react_i18next28.useTranslation)();
19513
20388
  const { navigateTo, selectedCase, setSelectedCase, pendingCaseUuid } = useInternalNavigation();
19514
20389
  const { accessToken, refreshToken, email, organizationId, workspaceId, onError, updateTokens } = useAuth();
19515
20390
  const { colors } = useTheme();
19516
20391
  const { keyboardOffset } = usePrivacyCenterInsets();
19517
20392
  const requestTypeLabels = useRequestTypeLabels();
19518
- const [activeTab, setActiveTab] = (0, import_react39.useState)("request-details");
19519
- const authContext = (0, import_react39.useMemo)(() => ({
20393
+ const [activeTab, setActiveTab] = (0, import_react41.useState)("request-details");
20394
+ const authContext = (0, import_react41.useMemo)(() => ({
19520
20395
  accessToken,
19521
20396
  refreshToken,
19522
20397
  onError,
@@ -19529,7 +20404,7 @@ function CaseDetailsPage() {
19529
20404
  email != null ? email : void 0,
19530
20405
  authContext
19531
20406
  );
19532
- (0, import_react39.useEffect)(() => {
20407
+ (0, import_react41.useEffect)(() => {
19533
20408
  if (!cases) return;
19534
20409
  if (cases.length === 0) {
19535
20410
  navigateTo("form");
@@ -19543,33 +20418,33 @@ function CaseDetailsPage() {
19543
20418
  navigateTo("form");
19544
20419
  }
19545
20420
  }, [cases, targetUuid, setSelectedCase, navigateTo]);
19546
- (0, import_react39.useEffect)(() => {
20421
+ (0, import_react41.useEffect)(() => {
19547
20422
  if (!selectedCase && !targetUuid && !isLoading) {
19548
20423
  navigateTo("form");
19549
20424
  }
19550
20425
  }, [selectedCase, targetUuid, isLoading, navigateTo]);
19551
20426
  if (!selectedCase) {
19552
- 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" }) });
19553
20428
  }
19554
20429
  const requestTypeLabel = requestTypeLabels[(_b = selectedCase.request_type) == null ? void 0 : _b.toUpperCase()] || selectedCase.request_type_display || formatCaseStatus(selectedCase.request_type || "");
19555
20430
  const tabs = [
19556
20431
  { id: "request-details", label: t("requestDetails") || "Request Details" },
19557
20432
  { id: "messages", label: t("messages") || "Messages" }
19558
20433
  ];
19559
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
20434
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
19560
20435
  KeyboardAvoidingViewCompat,
19561
20436
  {
19562
- style: [styles46.container, { backgroundColor: colors.canvasSubtle }],
20437
+ style: [styles48.container, { backgroundColor: colors.canvasSubtle }],
19563
20438
  behavior: "padding",
19564
- keyboardVerticalOffset: import_react_native57.Platform.OS === "ios" ? keyboardOffset : 0,
20439
+ keyboardVerticalOffset: import_react_native59.Platform.OS === "ios" ? keyboardOffset : 0,
19565
20440
  children: [
19566
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native57.View, { style: styles46.headerWrap, children: [
19567
- /* @__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: [
19568
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_react_native57.View, { style: [styles46.accent, { backgroundColor: getCaseStatusColor(selectedCase.status, colors) }] }),
19569
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native57.View, { style: styles46.heroBody, children: [
19570
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_react_native57.View, { style: styles46.heroTopRow, children: [
19571
- /* @__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 }) }),
19572
- /* @__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)(
19573
20448
  PCBadge,
19574
20449
  {
19575
20450
  status: getCaseStatusVariant(selectedCase.status),
@@ -19578,10 +20453,10 @@ function CaseDetailsPage() {
19578
20453
  }
19579
20454
  )
19580
20455
  ] }),
19581
- /* @__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 })
19582
20457
  ] })
19583
20458
  ] }) }),
19584
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20459
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
19585
20460
  Segmented,
19586
20461
  {
19587
20462
  options: tabs.map((tab) => ({ value: tab.id, label: tab.label })),
@@ -19590,18 +20465,18 @@ function CaseDetailsPage() {
19590
20465
  }
19591
20466
  )
19592
20467
  ] }),
19593
- /* @__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)(
19594
20469
  RequestDetailsTab,
19595
20470
  {
19596
20471
  selectedCase,
19597
20472
  requestTypeLabel
19598
20473
  }
19599
- ) : /* @__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) }) })
19600
20475
  ]
19601
20476
  }
19602
20477
  );
19603
20478
  }
19604
- var styles46 = import_react_native57.StyleSheet.create({
20479
+ var styles48 = import_react_native59.StyleSheet.create({
19605
20480
  container: {
19606
20481
  flex: 1
19607
20482
  },
@@ -19666,36 +20541,36 @@ var styles46 = import_react_native57.StyleSheet.create({
19666
20541
  });
19667
20542
 
19668
20543
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationsScreen.tsx
19669
- var import_react42 = require("react");
19670
- var import_react_native63 = require("react-native");
19671
- 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");
19672
20547
 
19673
20548
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx
19674
- var import_react_native61 = require("react-native");
19675
- var import_react_i18next27 = require("react-i18next");
20549
+ var import_react_native63 = require("react-native");
20550
+ var import_react_i18next29 = require("react-i18next");
19676
20551
 
19677
20552
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationCTAButton.tsx
19678
- var import_react_native58 = require("react-native");
19679
- 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");
19680
20555
  var NotificationCTAButton = ({ cta, onPress }) => {
19681
20556
  const { colors } = useTheme();
19682
20557
  const tone = cta.style === "danger" ? colors.error : colors.primary;
19683
20558
  const isPrimary = cta.style === "primary" || cta.style === "danger";
19684
- return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
19685
- import_react_native58.TouchableOpacity,
20559
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20560
+ import_react_native60.TouchableOpacity,
19686
20561
  {
19687
20562
  onPress,
19688
20563
  activeOpacity: 0.7,
19689
20564
  style: [
19690
- styles47.button,
20565
+ styles49.button,
19691
20566
  isPrimary ? { backgroundColor: tone } : { backgroundColor: colors.primarySoft }
19692
20567
  ],
19693
20568
  accessibilityRole: "button",
19694
- 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 })
19695
20570
  }
19696
20571
  );
19697
20572
  };
19698
- var styles47 = import_react_native58.StyleSheet.create({
20573
+ var styles49 = import_react_native60.StyleSheet.create({
19699
20574
  button: {
19700
20575
  paddingHorizontal: spacing.lg,
19701
20576
  paddingVertical: spacing.sm,
@@ -19710,8 +20585,8 @@ var styles47 = import_react_native58.StyleSheet.create({
19710
20585
  });
19711
20586
 
19712
20587
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationIcon.tsx
19713
- var import_react_native59 = require("react-native");
19714
- 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");
19715
20590
  var CATEGORY_ICON = {
19716
20591
  guardian: "user-round",
19717
20592
  consent: "clock",
@@ -19724,18 +20599,18 @@ var NotificationIcon = ({ notificationType, size = 40 }) => {
19724
20599
  var _a3;
19725
20600
  const category = (_a3 = TYPE_TO_ICON_CATEGORY[notificationType]) != null ? _a3 : "system";
19726
20601
  const color = ICON_COLORS[category];
19727
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
19728
- import_react_native59.View,
20602
+ return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
20603
+ import_react_native61.View,
19729
20604
  {
19730
20605
  style: [
19731
- styles48.wrap,
20606
+ styles50.wrap,
19732
20607
  { width: size, height: size, borderRadius: radii.md, backgroundColor: withAlpha(color, 0.13) }
19733
20608
  ],
19734
- 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 })
19735
20610
  }
19736
20611
  );
19737
20612
  };
19738
- var styles48 = import_react_native59.StyleSheet.create({
20613
+ var styles50 = import_react_native61.StyleSheet.create({
19739
20614
  wrap: {
19740
20615
  alignItems: "center",
19741
20616
  justifyContent: "center"
@@ -19743,15 +20618,15 @@ var styles48 = import_react_native59.StyleSheet.create({
19743
20618
  });
19744
20619
 
19745
20620
  // src/RedactoPrivacyCenter/components/NotificationHub/SwipeableRow.tsx
19746
- var import_react40 = require("react");
19747
- var import_react_native60 = require("react-native");
19748
- 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");
19749
20624
  var ACTION_WIDTH = 80;
19750
20625
  var CLAIM_THRESHOLD = 8;
19751
20626
  var SwipeableRow = ({ actions, background, children }) => {
19752
20627
  const { colors } = useTheme();
19753
- const translateX = (0, import_react40.useRef)(new import_react_native60.Animated.Value(0)).current;
19754
- 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);
19755
20630
  const maxOpen = actions.length * ACTION_WIDTH;
19756
20631
  const toneColor2 = {
19757
20632
  primary: colors.primary,
@@ -19760,10 +20635,10 @@ var SwipeableRow = ({ actions, background, children }) => {
19760
20635
  };
19761
20636
  const settle = (to) => {
19762
20637
  baseX.current = to;
19763
- 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();
19764
20639
  };
19765
- const panResponder = (0, import_react40.useMemo)(
19766
- () => import_react_native60.PanResponder.create({
20640
+ const panResponder = (0, import_react42.useMemo)(
20641
+ () => import_react_native62.PanResponder.create({
19767
20642
  onMoveShouldSetPanResponder: (_, g) => {
19768
20643
  const horizontal = Math.abs(g.dx) > Math.abs(g.dy) * 1.5;
19769
20644
  if (!horizontal) return false;
@@ -19784,37 +20659,37 @@ var SwipeableRow = ({ actions, background, children }) => {
19784
20659
  [maxOpen]
19785
20660
  );
19786
20661
  if (actions.length === 0) {
19787
- 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 });
19788
20663
  }
19789
20664
  const runAction = (action) => {
19790
20665
  settle(0);
19791
20666
  action.onPress();
19792
20667
  };
19793
- return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_react_native60.View, { style: styles49.root, children: [
19794
- /* @__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)(
19795
- 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,
19796
20671
  {
19797
- style: [styles49.action, { width: ACTION_WIDTH, backgroundColor: toneColor2[action.tone] }],
20672
+ style: [styles51.action, { width: ACTION_WIDTH, backgroundColor: toneColor2[action.tone] }],
19798
20673
  onPress: () => runAction(action),
19799
20674
  activeOpacity: 0.85,
19800
20675
  accessibilityRole: "button",
19801
20676
  accessibilityLabel: action.label,
19802
20677
  children: [
19803
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(Icon, { name: action.icon, size: 20, color: colors.primaryText, strokeWidth: 2.2 }),
19804
- /* @__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 })
19805
20680
  ]
19806
20681
  },
19807
20682
  action.key
19808
20683
  )) }),
19809
- /* @__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 })
19810
20685
  ] });
19811
20686
  };
19812
- var styles49 = import_react_native60.StyleSheet.create({
20687
+ var styles51 = import_react_native62.StyleSheet.create({
19813
20688
  root: {
19814
20689
  position: "relative"
19815
20690
  },
19816
20691
  actionsLayer: {
19817
- ...import_react_native60.StyleSheet.absoluteFillObject,
20692
+ ...import_react_native62.StyleSheet.absoluteFillObject,
19818
20693
  flexDirection: "row",
19819
20694
  justifyContent: "flex-end"
19820
20695
  },
@@ -19847,10 +20722,10 @@ var formatTimeAgo = (dateString, t) => {
19847
20722
  };
19848
20723
 
19849
20724
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx
19850
- var import_jsx_runtime62 = require("react/jsx-runtime");
20725
+ var import_jsx_runtime66 = require("react/jsx-runtime");
19851
20726
  var NotificationRow = ({ notification, onPress, onMarkRead, onAcknowledge }) => {
19852
20727
  var _a3, _b;
19853
- const { t } = (0, import_react_i18next27.useTranslation)();
20728
+ const { t } = (0, import_react_i18next29.useTranslation)();
19854
20729
  const { colors } = useTheme();
19855
20730
  const isUnread = !notification.is_read;
19856
20731
  const statusLabel = notification.status_label_display || notification.status_label;
@@ -19877,35 +20752,35 @@ var NotificationRow = ({ notification, onPress, onMarkRead, onAcknowledge }) =>
19877
20752
  onPress: onAcknowledge
19878
20753
  });
19879
20754
  }
19880
- 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: [
19881
- isUnread ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.View, { style: [styles50.accent, { backgroundColor: accent }] }) : null,
19882
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(NotificationIcon, { notificationType: notification.notification_type, size: 36 }),
19883
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native61.View, { style: styles50.content, children: [
19884
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native61.View, { style: styles50.titleRow, children: [
19885
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
19886
- 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,
19887
20762
  {
19888
- style: [styles50.title, { color: colors.text, fontWeight: isUnread ? "700" : "600" }],
20763
+ style: [styles52.title, { color: colors.text, fontWeight: isUnread ? "700" : "600" }],
19889
20764
  numberOfLines: 2,
19890
20765
  children: notification.title
19891
20766
  }
19892
20767
  ),
19893
- 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
19894
20769
  ] }),
19895
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react_native61.View, { style: styles50.metaRow, children: [
19896
- statusLabel ? /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_jsx_runtime62.Fragment, { children: [
19897
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.View, { style: [styles50.statusDot, { backgroundColor: accent }] }),
19898
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_react_native61.Text, { style: [styles50.metaText, { color: colors.textSecondary }], numberOfLines: 1, children: statusLabel }),
19899
- /* @__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" })
19900
20775
  ] }) : null,
19901
- /* @__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) })
19902
20777
  ] }),
19903
- 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
19904
20779
  ] }),
19905
- /* @__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 }) })
19906
20781
  ] }) });
19907
20782
  };
19908
- var styles50 = import_react_native61.StyleSheet.create({
20783
+ var styles52 = import_react_native63.StyleSheet.create({
19909
20784
  row: {
19910
20785
  flexDirection: "row",
19911
20786
  alignItems: "center",
@@ -19968,25 +20843,25 @@ var styles50 = import_react_native61.StyleSheet.create({
19968
20843
  });
19969
20844
 
19970
20845
  // src/RedactoPrivacyCenter/components/NotificationHub/useNotificationActions.ts
19971
- var import_react41 = require("react");
19972
- var import_react_native62 = require("react-native");
20846
+ var import_react43 = require("react");
20847
+ var import_react_native64 = require("react-native");
19973
20848
  var useNotificationActions = () => {
19974
20849
  const { navigateTo, setSelectedCase } = useInternalNavigation();
19975
20850
  const { accessToken, refreshToken, onError, updateTokens, organizationId, workspaceId, email } = useAuth();
19976
20851
  const { consentClient } = useBaseUrl();
19977
20852
  const { langParam } = useCurrentLanguage();
19978
- const authContext = (0, import_react41.useMemo)(
20853
+ const authContext = (0, import_react43.useMemo)(
19979
20854
  () => ({ accessToken, refreshToken, onError, updateTokens }),
19980
20855
  [accessToken, refreshToken, onError, updateTokens]
19981
20856
  );
19982
- const hasAcknowledgeCTA = (0, import_react41.useCallback)(
20857
+ const hasAcknowledgeCTA = (0, import_react43.useCallback)(
19983
20858
  (notification) => {
19984
20859
  var _a3, _b;
19985
20860
  return (_b = (_a3 = notification.ctas) == null ? void 0 : _a3.some((cta) => cta.action_type === "acknowledge")) != null ? _b : false;
19986
20861
  },
19987
20862
  []
19988
20863
  );
19989
- const handleMarkRead = (0, import_react41.useCallback)(
20864
+ const handleMarkRead = (0, import_react43.useCallback)(
19990
20865
  async (notificationUuid) => {
19991
20866
  if (!organizationId || !workspaceId) return false;
19992
20867
  const result = await markNotificationRead(organizationId, workspaceId, notificationUuid, authContext, consentClient);
@@ -19994,12 +20869,12 @@ var useNotificationActions = () => {
19994
20869
  },
19995
20870
  [organizationId, workspaceId, authContext, consentClient]
19996
20871
  );
19997
- const handleMarkAllRead = (0, import_react41.useCallback)(async () => {
20872
+ const handleMarkAllRead = (0, import_react43.useCallback)(async () => {
19998
20873
  if (!organizationId || !workspaceId) return false;
19999
20874
  const result = await markAllRead(organizationId, workspaceId, authContext, consentClient);
20000
20875
  return result !== null;
20001
20876
  }, [organizationId, workspaceId, authContext, consentClient]);
20002
- const handleAcknowledge = (0, import_react41.useCallback)(
20877
+ const handleAcknowledge = (0, import_react43.useCallback)(
20003
20878
  async (notificationUuid) => {
20004
20879
  if (!organizationId || !workspaceId) return false;
20005
20880
  const result = await acknowledgeNotification(organizationId, workspaceId, notificationUuid, authContext, consentClient);
@@ -20007,7 +20882,7 @@ var useNotificationActions = () => {
20007
20882
  },
20008
20883
  [organizationId, workspaceId, authContext, consentClient]
20009
20884
  );
20010
- const handleCTAClick = (0, import_react41.useCallback)(
20885
+ const handleCTAClick = (0, import_react43.useCallback)(
20011
20886
  async (notification, cta) => {
20012
20887
  var _a3;
20013
20888
  if (cta.action_type === "acknowledge") {
@@ -20041,7 +20916,7 @@ var useNotificationActions = () => {
20041
20916
  const url = cta.url;
20042
20917
  if (!/^https?:\/\//i.test(url)) return null;
20043
20918
  try {
20044
- await import_react_native62.Linking.openURL(url);
20919
+ await import_react_native64.Linking.openURL(url);
20045
20920
  return "opened";
20046
20921
  } catch {
20047
20922
  return null;
@@ -20064,7 +20939,7 @@ var useNotificationActions = () => {
20064
20939
  };
20065
20940
 
20066
20941
  // src/RedactoPrivacyCenter/components/NotificationHub/NotificationsScreen.tsx
20067
- var import_jsx_runtime63 = require("react/jsx-runtime");
20942
+ var import_jsx_runtime67 = require("react/jsx-runtime");
20068
20943
  var EMPTY_SUMMARY = { total: 0, unread: 0, action_needed: 0, acknowledged: 0 };
20069
20944
  var READ_FILTER_TO_PARAM = {
20070
20945
  all: void 0,
@@ -20072,7 +20947,7 @@ var READ_FILTER_TO_PARAM = {
20072
20947
  read: true
20073
20948
  };
20074
20949
  var NotificationsScreen = () => {
20075
- const { t } = (0, import_react_i18next28.useTranslation)();
20950
+ const { t } = (0, import_react_i18next30.useTranslation)();
20076
20951
  const { colors } = useTheme();
20077
20952
  const { langParam } = useCurrentLanguage();
20078
20953
  const { listBottom } = usePrivacyCenterInsets();
@@ -20089,15 +20964,15 @@ var NotificationsScreen = () => {
20089
20964
  handleAcknowledge,
20090
20965
  handleCTAClick
20091
20966
  } = useNotificationActions();
20092
- const [notifications, setNotifications] = (0, import_react42.useState)([]);
20093
- const [summary, setSummary] = (0, import_react42.useState)(EMPTY_SUMMARY);
20094
- const [activeTab, setActiveTab] = (0, import_react42.useState)("all");
20095
- const [readFilter, setReadFilter] = (0, import_react42.useState)("all");
20096
- const [isLoading, setIsLoading] = (0, import_react42.useState)(true);
20097
- const [isRefreshing2, setIsRefreshing] = (0, import_react42.useState)(false);
20098
- 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);
20099
20974
  const isFiltered = activeTab !== "all" || readFilter !== "all";
20100
- const loadNotifications = (0, import_react42.useCallback)(
20975
+ const loadNotifications = (0, import_react44.useCallback)(
20101
20976
  async (includeSummary = false, silent = false) => {
20102
20977
  if (!organizationId || !workspaceId) return;
20103
20978
  if (!silent) setIsLoading(true);
@@ -20127,18 +21002,21 @@ var NotificationsScreen = () => {
20127
21002
  },
20128
21003
  [organizationId, workspaceId, activeTab, readFilter, authContext, consentClient, langParam]
20129
21004
  );
20130
- (0, import_react42.useEffect)(() => {
21005
+ (0, import_react44.useEffect)(() => {
20131
21006
  loadNotifications(true);
20132
21007
  }, [loadNotifications]);
20133
- const loadRef = (0, import_react42.useRef)(loadNotifications);
21008
+ const loadRef = (0, import_react44.useRef)(loadNotifications);
20134
21009
  loadRef.current = loadNotifications;
20135
- (0, import_react42.useEffect)(() => {
21010
+ const authContextRef = (0, import_react44.useRef)(authContext);
21011
+ authContextRef.current = authContext;
21012
+ (0, import_react44.useEffect)(() => {
20136
21013
  const id = setInterval(() => {
21014
+ if (isRefreshBlocked(authContextRef.current)) return;
20137
21015
  loadRef.current(false, true);
20138
21016
  }, POLL_INTERVAL);
20139
21017
  return () => clearInterval(id);
20140
21018
  }, []);
20141
- const onNotificationClick = (0, import_react42.useCallback)(
21019
+ const onNotificationClick = (0, import_react44.useCallback)(
20142
21020
  async (notification) => {
20143
21021
  const shouldMarkRead = !notification.is_read;
20144
21022
  const shouldAutoAcknowledge = !notification.is_acknowledged && !hasAcknowledgeCTA(notification);
@@ -20159,7 +21037,7 @@ var NotificationsScreen = () => {
20159
21037
  },
20160
21038
  [hasAcknowledgeCTA, handleAcknowledge, handleMarkRead]
20161
21039
  );
20162
- const onRowPress = (0, import_react42.useCallback)(
21040
+ const onRowPress = (0, import_react44.useCallback)(
20163
21041
  async (notification) => {
20164
21042
  var _a3;
20165
21043
  const linkCta = (_a3 = notification.ctas) == null ? void 0 : _a3.find((cta) => cta.action_type === "link" && cta.url);
@@ -20177,7 +21055,7 @@ var NotificationsScreen = () => {
20177
21055
  },
20178
21056
  [handleCTAClick, onNotificationClick]
20179
21057
  );
20180
- const onMarkReadRow = (0, import_react42.useCallback)(
21058
+ const onMarkReadRow = (0, import_react44.useCallback)(
20181
21059
  async (notification) => {
20182
21060
  if (notification.is_read) return;
20183
21061
  const ok = await handleMarkRead(notification.uuid);
@@ -20187,7 +21065,7 @@ var NotificationsScreen = () => {
20187
21065
  },
20188
21066
  [handleMarkRead]
20189
21067
  );
20190
- const onAcknowledgeRow = (0, import_react42.useCallback)(
21068
+ const onAcknowledgeRow = (0, import_react44.useCallback)(
20191
21069
  async (notification) => {
20192
21070
  if (notification.is_acknowledged) return;
20193
21071
  const ok = await handleAcknowledge(notification.uuid);
@@ -20204,22 +21082,29 @@ var NotificationsScreen = () => {
20204
21082
  },
20205
21083
  [handleAcknowledge]
20206
21084
  );
20207
- 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)(() => {
20208
21093
  setIsRefreshing(true);
20209
21094
  loadNotifications(true, true);
20210
21095
  }, [loadNotifications]);
20211
- const sections = (0, import_react42.useMemo)(
21096
+ const sections = (0, import_react44.useMemo)(
20212
21097
  () => groupByTime(notifications, (item) => item.created_at, classifyTime),
20213
21098
  [notifications, classifyTime]
20214
21099
  );
20215
- const header = /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.header, children: [
20216
- /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.titleRow, children: [
20217
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.screenTitle, { color: colors.text }], children: t("notifications", { defaultValue: "Notifications" }) }),
20218
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20219
- 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,
20220
21105
  {
20221
21106
  style: [
20222
- styles51.filterBtn,
21107
+ styles53.filterBtn,
20223
21108
  {
20224
21109
  backgroundColor: isFiltered ? colors.primarySoft : colors.surface,
20225
21110
  borderColor: isFiltered ? colors.primary : colors.border
@@ -20228,30 +21113,30 @@ var NotificationsScreen = () => {
20228
21113
  onPress: () => setFilterOpen(true),
20229
21114
  accessibilityRole: "button",
20230
21115
  accessibilityLabel: t("filter") || "Filter",
20231
- 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 })
20232
21117
  }
20233
21118
  )
20234
21119
  ] }),
20235
- summary.unread > 0 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.TouchableOpacity, { style: styles51.markAllBtn, onPress: handleMarkAllRead, activeOpacity: 0.7, accessibilityRole: "button", children: [
20236
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Icon, { name: "check-check", size: 15, color: colors.primary, strokeWidth: 2.2 }),
20237
- /* @__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" })
20238
21123
  ] }) : null
20239
21124
  ] });
20240
- return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_jsx_runtime63.Fragment, { children: [
20241
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20242
- 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,
20243
21128
  {
20244
21129
  data: sections,
20245
21130
  keyExtractor: (section2) => section2.key,
20246
- style: [styles51.list, { backgroundColor: colors.canvasSubtle }],
20247
- contentContainerStyle: [styles51.listContent, { flexGrow: 1, paddingBottom: listBottom }],
21131
+ style: [styles53.list, { backgroundColor: colors.canvasSubtle }],
21132
+ contentContainerStyle: [styles53.listContent, { flexGrow: 1, paddingBottom: listBottom }],
20248
21133
  ListHeaderComponent: header,
20249
21134
  showsVerticalScrollIndicator: false,
20250
- refreshControl: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.RefreshControl, { refreshing: isRefreshing2, onRefresh, tintColor: colors.primary, colors: [colors.primary] }),
20251
- renderItem: ({ item: section2 }) => /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.section, children: [
20252
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.sectionTitle, { color: colors.textSecondary }], children: section2.title }),
20253
- /* @__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: [
20254
- /* @__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)(
20255
21140
  NotificationRow,
20256
21141
  {
20257
21142
  notification: item,
@@ -20260,19 +21145,19 @@ var NotificationsScreen = () => {
20260
21145
  onAcknowledge: () => onAcknowledgeRow(item)
20261
21146
  }
20262
21147
  ),
20263
- 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
20264
21149
  ] }, item.uuid)) }) })
20265
21150
  ] }),
20266
- 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: [
20267
- /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.skeletonRow, children: [
20268
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Skeleton, { width: 36, height: 36, radius: radii.md }),
20269
- /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_react_native63.View, { style: styles51.skeletonLines, children: [
20270
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Skeleton, { width: "70%", height: 13 }),
20271
- /* @__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 })
20272
21157
  ] })
20273
21158
  ] }),
20274
- i < 3 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.View, { style: [styles51.separator, { backgroundColor: colors.hairline }] }) : null
20275
- ] }, 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)(
20276
21161
  PCEmpty,
20277
21162
  {
20278
21163
  iconName: "circle-check",
@@ -20281,14 +21166,14 @@ var NotificationsScreen = () => {
20281
21166
  }
20282
21167
  ) }),
20283
21168
  ListFooterComponentStyle: { marginTop: "auto" },
20284
- ListFooterComponent: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Footer, {})
21169
+ ListFooterComponent: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Footer, {})
20285
21170
  }
20286
21171
  ),
20287
- /* @__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: [
20288
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.filterGroupLabel, { color: colors.textSecondary }], children: t("category", { defaultValue: "Category" }) }),
20289
- /* @__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) => {
20290
21175
  const selected = tab.key === activeTab;
20291
- return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
21176
+ return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20292
21177
  FilterChip,
20293
21178
  {
20294
21179
  label: tab.label,
@@ -20298,12 +21183,12 @@ var NotificationsScreen = () => {
20298
21183
  tab.key
20299
21184
  );
20300
21185
  }) }),
20301
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_react_native63.Text, { style: [styles51.filterGroupLabel, { color: colors.textSecondary, marginTop: spacing.lg }], children: t("readStatus", { defaultValue: "Status" }) }),
20302
- /* @__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: [
20303
21188
  { key: "all", label: t("all") || "All" },
20304
21189
  { key: "unread", label: t("unread") || "Unread" },
20305
21190
  { key: "read", label: t("read", { defaultValue: "Read" }) }
20306
- ].map((opt) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
21191
+ ].map((opt) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20307
21192
  FilterChip,
20308
21193
  {
20309
21194
  label: opt.label,
@@ -20312,13 +21197,13 @@ var NotificationsScreen = () => {
20312
21197
  },
20313
21198
  opt.key
20314
21199
  )) }),
20315
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20316
- import_react_native63.TouchableOpacity,
21200
+ /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21201
+ import_react_native65.TouchableOpacity,
20317
21202
  {
20318
- style: [styles51.applyBtn, { backgroundColor: colors.primary }],
21203
+ style: [styles53.applyBtn, { backgroundColor: colors.primary }],
20319
21204
  onPress: () => setFilterOpen(false),
20320
21205
  accessibilityRole: "button",
20321
- 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" }) })
20322
21207
  }
20323
21208
  )
20324
21209
  ] }) })
@@ -20326,25 +21211,25 @@ var NotificationsScreen = () => {
20326
21211
  };
20327
21212
  var FilterChip = ({ label, selected, onPress }) => {
20328
21213
  const { colors } = useTheme();
20329
- return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
20330
- import_react_native63.TouchableOpacity,
21214
+ return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
21215
+ import_react_native65.TouchableOpacity,
20331
21216
  {
20332
21217
  onPress,
20333
21218
  activeOpacity: 0.7,
20334
21219
  accessibilityRole: "button",
20335
21220
  accessibilityState: { selected },
20336
21221
  style: [
20337
- styles51.chip,
21222
+ styles53.chip,
20338
21223
  {
20339
21224
  backgroundColor: selected ? colors.primary : colors.surfaceAlt,
20340
21225
  borderColor: selected ? colors.primary : colors.border
20341
21226
  }
20342
21227
  ],
20343
- 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 })
20344
21229
  }
20345
21230
  );
20346
21231
  };
20347
- var styles51 = import_react_native63.StyleSheet.create({
21232
+ var styles53 = import_react_native65.StyleSheet.create({
20348
21233
  list: {
20349
21234
  flex: 1
20350
21235
  },
@@ -20378,7 +21263,7 @@ var styles51 = import_react_native63.StyleSheet.create({
20378
21263
  filterBtn: {
20379
21264
  width: 40,
20380
21265
  height: 40,
20381
- borderWidth: import_react_native63.StyleSheet.hairlineWidth,
21266
+ borderWidth: import_react_native65.StyleSheet.hairlineWidth,
20382
21267
  borderRadius: radii.md,
20383
21268
  justifyContent: "center",
20384
21269
  alignItems: "center"
@@ -20399,7 +21284,7 @@ var styles51 = import_react_native63.StyleSheet.create({
20399
21284
  overflow: "hidden"
20400
21285
  },
20401
21286
  separator: {
20402
- height: import_react_native63.StyleSheet.hairlineWidth,
21287
+ height: import_react_native65.StyleSheet.hairlineWidth,
20403
21288
  marginLeft: spacing.lg + 36 + spacing.md
20404
21289
  },
20405
21290
  emptyWrap: {
@@ -20437,7 +21322,7 @@ var styles51 = import_react_native63.StyleSheet.create({
20437
21322
  justifyContent: "center",
20438
21323
  paddingHorizontal: spacing.lg,
20439
21324
  borderRadius: radii.pill,
20440
- borderWidth: import_react_native63.StyleSheet.hairlineWidth
21325
+ borderWidth: import_react_native65.StyleSheet.hairlineWidth
20441
21326
  },
20442
21327
  chipLabel: {
20443
21328
  ...typography.label
@@ -20456,7 +21341,7 @@ var styles51 = import_react_native63.StyleSheet.create({
20456
21341
  });
20457
21342
 
20458
21343
  // src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx
20459
- var import_jsx_runtime64 = require("react/jsx-runtime");
21344
+ var import_jsx_runtime68 = require("react/jsx-runtime");
20460
21345
  var privacyCenterQueryClient = new import_react_query2.QueryClient();
20461
21346
  function PrivacyCenterContent({ onBack }) {
20462
21347
  const { currentPage } = useInternalNavigation();
@@ -20466,24 +21351,24 @@ function PrivacyCenterContent({ onBack }) {
20466
21351
  const chromeMode = getPageChromeMode(currentPage);
20467
21352
  const canvasIsLight = isLightColor(colors.canvasSubtle);
20468
21353
  const barStyle = canvasIsLight ? "dark-content" : "light-content";
20469
- (0, import_react43.useEffect)(() => {
20470
- import_react_native64.StatusBar.setBarStyle(barStyle, true);
20471
- 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") {
20472
21357
  setNavBarIconStyle(canvasIsLight ? "dark" : "light");
20473
21358
  }
20474
21359
  }, [barStyle, canvasIsLight]);
20475
- return /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)(import_react_native64.View, { style: [styles52.container, { backgroundColor: colors.canvasSubtle }], children: [
20476
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_react_native64.StatusBar, { barStyle, translucent: true }),
20477
- /* @__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: [
20478
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(SlimTopBar, { mode: chromeMode, onBack }),
20479
- /* @__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: [
20480
- currentPage === "home" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(HomeHub, {}),
20481
- currentPage === "consent-manager" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(ConsentManager, {}),
20482
- currentPage === "form" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(FormPage, {}),
20483
- currentPage === "activity" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(ActivitiesList, {}),
20484
- currentPage === "receipts" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(ReceiptsList, {}),
20485
- currentPage === "case-details" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(CaseDetailsPage, {}),
20486
- 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, {})
20487
21372
  ] }) })
20488
21373
  ] }) })
20489
21374
  ] });
@@ -20497,22 +21382,34 @@ function RedactoPrivacyCenter({
20497
21382
  theme: _theme,
20498
21383
  accessToken,
20499
21384
  refreshToken,
21385
+ token,
21386
+ email,
21387
+ mobile,
21388
+ ucic,
21389
+ organisationUuid,
21390
+ workspaceUuid,
20500
21391
  onError,
20501
21392
  initialPage = "home",
20502
21393
  initialCaseUuid,
20503
21394
  onBack
20504
21395
  }) {
20505
- 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)(
20506
21397
  AuthProvider,
20507
21398
  {
20508
- accessToken,
20509
- 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,
20510
21407
  onError,
20511
- 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 }) }) }) }) })
20512
21409
  }
20513
21410
  ) }) }) }) }) }) });
20514
21411
  }
20515
- var styles52 = import_react_native64.StyleSheet.create({
21412
+ var styles54 = import_react_native66.StyleSheet.create({
20516
21413
  container: {
20517
21414
  flex: 1
20518
21415
  },
@@ -20526,74 +21423,74 @@ var styles52 = import_react_native64.StyleSheet.create({
20526
21423
  });
20527
21424
 
20528
21425
  // src/RedactoPrivacyCenter/components/SideMenu.tsx
20529
- var import_react_native65 = require("react-native");
20530
- var import_react_i18next30 = require("react-i18next");
21426
+ var import_react_native67 = require("react-native");
21427
+ var import_react_i18next32 = require("react-i18next");
20531
21428
  var import_react_native_svg4 = __toESM(require("react-native-svg"));
20532
- var import_jsx_runtime65 = require("react/jsx-runtime");
21429
+ var import_jsx_runtime69 = require("react/jsx-runtime");
20533
21430
  var MENU_ITEMS = [
20534
21431
  { page: "consent-manager", labelKey: "consentManager", fallback: "Consent Manager", icon: "shield-check" },
20535
21432
  { page: "form", labelKey: "grievanceRequests", fallback: "Privacy Requests", icon: "message-circle-warning" },
20536
21433
  { page: "activity", labelKey: "activity", fallback: "Activity", icon: "activity" }
20537
21434
  ];
20538
21435
  function SideMenu({ onBack } = {}) {
20539
- const { t } = (0, import_react_i18next30.useTranslation)();
21436
+ const { t } = (0, import_react_i18next32.useTranslation)();
20540
21437
  const { currentPage, navigateTo } = useInternalNavigation();
20541
21438
  const { organizationName, email } = useAuth();
20542
21439
  const { colors } = useTheme();
20543
21440
  const orgInitial = organizationName ? organizationName.charAt(0).toUpperCase() : "R";
20544
21441
  const displayName = organizationName || "Organization";
20545
- return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_react_native65.View, { style: [styles53.container, { backgroundColor: colors.surface }], children: [
20546
- /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_react_native65.View, { style: styles53.orgSection, children: [
20547
- /* @__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 }) }),
20548
- /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_react_native65.View, { style: styles53.orgInfo, children: [
20549
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.Text, { style: [styles53.orgName, { color: colors.text }], numberOfLines: 1, children: displayName }),
20550
- 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
20551
21448
  ] })
20552
21449
  ] }),
20553
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: [styles53.divider, { backgroundColor: colors.border }] }),
20554
- /* @__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) => {
20555
21452
  const isActive = currentPage === item.page || item.page === "form" && currentPage === "case-details";
20556
- return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
20557
- import_react_native65.TouchableOpacity,
21453
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
21454
+ import_react_native67.TouchableOpacity,
20558
21455
  {
20559
21456
  style: [
20560
- styles53.menuItem,
20561
- isActive && [styles53.menuItemActive, { backgroundColor: `${colors.primary}14` }]
21457
+ styles55.menuItem,
21458
+ isActive && [styles55.menuItemActive, { backgroundColor: `${colors.primary}14` }]
20562
21459
  ],
20563
21460
  onPress: () => navigateTo(item.page),
20564
21461
  activeOpacity: 0.7,
20565
21462
  accessibilityRole: "button",
20566
21463
  accessibilityState: { selected: isActive },
20567
21464
  children: [
20568
- /* @__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 }) }),
20569
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
20570
- 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,
20571
21468
  {
20572
21469
  style: [
20573
- styles53.menuLabel,
21470
+ styles55.menuLabel,
20574
21471
  { color: isActive ? colors.primary : colors.text },
20575
- isActive && styles53.menuLabelActive
21472
+ isActive && styles55.menuLabelActive
20576
21473
  ],
20577
21474
  children: t(item.labelKey) || item.fallback
20578
21475
  }
20579
21476
  ),
20580
- 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
20581
21478
  ]
20582
21479
  },
20583
21480
  item.page
20584
21481
  );
20585
21482
  }) }),
20586
- onBack ? /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_jsx_runtime65.Fragment, { children: [
20587
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: { flex: 1 } }),
20588
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_react_native65.View, { style: [styles53.divider, { backgroundColor: colors.border }] }),
20589
- /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
20590
- 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,
20591
21488
  {
20592
- style: styles53.backBtn,
21489
+ style: styles55.backBtn,
20593
21490
  onPress: () => navigateBack(onBack),
20594
21491
  activeOpacity: 0.7,
20595
21492
  children: [
20596
- /* @__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)(
20597
21494
  import_react_native_svg4.Path,
20598
21495
  {
20599
21496
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20602,7 +21499,7 @@ function SideMenu({ onBack } = {}) {
20602
21499
  strokeLinecap: "round",
20603
21500
  strokeLinejoin: "round"
20604
21501
  }
20605
- ) : /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
21502
+ ) : /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
20606
21503
  import_react_native_svg4.Path,
20607
21504
  {
20608
21505
  d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4 M16 17l5-5-5-5 M21 12H9",
@@ -20612,14 +21509,14 @@ function SideMenu({ onBack } = {}) {
20612
21509
  strokeLinejoin: "round"
20613
21510
  }
20614
21511
  ) }),
20615
- /* @__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" })
20616
21513
  ]
20617
21514
  }
20618
21515
  )
20619
21516
  ] }) : null
20620
21517
  ] });
20621
21518
  }
20622
- var styles53 = import_react_native65.StyleSheet.create({
21519
+ var styles55 = import_react_native67.StyleSheet.create({
20623
21520
  container: {
20624
21521
  flex: 1,
20625
21522
  paddingTop: 12
@@ -20705,42 +21602,68 @@ var styles53 = import_react_native65.StyleSheet.create({
20705
21602
  });
20706
21603
 
20707
21604
  // src/RedactoPrivacyCenter/components/Navbar.tsx
20708
- var import_react44 = require("react");
20709
- var import_react_native67 = require("react-native");
20710
- 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");
20711
21608
  var import_react_native_svg6 = __toESM(require("react-native-svg"));
20712
21609
 
20713
21610
  // src/RedactoPrivacyCenter/components/UserOrgMenu.tsx
20714
- var import_react_native66 = require("react-native");
20715
- var import_react_i18next31 = require("react-i18next");
21611
+ var import_react_native68 = require("react-native");
21612
+ var import_react_i18next33 = require("react-i18next");
20716
21613
  var import_react_native_svg5 = __toESM(require("react-native-svg"));
20717
- var import_jsx_runtime66 = require("react/jsx-runtime");
21614
+ var import_jsx_runtime70 = require("react/jsx-runtime");
20718
21615
  var UserOrgMenu = ({ visible, onClose, onBack }) => {
20719
- const { t } = (0, import_react_i18next31.useTranslation)();
21616
+ const { t } = (0, import_react_i18next33.useTranslation)();
20720
21617
  const { organizationName, email } = useAuth();
20721
21618
  const { colors, branding } = useTheme();
21619
+ const { switchProfile } = useProfileSwitch();
20722
21620
  const brandName = (branding == null ? void 0 : branding.brand_name) || organizationName || t("privacyCenter") || "Privacy Center";
20723
21621
  const handleAction = () => {
20724
21622
  onClose();
20725
21623
  navigateBack(onBack);
20726
21624
  };
20727
- return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(BottomSheet, { visible, onClose, title: t("account") || "Account", children: [
20728
- /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_react_native66.View, { style: styles54.identity, children: [
20729
- (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 }),
20730
- /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_react_native66.View, { style: styles54.identityText, children: [
20731
- /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_react_native66.Text, { style: [styles54.orgName, { color: colors.text }], numberOfLines: 2, children: brandName }),
20732
- 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
20733
21631
  ] })
20734
21632
  ] }),
20735
- onBack ? /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
20736
- 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,
20737
21660
  {
20738
- 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) }],
20739
21662
  onPress: handleAction,
20740
21663
  activeOpacity: 0.7,
20741
21664
  accessibilityRole: "button",
20742
21665
  children: [
20743
- /* @__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)(
20744
21667
  import_react_native_svg5.Path,
20745
21668
  {
20746
21669
  d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4 M16 17l5-5-5-5 M21 12H9",
@@ -20749,7 +21672,7 @@ var UserOrgMenu = ({ visible, onClose, onBack }) => {
20749
21672
  strokeLinecap: "round",
20750
21673
  strokeLinejoin: "round"
20751
21674
  }
20752
- ) : /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
21675
+ ) : /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
20753
21676
  import_react_native_svg5.Path,
20754
21677
  {
20755
21678
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20759,13 +21682,13 @@ var UserOrgMenu = ({ visible, onClose, onBack }) => {
20759
21682
  strokeLinejoin: "round"
20760
21683
  }
20761
21684
  ) }),
20762
- /* @__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" })
20763
21686
  ]
20764
21687
  }
20765
21688
  ) : null
20766
21689
  ] });
20767
21690
  };
20768
- var styles54 = import_react_native66.StyleSheet.create({
21691
+ var styles56 = import_react_native68.StyleSheet.create({
20769
21692
  identity: {
20770
21693
  flexDirection: "row",
20771
21694
  alignItems: "center",
@@ -20806,33 +21729,33 @@ var styles54 = import_react_native66.StyleSheet.create({
20806
21729
  });
20807
21730
 
20808
21731
  // src/RedactoPrivacyCenter/components/Navbar.tsx
20809
- var import_jsx_runtime67 = require("react/jsx-runtime");
21732
+ var import_jsx_runtime71 = require("react/jsx-runtime");
20810
21733
  function Navbar({ mode = "primary", onBack }) {
20811
- const { t } = (0, import_react_i18next32.useTranslation)();
21734
+ const { t } = (0, import_react_i18next34.useTranslation)();
20812
21735
  const { currentPage, navigateTo } = useInternalNavigation();
20813
21736
  const { organizationName, email } = useAuth();
20814
21737
  const { colors, branding } = useTheme();
20815
- const [locale, setLocale] = (0, import_react44.useState)(i18n_default.language || "en");
20816
- 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);
20817
21740
  const unreadCount = useUnreadCount();
20818
21741
  const { status: pageStatus } = usePageStatus();
20819
21742
  const pageChrome = PAGE_CHROME_BY_PAGE[currentPage] || PAGE_CHROME_BY_PAGE["consent-manager"];
20820
21743
  const isDetail = mode === "detail";
20821
- (0, import_react44.useEffect)(() => {
21744
+ (0, import_react46.useEffect)(() => {
20822
21745
  const handleLanguageChanged = () => setLocale(i18n_default.language);
20823
21746
  i18n_default.on("languageChanged", handleLanguageChanged);
20824
21747
  return () => {
20825
21748
  i18n_default.off("languageChanged", handleLanguageChanged);
20826
21749
  };
20827
21750
  }, []);
20828
- const handleLanguageChange = (0, import_react44.useCallback)((value) => {
21751
+ const handleLanguageChange = (0, import_react46.useCallback)((value) => {
20829
21752
  i18n_default.changeLanguage(value);
20830
21753
  }, []);
20831
21754
  const brandLabel = (branding == null ? void 0 : branding.brand_name) || organizationName || t("privacyCenter") || "Privacy Center";
20832
21755
  const accountLabel = brandLabel || email || t("account") || "Account";
20833
- const brandLockup = /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.brandRow, children: [
20834
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PCAvatar, { name: organizationName || brandLabel, imageUrl: branding == null ? void 0 : branding.icon_url, size: 28 }),
20835
- /* @__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 })
20836
21759
  ] });
20837
21760
  const handleDetailBack = () => {
20838
21761
  if (currentPage === "case-details") {
@@ -20844,26 +21767,26 @@ function Navbar({ mode = "primary", onBack }) {
20844
21767
  }
20845
21768
  };
20846
21769
  if (isDetail) {
20847
- return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
20848
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20849
- 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,
20850
21773
  {
20851
21774
  style: [
20852
- styles55.container,
20853
- styles55.detailContainer,
21775
+ styles57.container,
21776
+ styles57.detailContainer,
20854
21777
  { backgroundColor: colors.background, borderBottomColor: colors.border, paddingTop: TOP_INSET + spacing.xs }
20855
21778
  ],
20856
- children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.detailRow, children: [
20857
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20858
- 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,
20859
21782
  {
20860
- style: styles55.backButton,
21783
+ style: styles57.backButton,
20861
21784
  onPress: handleDetailBack,
20862
21785
  activeOpacity: 0.7,
20863
21786
  hitSlop: DEFAULT_HIT_SLOP,
20864
21787
  accessibilityRole: "button",
20865
21788
  accessibilityLabel: t("back") || "Back",
20866
- 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)(
20867
21790
  import_react_native_svg6.Path,
20868
21791
  {
20869
21792
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20875,36 +21798,36 @@ function Navbar({ mode = "primary", onBack }) {
20875
21798
  ) })
20876
21799
  }
20877
21800
  ),
20878
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.detailTitleWrap, children: [
20879
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native67.Text, { style: [styles55.detailTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
20880
- 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
20881
21804
  ] })
20882
21805
  ] })
20883
21806
  }
20884
21807
  ),
20885
- /* @__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 })
20886
21809
  ] });
20887
21810
  }
20888
- return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
20889
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
20890
- 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,
20891
21814
  {
20892
21815
  style: [
20893
- styles55.container,
21816
+ styles57.container,
20894
21817
  { backgroundColor: colors.background, borderBottomColor: colors.border, paddingTop: TOP_INSET + spacing.xs }
20895
21818
  ],
20896
21819
  children: [
20897
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.appBar, children: [
20898
- onBack ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20899
- 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,
20900
21823
  {
20901
- style: styles55.backButton,
21824
+ style: styles57.backButton,
20902
21825
  onPress: () => navigateBack(onBack),
20903
21826
  activeOpacity: 0.7,
20904
21827
  hitSlop: DEFAULT_HIT_SLOP,
20905
21828
  accessibilityRole: "button",
20906
21829
  accessibilityLabel: onBack === "back" ? t("back") || "Back" : t("signOut") || "Sign Out",
20907
- 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)(
20908
21831
  import_react_native_svg6.Path,
20909
21832
  {
20910
21833
  d: "M19 12H5m0 0l7 7m-7-7l7-7",
@@ -20916,39 +21839,39 @@ function Navbar({ mode = "primary", onBack }) {
20916
21839
  ) })
20917
21840
  }
20918
21841
  ) : null,
20919
- /* @__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 }),
20920
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_react_native67.View, { style: styles55.actions, children: [
20921
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(NotificationBell, { count: unreadCount, onPress: () => navigateTo("notifications") }),
20922
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PCSelect, { value: locale, options: languageOptions, onChange: handleLanguageChange, placeholder: t("language"), compact: true }),
20923
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
20924
- 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,
20925
21848
  {
20926
- style: styles55.avatarButton,
21849
+ style: styles57.avatarButton,
20927
21850
  onPress: () => setMenuOpen(true),
20928
21851
  activeOpacity: 0.7,
20929
21852
  hitSlop: DEFAULT_HIT_SLOP,
20930
21853
  accessibilityRole: "button",
20931
21854
  accessibilityLabel: accountLabel,
20932
- 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 })
20933
21856
  }
20934
21857
  )
20935
21858
  ] })
20936
21859
  ] }),
20937
- /* @__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: [
20938
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_react_native67.Text, { style: [styles55.pageTitle, { color: colors.text }], numberOfLines: 1, children: t(pageChrome.titleKey) }),
20939
- 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
20940
21863
  ] }) })
20941
21864
  ]
20942
21865
  }
20943
21866
  ),
20944
- /* @__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 })
20945
21868
  ] });
20946
21869
  }
20947
- var styles55 = import_react_native67.StyleSheet.create({
21870
+ var styles57 = import_react_native69.StyleSheet.create({
20948
21871
  container: {
20949
21872
  paddingHorizontal: spacing.lg,
20950
21873
  paddingBottom: spacing.md,
20951
- borderBottomWidth: import_react_native67.StyleSheet.hairlineWidth
21874
+ borderBottomWidth: import_react_native69.StyleSheet.hairlineWidth
20952
21875
  },
20953
21876
  detailContainer: {
20954
21877
  paddingBottom: spacing.sm
@@ -21028,10 +21951,10 @@ var styles55 = import_react_native67.StyleSheet.create({
21028
21951
  });
21029
21952
 
21030
21953
  // src/RedactoPrivacyCenter/components/BottomTabBar.tsx
21031
- var import_react45 = require("react");
21032
- var import_react_native68 = require("react-native");
21033
- var import_react_i18next33 = require("react-i18next");
21034
- 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");
21035
21958
  var TAB_ITEMS = [
21036
21959
  { page: "consent-manager", labelKey: "consentManager", fallback: "Consents", icon: "shield-check" },
21037
21960
  { page: "form", labelKey: "grievanceRequests", fallback: "Requests", icon: "message-circle-warning" },
@@ -21042,10 +21965,10 @@ var PAD_H = spacing.lg;
21042
21965
  var PILL_WIDTH = 56;
21043
21966
  var PILL_HEIGHT = 34;
21044
21967
  function BottomTabBar({ showFooter = true }) {
21045
- const { t } = (0, import_react_i18next33.useTranslation)();
21968
+ const { t } = (0, import_react_i18next35.useTranslation)();
21046
21969
  const { currentPage, navigateTo } = useInternalNavigation();
21047
21970
  const { colors } = useTheme();
21048
- const [rowWidth, setRowWidth] = (0, import_react45.useState)(0);
21971
+ const [rowWidth, setRowWidth] = (0, import_react47.useState)(0);
21049
21972
  const innerWidth = Math.max(0, rowWidth - PAD_H * 2);
21050
21973
  const tabWidth = innerWidth > 0 ? innerWidth / TAB_ITEMS.length : 0;
21051
21974
  const activeIndex = TAB_ITEMS.findIndex(
@@ -21053,13 +21976,13 @@ function BottomTabBar({ showFooter = true }) {
21053
21976
  );
21054
21977
  const { translateX } = useAnimatedTabIndicator(Math.max(0, activeIndex), tabWidth);
21055
21978
  const onLayout = (e) => setRowWidth(e.nativeEvent.layout.width);
21056
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_react_native68.View, { style: [styles56.wrapper, { backgroundColor: colors.canvasSubtle, borderTopColor: colors.hairline }], children: [
21057
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_react_native68.View, { style: styles56.container, onLayout, children: [
21058
- tabWidth > 0 && activeIndex >= 0 ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
21059
- 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,
21060
21983
  {
21061
21984
  style: [
21062
- styles56.pill,
21985
+ styles58.pill,
21063
21986
  {
21064
21987
  width: PILL_WIDTH,
21065
21988
  left: PAD_H + (tabWidth - PILL_WIDTH) / 2,
@@ -21072,17 +21995,17 @@ function BottomTabBar({ showFooter = true }) {
21072
21995
  TAB_ITEMS.map((item) => {
21073
21996
  const isActive = currentPage === item.page || item.page === "form" && currentPage === "case-details";
21074
21997
  const label = t(item.labelKey) || item.fallback;
21075
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
21076
- import_react_native68.TouchableOpacity,
21998
+ return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
21999
+ import_react_native70.TouchableOpacity,
21077
22000
  {
21078
- style: styles56.tab,
22001
+ style: styles58.tab,
21079
22002
  onPress: () => navigateTo(item.page),
21080
22003
  activeOpacity: 0.7,
21081
22004
  accessibilityRole: "tab",
21082
22005
  accessibilityState: { selected: isActive },
21083
22006
  accessibilityLabel: label,
21084
22007
  children: [
21085
- /* @__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)(
21086
22009
  Icon,
21087
22010
  {
21088
22011
  name: item.icon,
@@ -21091,10 +22014,10 @@ function BottomTabBar({ showFooter = true }) {
21091
22014
  strokeWidth: isActive ? 2.1 : 1.85
21092
22015
  }
21093
22016
  ) }),
21094
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
21095
- import_react_native68.Text,
22017
+ /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
22018
+ import_react_native70.Text,
21096
22019
  {
21097
- style: [styles56.tabLabel, { color: isActive ? colors.primary : colors.textSecondary }],
22020
+ style: [styles58.tabLabel, { color: isActive ? colors.primary : colors.textSecondary }],
21098
22021
  numberOfLines: 1,
21099
22022
  children: label
21100
22023
  }
@@ -21105,13 +22028,13 @@ function BottomTabBar({ showFooter = true }) {
21105
22028
  );
21106
22029
  })
21107
22030
  ] }),
21108
- showFooter ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Footer, { inline: true }) : null,
21109
- /* @__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 } })
21110
22033
  ] });
21111
22034
  }
21112
- var styles56 = import_react_native68.StyleSheet.create({
22035
+ var styles58 = import_react_native70.StyleSheet.create({
21113
22036
  wrapper: {
21114
- borderTopWidth: import_react_native68.StyleSheet.hairlineWidth
22037
+ borderTopWidth: import_react_native70.StyleSheet.hairlineWidth
21115
22038
  },
21116
22039
  container: {
21117
22040
  flexDirection: "row",