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

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