@redacto.io/consent-sdk-react 3.2.0 → 3.4.0

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.
package/dist/index.js CHANGED
@@ -30,6 +30,21 @@ var import_react2 = require("react");
30
30
 
31
31
  // src/RedactoNoticeConsent/api/index.ts
32
32
  var import_jwt_decode = require("jwt-decode");
33
+
34
+ // src/utils/isLegacyApi.ts
35
+ function isLegacyApi(baseUrl) {
36
+ try {
37
+ return new URL(baseUrl).hostname.endsWith(".redacto.io");
38
+ } catch {
39
+ try {
40
+ return new URL(`https://${baseUrl}`).hostname.endsWith(".redacto.io");
41
+ } catch {
42
+ return false;
43
+ }
44
+ }
45
+ }
46
+
47
+ // src/RedactoNoticeConsent/api/index.ts
33
48
  var BASE_URL = "https://api.redacto.io/consent";
34
49
  var apiCache = /* @__PURE__ */ new Map();
35
50
  var CACHE_TTL = 5 * 60 * 1e3;
@@ -54,14 +69,6 @@ function decodeTokenSafely(token) {
54
69
  return null;
55
70
  }
56
71
  }
57
- var storage = {
58
- getItem: (key) => {
59
- if (typeof window !== "undefined") {
60
- return localStorage.getItem(key);
61
- }
62
- return null;
63
- }
64
- };
65
72
  var clearApiCache = () => {
66
73
  apiCache.clear();
67
74
  };
@@ -72,6 +79,7 @@ var fetchConsentContent = async ({
72
79
  language = "en",
73
80
  specific_uuid,
74
81
  validate_against = "all",
82
+ include_fully_consented_data = false,
75
83
  signal
76
84
  // AbortSignal for request cancellation
77
85
  }) => {
@@ -88,7 +96,7 @@ var fetchConsentContent = async ({
88
96
  throw new Error("Invalid token: missing organization or workspace UUID");
89
97
  }
90
98
  const apiBaseUrl = baseUrl || BASE_URL;
91
- const cacheKey = `${accessToken}-${noticeId}-${validate_against}-${language}-${specific_uuid || ""}`;
99
+ const cacheKey = `${accessToken}-${noticeId}-${validate_against}-${language}-${specific_uuid || ""}-${include_fully_consented_data}`;
92
100
  if (validate_against === "all" && !specific_uuid) {
93
101
  const cachedData = getCachedData(cacheKey);
94
102
  if (cachedData) {
@@ -102,6 +110,9 @@ var fetchConsentContent = async ({
102
110
  url.searchParams.append("specific_uuid", specific_uuid);
103
111
  }
104
112
  url.searchParams.append("validate_against", validate_against);
113
+ if (include_fully_consented_data) {
114
+ url.searchParams.append("include_fully_consented_data", "true");
115
+ }
105
116
  const response = await fetch(url.toString(), {
106
117
  method: "GET",
107
118
  headers: {
@@ -135,7 +146,6 @@ var fetchConsentContent = async ({
135
146
  }
136
147
  return data;
137
148
  } catch (error) {
138
- console.error("Error fetching consent content:", error instanceof Error ? error.message : error);
139
149
  throw error;
140
150
  }
141
151
  };
@@ -161,42 +171,62 @@ var submitConsentEvent = async ({
161
171
  if (!ORGANISATION_UUID || !WORKSPACE_UUID) {
162
172
  throw new Error("Invalid token: missing organization or workspace UUID");
163
173
  }
164
- const primaryEmail = storage.getItem("userEmail");
165
- const validatedPurposes = purposes.map((purpose) => {
166
- if (!purpose.uuid || !purpose.name) {
167
- throw new Error(`Invalid purpose data: missing uuid or name`);
168
- }
169
- return {
170
- uuid: purpose.uuid,
171
- name: purpose.name,
172
- description: purpose.description || "",
173
- industries: purpose.industries || "",
174
- selected: Boolean(purpose.selected),
175
- data_elements: (purpose.data_elements || []).map((element) => {
176
- if (!element.uuid || !element.name) {
177
- throw new Error(`Invalid data element: missing uuid or name`);
178
- }
179
- return {
180
- uuid: element.uuid,
181
- name: element.name,
182
- enabled: Boolean(element.enabled),
183
- required: Boolean(element.required),
184
- selected: element.required ? true : Boolean(element.selected)
185
- };
186
- })
187
- };
188
- });
189
- const payload = {
190
- primary_email: primaryEmail || void 0,
191
- notice_uuid: noticeUuid,
192
- source: "WEB",
193
- declined: Boolean(declined),
194
- consents: {
195
- purposes: validatedPurposes
196
- },
197
- meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid } : void 0
198
- };
199
174
  const apiBaseUrl = baseUrl || BASE_URL;
175
+ let payload;
176
+ if (isLegacyApi(apiBaseUrl)) {
177
+ const primaryEmail = typeof window !== "undefined" ? localStorage.getItem("userEmail") : null;
178
+ payload = {
179
+ primary_email: primaryEmail || void 0,
180
+ notice_uuid: noticeUuid,
181
+ source: "WEB",
182
+ declined: Boolean(declined),
183
+ consents: {
184
+ purposes: purposes.map((purpose) => {
185
+ if (!purpose.uuid) {
186
+ throw new Error(`Invalid purpose data: missing uuid`);
187
+ }
188
+ return {
189
+ uuid: purpose.uuid,
190
+ name: purpose.name,
191
+ description: purpose.description || "",
192
+ industries: purpose.industries || "",
193
+ selected: Boolean(purpose.selected),
194
+ data_elements: (purpose.data_elements || []).map((element) => ({
195
+ uuid: element.uuid,
196
+ name: element.name,
197
+ enabled: Boolean(element.enabled),
198
+ required: Boolean(element.required),
199
+ selected: element.required ? true : Boolean(element.selected)
200
+ }))
201
+ };
202
+ })
203
+ },
204
+ meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid } : void 0
205
+ };
206
+ } else {
207
+ const validatedPurposes = purposes.map((purpose) => {
208
+ if (!purpose.uuid) {
209
+ throw new Error(`Invalid purpose data: missing uuid`);
210
+ }
211
+ const dataElements = (purpose.data_elements || []).filter((element) => element.enabled).map((element) => ({
212
+ uuid: element.uuid,
213
+ selected: element.required ? true : Boolean(element.selected)
214
+ }));
215
+ return {
216
+ purpose_uuid: purpose.uuid,
217
+ selected: Boolean(purpose.selected),
218
+ data_elements: dataElements.length > 0 ? dataElements : void 0
219
+ };
220
+ });
221
+ payload = {
222
+ notice_uuid: noticeUuid,
223
+ purposes: validatedPurposes,
224
+ select_all_mandatory: false,
225
+ source: "WEB",
226
+ declined: Boolean(declined),
227
+ meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid } : void 0
228
+ };
229
+ }
200
230
  const response = await fetch(
201
231
  `${apiBaseUrl}/public/organisations/${ORGANISATION_UUID}/workspaces/${WORKSPACE_UUID}/submit-consent`,
202
232
  {
@@ -229,7 +259,6 @@ var submitConsentEvent = async ({
229
259
  }
230
260
  apiCache.clear();
231
261
  } catch (error) {
232
- console.error("Error submitting consent event:", error instanceof Error ? error.message : error);
233
262
  throw error;
234
263
  }
235
264
  };
@@ -361,7 +390,6 @@ var fetchTTSAudioUrls = async ({
361
390
  const data = await response.json();
362
391
  return data;
363
392
  } catch (error) {
364
- console.error("Error fetching TTS audio URLs:", error instanceof Error ? error.message : error);
365
393
  throw error;
366
394
  }
367
395
  };
@@ -369,6 +397,18 @@ var fetchTTSAudioUrls = async ({
369
397
  // src/RedactoNoticeConsent/assets/redacto-logo.png
370
398
  var redacto_logo_default = "data:image/png;base64,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";
371
399
 
400
+ // src/RedactoNoticeConsent/constants.ts
401
+ var DPO_AUDIO_ELEMENT_MAP = [
402
+ { audioKey: "grievance_text_audio_url", elementId: "dpo-grievance-text" },
403
+ { audioKey: "grievance_anchor_text_audio_url", elementId: "dpo-grievance-link" },
404
+ { audioKey: "grievance_email_connector_text_audio_url", elementId: "dpo-grievance-email-connector" },
405
+ { audioKey: "grievance_email_audio_url", elementId: "dpo-grievance-email" },
406
+ { audioKey: "dp_board_text_audio_url", elementId: "dpo-dp-board-text" },
407
+ { audioKey: "dp_board_anchor_text_audio_url", elementId: "dpo-dp-board-link" },
408
+ { audioKey: "dpo_text_audio_url", elementId: "dpo-dpo-text" },
409
+ { audioKey: "dpo_anchor_text_audio_url", elementId: "dpo-dpo-link" }
410
+ ];
411
+
372
412
  // src/RedactoNoticeConsent/injectStyles.ts
373
413
  var stylesInjected = false;
374
414
  var injectCheckboxStyles = () => {
@@ -558,8 +598,7 @@ var styles = {
558
598
  justifyContent: "space-between",
559
599
  alignItems: "center",
560
600
  paddingBottom: "15px",
561
- borderBottom: "1px solid #e5e7eb",
562
- boxShadow: "0 1px 2px rgba(0, 0, 0, 0.03)",
601
+ borderBottom: "none",
563
602
  backgroundColor: "#ffffff",
564
603
  margin: 0,
565
604
  boxSizing: "border-box",
@@ -613,7 +652,7 @@ var styles = {
613
652
  backgroundColor: "#ffffff"
614
653
  },
615
654
  middleSection: {
616
- margin: "20px 0px",
655
+ margin: "0px",
617
656
  display: "flex",
618
657
  flexDirection: "column",
619
658
  gap: "12px",
@@ -628,7 +667,6 @@ var styles = {
628
667
  fontSize: "16px",
629
668
  fontWeight: 400,
630
669
  lineHeight: "150%",
631
- letterSpacing: "0.2px",
632
670
  color: "#344054",
633
671
  margin: 0,
634
672
  padding: 0,
@@ -768,8 +806,7 @@ var styles = {
768
806
  justifyContent: "space-between",
769
807
  gap: "29px",
770
808
  paddingTop: "15px",
771
- borderTop: "1px solid #e5e7eb",
772
- boxShadow: "0 -1px 2px rgba(0, 0, 0, 0.03)",
809
+ borderTop: "none",
773
810
  backgroundColor: "#ffffff",
774
811
  margin: 0,
775
812
  boxSizing: "border-box"
@@ -1117,9 +1154,8 @@ var PurposeItem = ({
1117
1154
  ),
1118
1155
  isAlreadyConsented && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: (() => {
1119
1156
  const combinedId = `${purpose.uuid}-${dataElement.uuid}`;
1120
- const isCurrentlySelected = selectedDataElements[combinedId] || false;
1121
1157
  const wasOriginallySelected = initialDataElementSelections[combinedId] || false;
1122
- if (isCurrentlySelected && wasOriginallySelected) {
1158
+ if (wasOriginallySelected) {
1123
1159
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1124
1160
  "div",
1125
1161
  {
@@ -1132,7 +1168,7 @@ var PurposeItem = ({
1132
1168
  borderRadius: "50%",
1133
1169
  backgroundColor: "#10B981"
1134
1170
  },
1135
- "aria-label": `Already consented to ${getTranslatedText(
1171
+ "aria-label": `Consented to ${getTranslatedText(
1136
1172
  `data_elements.name`,
1137
1173
  dataElement.name,
1138
1174
  dataElement.uuid
@@ -1162,17 +1198,23 @@ var PurposeItem = ({
1162
1198
  );
1163
1199
  } else {
1164
1200
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1165
- "input",
1201
+ "div",
1166
1202
  {
1167
- className: "redacto-checkbox-small",
1168
- type: "checkbox",
1169
- checked: isCurrentlySelected,
1170
- onChange: () => onDataElementToggle(dataElement.uuid, purpose.uuid),
1171
- "aria-label": `Select ${getTranslatedText(
1203
+ style: {
1204
+ display: "flex",
1205
+ alignItems: "center",
1206
+ justifyContent: "center",
1207
+ width: "16px",
1208
+ height: "16px",
1209
+ borderRadius: "50%",
1210
+ border: "2px solid #d0d5dd",
1211
+ backgroundColor: "transparent"
1212
+ },
1213
+ "aria-label": `Not consented to ${getTranslatedText(
1172
1214
  `data_elements.name`,
1173
1215
  dataElement.name,
1174
1216
  dataElement.uuid
1175
- )}${dataElement.required ? " (required)" : ""}`
1217
+ )}`
1176
1218
  }
1177
1219
  );
1178
1220
  }
@@ -1582,7 +1624,9 @@ var RedactoNoticeConsent = ({
1582
1624
  onError,
1583
1625
  settings,
1584
1626
  applicationId,
1585
- validateAgainst = "all"
1627
+ validateAgainst = "all",
1628
+ includeFullyConsentedData = false,
1629
+ reviewModeButtonText = "Continue"
1586
1630
  }) => {
1587
1631
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w;
1588
1632
  const propValidationError = (0, import_react2.useMemo)(() => {
@@ -1624,6 +1668,7 @@ var RedactoNoticeConsent = ({
1624
1668
  const [initialDataElementSelections, setInitialDataElementSelections] = (0, import_react2.useState)({});
1625
1669
  const [collapsedPurposes, setCollapsedPurposes] = (0, import_react2.useState)({});
1626
1670
  const [hasAlreadyConsented, setHasAlreadyConsented] = (0, import_react2.useState)(false);
1671
+ const [isFullyConsentedReviewMode, setIsFullyConsentedReviewMode] = (0, import_react2.useState)(false);
1627
1672
  const [isLanguageDropdownOpen, setIsLanguageDropdownOpen] = (0, import_react2.useState)(false);
1628
1673
  const [selectedLanguage, setSelectedLanguage] = (0, import_react2.useState)(language);
1629
1674
  const [errorMessage, setErrorMessage] = (0, import_react2.useState)(null);
@@ -1785,10 +1830,15 @@ var RedactoNoticeConsent = ({
1785
1830
  onAccept == null ? void 0 : onAccept();
1786
1831
  }
1787
1832
  }, [hasAlreadyConsented, onAccept]);
1833
+ const isDefaultLanguage = (lang) => {
1834
+ if (!content) return true;
1835
+ if (lang === "English" || lang === "en" || lang === "EN") return true;
1836
+ return false;
1837
+ };
1788
1838
  const getTranslatedText = (key, defaultText, itemId) => {
1789
1839
  var _a2, _b2;
1790
1840
  if (!content) return defaultText;
1791
- if (selectedLanguage === "English" || selectedLanguage === "en") {
1841
+ if (isDefaultLanguage(selectedLanguage)) {
1792
1842
  if (key === "privacy_policy_anchor_text" && content.privacy_policy_anchor_text) {
1793
1843
  return content.privacy_policy_anchor_text;
1794
1844
  }
@@ -1815,18 +1865,38 @@ var RedactoNoticeConsent = ({
1815
1865
  }
1816
1866
  if (itemId) {
1817
1867
  if (key === "purposes.name" || key === "purposes.description") {
1818
- return ((_a2 = translationMap.purposes) == null ? void 0 : _a2[itemId]) || defaultText;
1868
+ const purposeData = (_a2 = translationMap.purposes) == null ? void 0 : _a2[itemId];
1869
+ if (purposeData) {
1870
+ if (typeof purposeData === "string") {
1871
+ return key === "purposes.name" ? purposeData : defaultText;
1872
+ }
1873
+ return key === "purposes.name" ? purposeData.name || defaultText : purposeData.description || defaultText;
1874
+ }
1875
+ return defaultText;
1819
1876
  }
1820
1877
  if (key.startsWith("data_elements.")) {
1821
1878
  return ((_b2 = translationMap.data_elements) == null ? void 0 : _b2[itemId]) || defaultText;
1822
1879
  }
1823
1880
  }
1824
1881
  const value = translationMap[key];
1825
- if (typeof value === "string") {
1882
+ if (typeof value === "string" && value) {
1826
1883
  return value;
1827
1884
  }
1828
1885
  return defaultText;
1829
1886
  };
1887
+ const getTranslatedDpoText = (key, defaultText) => {
1888
+ if (!(content == null ? void 0 : content.dpo_info)) return defaultText;
1889
+ if (isDefaultLanguage(selectedLanguage)) {
1890
+ return content.dpo_info[key] || defaultText;
1891
+ }
1892
+ if (!content.supported_languages_and_translations) return defaultText;
1893
+ const translationMap = content.supported_languages_and_translations[selectedLanguage];
1894
+ if (translationMap == null ? void 0 : translationMap.dpo_info) {
1895
+ const translated = translationMap.dpo_info[key];
1896
+ if (translated) return translated;
1897
+ }
1898
+ return content.dpo_info[key] || defaultText;
1899
+ };
1830
1900
  const fetchNotice = async () => {
1831
1901
  var _a2;
1832
1902
  if (isRequestInProgressRef.current) {
@@ -1850,16 +1920,18 @@ var RedactoNoticeConsent = ({
1850
1920
  language,
1851
1921
  specific_uuid: applicationId,
1852
1922
  validate_against: validateAgainst,
1923
+ include_fully_consented_data: includeFullyConsentedData,
1853
1924
  signal: (_a2 = abortControllerRef.current) == null ? void 0 : _a2.signal
1854
1925
  });
1855
- setContent(consentContentData.detail.active_config);
1856
- if (consentContentData.detail.active_config.default_language) {
1857
- const defaultLang = consentContentData.detail.active_config.default_language;
1926
+ const activeConfig = consentContentData.detail.active_config;
1927
+ setContent(activeConfig);
1928
+ if (activeConfig.default_language) {
1929
+ const defaultLang = activeConfig.default_language;
1858
1930
  setSelectedLanguage(
1859
1931
  defaultLang === "en" || defaultLang === "EN" ? "English" : defaultLang
1860
1932
  );
1861
1933
  }
1862
- const initialCollapsedState = consentContentData.detail.active_config.purposes.reduce(
1934
+ const initialCollapsedState = activeConfig.purposes.reduce(
1863
1935
  (acc, purpose) => ({
1864
1936
  ...acc,
1865
1937
  [purpose.uuid]: true
@@ -1870,13 +1942,13 @@ var RedactoNoticeConsent = ({
1870
1942
  const isReconsentRequired = consentContentData.detail.reconsent_required;
1871
1943
  const purposeSelections = consentContentData.detail.purpose_selections;
1872
1944
  const newCategorizedPurposes = isReconsentRequired ? {
1873
- alreadyConsented: consentContentData.detail.active_config.purposes.filter(
1945
+ alreadyConsented: activeConfig.purposes.filter(
1874
1946
  (purpose) => {
1875
1947
  const selection = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid];
1876
1948
  return selection && (selection.status === "ACTIVE" || selection.status === "EXPIRED") && !selection.needs_reconsent;
1877
1949
  }
1878
1950
  ),
1879
- needsConsent: consentContentData.detail.active_config.purposes.filter(
1951
+ needsConsent: activeConfig.purposes.filter(
1880
1952
  (purpose) => {
1881
1953
  const selection = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid];
1882
1954
  return !selection || selection.status !== "ACTIVE" || selection.needs_reconsent;
@@ -1884,9 +1956,9 @@ var RedactoNoticeConsent = ({
1884
1956
  )
1885
1957
  } : null;
1886
1958
  setCategorizedPurposes(newCategorizedPurposes);
1887
- const initialPurposeState = consentContentData.detail.active_config.purposes.reduce(
1959
+ const initialPurposeState = activeConfig.purposes.reduce(
1888
1960
  (acc, purpose) => {
1889
- if (isReconsentRequired && (purposeSelections == null ? void 0 : purposeSelections[purpose.uuid])) {
1961
+ if (purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) {
1890
1962
  acc[purpose.uuid] = purposeSelections[purpose.uuid].selected;
1891
1963
  } else {
1892
1964
  acc[purpose.uuid] = false;
@@ -1896,12 +1968,12 @@ var RedactoNoticeConsent = ({
1896
1968
  {}
1897
1969
  );
1898
1970
  setSelectedPurposes(initialPurposeState);
1899
- const initialDataElementState = consentContentData.detail.active_config.purposes.reduce(
1971
+ const initialDataElementState = activeConfig.purposes.reduce(
1900
1972
  (acc, purpose) => {
1901
1973
  purpose.data_elements.forEach((element) => {
1902
1974
  var _a3, _b2;
1903
1975
  const combinedId = `${purpose.uuid}-${element.uuid}`;
1904
- if (isReconsentRequired && ((_b2 = (_a3 = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid])) {
1976
+ if ((_b2 = (_a3 = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid]) {
1905
1977
  acc[combinedId] = purposeSelections[purpose.uuid].data_elements[element.uuid].selected;
1906
1978
  } else {
1907
1979
  acc[combinedId] = false;
@@ -1913,6 +1985,7 @@ var RedactoNoticeConsent = ({
1913
1985
  );
1914
1986
  setSelectedDataElements(initialDataElementState);
1915
1987
  if (isReconsentRequired && newCategorizedPurposes) {
1988
+ setIsFullyConsentedReviewMode(false);
1916
1989
  const initialSelections = {};
1917
1990
  newCategorizedPurposes.alreadyConsented.forEach((purpose) => {
1918
1991
  purpose.data_elements.forEach((element) => {
@@ -1926,7 +1999,36 @@ var RedactoNoticeConsent = ({
1926
1999
  });
1927
2000
  });
1928
2001
  setInitialDataElementSelections(initialSelections);
2002
+ } else if (includeFullyConsentedData && purposeSelections) {
2003
+ const allPurposesSelected = activeConfig.purposes.length > 0 && activeConfig.purposes.every(
2004
+ (p) => {
2005
+ var _a3;
2006
+ return ((_a3 = purposeSelections[p.uuid]) == null ? void 0 : _a3.selected) === true;
2007
+ }
2008
+ );
2009
+ setIsFullyConsentedReviewMode(allPurposesSelected);
2010
+ if (allPurposesSelected) {
2011
+ const initialSelections = {};
2012
+ activeConfig.purposes.forEach(
2013
+ (purpose) => {
2014
+ purpose.data_elements.forEach((element) => {
2015
+ var _a3, _b2;
2016
+ const combinedId = `${purpose.uuid}-${element.uuid}`;
2017
+ if ((_b2 = (_a3 = purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid]) {
2018
+ initialSelections[combinedId] = purposeSelections[purpose.uuid].data_elements[element.uuid].selected;
2019
+ } else {
2020
+ initialSelections[combinedId] = false;
2021
+ }
2022
+ });
2023
+ }
2024
+ );
2025
+ setInitialDataElementSelections(initialSelections);
2026
+ } else {
2027
+ setIsFullyConsentedReviewMode(false);
2028
+ setInitialDataElementSelections({});
2029
+ }
1929
2030
  } else {
2031
+ setIsFullyConsentedReviewMode(false);
1930
2032
  setInitialDataElementSelections({});
1931
2033
  }
1932
2034
  if (consentContentData.detail.is_minor) {
@@ -1937,7 +2039,6 @@ var RedactoNoticeConsent = ({
1937
2039
  if (err instanceof Error && err.name === "AbortError") {
1938
2040
  return;
1939
2041
  }
1940
- console.error(err);
1941
2042
  const error = err;
1942
2043
  setFetchError(error);
1943
2044
  if (error.status === 409) {
@@ -1959,7 +2060,8 @@ var RedactoNoticeConsent = ({
1959
2060
  refreshToken,
1960
2061
  language,
1961
2062
  applicationId,
1962
- validateAgainst
2063
+ validateAgainst,
2064
+ includeFullyConsentedData
1963
2065
  // Removed onError and isRefreshingToken from dependencies to prevent duplicate API calls
1964
2066
  // onError is only called on errors, not needed for initial data fetching
1965
2067
  ]);
@@ -2072,13 +2174,9 @@ var RedactoNoticeConsent = ({
2072
2174
  if (error instanceof Error && error.name === "AbortError") {
2073
2175
  return;
2074
2176
  }
2075
- console.error("Error submitting consent:", error);
2076
2177
  const err = error;
2077
- if (err.status === 500) {
2078
- setErrorMessage(
2079
- "An error occurred while submitting your consent. Please try again later."
2080
- );
2081
- }
2178
+ const message = err.status === 500 ? "An error occurred while submitting your consent. Please try again later." : err.message || "Failed to submit consent. Please try again.";
2179
+ setErrorMessage(message);
2082
2180
  onError == null ? void 0 : onError(error);
2083
2181
  } finally {
2084
2182
  setIsSubmittingAccept(false);
@@ -2243,6 +2341,20 @@ var RedactoNoticeConsent = ({
2243
2341
  });
2244
2342
  }
2245
2343
  });
2344
+ if (content.additional_text && ttsAudioUrls.additional_text_audio_url) {
2345
+ sequence.push(ttsAudioUrls.additional_text_audio_url);
2346
+ }
2347
+ if (content.privacy_center_url && ttsAudioUrls.privacy_center_anchor_text_audio_url) {
2348
+ sequence.push(ttsAudioUrls.privacy_center_anchor_text_audio_url);
2349
+ }
2350
+ if (content.dpo_info && ttsAudioUrls.dpo_info_audio) {
2351
+ const dpoAudio = ttsAudioUrls.dpo_info_audio;
2352
+ DPO_AUDIO_ELEMENT_MAP.forEach(({ audioKey }) => {
2353
+ if (dpoAudio[audioKey]) {
2354
+ sequence.push(dpoAudio[audioKey]);
2355
+ }
2356
+ });
2357
+ }
2246
2358
  if (ttsAudioUrls.confirm_button_text_audio_url) {
2247
2359
  sequence.push(ttsAudioUrls.confirm_button_text_audio_url);
2248
2360
  }
@@ -2290,6 +2402,20 @@ var RedactoNoticeConsent = ({
2290
2402
  });
2291
2403
  }
2292
2404
  });
2405
+ if (content.additional_text && ttsAudioUrls.additional_text_audio_url) {
2406
+ elementIds.push("additional-text");
2407
+ }
2408
+ if (content.privacy_center_url && ttsAudioUrls.privacy_center_anchor_text_audio_url) {
2409
+ elementIds.push("privacy-center-link");
2410
+ }
2411
+ if (content.dpo_info && ttsAudioUrls.dpo_info_audio) {
2412
+ const dpoAudio = ttsAudioUrls.dpo_info_audio;
2413
+ DPO_AUDIO_ELEMENT_MAP.forEach(({ audioKey, elementId }) => {
2414
+ if (dpoAudio[audioKey]) {
2415
+ elementIds.push(elementId);
2416
+ }
2417
+ });
2418
+ }
2293
2419
  if (ttsAudioUrls.confirm_button_text_audio_url) {
2294
2420
  elementIds.push("confirm-button-text");
2295
2421
  }
@@ -2460,7 +2586,6 @@ var RedactoNoticeConsent = ({
2460
2586
  setIsTTSAvailable(true);
2461
2587
  }).catch((error) => {
2462
2588
  if (error instanceof Error && error.name !== "AbortError") {
2463
- console.warn("Failed to fetch TTS audio URLs:", error.message);
2464
2589
  setIsTTSAvailable(false);
2465
2590
  setTtsAudioUrls(null);
2466
2591
  }
@@ -3107,16 +3232,135 @@ var RedactoNoticeConsent = ({
3107
3232
  onPurposeCollapse: togglePurposeCollapse,
3108
3233
  onDataElementToggle: handleDataElementCheckboxChange,
3109
3234
  getTranslatedText,
3110
- isAlreadyConsented: false,
3111
- selectedLanguage
3235
+ isAlreadyConsented: isFullyConsentedReviewMode,
3236
+ selectedLanguage,
3237
+ initialDataElementSelections
3112
3238
  },
3113
3239
  `${purpose.uuid}-${selectedLanguage}`
3114
3240
  )) })
3241
+ ),
3242
+ ((content == null ? void 0 : content.privacy_center_url) || (content == null ? void 0 : content.dpo_info)) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3243
+ "div",
3244
+ {
3245
+ style: {
3246
+ ...styles.privacyText,
3247
+ ...responsiveStyles.privacyText,
3248
+ ...componentTextStyle,
3249
+ fontSize: isMobile ? "13px" : "14px",
3250
+ lineHeight: "1.4",
3251
+ borderTop: "1px solid rgba(152, 162, 179, 0.3)",
3252
+ paddingTop: "12px",
3253
+ marginTop: "12px"
3254
+ },
3255
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { style: { margin: 0, opacity: 0.6 }, children: [
3256
+ content.privacy_center_url && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
3257
+ content.additional_text && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { id: "additional-text", children: getTranslatedText(
3258
+ "additional_text",
3259
+ content.additional_text
3260
+ ) }),
3261
+ " ",
3262
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3263
+ "a",
3264
+ {
3265
+ id: "privacy-center-link",
3266
+ style: { ...styles.link, ...linkStyle },
3267
+ href: content.privacy_center_url,
3268
+ target: "_blank",
3269
+ rel: "noopener noreferrer",
3270
+ children: getTranslatedText(
3271
+ "privacy_center_anchor_text",
3272
+ content.privacy_center_anchor_text || "Privacy Center"
3273
+ )
3274
+ }
3275
+ ),
3276
+ "."
3277
+ ] }),
3278
+ content.dpo_info && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
3279
+ content.privacy_center_url && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("br", {}),
3280
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { id: "dpo-grievance-text", children: getTranslatedDpoText(
3281
+ "grievance_text",
3282
+ content.dpo_info.grievance_text || ""
3283
+ ) }),
3284
+ " ",
3285
+ content.dpo_info.grievance_url && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3286
+ "a",
3287
+ {
3288
+ id: "dpo-grievance-link",
3289
+ style: { ...styles.link, ...linkStyle },
3290
+ href: content.dpo_info.grievance_url,
3291
+ target: "_blank",
3292
+ rel: "noopener noreferrer",
3293
+ children: getTranslatedDpoText(
3294
+ "grievance_anchor_text",
3295
+ content.dpo_info.grievance_anchor_text || "click here"
3296
+ )
3297
+ }
3298
+ ),
3299
+ content.dpo_info.grievance_email && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
3300
+ " ",
3301
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { id: "dpo-grievance-email-connector", children: getTranslatedDpoText(
3302
+ "grievance_email_connector_text",
3303
+ content.dpo_info.grievance_email_connector_text || "or email to"
3304
+ ) }),
3305
+ " ",
3306
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3307
+ "a",
3308
+ {
3309
+ id: "dpo-grievance-email",
3310
+ style: { ...styles.link, ...linkStyle },
3311
+ href: `mailto:${content.dpo_info.grievance_email}`,
3312
+ children: content.dpo_info.grievance_email
3313
+ }
3314
+ )
3315
+ ] }),
3316
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("br", {}),
3317
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { id: "dpo-dp-board-text", children: getTranslatedDpoText(
3318
+ "dp_board_text",
3319
+ content.dpo_info.dp_board_text || ""
3320
+ ) }),
3321
+ " ",
3322
+ content.dpo_info.dp_board_url && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3323
+ "a",
3324
+ {
3325
+ id: "dpo-dp-board-link",
3326
+ style: { ...styles.link, ...linkStyle },
3327
+ href: content.dpo_info.dp_board_url,
3328
+ target: "_blank",
3329
+ rel: "noopener noreferrer",
3330
+ children: getTranslatedDpoText(
3331
+ "dp_board_anchor_text",
3332
+ content.dpo_info.dp_board_anchor_text || "here"
3333
+ )
3334
+ }
3335
+ ),
3336
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("br", {}),
3337
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { id: "dpo-dpo-text", children: getTranslatedDpoText(
3338
+ "dpo_text",
3339
+ content.dpo_info.dpo_text || ""
3340
+ ) }),
3341
+ " ",
3342
+ content.dpo_info.dpo_url && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3343
+ "a",
3344
+ {
3345
+ id: "dpo-dpo-link",
3346
+ style: { ...styles.link, ...linkStyle },
3347
+ href: content.dpo_info.dpo_url,
3348
+ target: "_blank",
3349
+ rel: "noopener noreferrer",
3350
+ children: getTranslatedDpoText(
3351
+ "dpo_anchor_text",
3352
+ content.dpo_info.dpo_anchor_text || "Click here"
3353
+ )
3354
+ }
3355
+ )
3356
+ ] })
3357
+ ] })
3358
+ }
3115
3359
  )
3116
3360
  ]
3117
3361
  }
3118
3362
  ),
3119
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
3363
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3120
3364
  "div",
3121
3365
  {
3122
3366
  style: {
@@ -3124,7 +3368,22 @@ var RedactoNoticeConsent = ({
3124
3368
  ...responsiveStyles.bottomSection,
3125
3369
  ...sectionStyle
3126
3370
  },
3127
- children: [
3371
+ children: isFullyConsentedReviewMode ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3372
+ "button",
3373
+ {
3374
+ ref: lastFocusableRef,
3375
+ id: "review-mode-continue-button",
3376
+ style: {
3377
+ ...styles.button,
3378
+ ...responsiveStyles.button,
3379
+ ...styles.acceptButton,
3380
+ ...acceptButtonStyle
3381
+ },
3382
+ onClick: () => onAccept == null ? void 0 : onAccept(),
3383
+ "aria-label": reviewModeButtonText,
3384
+ children: reviewModeButtonText
3385
+ }
3386
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
3128
3387
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3129
3388
  "button",
3130
3389
  {
@@ -3172,7 +3431,7 @@ var RedactoNoticeConsent = ({
3172
3431
  )
3173
3432
  }
3174
3433
  )
3175
- ]
3434
+ ] })
3176
3435
  }
3177
3436
  )
3178
3437
  ] })
@@ -3226,7 +3485,6 @@ var fetchConsentContent2 = async ({
3226
3485
  const data = await response.json();
3227
3486
  return data;
3228
3487
  } catch (error) {
3229
- console.error("Error fetching consent content:", error);
3230
3488
  throw error;
3231
3489
  }
3232
3490
  };
@@ -3242,31 +3500,61 @@ var submitConsentEvent2 = async ({
3242
3500
  }) => {
3243
3501
  var _a, _b;
3244
3502
  try {
3245
- const primaryEmail = localStorage.getItem("userEmail");
3246
- const payload = {
3247
- primary_email: primaryEmail || void 0,
3248
- notice_uuid: noticeUuid,
3249
- source: "WEB",
3250
- declined,
3251
- consents: {
3252
- purposes: purposes.map((purpose) => ({
3253
- uuid: purpose.uuid,
3254
- name: purpose.name,
3255
- description: purpose.description,
3256
- industries: purpose.industries || "",
3257
- selected: purpose.selected,
3258
- data_elements: purpose.data_elements.map((element) => ({
3259
- uuid: element.uuid,
3260
- name: element.name,
3261
- enabled: element.enabled,
3262
- required: element.required,
3263
- selected: element.required ? true : element.selected
3264
- }))
3265
- }))
3266
- },
3267
- meta_data
3268
- };
3269
3503
  const apiBaseUrl = baseUrl || BASE_URL2;
3504
+ let payload;
3505
+ if (isLegacyApi(apiBaseUrl)) {
3506
+ const primaryEmail = typeof window !== "undefined" ? localStorage.getItem("userEmail") : null;
3507
+ payload = {
3508
+ primary_email: primaryEmail || void 0,
3509
+ notice_uuid: noticeUuid,
3510
+ source: "WEB",
3511
+ declined: Boolean(declined),
3512
+ consents: {
3513
+ purposes: purposes.map((purpose) => {
3514
+ if (!purpose.uuid) {
3515
+ throw new Error(`Invalid purpose data: missing uuid`);
3516
+ }
3517
+ return {
3518
+ uuid: purpose.uuid,
3519
+ name: purpose.name,
3520
+ description: purpose.description || "",
3521
+ industries: purpose.industries || "",
3522
+ selected: Boolean(purpose.selected),
3523
+ data_elements: (purpose.data_elements || []).map((element) => ({
3524
+ uuid: element.uuid,
3525
+ name: element.name,
3526
+ enabled: Boolean(element.enabled),
3527
+ required: Boolean(element.required),
3528
+ selected: element.required ? true : Boolean(element.selected)
3529
+ }))
3530
+ };
3531
+ })
3532
+ },
3533
+ meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid } : void 0
3534
+ };
3535
+ } else {
3536
+ payload = {
3537
+ notice_uuid: noticeUuid,
3538
+ purposes: purposes.map((purpose) => {
3539
+ if (!purpose.uuid) {
3540
+ throw new Error(`Invalid purpose data: missing uuid`);
3541
+ }
3542
+ const dataElements = purpose.data_elements.filter((element) => element.enabled).map((element) => ({
3543
+ uuid: element.uuid,
3544
+ selected: element.required ? true : Boolean(element.selected)
3545
+ }));
3546
+ return {
3547
+ purpose_uuid: purpose.uuid,
3548
+ selected: Boolean(purpose.selected),
3549
+ data_elements: dataElements.length > 0 ? dataElements : void 0
3550
+ };
3551
+ }),
3552
+ select_all_mandatory: false,
3553
+ source: "WEB",
3554
+ declined,
3555
+ meta_data
3556
+ };
3557
+ }
3270
3558
  const response = await fetch(
3271
3559
  `${apiBaseUrl}/public/organisations/${org_uuid}/workspaces/${workspace_uuid}/submit-consent`,
3272
3560
  {
@@ -3303,7 +3591,6 @@ var submitConsentEvent2 = async ({
3303
3591
  throw error;
3304
3592
  }
3305
3593
  } catch (error) {
3306
- console.error("Error submitting consent event:", error);
3307
3594
  throw error;
3308
3595
  }
3309
3596
  };
@@ -3782,7 +4069,7 @@ var RedactoConsentInlineComponent = ({
3782
4069
  const getTranslatedText = (key, defaultText, itemId) => {
3783
4070
  var _a2, _b;
3784
4071
  if (!content) return defaultText;
3785
- if (selectedLanguage === content.default_language) {
4072
+ if (selectedLanguage === "English" || selectedLanguage === "en" || selectedLanguage === "EN") {
3786
4073
  if (key === "privacy_policy_anchor_text" && content.privacy_policy_anchor_text) {
3787
4074
  return content.privacy_policy_anchor_text;
3788
4075
  }
@@ -3797,14 +4084,21 @@ var RedactoConsentInlineComponent = ({
3797
4084
  }
3798
4085
  if (itemId) {
3799
4086
  if (key === "purposes.name" || key === "purposes.description") {
3800
- return ((_a2 = translationMap.purposes) == null ? void 0 : _a2[itemId]) || defaultText;
4087
+ const purposeData = (_a2 = translationMap.purposes) == null ? void 0 : _a2[itemId];
4088
+ if (purposeData) {
4089
+ if (typeof purposeData === "string") {
4090
+ return key === "purposes.name" ? purposeData : defaultText;
4091
+ }
4092
+ return key === "purposes.name" ? purposeData.name || defaultText : purposeData.description || defaultText;
4093
+ }
4094
+ return defaultText;
3801
4095
  }
3802
4096
  if (key.startsWith("data_elements.")) {
3803
4097
  return ((_b = translationMap.data_elements) == null ? void 0 : _b[itemId]) || defaultText;
3804
4098
  }
3805
4099
  }
3806
4100
  const value = translationMap[key];
3807
- if (typeof value === "string") {
4101
+ if (typeof value === "string" && value) {
3808
4102
  return value;
3809
4103
  }
3810
4104
  return defaultText;
@@ -3821,13 +4115,12 @@ var RedactoConsentInlineComponent = ({
3821
4115
  language,
3822
4116
  specific_uuid: applicationId
3823
4117
  });
3824
- setContent(consentContentData.detail.active_config);
3825
- if (consentContentData.detail.active_config.default_language) {
3826
- setSelectedLanguage(
3827
- consentContentData.detail.active_config.default_language
3828
- );
4118
+ const activeConfig = consentContentData.detail.active_config;
4119
+ setContent(activeConfig);
4120
+ if (activeConfig.default_language) {
4121
+ setSelectedLanguage(activeConfig.default_language);
3829
4122
  }
3830
- const initialCollapsedState = consentContentData.detail.active_config.purposes.reduce(
4123
+ const initialCollapsedState = activeConfig.purposes.reduce(
3831
4124
  (acc, purpose) => ({
3832
4125
  ...acc,
3833
4126
  [purpose.uuid]: true
@@ -3835,7 +4128,7 @@ var RedactoConsentInlineComponent = ({
3835
4128
  {}
3836
4129
  );
3837
4130
  setCollapsedPurposes(initialCollapsedState);
3838
- const initialDataElementState = consentContentData.detail.active_config.purposes.reduce(
4131
+ const initialDataElementState = activeConfig.purposes.reduce(
3839
4132
  (acc, purpose) => {
3840
4133
  purpose.data_elements.forEach((element) => {
3841
4134
  const combinedId = `${purpose.uuid}-${element.uuid}`;
@@ -3846,7 +4139,7 @@ var RedactoConsentInlineComponent = ({
3846
4139
  {}
3847
4140
  );
3848
4141
  setSelectedDataElements(initialDataElementState);
3849
- const initialPurposeState = consentContentData.detail.active_config.purposes.reduce(
4142
+ const initialPurposeState = activeConfig.purposes.reduce(
3850
4143
  (acc, purpose) => {
3851
4144
  return {
3852
4145
  ...acc,
@@ -3857,7 +4150,6 @@ var RedactoConsentInlineComponent = ({
3857
4150
  );
3858
4151
  setSelectedPurposes(initialPurposeState);
3859
4152
  } catch (err) {
3860
- console.error(err);
3861
4153
  const error = err;
3862
4154
  setFetchError(error);
3863
4155
  if (error.status === 409) {
@@ -3972,13 +4264,9 @@ var RedactoConsentInlineComponent = ({
3972
4264
  onAccept == null ? void 0 : onAccept();
3973
4265
  hasSubmittedRef.current = false;
3974
4266
  } catch (error) {
3975
- console.error("Error submitting consent:", error);
3976
4267
  const err = error;
3977
- if (err.status === 500) {
3978
- setErrorMessage(
3979
- "An error occurred while submitting your consent. Please try again later."
3980
- );
3981
- }
4268
+ const message = err.status === 500 ? "An error occurred while submitting your consent. Please try again later." : err.message || "Failed to submit consent. Please try again.";
4269
+ setErrorMessage(message);
3982
4270
  hasSubmittedRef.current = false;
3983
4271
  throw error;
3984
4272
  } finally {
@@ -4003,7 +4291,6 @@ var RedactoConsentInlineComponent = ({
4003
4291
  try {
4004
4292
  await handleAcceptWithToken(accessToken);
4005
4293
  } catch (err) {
4006
- console.error("Failed to auto-submit consent:", err);
4007
4294
  hasSubmittedRef.current = false;
4008
4295
  onError == null ? void 0 : onError(err);
4009
4296
  }