@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.mjs CHANGED
@@ -3,6 +3,21 @@ import { useCallback, useEffect as useEffect2, useMemo, useRef, useState as useS
3
3
 
4
4
  // src/RedactoNoticeConsent/api/index.ts
5
5
  import { jwtDecode } from "jwt-decode";
6
+
7
+ // src/utils/isLegacyApi.ts
8
+ function isLegacyApi(baseUrl) {
9
+ try {
10
+ return new URL(baseUrl).hostname.endsWith(".redacto.io");
11
+ } catch {
12
+ try {
13
+ return new URL(`https://${baseUrl}`).hostname.endsWith(".redacto.io");
14
+ } catch {
15
+ return false;
16
+ }
17
+ }
18
+ }
19
+
20
+ // src/RedactoNoticeConsent/api/index.ts
6
21
  var BASE_URL = "https://api.redacto.io/consent";
7
22
  var apiCache = /* @__PURE__ */ new Map();
8
23
  var CACHE_TTL = 5 * 60 * 1e3;
@@ -27,14 +42,6 @@ function decodeTokenSafely(token) {
27
42
  return null;
28
43
  }
29
44
  }
30
- var storage = {
31
- getItem: (key) => {
32
- if (typeof window !== "undefined") {
33
- return localStorage.getItem(key);
34
- }
35
- return null;
36
- }
37
- };
38
45
  var clearApiCache = () => {
39
46
  apiCache.clear();
40
47
  };
@@ -45,6 +52,7 @@ var fetchConsentContent = async ({
45
52
  language = "en",
46
53
  specific_uuid,
47
54
  validate_against = "all",
55
+ include_fully_consented_data = false,
48
56
  signal
49
57
  // AbortSignal for request cancellation
50
58
  }) => {
@@ -61,7 +69,7 @@ var fetchConsentContent = async ({
61
69
  throw new Error("Invalid token: missing organization or workspace UUID");
62
70
  }
63
71
  const apiBaseUrl = baseUrl || BASE_URL;
64
- const cacheKey = `${accessToken}-${noticeId}-${validate_against}-${language}-${specific_uuid || ""}`;
72
+ const cacheKey = `${accessToken}-${noticeId}-${validate_against}-${language}-${specific_uuid || ""}-${include_fully_consented_data}`;
65
73
  if (validate_against === "all" && !specific_uuid) {
66
74
  const cachedData = getCachedData(cacheKey);
67
75
  if (cachedData) {
@@ -75,6 +83,9 @@ var fetchConsentContent = async ({
75
83
  url.searchParams.append("specific_uuid", specific_uuid);
76
84
  }
77
85
  url.searchParams.append("validate_against", validate_against);
86
+ if (include_fully_consented_data) {
87
+ url.searchParams.append("include_fully_consented_data", "true");
88
+ }
78
89
  const response = await fetch(url.toString(), {
79
90
  method: "GET",
80
91
  headers: {
@@ -108,7 +119,6 @@ var fetchConsentContent = async ({
108
119
  }
109
120
  return data;
110
121
  } catch (error) {
111
- console.error("Error fetching consent content:", error instanceof Error ? error.message : error);
112
122
  throw error;
113
123
  }
114
124
  };
@@ -134,42 +144,62 @@ var submitConsentEvent = async ({
134
144
  if (!ORGANISATION_UUID || !WORKSPACE_UUID) {
135
145
  throw new Error("Invalid token: missing organization or workspace UUID");
136
146
  }
137
- const primaryEmail = storage.getItem("userEmail");
138
- const validatedPurposes = purposes.map((purpose) => {
139
- if (!purpose.uuid || !purpose.name) {
140
- throw new Error(`Invalid purpose data: missing uuid or name`);
141
- }
142
- return {
143
- uuid: purpose.uuid,
144
- name: purpose.name,
145
- description: purpose.description || "",
146
- industries: purpose.industries || "",
147
- selected: Boolean(purpose.selected),
148
- data_elements: (purpose.data_elements || []).map((element) => {
149
- if (!element.uuid || !element.name) {
150
- throw new Error(`Invalid data element: missing uuid or name`);
151
- }
152
- return {
153
- uuid: element.uuid,
154
- name: element.name,
155
- enabled: Boolean(element.enabled),
156
- required: Boolean(element.required),
157
- selected: element.required ? true : Boolean(element.selected)
158
- };
159
- })
160
- };
161
- });
162
- const payload = {
163
- primary_email: primaryEmail || void 0,
164
- notice_uuid: noticeUuid,
165
- source: "WEB",
166
- declined: Boolean(declined),
167
- consents: {
168
- purposes: validatedPurposes
169
- },
170
- meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid } : void 0
171
- };
172
147
  const apiBaseUrl = baseUrl || BASE_URL;
148
+ let payload;
149
+ if (isLegacyApi(apiBaseUrl)) {
150
+ const primaryEmail = typeof window !== "undefined" ? localStorage.getItem("userEmail") : null;
151
+ payload = {
152
+ primary_email: primaryEmail || void 0,
153
+ notice_uuid: noticeUuid,
154
+ source: "WEB",
155
+ declined: Boolean(declined),
156
+ consents: {
157
+ purposes: purposes.map((purpose) => {
158
+ if (!purpose.uuid) {
159
+ throw new Error(`Invalid purpose data: missing uuid`);
160
+ }
161
+ return {
162
+ uuid: purpose.uuid,
163
+ name: purpose.name,
164
+ description: purpose.description || "",
165
+ industries: purpose.industries || "",
166
+ selected: Boolean(purpose.selected),
167
+ data_elements: (purpose.data_elements || []).map((element) => ({
168
+ uuid: element.uuid,
169
+ name: element.name,
170
+ enabled: Boolean(element.enabled),
171
+ required: Boolean(element.required),
172
+ selected: element.required ? true : Boolean(element.selected)
173
+ }))
174
+ };
175
+ })
176
+ },
177
+ meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid } : void 0
178
+ };
179
+ } else {
180
+ const validatedPurposes = purposes.map((purpose) => {
181
+ if (!purpose.uuid) {
182
+ throw new Error(`Invalid purpose data: missing uuid`);
183
+ }
184
+ const dataElements = (purpose.data_elements || []).filter((element) => element.enabled).map((element) => ({
185
+ uuid: element.uuid,
186
+ selected: element.required ? true : Boolean(element.selected)
187
+ }));
188
+ return {
189
+ purpose_uuid: purpose.uuid,
190
+ selected: Boolean(purpose.selected),
191
+ data_elements: dataElements.length > 0 ? dataElements : void 0
192
+ };
193
+ });
194
+ payload = {
195
+ notice_uuid: noticeUuid,
196
+ purposes: validatedPurposes,
197
+ select_all_mandatory: false,
198
+ source: "WEB",
199
+ declined: Boolean(declined),
200
+ meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid } : void 0
201
+ };
202
+ }
173
203
  const response = await fetch(
174
204
  `${apiBaseUrl}/public/organisations/${ORGANISATION_UUID}/workspaces/${WORKSPACE_UUID}/submit-consent`,
175
205
  {
@@ -202,7 +232,6 @@ var submitConsentEvent = async ({
202
232
  }
203
233
  apiCache.clear();
204
234
  } catch (error) {
205
- console.error("Error submitting consent event:", error instanceof Error ? error.message : error);
206
235
  throw error;
207
236
  }
208
237
  };
@@ -334,7 +363,6 @@ var fetchTTSAudioUrls = async ({
334
363
  const data = await response.json();
335
364
  return data;
336
365
  } catch (error) {
337
- console.error("Error fetching TTS audio URLs:", error instanceof Error ? error.message : error);
338
366
  throw error;
339
367
  }
340
368
  };
@@ -342,6 +370,18 @@ var fetchTTSAudioUrls = async ({
342
370
  // src/RedactoNoticeConsent/assets/redacto-logo.png
343
371
  var redacto_logo_default = "data:image/png;base64,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";
344
372
 
373
+ // src/RedactoNoticeConsent/constants.ts
374
+ var DPO_AUDIO_ELEMENT_MAP = [
375
+ { audioKey: "grievance_text_audio_url", elementId: "dpo-grievance-text" },
376
+ { audioKey: "grievance_anchor_text_audio_url", elementId: "dpo-grievance-link" },
377
+ { audioKey: "grievance_email_connector_text_audio_url", elementId: "dpo-grievance-email-connector" },
378
+ { audioKey: "grievance_email_audio_url", elementId: "dpo-grievance-email" },
379
+ { audioKey: "dp_board_text_audio_url", elementId: "dpo-dp-board-text" },
380
+ { audioKey: "dp_board_anchor_text_audio_url", elementId: "dpo-dp-board-link" },
381
+ { audioKey: "dpo_text_audio_url", elementId: "dpo-dpo-text" },
382
+ { audioKey: "dpo_anchor_text_audio_url", elementId: "dpo-dpo-link" }
383
+ ];
384
+
345
385
  // src/RedactoNoticeConsent/injectStyles.ts
346
386
  var stylesInjected = false;
347
387
  var injectCheckboxStyles = () => {
@@ -531,8 +571,7 @@ var styles = {
531
571
  justifyContent: "space-between",
532
572
  alignItems: "center",
533
573
  paddingBottom: "15px",
534
- borderBottom: "1px solid #e5e7eb",
535
- boxShadow: "0 1px 2px rgba(0, 0, 0, 0.03)",
574
+ borderBottom: "none",
536
575
  backgroundColor: "#ffffff",
537
576
  margin: 0,
538
577
  boxSizing: "border-box",
@@ -586,7 +625,7 @@ var styles = {
586
625
  backgroundColor: "#ffffff"
587
626
  },
588
627
  middleSection: {
589
- margin: "20px 0px",
628
+ margin: "0px",
590
629
  display: "flex",
591
630
  flexDirection: "column",
592
631
  gap: "12px",
@@ -601,7 +640,6 @@ var styles = {
601
640
  fontSize: "16px",
602
641
  fontWeight: 400,
603
642
  lineHeight: "150%",
604
- letterSpacing: "0.2px",
605
643
  color: "#344054",
606
644
  margin: 0,
607
645
  padding: 0,
@@ -741,8 +779,7 @@ var styles = {
741
779
  justifyContent: "space-between",
742
780
  gap: "29px",
743
781
  paddingTop: "15px",
744
- borderTop: "1px solid #e5e7eb",
745
- boxShadow: "0 -1px 2px rgba(0, 0, 0, 0.03)",
782
+ borderTop: "none",
746
783
  backgroundColor: "#ffffff",
747
784
  margin: 0,
748
785
  boxSizing: "border-box"
@@ -1090,9 +1127,8 @@ var PurposeItem = ({
1090
1127
  ),
1091
1128
  isAlreadyConsented && /* @__PURE__ */ jsx(Fragment, { children: (() => {
1092
1129
  const combinedId = `${purpose.uuid}-${dataElement.uuid}`;
1093
- const isCurrentlySelected = selectedDataElements[combinedId] || false;
1094
1130
  const wasOriginallySelected = initialDataElementSelections[combinedId] || false;
1095
- if (isCurrentlySelected && wasOriginallySelected) {
1131
+ if (wasOriginallySelected) {
1096
1132
  return /* @__PURE__ */ jsx(
1097
1133
  "div",
1098
1134
  {
@@ -1105,7 +1141,7 @@ var PurposeItem = ({
1105
1141
  borderRadius: "50%",
1106
1142
  backgroundColor: "#10B981"
1107
1143
  },
1108
- "aria-label": `Already consented to ${getTranslatedText(
1144
+ "aria-label": `Consented to ${getTranslatedText(
1109
1145
  `data_elements.name`,
1110
1146
  dataElement.name,
1111
1147
  dataElement.uuid
@@ -1135,17 +1171,23 @@ var PurposeItem = ({
1135
1171
  );
1136
1172
  } else {
1137
1173
  return /* @__PURE__ */ jsx(
1138
- "input",
1174
+ "div",
1139
1175
  {
1140
- className: "redacto-checkbox-small",
1141
- type: "checkbox",
1142
- checked: isCurrentlySelected,
1143
- onChange: () => onDataElementToggle(dataElement.uuid, purpose.uuid),
1144
- "aria-label": `Select ${getTranslatedText(
1176
+ style: {
1177
+ display: "flex",
1178
+ alignItems: "center",
1179
+ justifyContent: "center",
1180
+ width: "16px",
1181
+ height: "16px",
1182
+ borderRadius: "50%",
1183
+ border: "2px solid #d0d5dd",
1184
+ backgroundColor: "transparent"
1185
+ },
1186
+ "aria-label": `Not consented to ${getTranslatedText(
1145
1187
  `data_elements.name`,
1146
1188
  dataElement.name,
1147
1189
  dataElement.uuid
1148
- )}${dataElement.required ? " (required)" : ""}`
1190
+ )}`
1149
1191
  }
1150
1192
  );
1151
1193
  }
@@ -1555,7 +1597,9 @@ var RedactoNoticeConsent = ({
1555
1597
  onError,
1556
1598
  settings,
1557
1599
  applicationId,
1558
- validateAgainst = "all"
1600
+ validateAgainst = "all",
1601
+ includeFullyConsentedData = false,
1602
+ reviewModeButtonText = "Continue"
1559
1603
  }) => {
1560
1604
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w;
1561
1605
  const propValidationError = useMemo(() => {
@@ -1597,6 +1641,7 @@ var RedactoNoticeConsent = ({
1597
1641
  const [initialDataElementSelections, setInitialDataElementSelections] = useState2({});
1598
1642
  const [collapsedPurposes, setCollapsedPurposes] = useState2({});
1599
1643
  const [hasAlreadyConsented, setHasAlreadyConsented] = useState2(false);
1644
+ const [isFullyConsentedReviewMode, setIsFullyConsentedReviewMode] = useState2(false);
1600
1645
  const [isLanguageDropdownOpen, setIsLanguageDropdownOpen] = useState2(false);
1601
1646
  const [selectedLanguage, setSelectedLanguage] = useState2(language);
1602
1647
  const [errorMessage, setErrorMessage] = useState2(null);
@@ -1758,10 +1803,15 @@ var RedactoNoticeConsent = ({
1758
1803
  onAccept == null ? void 0 : onAccept();
1759
1804
  }
1760
1805
  }, [hasAlreadyConsented, onAccept]);
1806
+ const isDefaultLanguage = (lang) => {
1807
+ if (!content) return true;
1808
+ if (lang === "English" || lang === "en" || lang === "EN") return true;
1809
+ return false;
1810
+ };
1761
1811
  const getTranslatedText = (key, defaultText, itemId) => {
1762
1812
  var _a2, _b2;
1763
1813
  if (!content) return defaultText;
1764
- if (selectedLanguage === "English" || selectedLanguage === "en") {
1814
+ if (isDefaultLanguage(selectedLanguage)) {
1765
1815
  if (key === "privacy_policy_anchor_text" && content.privacy_policy_anchor_text) {
1766
1816
  return content.privacy_policy_anchor_text;
1767
1817
  }
@@ -1788,18 +1838,38 @@ var RedactoNoticeConsent = ({
1788
1838
  }
1789
1839
  if (itemId) {
1790
1840
  if (key === "purposes.name" || key === "purposes.description") {
1791
- return ((_a2 = translationMap.purposes) == null ? void 0 : _a2[itemId]) || defaultText;
1841
+ const purposeData = (_a2 = translationMap.purposes) == null ? void 0 : _a2[itemId];
1842
+ if (purposeData) {
1843
+ if (typeof purposeData === "string") {
1844
+ return key === "purposes.name" ? purposeData : defaultText;
1845
+ }
1846
+ return key === "purposes.name" ? purposeData.name || defaultText : purposeData.description || defaultText;
1847
+ }
1848
+ return defaultText;
1792
1849
  }
1793
1850
  if (key.startsWith("data_elements.")) {
1794
1851
  return ((_b2 = translationMap.data_elements) == null ? void 0 : _b2[itemId]) || defaultText;
1795
1852
  }
1796
1853
  }
1797
1854
  const value = translationMap[key];
1798
- if (typeof value === "string") {
1855
+ if (typeof value === "string" && value) {
1799
1856
  return value;
1800
1857
  }
1801
1858
  return defaultText;
1802
1859
  };
1860
+ const getTranslatedDpoText = (key, defaultText) => {
1861
+ if (!(content == null ? void 0 : content.dpo_info)) return defaultText;
1862
+ if (isDefaultLanguage(selectedLanguage)) {
1863
+ return content.dpo_info[key] || defaultText;
1864
+ }
1865
+ if (!content.supported_languages_and_translations) return defaultText;
1866
+ const translationMap = content.supported_languages_and_translations[selectedLanguage];
1867
+ if (translationMap == null ? void 0 : translationMap.dpo_info) {
1868
+ const translated = translationMap.dpo_info[key];
1869
+ if (translated) return translated;
1870
+ }
1871
+ return content.dpo_info[key] || defaultText;
1872
+ };
1803
1873
  const fetchNotice = async () => {
1804
1874
  var _a2;
1805
1875
  if (isRequestInProgressRef.current) {
@@ -1823,16 +1893,18 @@ var RedactoNoticeConsent = ({
1823
1893
  language,
1824
1894
  specific_uuid: applicationId,
1825
1895
  validate_against: validateAgainst,
1896
+ include_fully_consented_data: includeFullyConsentedData,
1826
1897
  signal: (_a2 = abortControllerRef.current) == null ? void 0 : _a2.signal
1827
1898
  });
1828
- setContent(consentContentData.detail.active_config);
1829
- if (consentContentData.detail.active_config.default_language) {
1830
- const defaultLang = consentContentData.detail.active_config.default_language;
1899
+ const activeConfig = consentContentData.detail.active_config;
1900
+ setContent(activeConfig);
1901
+ if (activeConfig.default_language) {
1902
+ const defaultLang = activeConfig.default_language;
1831
1903
  setSelectedLanguage(
1832
1904
  defaultLang === "en" || defaultLang === "EN" ? "English" : defaultLang
1833
1905
  );
1834
1906
  }
1835
- const initialCollapsedState = consentContentData.detail.active_config.purposes.reduce(
1907
+ const initialCollapsedState = activeConfig.purposes.reduce(
1836
1908
  (acc, purpose) => ({
1837
1909
  ...acc,
1838
1910
  [purpose.uuid]: true
@@ -1843,13 +1915,13 @@ var RedactoNoticeConsent = ({
1843
1915
  const isReconsentRequired = consentContentData.detail.reconsent_required;
1844
1916
  const purposeSelections = consentContentData.detail.purpose_selections;
1845
1917
  const newCategorizedPurposes = isReconsentRequired ? {
1846
- alreadyConsented: consentContentData.detail.active_config.purposes.filter(
1918
+ alreadyConsented: activeConfig.purposes.filter(
1847
1919
  (purpose) => {
1848
1920
  const selection = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid];
1849
1921
  return selection && (selection.status === "ACTIVE" || selection.status === "EXPIRED") && !selection.needs_reconsent;
1850
1922
  }
1851
1923
  ),
1852
- needsConsent: consentContentData.detail.active_config.purposes.filter(
1924
+ needsConsent: activeConfig.purposes.filter(
1853
1925
  (purpose) => {
1854
1926
  const selection = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid];
1855
1927
  return !selection || selection.status !== "ACTIVE" || selection.needs_reconsent;
@@ -1857,9 +1929,9 @@ var RedactoNoticeConsent = ({
1857
1929
  )
1858
1930
  } : null;
1859
1931
  setCategorizedPurposes(newCategorizedPurposes);
1860
- const initialPurposeState = consentContentData.detail.active_config.purposes.reduce(
1932
+ const initialPurposeState = activeConfig.purposes.reduce(
1861
1933
  (acc, purpose) => {
1862
- if (isReconsentRequired && (purposeSelections == null ? void 0 : purposeSelections[purpose.uuid])) {
1934
+ if (purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) {
1863
1935
  acc[purpose.uuid] = purposeSelections[purpose.uuid].selected;
1864
1936
  } else {
1865
1937
  acc[purpose.uuid] = false;
@@ -1869,12 +1941,12 @@ var RedactoNoticeConsent = ({
1869
1941
  {}
1870
1942
  );
1871
1943
  setSelectedPurposes(initialPurposeState);
1872
- const initialDataElementState = consentContentData.detail.active_config.purposes.reduce(
1944
+ const initialDataElementState = activeConfig.purposes.reduce(
1873
1945
  (acc, purpose) => {
1874
1946
  purpose.data_elements.forEach((element) => {
1875
1947
  var _a3, _b2;
1876
1948
  const combinedId = `${purpose.uuid}-${element.uuid}`;
1877
- if (isReconsentRequired && ((_b2 = (_a3 = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid])) {
1949
+ if ((_b2 = (_a3 = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid]) {
1878
1950
  acc[combinedId] = purposeSelections[purpose.uuid].data_elements[element.uuid].selected;
1879
1951
  } else {
1880
1952
  acc[combinedId] = false;
@@ -1886,6 +1958,7 @@ var RedactoNoticeConsent = ({
1886
1958
  );
1887
1959
  setSelectedDataElements(initialDataElementState);
1888
1960
  if (isReconsentRequired && newCategorizedPurposes) {
1961
+ setIsFullyConsentedReviewMode(false);
1889
1962
  const initialSelections = {};
1890
1963
  newCategorizedPurposes.alreadyConsented.forEach((purpose) => {
1891
1964
  purpose.data_elements.forEach((element) => {
@@ -1899,7 +1972,36 @@ var RedactoNoticeConsent = ({
1899
1972
  });
1900
1973
  });
1901
1974
  setInitialDataElementSelections(initialSelections);
1975
+ } else if (includeFullyConsentedData && purposeSelections) {
1976
+ const allPurposesSelected = activeConfig.purposes.length > 0 && activeConfig.purposes.every(
1977
+ (p) => {
1978
+ var _a3;
1979
+ return ((_a3 = purposeSelections[p.uuid]) == null ? void 0 : _a3.selected) === true;
1980
+ }
1981
+ );
1982
+ setIsFullyConsentedReviewMode(allPurposesSelected);
1983
+ if (allPurposesSelected) {
1984
+ const initialSelections = {};
1985
+ activeConfig.purposes.forEach(
1986
+ (purpose) => {
1987
+ purpose.data_elements.forEach((element) => {
1988
+ var _a3, _b2;
1989
+ const combinedId = `${purpose.uuid}-${element.uuid}`;
1990
+ if ((_b2 = (_a3 = purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid]) {
1991
+ initialSelections[combinedId] = purposeSelections[purpose.uuid].data_elements[element.uuid].selected;
1992
+ } else {
1993
+ initialSelections[combinedId] = false;
1994
+ }
1995
+ });
1996
+ }
1997
+ );
1998
+ setInitialDataElementSelections(initialSelections);
1999
+ } else {
2000
+ setIsFullyConsentedReviewMode(false);
2001
+ setInitialDataElementSelections({});
2002
+ }
1902
2003
  } else {
2004
+ setIsFullyConsentedReviewMode(false);
1903
2005
  setInitialDataElementSelections({});
1904
2006
  }
1905
2007
  if (consentContentData.detail.is_minor) {
@@ -1910,7 +2012,6 @@ var RedactoNoticeConsent = ({
1910
2012
  if (err instanceof Error && err.name === "AbortError") {
1911
2013
  return;
1912
2014
  }
1913
- console.error(err);
1914
2015
  const error = err;
1915
2016
  setFetchError(error);
1916
2017
  if (error.status === 409) {
@@ -1932,7 +2033,8 @@ var RedactoNoticeConsent = ({
1932
2033
  refreshToken,
1933
2034
  language,
1934
2035
  applicationId,
1935
- validateAgainst
2036
+ validateAgainst,
2037
+ includeFullyConsentedData
1936
2038
  // Removed onError and isRefreshingToken from dependencies to prevent duplicate API calls
1937
2039
  // onError is only called on errors, not needed for initial data fetching
1938
2040
  ]);
@@ -2045,13 +2147,9 @@ var RedactoNoticeConsent = ({
2045
2147
  if (error instanceof Error && error.name === "AbortError") {
2046
2148
  return;
2047
2149
  }
2048
- console.error("Error submitting consent:", error);
2049
2150
  const err = error;
2050
- if (err.status === 500) {
2051
- setErrorMessage(
2052
- "An error occurred while submitting your consent. Please try again later."
2053
- );
2054
- }
2151
+ 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.";
2152
+ setErrorMessage(message);
2055
2153
  onError == null ? void 0 : onError(error);
2056
2154
  } finally {
2057
2155
  setIsSubmittingAccept(false);
@@ -2216,6 +2314,20 @@ var RedactoNoticeConsent = ({
2216
2314
  });
2217
2315
  }
2218
2316
  });
2317
+ if (content.additional_text && ttsAudioUrls.additional_text_audio_url) {
2318
+ sequence.push(ttsAudioUrls.additional_text_audio_url);
2319
+ }
2320
+ if (content.privacy_center_url && ttsAudioUrls.privacy_center_anchor_text_audio_url) {
2321
+ sequence.push(ttsAudioUrls.privacy_center_anchor_text_audio_url);
2322
+ }
2323
+ if (content.dpo_info && ttsAudioUrls.dpo_info_audio) {
2324
+ const dpoAudio = ttsAudioUrls.dpo_info_audio;
2325
+ DPO_AUDIO_ELEMENT_MAP.forEach(({ audioKey }) => {
2326
+ if (dpoAudio[audioKey]) {
2327
+ sequence.push(dpoAudio[audioKey]);
2328
+ }
2329
+ });
2330
+ }
2219
2331
  if (ttsAudioUrls.confirm_button_text_audio_url) {
2220
2332
  sequence.push(ttsAudioUrls.confirm_button_text_audio_url);
2221
2333
  }
@@ -2263,6 +2375,20 @@ var RedactoNoticeConsent = ({
2263
2375
  });
2264
2376
  }
2265
2377
  });
2378
+ if (content.additional_text && ttsAudioUrls.additional_text_audio_url) {
2379
+ elementIds.push("additional-text");
2380
+ }
2381
+ if (content.privacy_center_url && ttsAudioUrls.privacy_center_anchor_text_audio_url) {
2382
+ elementIds.push("privacy-center-link");
2383
+ }
2384
+ if (content.dpo_info && ttsAudioUrls.dpo_info_audio) {
2385
+ const dpoAudio = ttsAudioUrls.dpo_info_audio;
2386
+ DPO_AUDIO_ELEMENT_MAP.forEach(({ audioKey, elementId }) => {
2387
+ if (dpoAudio[audioKey]) {
2388
+ elementIds.push(elementId);
2389
+ }
2390
+ });
2391
+ }
2266
2392
  if (ttsAudioUrls.confirm_button_text_audio_url) {
2267
2393
  elementIds.push("confirm-button-text");
2268
2394
  }
@@ -2433,7 +2559,6 @@ var RedactoNoticeConsent = ({
2433
2559
  setIsTTSAvailable(true);
2434
2560
  }).catch((error) => {
2435
2561
  if (error instanceof Error && error.name !== "AbortError") {
2436
- console.warn("Failed to fetch TTS audio URLs:", error.message);
2437
2562
  setIsTTSAvailable(false);
2438
2563
  setTtsAudioUrls(null);
2439
2564
  }
@@ -3080,16 +3205,135 @@ var RedactoNoticeConsent = ({
3080
3205
  onPurposeCollapse: togglePurposeCollapse,
3081
3206
  onDataElementToggle: handleDataElementCheckboxChange,
3082
3207
  getTranslatedText,
3083
- isAlreadyConsented: false,
3084
- selectedLanguage
3208
+ isAlreadyConsented: isFullyConsentedReviewMode,
3209
+ selectedLanguage,
3210
+ initialDataElementSelections
3085
3211
  },
3086
3212
  `${purpose.uuid}-${selectedLanguage}`
3087
3213
  )) })
3214
+ ),
3215
+ ((content == null ? void 0 : content.privacy_center_url) || (content == null ? void 0 : content.dpo_info)) && /* @__PURE__ */ jsx(
3216
+ "div",
3217
+ {
3218
+ style: {
3219
+ ...styles.privacyText,
3220
+ ...responsiveStyles.privacyText,
3221
+ ...componentTextStyle,
3222
+ fontSize: isMobile ? "13px" : "14px",
3223
+ lineHeight: "1.4",
3224
+ borderTop: "1px solid rgba(152, 162, 179, 0.3)",
3225
+ paddingTop: "12px",
3226
+ marginTop: "12px"
3227
+ },
3228
+ children: /* @__PURE__ */ jsxs("p", { style: { margin: 0, opacity: 0.6 }, children: [
3229
+ content.privacy_center_url && /* @__PURE__ */ jsxs(Fragment, { children: [
3230
+ content.additional_text && /* @__PURE__ */ jsx("span", { id: "additional-text", children: getTranslatedText(
3231
+ "additional_text",
3232
+ content.additional_text
3233
+ ) }),
3234
+ " ",
3235
+ /* @__PURE__ */ jsx(
3236
+ "a",
3237
+ {
3238
+ id: "privacy-center-link",
3239
+ style: { ...styles.link, ...linkStyle },
3240
+ href: content.privacy_center_url,
3241
+ target: "_blank",
3242
+ rel: "noopener noreferrer",
3243
+ children: getTranslatedText(
3244
+ "privacy_center_anchor_text",
3245
+ content.privacy_center_anchor_text || "Privacy Center"
3246
+ )
3247
+ }
3248
+ ),
3249
+ "."
3250
+ ] }),
3251
+ content.dpo_info && /* @__PURE__ */ jsxs(Fragment, { children: [
3252
+ content.privacy_center_url && /* @__PURE__ */ jsx("br", {}),
3253
+ /* @__PURE__ */ jsx("span", { id: "dpo-grievance-text", children: getTranslatedDpoText(
3254
+ "grievance_text",
3255
+ content.dpo_info.grievance_text || ""
3256
+ ) }),
3257
+ " ",
3258
+ content.dpo_info.grievance_url && /* @__PURE__ */ jsx(
3259
+ "a",
3260
+ {
3261
+ id: "dpo-grievance-link",
3262
+ style: { ...styles.link, ...linkStyle },
3263
+ href: content.dpo_info.grievance_url,
3264
+ target: "_blank",
3265
+ rel: "noopener noreferrer",
3266
+ children: getTranslatedDpoText(
3267
+ "grievance_anchor_text",
3268
+ content.dpo_info.grievance_anchor_text || "click here"
3269
+ )
3270
+ }
3271
+ ),
3272
+ content.dpo_info.grievance_email && /* @__PURE__ */ jsxs(Fragment, { children: [
3273
+ " ",
3274
+ /* @__PURE__ */ jsx("span", { id: "dpo-grievance-email-connector", children: getTranslatedDpoText(
3275
+ "grievance_email_connector_text",
3276
+ content.dpo_info.grievance_email_connector_text || "or email to"
3277
+ ) }),
3278
+ " ",
3279
+ /* @__PURE__ */ jsx(
3280
+ "a",
3281
+ {
3282
+ id: "dpo-grievance-email",
3283
+ style: { ...styles.link, ...linkStyle },
3284
+ href: `mailto:${content.dpo_info.grievance_email}`,
3285
+ children: content.dpo_info.grievance_email
3286
+ }
3287
+ )
3288
+ ] }),
3289
+ /* @__PURE__ */ jsx("br", {}),
3290
+ /* @__PURE__ */ jsx("span", { id: "dpo-dp-board-text", children: getTranslatedDpoText(
3291
+ "dp_board_text",
3292
+ content.dpo_info.dp_board_text || ""
3293
+ ) }),
3294
+ " ",
3295
+ content.dpo_info.dp_board_url && /* @__PURE__ */ jsx(
3296
+ "a",
3297
+ {
3298
+ id: "dpo-dp-board-link",
3299
+ style: { ...styles.link, ...linkStyle },
3300
+ href: content.dpo_info.dp_board_url,
3301
+ target: "_blank",
3302
+ rel: "noopener noreferrer",
3303
+ children: getTranslatedDpoText(
3304
+ "dp_board_anchor_text",
3305
+ content.dpo_info.dp_board_anchor_text || "here"
3306
+ )
3307
+ }
3308
+ ),
3309
+ /* @__PURE__ */ jsx("br", {}),
3310
+ /* @__PURE__ */ jsx("span", { id: "dpo-dpo-text", children: getTranslatedDpoText(
3311
+ "dpo_text",
3312
+ content.dpo_info.dpo_text || ""
3313
+ ) }),
3314
+ " ",
3315
+ content.dpo_info.dpo_url && /* @__PURE__ */ jsx(
3316
+ "a",
3317
+ {
3318
+ id: "dpo-dpo-link",
3319
+ style: { ...styles.link, ...linkStyle },
3320
+ href: content.dpo_info.dpo_url,
3321
+ target: "_blank",
3322
+ rel: "noopener noreferrer",
3323
+ children: getTranslatedDpoText(
3324
+ "dpo_anchor_text",
3325
+ content.dpo_info.dpo_anchor_text || "Click here"
3326
+ )
3327
+ }
3328
+ )
3329
+ ] })
3330
+ ] })
3331
+ }
3088
3332
  )
3089
3333
  ]
3090
3334
  }
3091
3335
  ),
3092
- /* @__PURE__ */ jsxs(
3336
+ /* @__PURE__ */ jsx(
3093
3337
  "div",
3094
3338
  {
3095
3339
  style: {
@@ -3097,7 +3341,22 @@ var RedactoNoticeConsent = ({
3097
3341
  ...responsiveStyles.bottomSection,
3098
3342
  ...sectionStyle
3099
3343
  },
3100
- children: [
3344
+ children: isFullyConsentedReviewMode ? /* @__PURE__ */ jsx(
3345
+ "button",
3346
+ {
3347
+ ref: lastFocusableRef,
3348
+ id: "review-mode-continue-button",
3349
+ style: {
3350
+ ...styles.button,
3351
+ ...responsiveStyles.button,
3352
+ ...styles.acceptButton,
3353
+ ...acceptButtonStyle
3354
+ },
3355
+ onClick: () => onAccept == null ? void 0 : onAccept(),
3356
+ "aria-label": reviewModeButtonText,
3357
+ children: reviewModeButtonText
3358
+ }
3359
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
3101
3360
  /* @__PURE__ */ jsx(
3102
3361
  "button",
3103
3362
  {
@@ -3145,7 +3404,7 @@ var RedactoNoticeConsent = ({
3145
3404
  )
3146
3405
  }
3147
3406
  )
3148
- ]
3407
+ ] })
3149
3408
  }
3150
3409
  )
3151
3410
  ] })
@@ -3199,7 +3458,6 @@ var fetchConsentContent2 = async ({
3199
3458
  const data = await response.json();
3200
3459
  return data;
3201
3460
  } catch (error) {
3202
- console.error("Error fetching consent content:", error);
3203
3461
  throw error;
3204
3462
  }
3205
3463
  };
@@ -3215,31 +3473,61 @@ var submitConsentEvent2 = async ({
3215
3473
  }) => {
3216
3474
  var _a, _b;
3217
3475
  try {
3218
- const primaryEmail = localStorage.getItem("userEmail");
3219
- const payload = {
3220
- primary_email: primaryEmail || void 0,
3221
- notice_uuid: noticeUuid,
3222
- source: "WEB",
3223
- declined,
3224
- consents: {
3225
- purposes: purposes.map((purpose) => ({
3226
- uuid: purpose.uuid,
3227
- name: purpose.name,
3228
- description: purpose.description,
3229
- industries: purpose.industries || "",
3230
- selected: purpose.selected,
3231
- data_elements: purpose.data_elements.map((element) => ({
3232
- uuid: element.uuid,
3233
- name: element.name,
3234
- enabled: element.enabled,
3235
- required: element.required,
3236
- selected: element.required ? true : element.selected
3237
- }))
3238
- }))
3239
- },
3240
- meta_data
3241
- };
3242
3476
  const apiBaseUrl = baseUrl || BASE_URL2;
3477
+ let payload;
3478
+ if (isLegacyApi(apiBaseUrl)) {
3479
+ const primaryEmail = typeof window !== "undefined" ? localStorage.getItem("userEmail") : null;
3480
+ payload = {
3481
+ primary_email: primaryEmail || void 0,
3482
+ notice_uuid: noticeUuid,
3483
+ source: "WEB",
3484
+ declined: Boolean(declined),
3485
+ consents: {
3486
+ purposes: purposes.map((purpose) => {
3487
+ if (!purpose.uuid) {
3488
+ throw new Error(`Invalid purpose data: missing uuid`);
3489
+ }
3490
+ return {
3491
+ uuid: purpose.uuid,
3492
+ name: purpose.name,
3493
+ description: purpose.description || "",
3494
+ industries: purpose.industries || "",
3495
+ selected: Boolean(purpose.selected),
3496
+ data_elements: (purpose.data_elements || []).map((element) => ({
3497
+ uuid: element.uuid,
3498
+ name: element.name,
3499
+ enabled: Boolean(element.enabled),
3500
+ required: Boolean(element.required),
3501
+ selected: element.required ? true : Boolean(element.selected)
3502
+ }))
3503
+ };
3504
+ })
3505
+ },
3506
+ meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid } : void 0
3507
+ };
3508
+ } else {
3509
+ payload = {
3510
+ notice_uuid: noticeUuid,
3511
+ purposes: purposes.map((purpose) => {
3512
+ if (!purpose.uuid) {
3513
+ throw new Error(`Invalid purpose data: missing uuid`);
3514
+ }
3515
+ const dataElements = purpose.data_elements.filter((element) => element.enabled).map((element) => ({
3516
+ uuid: element.uuid,
3517
+ selected: element.required ? true : Boolean(element.selected)
3518
+ }));
3519
+ return {
3520
+ purpose_uuid: purpose.uuid,
3521
+ selected: Boolean(purpose.selected),
3522
+ data_elements: dataElements.length > 0 ? dataElements : void 0
3523
+ };
3524
+ }),
3525
+ select_all_mandatory: false,
3526
+ source: "WEB",
3527
+ declined,
3528
+ meta_data
3529
+ };
3530
+ }
3243
3531
  const response = await fetch(
3244
3532
  `${apiBaseUrl}/public/organisations/${org_uuid}/workspaces/${workspace_uuid}/submit-consent`,
3245
3533
  {
@@ -3276,7 +3564,6 @@ var submitConsentEvent2 = async ({
3276
3564
  throw error;
3277
3565
  }
3278
3566
  } catch (error) {
3279
- console.error("Error submitting consent event:", error);
3280
3567
  throw error;
3281
3568
  }
3282
3569
  };
@@ -3755,7 +4042,7 @@ var RedactoConsentInlineComponent = ({
3755
4042
  const getTranslatedText = (key, defaultText, itemId) => {
3756
4043
  var _a2, _b;
3757
4044
  if (!content) return defaultText;
3758
- if (selectedLanguage === content.default_language) {
4045
+ if (selectedLanguage === "English" || selectedLanguage === "en" || selectedLanguage === "EN") {
3759
4046
  if (key === "privacy_policy_anchor_text" && content.privacy_policy_anchor_text) {
3760
4047
  return content.privacy_policy_anchor_text;
3761
4048
  }
@@ -3770,14 +4057,21 @@ var RedactoConsentInlineComponent = ({
3770
4057
  }
3771
4058
  if (itemId) {
3772
4059
  if (key === "purposes.name" || key === "purposes.description") {
3773
- return ((_a2 = translationMap.purposes) == null ? void 0 : _a2[itemId]) || defaultText;
4060
+ const purposeData = (_a2 = translationMap.purposes) == null ? void 0 : _a2[itemId];
4061
+ if (purposeData) {
4062
+ if (typeof purposeData === "string") {
4063
+ return key === "purposes.name" ? purposeData : defaultText;
4064
+ }
4065
+ return key === "purposes.name" ? purposeData.name || defaultText : purposeData.description || defaultText;
4066
+ }
4067
+ return defaultText;
3774
4068
  }
3775
4069
  if (key.startsWith("data_elements.")) {
3776
4070
  return ((_b = translationMap.data_elements) == null ? void 0 : _b[itemId]) || defaultText;
3777
4071
  }
3778
4072
  }
3779
4073
  const value = translationMap[key];
3780
- if (typeof value === "string") {
4074
+ if (typeof value === "string" && value) {
3781
4075
  return value;
3782
4076
  }
3783
4077
  return defaultText;
@@ -3794,13 +4088,12 @@ var RedactoConsentInlineComponent = ({
3794
4088
  language,
3795
4089
  specific_uuid: applicationId
3796
4090
  });
3797
- setContent(consentContentData.detail.active_config);
3798
- if (consentContentData.detail.active_config.default_language) {
3799
- setSelectedLanguage(
3800
- consentContentData.detail.active_config.default_language
3801
- );
4091
+ const activeConfig = consentContentData.detail.active_config;
4092
+ setContent(activeConfig);
4093
+ if (activeConfig.default_language) {
4094
+ setSelectedLanguage(activeConfig.default_language);
3802
4095
  }
3803
- const initialCollapsedState = consentContentData.detail.active_config.purposes.reduce(
4096
+ const initialCollapsedState = activeConfig.purposes.reduce(
3804
4097
  (acc, purpose) => ({
3805
4098
  ...acc,
3806
4099
  [purpose.uuid]: true
@@ -3808,7 +4101,7 @@ var RedactoConsentInlineComponent = ({
3808
4101
  {}
3809
4102
  );
3810
4103
  setCollapsedPurposes(initialCollapsedState);
3811
- const initialDataElementState = consentContentData.detail.active_config.purposes.reduce(
4104
+ const initialDataElementState = activeConfig.purposes.reduce(
3812
4105
  (acc, purpose) => {
3813
4106
  purpose.data_elements.forEach((element) => {
3814
4107
  const combinedId = `${purpose.uuid}-${element.uuid}`;
@@ -3819,7 +4112,7 @@ var RedactoConsentInlineComponent = ({
3819
4112
  {}
3820
4113
  );
3821
4114
  setSelectedDataElements(initialDataElementState);
3822
- const initialPurposeState = consentContentData.detail.active_config.purposes.reduce(
4115
+ const initialPurposeState = activeConfig.purposes.reduce(
3823
4116
  (acc, purpose) => {
3824
4117
  return {
3825
4118
  ...acc,
@@ -3830,7 +4123,6 @@ var RedactoConsentInlineComponent = ({
3830
4123
  );
3831
4124
  setSelectedPurposes(initialPurposeState);
3832
4125
  } catch (err) {
3833
- console.error(err);
3834
4126
  const error = err;
3835
4127
  setFetchError(error);
3836
4128
  if (error.status === 409) {
@@ -3945,13 +4237,9 @@ var RedactoConsentInlineComponent = ({
3945
4237
  onAccept == null ? void 0 : onAccept();
3946
4238
  hasSubmittedRef.current = false;
3947
4239
  } catch (error) {
3948
- console.error("Error submitting consent:", error);
3949
4240
  const err = error;
3950
- if (err.status === 500) {
3951
- setErrorMessage(
3952
- "An error occurred while submitting your consent. Please try again later."
3953
- );
3954
- }
4241
+ 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.";
4242
+ setErrorMessage(message);
3955
4243
  hasSubmittedRef.current = false;
3956
4244
  throw error;
3957
4245
  } finally {
@@ -3976,7 +4264,6 @@ var RedactoConsentInlineComponent = ({
3976
4264
  try {
3977
4265
  await handleAcceptWithToken(accessToken);
3978
4266
  } catch (err) {
3979
- console.error("Failed to auto-submit consent:", err);
3980
4267
  hasSubmittedRef.current = false;
3981
4268
  onError == null ? void 0 : onError(err);
3982
4269
  }