@redacto.io/consent-sdk-react 10.4.0-beta.1 → 11.0.0-beta.2
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/README.md +98 -30
- package/dist/{chunk-DGMUTOWJ.mjs → chunk-W45JQYDG.mjs} +65 -1
- package/dist/index.d.mts +38 -4
- package/dist/index.d.ts +38 -4
- package/dist/index.js +414 -293
- package/dist/index.mjs +73 -14
- package/dist/privacy-center.d.mts +63 -21
- package/dist/privacy-center.d.ts +63 -21
- package/dist/privacy-center.js +654 -655
- package/dist/privacy-center.mjs +103 -165
- package/package.json +1 -1
package/dist/privacy-center.js
CHANGED
|
@@ -5,8 +5,13 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __esm = (fn, res) => function __init() {
|
|
9
|
-
|
|
8
|
+
var __esm = (fn, res, err) => function __init() {
|
|
9
|
+
if (err) throw err[0];
|
|
10
|
+
try {
|
|
11
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
throw err = [e], e;
|
|
14
|
+
}
|
|
10
15
|
};
|
|
11
16
|
var __export = (target, all) => {
|
|
12
17
|
for (var name in all)
|
|
@@ -8204,7 +8209,7 @@ syncDayjsLocale(import_i18next.default.language);
|
|
|
8204
8209
|
var i18n_default = import_i18next.default;
|
|
8205
8210
|
|
|
8206
8211
|
// src/RedactoPrivacyCenter/PrivacyCenterLayout.tsx
|
|
8207
|
-
var
|
|
8212
|
+
var import_react50 = require("react");
|
|
8208
8213
|
|
|
8209
8214
|
// src/RedactoPrivacyCenter/context/OrganizationContext.tsx
|
|
8210
8215
|
var import_react = require("react");
|
|
@@ -8227,7 +8232,7 @@ var useOrganization = () => {
|
|
|
8227
8232
|
};
|
|
8228
8233
|
|
|
8229
8234
|
// src/RedactoPrivacyCenter/context/DataAvailabilityContext.tsx
|
|
8230
|
-
var
|
|
8235
|
+
var import_react7 = require("react");
|
|
8231
8236
|
|
|
8232
8237
|
// src/shared/sandbox.ts
|
|
8233
8238
|
var SANDBOX_TOKEN_HEADER = "X-Consent-Token";
|
|
@@ -9231,36 +9236,35 @@ var isJwtExpired = (token, bufferSeconds = 5 * 60) => {
|
|
|
9231
9236
|
return true;
|
|
9232
9237
|
}
|
|
9233
9238
|
};
|
|
9234
|
-
var isUserAuthenticated = (
|
|
9239
|
+
var isUserAuthenticated = (_expectedSlug) => {
|
|
9235
9240
|
if (typeof window === "undefined") return false;
|
|
9236
9241
|
const accessToken = sessionStorage.getItem("access_token");
|
|
9237
9242
|
const email = sessionStorage.getItem("email");
|
|
9238
|
-
|
|
9239
|
-
if (!accessToken || !email || !orgSlug) {
|
|
9240
|
-
return false;
|
|
9241
|
-
}
|
|
9242
|
-
return orgSlug === expectedSlug;
|
|
9243
|
+
return Boolean(accessToken && email);
|
|
9243
9244
|
};
|
|
9244
|
-
var getInitialState = (
|
|
9245
|
+
var getInitialState = (_slug) => {
|
|
9245
9246
|
if (typeof window === "undefined") return true;
|
|
9246
|
-
return !isUserAuthenticated(
|
|
9247
|
+
return !isUserAuthenticated();
|
|
9248
|
+
};
|
|
9249
|
+
var isSessionForOrganisation = (organizationId) => {
|
|
9250
|
+
const storedOrgId = sessionStorage.getItem("pc_org_id");
|
|
9251
|
+
return Boolean(storedOrgId) && (!organizationId || storedOrgId === organizationId);
|
|
9247
9252
|
};
|
|
9248
|
-
var checkAndRefreshAuth = async (
|
|
9253
|
+
var checkAndRefreshAuth = async (_expectedSlug, organizationId, workspaceId, consentClient) => {
|
|
9249
9254
|
if (typeof window === "undefined") return false;
|
|
9250
9255
|
if (getSandboxConfig()) {
|
|
9251
9256
|
return true;
|
|
9252
9257
|
}
|
|
9253
9258
|
const accessToken = sessionStorage.getItem("access_token");
|
|
9254
9259
|
const email = sessionStorage.getItem("email");
|
|
9255
|
-
|
|
9256
|
-
if (orgSlug && orgSlug !== expectedSlug) {
|
|
9260
|
+
if (!isSessionForOrganisation(organizationId)) {
|
|
9257
9261
|
return false;
|
|
9258
9262
|
}
|
|
9259
9263
|
const needsRefresh = !accessToken || accessToken && isJwtExpired(accessToken, TOKEN_EXPIRY_BUFFER_SECONDS);
|
|
9260
|
-
if (!needsRefresh && accessToken && email
|
|
9264
|
+
if (!needsRefresh && accessToken && email) {
|
|
9261
9265
|
return true;
|
|
9262
9266
|
}
|
|
9263
|
-
if (needsRefresh && email
|
|
9267
|
+
if (needsRefresh && email) {
|
|
9264
9268
|
const orgId = organizationId || sessionStorage.getItem("pc_org_id") || "";
|
|
9265
9269
|
const wsId = workspaceId || sessionStorage.getItem("pc_workspace_id") || "";
|
|
9266
9270
|
if (!orgId || !wsId) {
|
|
@@ -9359,7 +9363,7 @@ var signOutPrivacyCenter = () => {
|
|
|
9359
9363
|
removeStorage(REFRESH_TOKEN_STORAGE_KEY);
|
|
9360
9364
|
clearLegacyRefreshTokenCookie();
|
|
9361
9365
|
};
|
|
9362
|
-
var ensureValidToken = async (organizationId, workspaceId,
|
|
9366
|
+
var ensureValidToken = async (organizationId, workspaceId, _slug, authContext, consentClient) => {
|
|
9363
9367
|
if (typeof window === "undefined") return null;
|
|
9364
9368
|
const sandbox = getSandboxConfig();
|
|
9365
9369
|
if (sandbox) {
|
|
@@ -9384,7 +9388,7 @@ var ensureValidToken = async (organizationId, workspaceId, slug, authContext, co
|
|
|
9384
9388
|
return newToken;
|
|
9385
9389
|
}
|
|
9386
9390
|
isRefreshing = true;
|
|
9387
|
-
refreshPromise = performTokenRefresh(organizationId, workspaceId,
|
|
9391
|
+
refreshPromise = performTokenRefresh(organizationId, workspaceId, authContext, consentClient);
|
|
9388
9392
|
try {
|
|
9389
9393
|
const newToken = await refreshPromise;
|
|
9390
9394
|
return newToken;
|
|
@@ -9393,7 +9397,7 @@ var ensureValidToken = async (organizationId, workspaceId, slug, authContext, co
|
|
|
9393
9397
|
refreshPromise = null;
|
|
9394
9398
|
}
|
|
9395
9399
|
};
|
|
9396
|
-
var performTokenRefresh = async (organizationId, workspaceId,
|
|
9400
|
+
var performTokenRefresh = async (organizationId, workspaceId, authContext, consentClient) => {
|
|
9397
9401
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
9398
9402
|
const orgId = organizationId || sessionStorage.getItem("pc_org_id") || "";
|
|
9399
9403
|
const wsId = workspaceId || sessionStorage.getItem("pc_workspace_id") || "";
|
|
@@ -9997,13 +10001,15 @@ var seedSessionStorage = (data) => {
|
|
|
9997
10001
|
return;
|
|
9998
10002
|
}
|
|
9999
10003
|
if (data.accessToken) sessionStorage.setItem("access_token", data.accessToken);
|
|
10004
|
+
if (data.orgId && !data.workspaceId && sessionStorage.getItem("pc_org_id") !== data.orgId) {
|
|
10005
|
+
sessionStorage.removeItem("pc_workspace_id");
|
|
10006
|
+
}
|
|
10000
10007
|
if (data.orgId) sessionStorage.setItem("pc_org_id", data.orgId);
|
|
10001
10008
|
if (data.workspaceId) sessionStorage.setItem("pc_workspace_id", data.workspaceId);
|
|
10002
|
-
if (data.slug) sessionStorage.setItem("pc_org_slug", data.slug);
|
|
10003
10009
|
if (data.contact) sessionStorage.setItem("email", data.contact);
|
|
10004
10010
|
};
|
|
10005
10011
|
var configureSandbox = (props) => {
|
|
10006
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k
|
|
10012
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
10007
10013
|
const token = (_a = props.token) == null ? void 0 : _a.trim();
|
|
10008
10014
|
if (!token) {
|
|
10009
10015
|
setSandboxConfig(null);
|
|
@@ -10014,21 +10020,18 @@ var configureSandbox = (props) => {
|
|
|
10014
10020
|
const ucic = (_g = (_f = props.sandboxUcic) == null ? void 0 : _f.trim()) != null ? _g : "";
|
|
10015
10021
|
const email = (_i = (_h = props.sandboxEmail) == null ? void 0 : _h.trim()) != null ? _i : "";
|
|
10016
10022
|
const mobile = (_k = (_j = props.sandboxMobile) == null ? void 0 : _j.trim()) != null ? _k : "";
|
|
10017
|
-
const slug = (_m = (_l = props.slug) == null ? void 0 : _l.trim()) != null ? _m : "";
|
|
10018
10023
|
setSandboxConfig({
|
|
10019
10024
|
token,
|
|
10020
10025
|
ucic: ucic || void 0,
|
|
10021
10026
|
email: email || void 0,
|
|
10022
10027
|
mobile: mobile || void 0,
|
|
10023
10028
|
organisationUuid,
|
|
10024
|
-
workspaceUuid
|
|
10025
|
-
slug
|
|
10029
|
+
workspaceUuid
|
|
10026
10030
|
});
|
|
10027
10031
|
seedSessionStorage({
|
|
10028
10032
|
accessToken: token,
|
|
10029
10033
|
orgId: organisationUuid,
|
|
10030
10034
|
workspaceId: workspaceUuid,
|
|
10031
|
-
slug,
|
|
10032
10035
|
// The principal precedence (UCIC > email > mobile) the server also applies.
|
|
10033
10036
|
contact: ucic || email || mobile
|
|
10034
10037
|
});
|
|
@@ -10044,7 +10047,6 @@ var syncJwtDataToSessionStorage = (accessToken) => {
|
|
|
10044
10047
|
seedSessionStorage({
|
|
10045
10048
|
orgId: typeof decoded.organisation_uuid === "string" ? decoded.organisation_uuid : void 0,
|
|
10046
10049
|
workspaceId: typeof decoded.workspace_uuid === "string" ? decoded.workspace_uuid : void 0,
|
|
10047
|
-
slug: typeof decoded.organisation_slug === "string" ? decoded.organisation_slug : void 0,
|
|
10048
10050
|
contact: typeof contact === "string" ? contact : void 0
|
|
10049
10051
|
});
|
|
10050
10052
|
};
|
|
@@ -10059,7 +10061,6 @@ var AuthProvider = (props) => {
|
|
|
10059
10061
|
sandboxMobile,
|
|
10060
10062
|
organisationUuid,
|
|
10061
10063
|
workspaceUuid,
|
|
10062
|
-
slug,
|
|
10063
10064
|
onError
|
|
10064
10065
|
} = props;
|
|
10065
10066
|
const [sandboxActive] = (0, import_react4.useState)(() => configureSandbox(props));
|
|
@@ -10143,7 +10144,7 @@ var AuthProvider = (props) => {
|
|
|
10143
10144
|
}
|
|
10144
10145
|
configureSandbox(props);
|
|
10145
10146
|
return () => setSandboxConfig(null);
|
|
10146
|
-
}, [sandboxActive, sandboxToken, sandboxUcic, sandboxEmail, sandboxMobile, organisationUuid, workspaceUuid
|
|
10147
|
+
}, [sandboxActive, sandboxToken, sandboxUcic, sandboxEmail, sandboxMobile, organisationUuid, workspaceUuid]);
|
|
10147
10148
|
const updateTokens = (0, import_react4.useCallback)((newAccessToken, newRefreshToken) => {
|
|
10148
10149
|
setAccessToken(newAccessToken);
|
|
10149
10150
|
if (newRefreshToken) {
|
|
@@ -10186,7 +10187,7 @@ var useAuth = () => {
|
|
|
10186
10187
|
};
|
|
10187
10188
|
|
|
10188
10189
|
// src/RedactoPrivacyCenter/context/BaseUrlContext.tsx
|
|
10189
|
-
var
|
|
10190
|
+
var import_react6 = require("react");
|
|
10190
10191
|
|
|
10191
10192
|
// src/shared/idempotency.ts
|
|
10192
10193
|
var HEADER = "Idempotency-Key";
|
|
@@ -10246,11 +10247,66 @@ ${body}`;
|
|
|
10246
10247
|
}
|
|
10247
10248
|
};
|
|
10248
10249
|
|
|
10250
|
+
// src/shared/endpoints.ts
|
|
10251
|
+
var CONSENT_PATH = "/consent";
|
|
10252
|
+
var LEDGER_PATH = "/consent-ledger";
|
|
10253
|
+
var ABSOLUTE_HTTP_URL = /^https?:\/\/(?:\[[0-9a-f:.]+\]|[^\s/?#@:[\]]+)(?::\d+)?(?:\/[^\s?#]*)?$/i;
|
|
10254
|
+
var trimUrl = (value) => (value != null ? value : "").trim().replace(/\/+$/, "");
|
|
10255
|
+
var isConsentServerUrl = (trimmed) => ABSOLUTE_HTTP_URL.test(trimmed) && trimmed.endsWith(CONSENT_PATH);
|
|
10256
|
+
var isHostForm = (trimmed) => ABSOLUTE_HTTP_URL.test(trimmed) && !trimmed.endsWith(CONSENT_PATH);
|
|
10257
|
+
function resolveEndpoints(baseUrl, ledgerBaseUrl) {
|
|
10258
|
+
const trimmed = trimUrl(baseUrl);
|
|
10259
|
+
if (!isHostForm(trimmed)) {
|
|
10260
|
+
return { mode: "legacy", apiHost: void 0, baseUrl, ledgerBaseUrl };
|
|
10261
|
+
}
|
|
10262
|
+
const apiHost = trimmed.endsWith(LEDGER_PATH) ? trimmed.slice(0, -LEDGER_PATH.length) : trimmed;
|
|
10263
|
+
return {
|
|
10264
|
+
mode: "host",
|
|
10265
|
+
apiHost,
|
|
10266
|
+
baseUrl: `${apiHost}${CONSENT_PATH}`,
|
|
10267
|
+
ledgerBaseUrl: `${apiHost}${LEDGER_PATH}`
|
|
10268
|
+
};
|
|
10269
|
+
}
|
|
10270
|
+
var ENDPOINT_WARNINGS = {
|
|
10271
|
+
missingBaseUrl: "[Redacto] baseUrl is not set, so the SDK's built-in production default is used. Pass baseUrl: your API host.",
|
|
10272
|
+
consentServerBaseUrl: "[Redacto] baseUrl is the consent server URL (ending in /consent), which is deprecated. Pass the API host instead; the SDK derives the consent server and ledger URLs from it.",
|
|
10273
|
+
ledgerBaseUrl: "[Redacto] ledgerBaseUrl is deprecated. Pass the Redacto API host as baseUrl instead; the SDK then reaches the consent server and the ledger under it.",
|
|
10274
|
+
ledgerBaseUrlIgnored: "[Redacto] ledgerBaseUrl is ignored because baseUrl is the API host; the SDK reaches the ledger under that host. Remove ledgerBaseUrl.",
|
|
10275
|
+
slugIgnored: "[Redacto] slug is deprecated and ignored. The Privacy Center reads the organisation from the access token, or from organisationUuid and workspaceUuid. Remove slug."
|
|
10276
|
+
};
|
|
10277
|
+
var issuedWarnings = /* @__PURE__ */ new Set();
|
|
10278
|
+
var warnOnce = (warning) => {
|
|
10279
|
+
if (issuedWarnings.has(warning)) {
|
|
10280
|
+
return;
|
|
10281
|
+
}
|
|
10282
|
+
issuedWarnings.add(warning);
|
|
10283
|
+
console.warn(ENDPOINT_WARNINGS[warning]);
|
|
10284
|
+
};
|
|
10285
|
+
var warnEndpointUsage = (baseUrl, ledgerBaseUrl, { hasBuiltInDefault }) => {
|
|
10286
|
+
if (!baseUrl) {
|
|
10287
|
+
if (hasBuiltInDefault) {
|
|
10288
|
+
warnOnce("missingBaseUrl");
|
|
10289
|
+
}
|
|
10290
|
+
} else if (isConsentServerUrl(trimUrl(baseUrl))) {
|
|
10291
|
+
warnOnce("consentServerBaseUrl");
|
|
10292
|
+
}
|
|
10293
|
+
if (trimUrl(ledgerBaseUrl)) {
|
|
10294
|
+
warnOnce(isHostForm(trimUrl(baseUrl)) ? "ledgerBaseUrlIgnored" : "ledgerBaseUrl");
|
|
10295
|
+
}
|
|
10296
|
+
};
|
|
10297
|
+
var warnSlugDeprecated = () => {
|
|
10298
|
+
warnOnce("slugIgnored");
|
|
10299
|
+
};
|
|
10300
|
+
|
|
10249
10301
|
// src/RedactoPrivacyCenter/api/client.ts
|
|
10250
10302
|
function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
10251
|
-
|
|
10303
|
+
var _a;
|
|
10304
|
+
warnEndpointUsage(baseUrl, ledgerBaseUrl, { hasBuiltInDefault: false });
|
|
10305
|
+
const endpoints = resolveEndpoints(baseUrl, ledgerBaseUrl);
|
|
10306
|
+
const consentBaseUrl = endpoints.baseUrl;
|
|
10307
|
+
const ledgerConfigured = Boolean(endpoints.ledgerBaseUrl);
|
|
10252
10308
|
const useLedger = () => ledgerConfigured;
|
|
10253
|
-
const ledgerBase = (ledgerBaseUrl != null ?
|
|
10309
|
+
const ledgerBase = ((_a = endpoints.ledgerBaseUrl) != null ? _a : "").replace(/\/$/, "");
|
|
10254
10310
|
async function privacyCenterApiFetch(url, options) {
|
|
10255
10311
|
const { authToken, getAuthToken, headers = {}, ...fetchOptions } = options;
|
|
10256
10312
|
const requestHeaders = new Headers();
|
|
@@ -10348,7 +10404,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10348
10404
|
}
|
|
10349
10405
|
}
|
|
10350
10406
|
function privacyCenterUrl(baseRequest, path) {
|
|
10351
|
-
return `${
|
|
10407
|
+
return `${consentBaseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/dsar/privacy-center${path}`;
|
|
10352
10408
|
}
|
|
10353
10409
|
function ledgerUrl(baseRequest, path) {
|
|
10354
10410
|
if (!useLedger()) {
|
|
@@ -10450,7 +10506,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10450
10506
|
* `channel: "sms"`.
|
|
10451
10507
|
*/
|
|
10452
10508
|
async createOtp(organisationId, workspaceId, email, options, channel = "email") {
|
|
10453
|
-
const url = `${
|
|
10509
|
+
const url = `${consentBaseUrl}/public/organisations/${organisationId}/workspaces/${workspaceId}/otp/create`;
|
|
10454
10510
|
return apiFetch(url, {
|
|
10455
10511
|
...options,
|
|
10456
10512
|
method: "POST",
|
|
@@ -10468,7 +10524,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10468
10524
|
* then rejects it with 403 "Token scope is not permitted".
|
|
10469
10525
|
*/
|
|
10470
10526
|
async verifyOtp(organisationId, workspaceId, otpId, otp, options, purpose = "login") {
|
|
10471
|
-
const url = `${
|
|
10527
|
+
const url = `${consentBaseUrl}/public/organisations/${organisationId}/workspaces/${workspaceId}/otp/verify`;
|
|
10472
10528
|
return apiFetch(url, {
|
|
10473
10529
|
...options,
|
|
10474
10530
|
method: "POST",
|
|
@@ -10479,7 +10535,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10479
10535
|
* Exchange one-time token for JWT tokens (public)
|
|
10480
10536
|
*/
|
|
10481
10537
|
async exchangeToken(token) {
|
|
10482
|
-
const url = `${
|
|
10538
|
+
const url = `${consentBaseUrl}/public/tokens/token-exchange?token=${encodeURIComponent(token)}`;
|
|
10483
10539
|
const response = await fetch(url, {
|
|
10484
10540
|
method: "GET",
|
|
10485
10541
|
headers: { Accept: "application/json" }
|
|
@@ -10500,7 +10556,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10500
10556
|
* Refresh OTP token (public)
|
|
10501
10557
|
*/
|
|
10502
10558
|
async refreshOtpToken(organisationId, workspaceId, refreshToken, options) {
|
|
10503
|
-
const url = `${
|
|
10559
|
+
const url = `${consentBaseUrl}/public/organisations/${organisationId}/workspaces/${workspaceId}/otp/refresh`;
|
|
10504
10560
|
return apiFetch(url, {
|
|
10505
10561
|
...options,
|
|
10506
10562
|
method: "POST",
|
|
@@ -10511,7 +10567,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10511
10567
|
* Get products
|
|
10512
10568
|
*/
|
|
10513
10569
|
async getProducts(baseRequest, skip = 0, limit = 10, options) {
|
|
10514
|
-
const url = `${
|
|
10570
|
+
const url = `${consentBaseUrl}/organisations/${baseRequest.organisationUuid}/workspaces/${baseRequest.workspaceUuid}/notice-management/products/?skip=${skip}&limit=${limit}`;
|
|
10515
10571
|
return apiFetch(url, {
|
|
10516
10572
|
...options,
|
|
10517
10573
|
getAuthToken: async () => baseRequest.authToken
|
|
@@ -10603,7 +10659,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10603
10659
|
* used with its `{ purpose_uuid, contact, ... }` payload.
|
|
10604
10660
|
*/
|
|
10605
10661
|
async manageConsent(baseRequest, purposeId, contact, status, authToken, options, nominatorContact, dataElementUuids, productUuid, noticeUuid, dataElements, language, nominatorUuid) {
|
|
10606
|
-
var
|
|
10662
|
+
var _a2;
|
|
10607
10663
|
if (!useLedger()) {
|
|
10608
10664
|
const url2 = privacyCenterUrl(
|
|
10609
10665
|
baseRequest,
|
|
@@ -10653,7 +10709,7 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10653
10709
|
notice_uuid: noticeUuid,
|
|
10654
10710
|
// Sandbox has no JWT, so the ledger resolves the acting test principal
|
|
10655
10711
|
// from this identity in the body; null (spread no-op) on the live JWT path.
|
|
10656
|
-
...(
|
|
10712
|
+
...(_a2 = sandboxBodyIdentity()) != null ? _a2 : {},
|
|
10657
10713
|
// Pins the action to the card the user acted on. Without it the ledger
|
|
10658
10714
|
// scopes by the notice and applies the answer to every product the
|
|
10659
10715
|
// notice covers, so revoking a purpose held on two products withdrew
|
|
@@ -10996,30 +11052,43 @@ function createConsentClient(baseUrl, ledgerBaseUrl) {
|
|
|
10996
11052
|
};
|
|
10997
11053
|
}
|
|
10998
11054
|
|
|
11055
|
+
// src/shared/useResolvedEndpoints.ts
|
|
11056
|
+
var import_react5 = require("react");
|
|
11057
|
+
var useResolvedEndpoints = (baseUrl, ledgerBaseUrl, { warn = true, hasBuiltInDefault = true } = {}) => (0, import_react5.useMemo)(() => {
|
|
11058
|
+
if (warn) {
|
|
11059
|
+
warnEndpointUsage(baseUrl, ledgerBaseUrl, { hasBuiltInDefault });
|
|
11060
|
+
}
|
|
11061
|
+
return resolveEndpoints(baseUrl, ledgerBaseUrl);
|
|
11062
|
+
}, [baseUrl, ledgerBaseUrl, warn, hasBuiltInDefault]);
|
|
11063
|
+
|
|
10999
11064
|
// src/RedactoPrivacyCenter/context/BaseUrlContext.tsx
|
|
11000
11065
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
11001
|
-
var BaseUrlContext = (0,
|
|
11066
|
+
var BaseUrlContext = (0, import_react6.createContext)(null);
|
|
11002
11067
|
var BaseUrlProvider = ({
|
|
11003
11068
|
children,
|
|
11004
11069
|
baseUrl,
|
|
11005
11070
|
ledgerBaseUrl
|
|
11006
11071
|
}) => {
|
|
11007
|
-
const
|
|
11072
|
+
const endpoints = useResolvedEndpoints(baseUrl, ledgerBaseUrl, {
|
|
11073
|
+
hasBuiltInDefault: false
|
|
11074
|
+
});
|
|
11075
|
+
const consentClient = (0, import_react6.useMemo)(
|
|
11008
11076
|
() => createConsentClient(baseUrl, ledgerBaseUrl),
|
|
11009
11077
|
[baseUrl, ledgerBaseUrl]
|
|
11010
11078
|
);
|
|
11011
|
-
const value = (0,
|
|
11079
|
+
const value = (0, import_react6.useMemo)(
|
|
11012
11080
|
() => ({
|
|
11013
|
-
baseUrl,
|
|
11014
|
-
ledgerBaseUrl,
|
|
11015
|
-
consentClient
|
|
11081
|
+
baseUrl: endpoints.baseUrl,
|
|
11082
|
+
ledgerBaseUrl: endpoints.ledgerBaseUrl,
|
|
11083
|
+
consentClient,
|
|
11084
|
+
apiHost: endpoints.apiHost
|
|
11016
11085
|
}),
|
|
11017
|
-
[
|
|
11086
|
+
[endpoints, consentClient]
|
|
11018
11087
|
);
|
|
11019
11088
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(BaseUrlContext.Provider, { value, children });
|
|
11020
11089
|
};
|
|
11021
11090
|
var useBaseUrl = () => {
|
|
11022
|
-
const context = (0,
|
|
11091
|
+
const context = (0, import_react6.useContext)(BaseUrlContext);
|
|
11023
11092
|
if (!context) {
|
|
11024
11093
|
throw new Error(
|
|
11025
11094
|
"useBaseUrl must be used within a BaseUrlProvider"
|
|
@@ -11030,7 +11099,7 @@ var useBaseUrl = () => {
|
|
|
11030
11099
|
|
|
11031
11100
|
// src/RedactoPrivacyCenter/context/DataAvailabilityContext.tsx
|
|
11032
11101
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
11033
|
-
var DataAvailabilityContext = (0,
|
|
11102
|
+
var DataAvailabilityContext = (0, import_react7.createContext)(null);
|
|
11034
11103
|
var DataAvailabilityProvider = ({ children }) => {
|
|
11035
11104
|
var _a;
|
|
11036
11105
|
const { organization } = useOrganization();
|
|
@@ -11039,20 +11108,20 @@ var DataAvailabilityProvider = ({ children }) => {
|
|
|
11039
11108
|
const { langParam } = useCurrentLanguage();
|
|
11040
11109
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
11041
11110
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
11042
|
-
const authContext = (0,
|
|
11111
|
+
const authContext = (0, import_react7.useMemo)(
|
|
11043
11112
|
() => ({ accessToken, refreshToken, onError, updateTokens }),
|
|
11044
11113
|
[accessToken, refreshToken, onError, updateTokens]
|
|
11045
11114
|
);
|
|
11046
|
-
const [status, setStatus] = (0,
|
|
11047
|
-
const runIdRef = (0,
|
|
11048
|
-
const mountedRef = (0,
|
|
11049
|
-
(0,
|
|
11115
|
+
const [status, setStatus] = (0, import_react7.useState)("checking");
|
|
11116
|
+
const runIdRef = (0, import_react7.useRef)(0);
|
|
11117
|
+
const mountedRef = (0, import_react7.useRef)(true);
|
|
11118
|
+
(0, import_react7.useEffect)(() => {
|
|
11050
11119
|
mountedRef.current = true;
|
|
11051
11120
|
return () => {
|
|
11052
11121
|
mountedRef.current = false;
|
|
11053
11122
|
};
|
|
11054
11123
|
}, []);
|
|
11055
|
-
const runCheck = (0,
|
|
11124
|
+
const runCheck = (0, import_react7.useCallback)(async () => {
|
|
11056
11125
|
if (!organizationId || !workspaceId) return;
|
|
11057
11126
|
const runId = ++runIdRef.current;
|
|
11058
11127
|
setStatus("checking");
|
|
@@ -11106,7 +11175,7 @@ var DataAvailabilityProvider = ({ children }) => {
|
|
|
11106
11175
|
consentsEmpty && casesEmpty && activitiesEmpty ? "empty" : "has-data"
|
|
11107
11176
|
);
|
|
11108
11177
|
}, [organizationId, workspaceId, authContext, consentClient, langParam]);
|
|
11109
|
-
(0,
|
|
11178
|
+
(0, import_react7.useEffect)(() => {
|
|
11110
11179
|
if (sessionExpired) {
|
|
11111
11180
|
runIdRef.current += 1;
|
|
11112
11181
|
setStatus("session-expired");
|
|
@@ -11116,14 +11185,14 @@ var DataAvailabilityProvider = ({ children }) => {
|
|
|
11116
11185
|
void runCheck();
|
|
11117
11186
|
}
|
|
11118
11187
|
}, [organizationId, workspaceId, accessToken, runCheck, sessionExpired]);
|
|
11119
|
-
const value = (0,
|
|
11188
|
+
const value = (0, import_react7.useMemo)(
|
|
11120
11189
|
() => ({ status }),
|
|
11121
11190
|
[status]
|
|
11122
11191
|
);
|
|
11123
11192
|
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DataAvailabilityContext.Provider, { value, children });
|
|
11124
11193
|
};
|
|
11125
11194
|
var useDataAvailability = () => {
|
|
11126
|
-
const ctx = (0,
|
|
11195
|
+
const ctx = (0, import_react7.useContext)(DataAvailabilityContext);
|
|
11127
11196
|
if (!ctx) {
|
|
11128
11197
|
throw new Error(
|
|
11129
11198
|
"useDataAvailability must be used within a DataAvailabilityProvider"
|
|
@@ -12051,9 +12120,9 @@ function PCButton({
|
|
|
12051
12120
|
}
|
|
12052
12121
|
|
|
12053
12122
|
// src/RedactoPrivacyCenter/ui/PCActionIcon.tsx
|
|
12054
|
-
var
|
|
12123
|
+
var import_react8 = require("react");
|
|
12055
12124
|
var import_jsx_runtime9 = require("react/jsx-runtime");
|
|
12056
|
-
var PCActionIcon = (0,
|
|
12125
|
+
var PCActionIcon = (0, import_react8.forwardRef)(({
|
|
12057
12126
|
children,
|
|
12058
12127
|
className = "",
|
|
12059
12128
|
style = {},
|
|
@@ -12087,7 +12156,7 @@ var PCActionIcon = (0, import_react7.forwardRef)(({
|
|
|
12087
12156
|
PCActionIcon.displayName = "PCActionIcon";
|
|
12088
12157
|
|
|
12089
12158
|
// src/RedactoPrivacyCenter/ui/PCInput.tsx
|
|
12090
|
-
var
|
|
12159
|
+
var import_react9 = require("react");
|
|
12091
12160
|
var import_lucide_react = require("lucide-react");
|
|
12092
12161
|
var import_jsx_runtime10 = require("react/jsx-runtime");
|
|
12093
12162
|
function PCInput({
|
|
@@ -12106,9 +12175,9 @@ function PCInput({
|
|
|
12106
12175
|
onChange,
|
|
12107
12176
|
...props
|
|
12108
12177
|
}) {
|
|
12109
|
-
const [showClear, setShowClear] = (0,
|
|
12110
|
-
const inputRef = (0,
|
|
12111
|
-
(0,
|
|
12178
|
+
const [showClear, setShowClear] = (0, import_react9.useState)(false);
|
|
12179
|
+
const inputRef = (0, import_react9.useRef)(null);
|
|
12180
|
+
(0, import_react9.useEffect)(() => {
|
|
12112
12181
|
if (clearable && value && String(value).length > 0) {
|
|
12113
12182
|
setShowClear(true);
|
|
12114
12183
|
} else {
|
|
@@ -12275,12 +12344,12 @@ function PCCheckbox({
|
|
|
12275
12344
|
}
|
|
12276
12345
|
|
|
12277
12346
|
// src/RedactoPrivacyCenter/ui/PCSelect.tsx
|
|
12278
|
-
var
|
|
12347
|
+
var import_react11 = require("react");
|
|
12279
12348
|
var import_lucide_react2 = require("lucide-react");
|
|
12280
12349
|
|
|
12281
12350
|
// src/shared/useIsomorphicLayoutEffect.ts
|
|
12282
|
-
var
|
|
12283
|
-
var useIsomorphicLayoutEffect = typeof window === "undefined" ?
|
|
12351
|
+
var import_react10 = require("react");
|
|
12352
|
+
var useIsomorphicLayoutEffect = typeof window === "undefined" ? import_react10.useEffect : import_react10.useLayoutEffect;
|
|
12284
12353
|
|
|
12285
12354
|
// src/RedactoPrivacyCenter/ui/PCSelect.tsx
|
|
12286
12355
|
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
@@ -12305,13 +12374,13 @@ function PCSelect({
|
|
|
12305
12374
|
clearAriaLabel = "Clear selection",
|
|
12306
12375
|
showSelectedCheck = false
|
|
12307
12376
|
}) {
|
|
12308
|
-
const [isOpen, setIsOpen] = (0,
|
|
12309
|
-
const [searchQuery, setSearchQuery] = (0,
|
|
12310
|
-
const [dropdownLayout, setDropdownLayout] = (0,
|
|
12311
|
-
const wrapperRef = (0,
|
|
12312
|
-
const selectRef = (0,
|
|
12313
|
-
const triggerRef = (0,
|
|
12314
|
-
const dropdownRef = (0,
|
|
12377
|
+
const [isOpen, setIsOpen] = (0, import_react11.useState)(false);
|
|
12378
|
+
const [searchQuery, setSearchQuery] = (0, import_react11.useState)("");
|
|
12379
|
+
const [dropdownLayout, setDropdownLayout] = (0, import_react11.useState)(null);
|
|
12380
|
+
const wrapperRef = (0, import_react11.useRef)(null);
|
|
12381
|
+
const selectRef = (0, import_react11.useRef)(null);
|
|
12382
|
+
const triggerRef = (0, import_react11.useRef)(null);
|
|
12383
|
+
const dropdownRef = (0, import_react11.useRef)(null);
|
|
12315
12384
|
const filteredOptions = searchable && searchQuery ? options.filter(
|
|
12316
12385
|
(opt) => opt.label.toLowerCase().includes(searchQuery.toLowerCase())
|
|
12317
12386
|
) : options;
|
|
@@ -12384,7 +12453,7 @@ function PCSelect({
|
|
|
12384
12453
|
clearable,
|
|
12385
12454
|
dropdownMatchTriggerWidth
|
|
12386
12455
|
]);
|
|
12387
|
-
(0,
|
|
12456
|
+
(0, import_react11.useEffect)(() => {
|
|
12388
12457
|
const handleClickOutside = (event) => {
|
|
12389
12458
|
if (selectRef.current && !selectRef.current.contains(event.target) && dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
12390
12459
|
setIsOpen(false);
|
|
@@ -12605,7 +12674,7 @@ function PCSelect({
|
|
|
12605
12674
|
}
|
|
12606
12675
|
|
|
12607
12676
|
// src/RedactoPrivacyCenter/ui/PCModal.tsx
|
|
12608
|
-
var
|
|
12677
|
+
var import_react14 = require("react");
|
|
12609
12678
|
var import_lucide_react3 = require("lucide-react");
|
|
12610
12679
|
|
|
12611
12680
|
// src/shared/appearance/constants.ts
|
|
@@ -12875,10 +12944,10 @@ var prefersReducedMotion = () => {
|
|
|
12875
12944
|
};
|
|
12876
12945
|
|
|
12877
12946
|
// src/shared/usePresence.ts
|
|
12878
|
-
var
|
|
12947
|
+
var import_react12 = require("react");
|
|
12879
12948
|
function usePresence(isOpen, exitMs) {
|
|
12880
|
-
const [lingering, setLingering] = (0,
|
|
12881
|
-
(0,
|
|
12949
|
+
const [lingering, setLingering] = (0, import_react12.useState)(isOpen);
|
|
12950
|
+
(0, import_react12.useEffect)(() => {
|
|
12882
12951
|
if (isOpen) {
|
|
12883
12952
|
setLingering(true);
|
|
12884
12953
|
return;
|
|
@@ -12890,7 +12959,7 @@ function usePresence(isOpen, exitMs) {
|
|
|
12890
12959
|
}
|
|
12891
12960
|
|
|
12892
12961
|
// src/RedactoPrivacyCenter/context/AppearanceContext.tsx
|
|
12893
|
-
var
|
|
12962
|
+
var import_react13 = require("react");
|
|
12894
12963
|
|
|
12895
12964
|
// src/RedactoPrivacyCenter/styles/glass/tokens.ts
|
|
12896
12965
|
var S = `[${APPEARANCE_ATTRIBUTE}="glass"]:not([${NOTICE_ROOT_ATTRIBUTE}])`;
|
|
@@ -13564,7 +13633,7 @@ var APPEARANCE_STYLESHEETS = {
|
|
|
13564
13633
|
|
|
13565
13634
|
// src/RedactoPrivacyCenter/context/AppearanceContext.tsx
|
|
13566
13635
|
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
13567
|
-
var AppearanceContext = (0,
|
|
13636
|
+
var AppearanceContext = (0, import_react13.createContext)(DEFAULT_APPEARANCE);
|
|
13568
13637
|
var AppearanceProvider = ({ theme, children }) => {
|
|
13569
13638
|
const resolved = resolveAppearance(theme);
|
|
13570
13639
|
useIsomorphicLayoutEffect(() => {
|
|
@@ -13573,7 +13642,7 @@ var AppearanceProvider = ({ theme, children }) => {
|
|
|
13573
13642
|
}, [resolved]);
|
|
13574
13643
|
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(AppearanceContext.Provider, { value: resolved, children });
|
|
13575
13644
|
};
|
|
13576
|
-
var useAppearance = () => (0,
|
|
13645
|
+
var useAppearance = () => (0, import_react13.useContext)(AppearanceContext);
|
|
13577
13646
|
var useAppearanceLayout = () => getAppearanceLayout(useAppearance());
|
|
13578
13647
|
var useAppearanceAttributes = () => {
|
|
13579
13648
|
const appearance = useAppearance();
|
|
@@ -13594,7 +13663,7 @@ function PCModal({
|
|
|
13594
13663
|
footer,
|
|
13595
13664
|
closeAriaLabel = "Close modal"
|
|
13596
13665
|
}) {
|
|
13597
|
-
(0,
|
|
13666
|
+
(0, import_react14.useEffect)(() => {
|
|
13598
13667
|
if (isOpen) {
|
|
13599
13668
|
document.body.style.overflow = "hidden";
|
|
13600
13669
|
} else {
|
|
@@ -13604,7 +13673,7 @@ function PCModal({
|
|
|
13604
13673
|
document.body.style.overflow = "";
|
|
13605
13674
|
};
|
|
13606
13675
|
}, [isOpen]);
|
|
13607
|
-
(0,
|
|
13676
|
+
(0, import_react14.useEffect)(() => {
|
|
13608
13677
|
const handleEscape = (e) => {
|
|
13609
13678
|
if (e.key === "Escape" && isOpen) {
|
|
13610
13679
|
onClose();
|
|
@@ -13615,11 +13684,11 @@ function PCModal({
|
|
|
13615
13684
|
}, [isOpen, onClose]);
|
|
13616
13685
|
const { sheetOverlays } = useAppearanceLayout();
|
|
13617
13686
|
const { mounted, closing } = usePresence(isOpen, sheetOverlays ? MOTION.dimMs : MOTION.fadeMs);
|
|
13618
|
-
const lastOpen = (0,
|
|
13687
|
+
const lastOpen = (0, import_react14.useRef)({ title, children, footer });
|
|
13619
13688
|
if (isOpen) {
|
|
13620
13689
|
lastOpen.current = { title, children, footer };
|
|
13621
13690
|
}
|
|
13622
|
-
const dialogRef = (0,
|
|
13691
|
+
const dialogRef = (0, import_react14.useRef)(null);
|
|
13623
13692
|
useIsomorphicLayoutEffect(() => {
|
|
13624
13693
|
const dialog = dialogRef.current;
|
|
13625
13694
|
if (!dialog) {
|
|
@@ -13695,9 +13764,9 @@ function PCModal({
|
|
|
13695
13764
|
}
|
|
13696
13765
|
|
|
13697
13766
|
// src/RedactoPrivacyCenter/ui/PCTable.tsx
|
|
13698
|
-
var
|
|
13767
|
+
var import_react15 = require("react");
|
|
13699
13768
|
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
13700
|
-
var TableContext = (0,
|
|
13769
|
+
var TableContext = (0, import_react15.createContext)({});
|
|
13701
13770
|
function PCTable({ children, variant = "modern", className = "", style = {}, ...props }) {
|
|
13702
13771
|
const tableStyle = {
|
|
13703
13772
|
...pcStyles.table,
|
|
@@ -13800,16 +13869,16 @@ function PCBadge({
|
|
|
13800
13869
|
}
|
|
13801
13870
|
|
|
13802
13871
|
// src/RedactoPrivacyCenter/ui/PCTooltip.tsx
|
|
13803
|
-
var
|
|
13872
|
+
var import_react17 = require("react");
|
|
13804
13873
|
var import_react_dom = require("react-dom");
|
|
13805
13874
|
|
|
13806
13875
|
// src/RedactoPrivacyCenter/context/scopeState.ts
|
|
13807
|
-
var
|
|
13876
|
+
var import_react16 = require("react");
|
|
13808
13877
|
var PC_SCOPE_ATTRIBUTE = "data-redacto-pc-scope";
|
|
13809
|
-
var ScopeContext = (0,
|
|
13810
|
-
var usePrivacyCenterScope = () => (0,
|
|
13878
|
+
var ScopeContext = (0, import_react16.createContext)(null);
|
|
13879
|
+
var usePrivacyCenterScope = () => (0, import_react16.useContext)(ScopeContext);
|
|
13811
13880
|
var usePrivacyCenterScopeAttributes = () => {
|
|
13812
|
-
const scope = (0,
|
|
13881
|
+
const scope = (0, import_react16.useContext)(ScopeContext);
|
|
13813
13882
|
if (!scope) {
|
|
13814
13883
|
return {};
|
|
13815
13884
|
}
|
|
@@ -13827,10 +13896,10 @@ function PCTooltip({
|
|
|
13827
13896
|
color = "default",
|
|
13828
13897
|
triggerStyle
|
|
13829
13898
|
}) {
|
|
13830
|
-
const [isVisible, setIsVisible] = (0,
|
|
13831
|
-
const [position, setPosition] = (0,
|
|
13832
|
-
const triggerRef = (0,
|
|
13833
|
-
const tooltipRef = (0,
|
|
13899
|
+
const [isVisible, setIsVisible] = (0, import_react17.useState)(false);
|
|
13900
|
+
const [position, setPosition] = (0, import_react17.useState)({ top: 0, left: 0 });
|
|
13901
|
+
const triggerRef = (0, import_react17.useRef)(null);
|
|
13902
|
+
const tooltipRef = (0, import_react17.useRef)(null);
|
|
13834
13903
|
const appearanceAttributes = useAppearanceAttributes();
|
|
13835
13904
|
const scopeAttributes = usePrivacyCenterScopeAttributes();
|
|
13836
13905
|
const updatePosition = () => {
|
|
@@ -13865,7 +13934,7 @@ function PCTooltip({
|
|
|
13865
13934
|
top = Math.min(Math.max(top, viewportGutter), Math.max(viewportGutter, maxTop));
|
|
13866
13935
|
setPosition({ top, left });
|
|
13867
13936
|
};
|
|
13868
|
-
(0,
|
|
13937
|
+
(0, import_react17.useEffect)(() => {
|
|
13869
13938
|
if (isVisible) {
|
|
13870
13939
|
updatePosition();
|
|
13871
13940
|
window.addEventListener("scroll", updatePosition, true);
|
|
@@ -13923,7 +13992,7 @@ function PCTooltip({
|
|
|
13923
13992
|
}
|
|
13924
13993
|
|
|
13925
13994
|
// src/RedactoPrivacyCenter/ui/PCPopover.tsx
|
|
13926
|
-
var
|
|
13995
|
+
var import_react18 = require("react");
|
|
13927
13996
|
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
13928
13997
|
function PCPopover({
|
|
13929
13998
|
content,
|
|
@@ -13934,10 +14003,10 @@ function PCPopover({
|
|
|
13934
14003
|
style = {},
|
|
13935
14004
|
onOpen
|
|
13936
14005
|
}) {
|
|
13937
|
-
const [isOpen, setIsOpen] = (0,
|
|
13938
|
-
const [position, setPosition] = (0,
|
|
13939
|
-
const triggerRef = (0,
|
|
13940
|
-
const popoverRef = (0,
|
|
14006
|
+
const [isOpen, setIsOpen] = (0, import_react18.useState)(false);
|
|
14007
|
+
const [position, setPosition] = (0, import_react18.useState)({ top: 0, left: 0 });
|
|
14008
|
+
const triggerRef = (0, import_react18.useRef)(null);
|
|
14009
|
+
const popoverRef = (0, import_react18.useRef)(null);
|
|
13941
14010
|
const updatePosition = () => {
|
|
13942
14011
|
if (!triggerRef.current || !popoverRef.current) return;
|
|
13943
14012
|
const triggerRect = triggerRef.current.getBoundingClientRect();
|
|
@@ -13998,7 +14067,7 @@ function PCPopover({
|
|
|
13998
14067
|
};
|
|
13999
14068
|
}
|
|
14000
14069
|
}, [isOpen, placement]);
|
|
14001
|
-
(0,
|
|
14070
|
+
(0, import_react18.useEffect)(() => {
|
|
14002
14071
|
const handleClickOutside = (event) => {
|
|
14003
14072
|
if (triggerRef.current && !triggerRef.current.contains(event.target) && popoverRef.current && !popoverRef.current.contains(event.target)) {
|
|
14004
14073
|
setIsOpen(false);
|
|
@@ -14083,7 +14152,7 @@ PCPopover.Trigger = ({ children }) => children;
|
|
|
14083
14152
|
PCPopover.Content = ({ children }) => children;
|
|
14084
14153
|
|
|
14085
14154
|
// src/RedactoPrivacyCenter/ui/PCAccordion.tsx
|
|
14086
|
-
var
|
|
14155
|
+
var import_react19 = require("react");
|
|
14087
14156
|
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
14088
14157
|
function PCAccordion({ children, className = "", style = {}, ...props }) {
|
|
14089
14158
|
const accordionStyle = {
|
|
@@ -14123,8 +14192,8 @@ function PCAccordionBody({
|
|
|
14123
14192
|
open = false,
|
|
14124
14193
|
...props
|
|
14125
14194
|
}) {
|
|
14126
|
-
const [settledOpen, setSettledOpen] = (0,
|
|
14127
|
-
(0,
|
|
14195
|
+
const [settledOpen, setSettledOpen] = (0, import_react19.useState)(open);
|
|
14196
|
+
(0, import_react19.useEffect)(() => {
|
|
14128
14197
|
if (!open) {
|
|
14129
14198
|
setSettledOpen(false);
|
|
14130
14199
|
return;
|
|
@@ -14152,7 +14221,7 @@ PCAccordion.Header = PCAccordionHeader;
|
|
|
14152
14221
|
PCAccordion.Body = PCAccordionBody;
|
|
14153
14222
|
|
|
14154
14223
|
// src/RedactoPrivacyCenter/ui/PCCollapse.tsx
|
|
14155
|
-
var
|
|
14224
|
+
var import_react20 = require("react");
|
|
14156
14225
|
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
14157
14226
|
function PCCollapse({
|
|
14158
14227
|
children,
|
|
@@ -14161,7 +14230,7 @@ function PCCollapse({
|
|
|
14161
14230
|
style = {},
|
|
14162
14231
|
...props
|
|
14163
14232
|
}) {
|
|
14164
|
-
const [open, setOpen] = (0,
|
|
14233
|
+
const [open, setOpen] = (0, import_react20.useState)(defaultOpen);
|
|
14165
14234
|
const toggle = () => setOpen(!open);
|
|
14166
14235
|
const collapseStyle = {
|
|
14167
14236
|
...style
|
|
@@ -14213,7 +14282,7 @@ PCCollapse.Header = PCCollapseHeader;
|
|
|
14213
14282
|
PCCollapse.Body = PCCollapseBody;
|
|
14214
14283
|
|
|
14215
14284
|
// src/RedactoPrivacyCenter/ui/PCAvatar.tsx
|
|
14216
|
-
var
|
|
14285
|
+
var import_react21 = require("react");
|
|
14217
14286
|
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
14218
14287
|
function getInitials(name) {
|
|
14219
14288
|
return name.split(" ").map((n) => n[0]).join("").toUpperCase().slice(0, 2);
|
|
@@ -14239,8 +14308,8 @@ function PCAvatar({
|
|
|
14239
14308
|
color = "primary",
|
|
14240
14309
|
framed = true
|
|
14241
14310
|
}) {
|
|
14242
|
-
const [failed, setFailed] = (0,
|
|
14243
|
-
(0,
|
|
14311
|
+
const [failed, setFailed] = (0, import_react21.useState)(false);
|
|
14312
|
+
(0, import_react21.useEffect)(() => setFailed(false), [src]);
|
|
14244
14313
|
const baseStyle = {
|
|
14245
14314
|
...pcStyles.avatar,
|
|
14246
14315
|
...size === "sm" && pcStyles.avatarSm,
|
|
@@ -14294,12 +14363,12 @@ function PCEmpty({
|
|
|
14294
14363
|
}
|
|
14295
14364
|
|
|
14296
14365
|
// src/RedactoPrivacyCenter/components/AppShell/AppShell.tsx
|
|
14297
|
-
var
|
|
14366
|
+
var import_react42 = require("react");
|
|
14298
14367
|
var import_react_i18next18 = require("react-i18next");
|
|
14299
14368
|
|
|
14300
14369
|
// src/RedactoPrivacyCenter/context/LocaleContext.tsx
|
|
14301
|
-
var
|
|
14302
|
-
var LocaleContext = (0,
|
|
14370
|
+
var import_react22 = require("react");
|
|
14371
|
+
var LocaleContext = (0, import_react22.createContext)({
|
|
14303
14372
|
locale: "en",
|
|
14304
14373
|
setLocale: () => {
|
|
14305
14374
|
}
|
|
@@ -14312,7 +14381,7 @@ var import_react_i18next4 = require("react-i18next");
|
|
|
14312
14381
|
var poweredByRedacto_default = 'data:image/svg+xml,<svg width="81" height="27" viewBox="0 0 81 27" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">%0A<rect width="81" height="27" fill="url(%23pattern0_23733_15486)"/>%0A<defs>%0A<pattern id="pattern0_23733_15486" patternContentUnits="objectBoundingBox" width="1" height="1">%0A<use xlink:href="%23image0_23733_15486" transform="matrix(0.000971817 0 0 0.00291545 -0.00826045 0)"/>%0A</pattern>%0A<image id="image0_23733_15486" width="1046" height="343" preserveAspectRatio="none" xlink:href="data:image/png;base64,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dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMDc0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+U2NyZWVuc2hvdDwvZXhpZjpVc2VyQ29tbWVudD4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjQ5MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjE0NDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4Ky5Nh9gAAQABJREFUeAHsnQeA1MX1x2fL3V7vwHGANBHpChZEo2KPUSwRsIuIYsX+tyTKamKLNWqMkBg1lkSIJvaCiqL0Xu6QzhWu317vW/7vzezvbu+4svVud+/7g73d/e3Uz5uZ38ybNzNC4AIBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAglArpQSizSGlgCZrNDnzA2z1R10JSYXxKZUVZh62e1OWIcDn2sTjiiHEIXIRyOSIcQLuVGb6Pfmh0OR7NBp2+yC3sDvwx6Xb3Dpq936G31RoOu3tpobLAZjPW6aGtjTGlTsxD9msaNE1azWUfBCX7hAgEQAAEQAAEQAAEQAAEQAAEQCEEC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gARIgARIoOsQYMdC19HVMSXNyLD5bD1QcnJtXeNs2Zhw9DEtnGAGZD7COouf7dZRfaK/43KHE0y5DA4JkAAJkAAJkAAJkAAJkECnJcCOhU6rmrYJlpGxNWDLgYQp9XW2x0/wTobNNqvl3rGpkZ9IZ0Jd26jRNgmQAAmQAAmQAAmQAAmQAAmQgLsE2LHgLrEuaD7jU5vfzmXFEysqbY/bbMbJXTAIh4u8NiTEuKfnyMz182aMqz/8R34nARIgARIgARIgARIgARIgARLoOALsWOg41p3CJ2z6+PA/y6N/3lk7tarW8rBsaJjQKQQ7qhC23MBA20N9ewUun/VQWKHFwk0Yj4qLP5IACZAACZAACZAACZAACZBABxJgx0IHwu6MXqmOhnk5wYU5YSkHD9aeUV9rnCnHMk6QDoe4jpfXlmfYjG/9/Y2PEmMDP45OKd/70LW9qtmR0PGaoI8kQAIkQAIkQAIkQAIkQAIk4CoBdiy4SqqbmkPHw/TpS33S06dZtm41fAxjv29pkL9PkL+vT32tj6VHqMVSXyefYIulQe49hVOZfPwCbDb/avnIXZZg2PwDrbaa+kZrom98Y2WKYU03DOvWrUttS5ZMs7LjoJtGLgabBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjAUwL/H4Qg+t9kjfqtAAAAAElFTkSuQmCC"/>%0A</defs>%0A</svg>%0A';
|
|
14313
14382
|
|
|
14314
14383
|
// src/RedactoPrivacyCenter/context/BrandingContext.tsx
|
|
14315
|
-
var
|
|
14384
|
+
var import_react24 = require("react");
|
|
14316
14385
|
|
|
14317
14386
|
// src/constants.ts
|
|
14318
14387
|
var DEFAULT_CONSENT_API_BASE_URL = "https://api.redacto.io/consent";
|
|
@@ -14325,11 +14394,15 @@ function originOf(url) {
|
|
|
14325
14394
|
return match ? match[0] : "";
|
|
14326
14395
|
}
|
|
14327
14396
|
function userServiceBaseUrl(consentBaseUrl) {
|
|
14397
|
+
const endpoints = resolveEndpoints(consentBaseUrl);
|
|
14398
|
+
if (endpoints.mode === "host") {
|
|
14399
|
+
return endpoints.apiHost + USER_SERVICE_PATH;
|
|
14400
|
+
}
|
|
14328
14401
|
const origin = originOf(consentBaseUrl) || originOf(DEFAULT_CONSENT_API_BASE_URL);
|
|
14329
14402
|
return origin + USER_SERVICE_PATH;
|
|
14330
14403
|
}
|
|
14331
|
-
async function
|
|
14332
|
-
const url = `${userServiceBaseUrl(baseUrl)}/public/org-branding
|
|
14404
|
+
async function fetchOrgBrandingForOrganisation(organisationUuid, baseUrl) {
|
|
14405
|
+
const url = `${userServiceBaseUrl(baseUrl)}/public/org-branding/${encodeURIComponent(organisationUuid)}`;
|
|
14333
14406
|
return apiFetch(url, { method: "GET" });
|
|
14334
14407
|
}
|
|
14335
14408
|
|
|
@@ -14736,7 +14809,7 @@ function clearBrandingTheme() {
|
|
|
14736
14809
|
}
|
|
14737
14810
|
|
|
14738
14811
|
// src/RedactoPrivacyCenter/context/settingsState.ts
|
|
14739
|
-
var
|
|
14812
|
+
var import_react23 = require("react");
|
|
14740
14813
|
|
|
14741
14814
|
// src/RedactoPrivacyCenter/settings/constants.ts
|
|
14742
14815
|
var SETTINGS_SCHEMA_VERSION = 1;
|
|
@@ -14940,17 +15013,16 @@ var DEFAULT_CONTEXT = {
|
|
|
14940
15013
|
status: "idle",
|
|
14941
15014
|
isCustomised: false,
|
|
14942
15015
|
organisation: { organisationUuid: null, workspaceUuid: null, status: "failed" },
|
|
14943
|
-
slug: "",
|
|
14944
15016
|
builtInSignIn: false,
|
|
14945
15017
|
brandContact: EMPTY_BRAND_CONTACT
|
|
14946
15018
|
};
|
|
14947
|
-
var PrivacyCenterSettingsContext = (0,
|
|
14948
|
-
var usePrivacyCenterSettingsContext = () => (0,
|
|
14949
|
-
var usePrivacyCenterSettings = () => (0,
|
|
15019
|
+
var PrivacyCenterSettingsContext = (0, import_react23.createContext)(DEFAULT_CONTEXT);
|
|
15020
|
+
var usePrivacyCenterSettingsContext = () => (0, import_react23.useContext)(PrivacyCenterSettingsContext);
|
|
15021
|
+
var usePrivacyCenterSettings = () => (0, import_react23.useContext)(PrivacyCenterSettingsContext).settings;
|
|
14950
15022
|
|
|
14951
15023
|
// src/RedactoPrivacyCenter/context/BrandingContext.tsx
|
|
14952
15024
|
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
14953
|
-
var BrandingContext = (0,
|
|
15025
|
+
var BrandingContext = (0, import_react24.createContext)(null);
|
|
14954
15026
|
var withIdentityOverride = (branding, settings) => {
|
|
14955
15027
|
var _a;
|
|
14956
15028
|
if (settings.inherit_identity) {
|
|
@@ -14967,18 +15039,20 @@ var withIdentityOverride = (branding, settings) => {
|
|
|
14967
15039
|
};
|
|
14968
15040
|
var BrandingProvider = ({
|
|
14969
15041
|
children,
|
|
14970
|
-
slug,
|
|
14971
15042
|
baseUrl
|
|
14972
15043
|
}) => {
|
|
14973
15044
|
var _a;
|
|
14974
|
-
const [branding, setBranding] = (0,
|
|
14975
|
-
const {
|
|
15045
|
+
const [branding, setBranding] = (0, import_react24.useState)(null);
|
|
15046
|
+
const { settings, organisation } = usePrivacyCenterSettingsContext();
|
|
15047
|
+
const brandingSettings = settings.branding;
|
|
15048
|
+
const organisationUuid = organisation.organisationUuid;
|
|
14976
15049
|
const scope = usePrivacyCenterScope();
|
|
14977
15050
|
const scopeId = (_a = scope == null ? void 0 : scope.id) != null ? _a : null;
|
|
14978
|
-
(0,
|
|
14979
|
-
|
|
15051
|
+
(0, import_react24.useEffect)(() => {
|
|
15052
|
+
setBranding(null);
|
|
15053
|
+
if (!organisationUuid) return;
|
|
14980
15054
|
let cancelled = false;
|
|
14981
|
-
|
|
15055
|
+
fetchOrgBrandingForOrganisation(organisationUuid, baseUrl).then((data) => {
|
|
14982
15056
|
if (!cancelled) setBranding(data);
|
|
14983
15057
|
}).catch((error) => {
|
|
14984
15058
|
console.warn("[RedactoPrivacyCenter] org branding fetch failed:", error);
|
|
@@ -14986,8 +15060,8 @@ var BrandingProvider = ({
|
|
|
14986
15060
|
return () => {
|
|
14987
15061
|
cancelled = true;
|
|
14988
15062
|
};
|
|
14989
|
-
}, [
|
|
14990
|
-
const themeVars = (0,
|
|
15063
|
+
}, [organisationUuid, baseUrl]);
|
|
15064
|
+
const themeVars = (0, import_react24.useMemo)(
|
|
14991
15065
|
() => ({
|
|
14992
15066
|
...(branding == null ? void 0 : branding.theme) ? brandingThemeVars(branding.theme) : {},
|
|
14993
15067
|
...settingsThemeVars(brandingSettings)
|
|
@@ -14995,7 +15069,7 @@ var BrandingProvider = ({
|
|
|
14995
15069
|
[branding, brandingSettings]
|
|
14996
15070
|
);
|
|
14997
15071
|
const themeKey = JSON.stringify(themeVars);
|
|
14998
|
-
(0,
|
|
15072
|
+
(0, import_react24.useEffect)(() => {
|
|
14999
15073
|
if (scopeId) {
|
|
15000
15074
|
return applyScopedTheme(PC_SCOPE_ATTRIBUTE, scopeId, themeVars);
|
|
15001
15075
|
}
|
|
@@ -15005,7 +15079,7 @@ var BrandingProvider = ({
|
|
|
15005
15079
|
applyBrandingTheme(branding.theme);
|
|
15006
15080
|
return clearBrandingTheme;
|
|
15007
15081
|
}, [scopeId, themeKey]);
|
|
15008
|
-
const value = (0,
|
|
15082
|
+
const value = (0, import_react24.useMemo)(
|
|
15009
15083
|
() => ({ branding: withIdentityOverride(branding, brandingSettings) }),
|
|
15010
15084
|
[branding, brandingSettings]
|
|
15011
15085
|
);
|
|
@@ -15013,12 +15087,12 @@ var BrandingProvider = ({
|
|
|
15013
15087
|
};
|
|
15014
15088
|
var useBranding = () => {
|
|
15015
15089
|
var _a;
|
|
15016
|
-
const ctx = (0,
|
|
15090
|
+
const ctx = (0, import_react24.useContext)(BrandingContext);
|
|
15017
15091
|
return (_a = ctx == null ? void 0 : ctx.branding) != null ? _a : null;
|
|
15018
15092
|
};
|
|
15019
15093
|
|
|
15020
15094
|
// src/RedactoPrivacyCenter/settings/copy.ts
|
|
15021
|
-
var
|
|
15095
|
+
var import_react25 = require("react");
|
|
15022
15096
|
var import_react_i18next3 = require("react-i18next");
|
|
15023
15097
|
|
|
15024
15098
|
// src/RedactoPrivacyCenter/settings/placeholders.ts
|
|
@@ -15046,20 +15120,19 @@ var resolvePlaceholders = (text2, context) => {
|
|
|
15046
15120
|
};
|
|
15047
15121
|
|
|
15048
15122
|
// src/RedactoPrivacyCenter/settings/copy.ts
|
|
15049
|
-
var nameFromSlug = (slug) => slug.split("-").filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
|
|
15050
15123
|
var usePlaceholderContext = () => {
|
|
15051
15124
|
var _a, _b;
|
|
15052
15125
|
const branding = useBranding();
|
|
15053
|
-
const {
|
|
15054
|
-
const organizationName = (_b = (_a = (0,
|
|
15055
|
-
const brand = (branding == null ? void 0 : branding.brand_name) || organizationName ||
|
|
15126
|
+
const { brandContact } = usePrivacyCenterSettingsContext();
|
|
15127
|
+
const organizationName = (_b = (_a = (0, import_react25.useContext)(OrganizationContext)) == null ? void 0 : _a.organization) == null ? void 0 : _b.name;
|
|
15128
|
+
const brand = (branding == null ? void 0 : branding.brand_name) || organizationName || "";
|
|
15056
15129
|
const legal = brandContact.legal_entity_name || (branding == null ? void 0 : branding.legal_name) || null;
|
|
15057
|
-
return (0,
|
|
15130
|
+
return (0, import_react25.useMemo)(() => ({ brand, legal }), [brand, legal]);
|
|
15058
15131
|
};
|
|
15059
15132
|
var useSettingsCopy = () => {
|
|
15060
15133
|
const { t } = (0, import_react_i18next3.useTranslation)();
|
|
15061
15134
|
const context = usePlaceholderContext();
|
|
15062
|
-
return (0,
|
|
15135
|
+
return (0, import_react25.useCallback)(
|
|
15063
15136
|
(value, extra) => {
|
|
15064
15137
|
if (!value) {
|
|
15065
15138
|
return "";
|
|
@@ -15208,11 +15281,11 @@ function Footer() {
|
|
|
15208
15281
|
}
|
|
15209
15282
|
|
|
15210
15283
|
// src/RedactoNoticeConsent/useMediaQuery.ts
|
|
15211
|
-
var
|
|
15284
|
+
var import_react26 = require("react");
|
|
15212
15285
|
var useMediaQuery = (query) => {
|
|
15213
15286
|
const getMatches = () => typeof window !== "undefined" ? window.matchMedia(query).matches : false;
|
|
15214
|
-
const [matches, setMatches] = (0,
|
|
15215
|
-
(0,
|
|
15287
|
+
const [matches, setMatches] = (0, import_react26.useState)(getMatches);
|
|
15288
|
+
(0, import_react26.useEffect)(() => {
|
|
15216
15289
|
if (typeof window === "undefined") return;
|
|
15217
15290
|
const media = window.matchMedia(query);
|
|
15218
15291
|
const listener = (e) => {
|
|
@@ -15235,7 +15308,7 @@ var useMediaQuery = (query) => {
|
|
|
15235
15308
|
};
|
|
15236
15309
|
|
|
15237
15310
|
// src/RedactoPrivacyCenter/components/AppShell/hooks/useSidebarState.ts
|
|
15238
|
-
var
|
|
15311
|
+
var import_react27 = require("react");
|
|
15239
15312
|
var STORAGE_KEY = "redacto-pc-sidebar-state";
|
|
15240
15313
|
var EXPAND_MIN_WIDTH = "(min-width: 1024px)";
|
|
15241
15314
|
function getDefaultState() {
|
|
@@ -15263,18 +15336,18 @@ function writeStored(value) {
|
|
|
15263
15336
|
}
|
|
15264
15337
|
}
|
|
15265
15338
|
function useSidebarState() {
|
|
15266
|
-
const [state, setStateRaw] = (0,
|
|
15267
|
-
(0,
|
|
15339
|
+
const [state, setStateRaw] = (0, import_react27.useState)(void 0);
|
|
15340
|
+
(0, import_react27.useEffect)(() => {
|
|
15268
15341
|
var _a;
|
|
15269
15342
|
setStateRaw((_a = readStored()) != null ? _a : getDefaultState());
|
|
15270
15343
|
}, []);
|
|
15271
|
-
(0,
|
|
15344
|
+
(0, import_react27.useEffect)(() => {
|
|
15272
15345
|
if (state) writeStored(state);
|
|
15273
15346
|
}, [state]);
|
|
15274
|
-
const setState = (0,
|
|
15347
|
+
const setState = (0, import_react27.useCallback)((next) => {
|
|
15275
15348
|
setStateRaw(next);
|
|
15276
15349
|
}, []);
|
|
15277
|
-
const toggle = (0,
|
|
15350
|
+
const toggle = (0, import_react27.useCallback)(() => {
|
|
15278
15351
|
setStateRaw((prev) => prev === "expanded" ? "collapsed" : "expanded");
|
|
15279
15352
|
}, []);
|
|
15280
15353
|
return {
|
|
@@ -15287,7 +15360,7 @@ function useSidebarState() {
|
|
|
15287
15360
|
}
|
|
15288
15361
|
|
|
15289
15362
|
// src/RedactoPrivacyCenter/components/AppShell/hooks/useKeyboardShortcut.ts
|
|
15290
|
-
var
|
|
15363
|
+
var import_react28 = require("react");
|
|
15291
15364
|
function isEditableTarget(target) {
|
|
15292
15365
|
if (!target || !(target instanceof HTMLElement)) return false;
|
|
15293
15366
|
const tag = target.tagName;
|
|
@@ -15296,7 +15369,7 @@ function isEditableTarget(target) {
|
|
|
15296
15369
|
return false;
|
|
15297
15370
|
}
|
|
15298
15371
|
function useKeyboardShortcut(combo, handler) {
|
|
15299
|
-
(0,
|
|
15372
|
+
(0, import_react28.useEffect)(() => {
|
|
15300
15373
|
if (typeof window === "undefined") return;
|
|
15301
15374
|
const onKey = (event) => {
|
|
15302
15375
|
if (event.key.toLowerCase() !== combo.key.toLowerCase()) return;
|
|
@@ -15316,12 +15389,12 @@ function useKeyboardShortcut(combo, handler) {
|
|
|
15316
15389
|
}
|
|
15317
15390
|
|
|
15318
15391
|
// src/RedactoPrivacyCenter/components/AppShell/TopAppBar.tsx
|
|
15319
|
-
var
|
|
15392
|
+
var import_react37 = require("react");
|
|
15320
15393
|
var import_react_i18next12 = require("react-i18next");
|
|
15321
15394
|
var import_lucide_react8 = require("lucide-react");
|
|
15322
15395
|
|
|
15323
15396
|
// src/RedactoPrivacyCenter/context/NavigationContext.tsx
|
|
15324
|
-
var
|
|
15397
|
+
var import_react29 = require("react");
|
|
15325
15398
|
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
15326
15399
|
var NAV_STORAGE_KEY = "pc_current_page";
|
|
15327
15400
|
var CASE_UUID_STORAGE_KEY = "pc_selected_case_uuid";
|
|
@@ -15352,18 +15425,18 @@ function getStoredCaseUuid() {
|
|
|
15352
15425
|
return null;
|
|
15353
15426
|
}
|
|
15354
15427
|
}
|
|
15355
|
-
var NavigationContext = (0,
|
|
15428
|
+
var NavigationContext = (0, import_react29.createContext)(null);
|
|
15356
15429
|
var NavigationProvider = ({
|
|
15357
15430
|
children,
|
|
15358
15431
|
initialPage = "consent-manager"
|
|
15359
15432
|
}) => {
|
|
15360
15433
|
var _a;
|
|
15361
|
-
const [currentPage, setCurrentPage] = (0,
|
|
15434
|
+
const [currentPage, setCurrentPage] = (0, import_react29.useState)(
|
|
15362
15435
|
() => getStoredPage(initialPage)
|
|
15363
15436
|
);
|
|
15364
|
-
const [selectedCase, setSelectedCaseState] = (0,
|
|
15365
|
-
const [pendingCaseUuid] = (0,
|
|
15366
|
-
const setSelectedCase = (0,
|
|
15437
|
+
const [selectedCase, setSelectedCaseState] = (0, import_react29.useState)(null);
|
|
15438
|
+
const [pendingCaseUuid] = (0, import_react29.useState)(() => getStoredCaseUuid());
|
|
15439
|
+
const setSelectedCase = (0, import_react29.useCallback)((c) => {
|
|
15367
15440
|
setSelectedCaseState(c);
|
|
15368
15441
|
try {
|
|
15369
15442
|
if (c == null ? void 0 : c.uuid) {
|
|
@@ -15375,16 +15448,16 @@ var NavigationProvider = ({
|
|
|
15375
15448
|
}
|
|
15376
15449
|
}, []);
|
|
15377
15450
|
const { portal } = usePrivacyCenterSettings();
|
|
15378
|
-
const enabledPages = (0,
|
|
15451
|
+
const enabledPages = (0, import_react29.useMemo)(
|
|
15379
15452
|
() => portal.sections.filter((section) => section.enabled).map((section) => section.key),
|
|
15380
15453
|
[portal.sections]
|
|
15381
15454
|
);
|
|
15382
|
-
const isPageAllowed = (0,
|
|
15455
|
+
const isPageAllowed = (0, import_react29.useCallback)(
|
|
15383
15456
|
(page) => page === "case-details" || enabledPages.includes(page),
|
|
15384
15457
|
[enabledPages]
|
|
15385
15458
|
);
|
|
15386
15459
|
const effectivePage = isPageAllowed(currentPage) ? currentPage : (_a = enabledPages[0]) != null ? _a : "consent-manager";
|
|
15387
|
-
const navigateTo = (0,
|
|
15460
|
+
const navigateTo = (0, import_react29.useCallback)((page) => {
|
|
15388
15461
|
if (!isPageAllowed(page)) {
|
|
15389
15462
|
return;
|
|
15390
15463
|
}
|
|
@@ -15400,7 +15473,7 @@ var NavigationProvider = ({
|
|
|
15400
15473
|
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(NavigationContext.Provider, { value: { currentPage: effectivePage, navigateTo, selectedCase, setSelectedCase, pendingCaseUuid }, children });
|
|
15401
15474
|
};
|
|
15402
15475
|
var useInternalNavigation = () => {
|
|
15403
|
-
const context = (0,
|
|
15476
|
+
const context = (0, import_react29.useContext)(NavigationContext);
|
|
15404
15477
|
if (!context) {
|
|
15405
15478
|
throw new Error("useInternalNavigation must be used within a NavigationProvider");
|
|
15406
15479
|
}
|
|
@@ -15434,7 +15507,7 @@ var rememberLanguageChoice = (code) => {
|
|
|
15434
15507
|
};
|
|
15435
15508
|
|
|
15436
15509
|
// src/RedactoPrivacyCenter/settings/hooks.ts
|
|
15437
|
-
var
|
|
15510
|
+
var import_react30 = require("react");
|
|
15438
15511
|
var import_react_i18next5 = require("react-i18next");
|
|
15439
15512
|
|
|
15440
15513
|
// src/RedactoPrivacyCenter/components/SideMenuBarPC/constants.tsx
|
|
@@ -15466,7 +15539,7 @@ var menuItemsPC = [
|
|
|
15466
15539
|
// src/RedactoPrivacyCenter/settings/hooks.ts
|
|
15467
15540
|
var useIsSectionEnabled = () => {
|
|
15468
15541
|
const { portal } = usePrivacyCenterSettings();
|
|
15469
|
-
return (0,
|
|
15542
|
+
return (0, import_react30.useCallback)(
|
|
15470
15543
|
(key) => {
|
|
15471
15544
|
var _a, _b;
|
|
15472
15545
|
return (_b = (_a = portal.sections.find((section) => section.key === key)) == null ? void 0 : _a.enabled) != null ? _b : true;
|
|
@@ -15477,7 +15550,7 @@ var useIsSectionEnabled = () => {
|
|
|
15477
15550
|
var useMenuItemsPC = () => {
|
|
15478
15551
|
const { t } = (0, import_react_i18next5.useTranslation)();
|
|
15479
15552
|
const { portal } = usePrivacyCenterSettings();
|
|
15480
|
-
return (0,
|
|
15553
|
+
return (0, import_react30.useMemo)(
|
|
15481
15554
|
() => portal.sections.filter((section) => section.enabled).flatMap((section) => {
|
|
15482
15555
|
var _a;
|
|
15483
15556
|
const item = menuItemsPC.find((candidate) => candidate.href === section.key);
|
|
@@ -15488,14 +15561,14 @@ var useMenuItemsPC = () => {
|
|
|
15488
15561
|
};
|
|
15489
15562
|
var useLanguageOptions = () => {
|
|
15490
15563
|
const { languages } = usePrivacyCenterSettings();
|
|
15491
|
-
return (0,
|
|
15564
|
+
return (0, import_react30.useMemo)(() => {
|
|
15492
15565
|
const options = languageOptions.filter((option2) => languages.enabled.includes(option2.value));
|
|
15493
15566
|
return { options, showSwitcher: languages.show_switcher && options.length >= 2 };
|
|
15494
15567
|
}, [languages]);
|
|
15495
15568
|
};
|
|
15496
15569
|
|
|
15497
15570
|
// src/RedactoPrivacyCenter/components/NotificationHub/NotificationBell.tsx
|
|
15498
|
-
var
|
|
15571
|
+
var import_react32 = require("react");
|
|
15499
15572
|
var import_react_i18next9 = require("react-i18next");
|
|
15500
15573
|
var import_io53 = require("react-icons/io5");
|
|
15501
15574
|
|
|
@@ -15708,7 +15781,7 @@ var NotificationDropdown = ({
|
|
|
15708
15781
|
};
|
|
15709
15782
|
|
|
15710
15783
|
// src/RedactoPrivacyCenter/components/NotificationHub/useNotificationActions.ts
|
|
15711
|
-
var
|
|
15784
|
+
var import_react31 = require("react");
|
|
15712
15785
|
var useNotificationActions = () => {
|
|
15713
15786
|
var _a;
|
|
15714
15787
|
const { navigateTo, setSelectedCase } = useInternalNavigation();
|
|
@@ -15718,38 +15791,38 @@ var useNotificationActions = () => {
|
|
|
15718
15791
|
const { langParam } = useCurrentLanguage();
|
|
15719
15792
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
15720
15793
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
15721
|
-
const authContext = (0,
|
|
15794
|
+
const authContext = (0, import_react31.useMemo)(() => ({
|
|
15722
15795
|
accessToken,
|
|
15723
15796
|
refreshToken,
|
|
15724
15797
|
onError,
|
|
15725
15798
|
updateTokens
|
|
15726
15799
|
}), [accessToken, refreshToken, onError, updateTokens]);
|
|
15727
|
-
const hasAcknowledgeCTA = (0,
|
|
15800
|
+
const hasAcknowledgeCTA = (0, import_react31.useCallback)((notification) => {
|
|
15728
15801
|
var _a2, _b;
|
|
15729
15802
|
return (_b = (_a2 = notification.ctas) == null ? void 0 : _a2.some((cta) => cta.action_type === "acknowledge")) != null ? _b : false;
|
|
15730
15803
|
}, []);
|
|
15731
|
-
const handleMarkRead = (0,
|
|
15804
|
+
const handleMarkRead = (0, import_react31.useCallback)(async (notificationUuid) => {
|
|
15732
15805
|
if (!organizationId || !workspaceId) {
|
|
15733
15806
|
return false;
|
|
15734
15807
|
}
|
|
15735
15808
|
const result = await markNotificationRead(organizationId, workspaceId, notificationUuid, authContext, consentClient);
|
|
15736
15809
|
return result !== null;
|
|
15737
15810
|
}, [organizationId, workspaceId, authContext, consentClient]);
|
|
15738
|
-
const handleMarkAllRead = (0,
|
|
15811
|
+
const handleMarkAllRead = (0, import_react31.useCallback)(async () => {
|
|
15739
15812
|
if (!organizationId || !workspaceId) {
|
|
15740
15813
|
return false;
|
|
15741
15814
|
}
|
|
15742
15815
|
const result = await markAllRead(organizationId, workspaceId, authContext, consentClient);
|
|
15743
15816
|
return result !== null;
|
|
15744
15817
|
}, [organizationId, workspaceId, authContext, consentClient]);
|
|
15745
|
-
const handleAcknowledge = (0,
|
|
15818
|
+
const handleAcknowledge = (0, import_react31.useCallback)(async (notificationUuid) => {
|
|
15746
15819
|
if (!organizationId || !workspaceId) {
|
|
15747
15820
|
return false;
|
|
15748
15821
|
}
|
|
15749
15822
|
const result = await acknowledgeNotification(organizationId, workspaceId, notificationUuid, authContext, consentClient);
|
|
15750
15823
|
return result !== null;
|
|
15751
15824
|
}, [organizationId, workspaceId, authContext, consentClient]);
|
|
15752
|
-
const handleCTAClick = (0,
|
|
15825
|
+
const handleCTAClick = (0, import_react31.useCallback)(async (notification, cta) => {
|
|
15753
15826
|
var _a2;
|
|
15754
15827
|
if (cta.action_type === "acknowledge") {
|
|
15755
15828
|
const ok = await handleAcknowledge(notification.uuid);
|
|
@@ -15807,11 +15880,11 @@ var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
|
15807
15880
|
var NotificationBell = () => {
|
|
15808
15881
|
const { t } = (0, import_react_i18next9.useTranslation)();
|
|
15809
15882
|
const { langParam } = useCurrentLanguage();
|
|
15810
|
-
const [notifications, setNotifications] = (0,
|
|
15811
|
-
const [unreadCount, setUnreadCount] = (0,
|
|
15812
|
-
const [isRefreshing2, setIsRefreshing] = (0,
|
|
15813
|
-
const pollRef = (0,
|
|
15814
|
-
const tenantRequestRef = (0,
|
|
15883
|
+
const [notifications, setNotifications] = (0, import_react32.useState)([]);
|
|
15884
|
+
const [unreadCount, setUnreadCount] = (0, import_react32.useState)(0);
|
|
15885
|
+
const [isRefreshing2, setIsRefreshing] = (0, import_react32.useState)(false);
|
|
15886
|
+
const pollRef = (0, import_react32.useRef)(null);
|
|
15887
|
+
const tenantRequestRef = (0, import_react32.useRef)(0);
|
|
15815
15888
|
const {
|
|
15816
15889
|
organizationId,
|
|
15817
15890
|
workspaceId,
|
|
@@ -15822,7 +15895,7 @@ var NotificationBell = () => {
|
|
|
15822
15895
|
handleMarkAllRead,
|
|
15823
15896
|
handleCTAClick
|
|
15824
15897
|
} = useNotificationActions();
|
|
15825
|
-
const pollUnreadCount = (0,
|
|
15898
|
+
const pollUnreadCount = (0, import_react32.useCallback)(async () => {
|
|
15826
15899
|
if (!organizationId || !workspaceId) {
|
|
15827
15900
|
return;
|
|
15828
15901
|
}
|
|
@@ -15838,7 +15911,7 @@ var NotificationBell = () => {
|
|
|
15838
15911
|
setUnreadCount(result.count);
|
|
15839
15912
|
}
|
|
15840
15913
|
}, [organizationId, workspaceId, authContext, consentClient]);
|
|
15841
|
-
const loadDropdownNotifications = (0,
|
|
15914
|
+
const loadDropdownNotifications = (0, import_react32.useCallback)(async () => {
|
|
15842
15915
|
if (!organizationId || !workspaceId) {
|
|
15843
15916
|
return;
|
|
15844
15917
|
}
|
|
@@ -15854,7 +15927,7 @@ var NotificationBell = () => {
|
|
|
15854
15927
|
}
|
|
15855
15928
|
}
|
|
15856
15929
|
}, [organizationId, workspaceId, authContext, consentClient, langParam]);
|
|
15857
|
-
(0,
|
|
15930
|
+
(0, import_react32.useEffect)(() => {
|
|
15858
15931
|
tenantRequestRef.current += 1;
|
|
15859
15932
|
setNotifications([]);
|
|
15860
15933
|
setUnreadCount(0);
|
|
@@ -15862,11 +15935,11 @@ var NotificationBell = () => {
|
|
|
15862
15935
|
tenantRequestRef.current += 1;
|
|
15863
15936
|
};
|
|
15864
15937
|
}, [organizationId, workspaceId]);
|
|
15865
|
-
const pollUnreadCountRef = (0,
|
|
15866
|
-
(0,
|
|
15938
|
+
const pollUnreadCountRef = (0, import_react32.useRef)(pollUnreadCount);
|
|
15939
|
+
(0, import_react32.useEffect)(() => {
|
|
15867
15940
|
pollUnreadCountRef.current = pollUnreadCount;
|
|
15868
15941
|
}, [pollUnreadCount]);
|
|
15869
|
-
(0,
|
|
15942
|
+
(0, import_react32.useEffect)(() => {
|
|
15870
15943
|
if (!organizationId || !workspaceId) {
|
|
15871
15944
|
if (pollRef.current) {
|
|
15872
15945
|
clearInterval(pollRef.current);
|
|
@@ -15882,7 +15955,7 @@ var NotificationBell = () => {
|
|
|
15882
15955
|
}
|
|
15883
15956
|
};
|
|
15884
15957
|
}, [organizationId, workspaceId]);
|
|
15885
|
-
const onRefresh = (0,
|
|
15958
|
+
const onRefresh = (0, import_react32.useCallback)(async () => {
|
|
15886
15959
|
setIsRefreshing(true);
|
|
15887
15960
|
try {
|
|
15888
15961
|
await loadDropdownNotifications();
|
|
@@ -15890,7 +15963,7 @@ var NotificationBell = () => {
|
|
|
15890
15963
|
setIsRefreshing(false);
|
|
15891
15964
|
}
|
|
15892
15965
|
}, [loadDropdownNotifications]);
|
|
15893
|
-
const onMarkAllRead = (0,
|
|
15966
|
+
const onMarkAllRead = (0, import_react32.useCallback)(async () => {
|
|
15894
15967
|
const ok = await handleMarkAllRead();
|
|
15895
15968
|
if (!ok) {
|
|
15896
15969
|
return;
|
|
@@ -15898,7 +15971,7 @@ var NotificationBell = () => {
|
|
|
15898
15971
|
setNotifications((prev) => prev.map((n) => ({ ...n, is_read: true })));
|
|
15899
15972
|
setUnreadCount(0);
|
|
15900
15973
|
}, [handleMarkAllRead]);
|
|
15901
|
-
const onNotificationClick = (0,
|
|
15974
|
+
const onNotificationClick = (0, import_react32.useCallback)(async (notification) => {
|
|
15902
15975
|
if (!notification.is_read) {
|
|
15903
15976
|
const ok = await handleMarkRead(notification.uuid);
|
|
15904
15977
|
if (!ok) {
|
|
@@ -15908,7 +15981,7 @@ var NotificationBell = () => {
|
|
|
15908
15981
|
setUnreadCount((prev) => Math.max(0, prev - 1));
|
|
15909
15982
|
}
|
|
15910
15983
|
}, [handleMarkRead]);
|
|
15911
|
-
const onCTAClick = (0,
|
|
15984
|
+
const onCTAClick = (0, import_react32.useCallback)(async (notification, cta) => {
|
|
15912
15985
|
const result = await handleCTAClick(notification, cta);
|
|
15913
15986
|
if (result === "acknowledged") {
|
|
15914
15987
|
setNotifications((prev) => prev.map(
|
|
@@ -15952,28 +16025,28 @@ var NotificationBell = () => {
|
|
|
15952
16025
|
};
|
|
15953
16026
|
|
|
15954
16027
|
// src/RedactoPrivacyCenter/components/AppShell/UserMenu.tsx
|
|
15955
|
-
var
|
|
16028
|
+
var import_react35 = require("react");
|
|
15956
16029
|
var import_lucide_react6 = require("lucide-react");
|
|
15957
16030
|
var import_react_i18next11 = require("react-i18next");
|
|
15958
16031
|
|
|
15959
16032
|
// src/RedactoPrivacyCenter/context/ProfileSwitchContext.tsx
|
|
15960
|
-
var
|
|
15961
|
-
var ProfileSwitchContext = (0,
|
|
16033
|
+
var import_react33 = require("react");
|
|
16034
|
+
var ProfileSwitchContext = (0, import_react33.createContext)({
|
|
15962
16035
|
canSwitch: false,
|
|
15963
16036
|
switchProfile: () => {
|
|
15964
16037
|
}
|
|
15965
16038
|
});
|
|
15966
16039
|
var ProfileSwitchProvider = ProfileSwitchContext.Provider;
|
|
15967
|
-
var useProfileSwitch = () => (0,
|
|
16040
|
+
var useProfileSwitch = () => (0, import_react33.useContext)(ProfileSwitchContext);
|
|
15968
16041
|
|
|
15969
16042
|
// src/RedactoPrivacyCenter/components/AppShell/usePrivacyCenterExitAction.ts
|
|
15970
|
-
var
|
|
16043
|
+
var import_react34 = require("react");
|
|
15971
16044
|
var import_react_i18next10 = require("react-i18next");
|
|
15972
16045
|
var import_lucide_react5 = require("lucide-react");
|
|
15973
16046
|
function usePrivacyCenterExitAction(onBack) {
|
|
15974
16047
|
const { t } = (0, import_react_i18next10.useTranslation)();
|
|
15975
16048
|
const { emitSignOut } = usePrivacyCenterEvents();
|
|
15976
|
-
const handleAction = (0,
|
|
16049
|
+
const handleAction = (0, import_react34.useCallback)(() => {
|
|
15977
16050
|
if (onBack === "back") {
|
|
15978
16051
|
window.history.back();
|
|
15979
16052
|
} else if (onBack === "signout") {
|
|
@@ -16017,8 +16090,8 @@ function UserMenu({ onBack }) {
|
|
|
16017
16090
|
const branding = useBranding();
|
|
16018
16091
|
const { organization } = useOrganization();
|
|
16019
16092
|
const { accessToken } = useAuth();
|
|
16020
|
-
const [email, setEmail] = (0,
|
|
16021
|
-
(0,
|
|
16093
|
+
const [email, setEmail] = (0, import_react35.useState)("");
|
|
16094
|
+
(0, import_react35.useEffect)(() => {
|
|
16022
16095
|
setEmail(readEmail());
|
|
16023
16096
|
}, []);
|
|
16024
16097
|
const { handleAction, label: actionLabel, Icon: ActionIcon } = usePrivacyCenterExitAction(onBack);
|
|
@@ -16208,14 +16281,14 @@ function UserMenu({ onBack }) {
|
|
|
16208
16281
|
}
|
|
16209
16282
|
|
|
16210
16283
|
// src/RedactoPrivacyCenter/components/AppShell/CompactLanguageMenu.tsx
|
|
16211
|
-
var
|
|
16284
|
+
var import_react36 = require("react");
|
|
16212
16285
|
var import_lucide_react7 = require("lucide-react");
|
|
16213
16286
|
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
16214
16287
|
function CompactLanguageMenu({ locale, options, onChange }) {
|
|
16215
16288
|
var _a, _b;
|
|
16216
|
-
const containerRef = (0,
|
|
16217
|
-
const [open, setOpen] = (0,
|
|
16218
|
-
(0,
|
|
16289
|
+
const containerRef = (0, import_react36.useRef)(null);
|
|
16290
|
+
const [open, setOpen] = (0, import_react36.useState)(false);
|
|
16291
|
+
(0, import_react36.useEffect)(() => {
|
|
16219
16292
|
if (!open) return;
|
|
16220
16293
|
const onDocMouseDown = (event) => {
|
|
16221
16294
|
var _a2;
|
|
@@ -16346,7 +16419,7 @@ function CompactLanguageMenu({ locale, options, onChange }) {
|
|
|
16346
16419
|
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
16347
16420
|
var TOP_BAR_LOGO_HEIGHT = 32;
|
|
16348
16421
|
var TOP_BAR_LOGO_MAX_HEIGHT = 40;
|
|
16349
|
-
var TopAppBar = (0,
|
|
16422
|
+
var TopAppBar = (0, import_react37.forwardRef)(function TopAppBar2({ onOpenMobileNav, showHamburger, locale, onLocaleChange, onBack, showNotifications = true }, hamburgerRef) {
|
|
16350
16423
|
var _a, _b;
|
|
16351
16424
|
const { t } = (0, import_react_i18next12.useTranslation)();
|
|
16352
16425
|
const branding = useBranding();
|
|
@@ -16360,7 +16433,7 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16360
16433
|
const displayName = (branding == null ? void 0 : branding.brand_name) || (organization == null ? void 0 : organization.name) || "";
|
|
16361
16434
|
const hasLogoImage = Boolean(branding == null ? void 0 : branding.logo_url);
|
|
16362
16435
|
const logoHeight = brandingSettings.logo_height ? Math.min(brandingSettings.logo_height, TOP_BAR_LOGO_MAX_HEIGHT) : TOP_BAR_LOGO_HEIGHT;
|
|
16363
|
-
const changeLanguage = (0,
|
|
16436
|
+
const changeLanguage = (0, import_react37.useCallback)(
|
|
16364
16437
|
(value) => {
|
|
16365
16438
|
rememberLanguageChoice(value);
|
|
16366
16439
|
void i18n_default.changeLanguage(value);
|
|
@@ -16368,7 +16441,7 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16368
16441
|
},
|
|
16369
16442
|
[onLocaleChange]
|
|
16370
16443
|
);
|
|
16371
|
-
const handleLanguageChange = (0,
|
|
16444
|
+
const handleLanguageChange = (0, import_react37.useCallback)(
|
|
16372
16445
|
(value) => {
|
|
16373
16446
|
const langValue = value;
|
|
16374
16447
|
if (!langValue) return;
|
|
@@ -16519,7 +16592,7 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16519
16592
|
` })
|
|
16520
16593
|
] });
|
|
16521
16594
|
});
|
|
16522
|
-
var HamburgerButton = (0,
|
|
16595
|
+
var HamburgerButton = (0, import_react37.forwardRef)(
|
|
16523
16596
|
function HamburgerButton2({ onClick, label }, ref) {
|
|
16524
16597
|
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
16525
16598
|
PCActionIcon,
|
|
@@ -16541,16 +16614,16 @@ var HamburgerButton = (0, import_react36.forwardRef)(
|
|
|
16541
16614
|
);
|
|
16542
16615
|
|
|
16543
16616
|
// src/RedactoPrivacyCenter/components/AppShell/SidebarNav.tsx
|
|
16544
|
-
var
|
|
16617
|
+
var import_react39 = require("react");
|
|
16545
16618
|
var import_react_i18next13 = require("react-i18next");
|
|
16546
16619
|
var import_lucide_react9 = require("lucide-react");
|
|
16547
16620
|
|
|
16548
16621
|
// src/RedactoPrivacyCenter/components/AppShell/NavItem.tsx
|
|
16549
|
-
var
|
|
16622
|
+
var import_react38 = require("react");
|
|
16550
16623
|
var import_jsx_runtime38 = require("react/jsx-runtime");
|
|
16551
16624
|
function NavItem({ item, mode, onNavigate }) {
|
|
16552
16625
|
const { currentPage, navigateTo } = useInternalNavigation();
|
|
16553
|
-
const [hover, setHover] = (0,
|
|
16626
|
+
const [hover, setHover] = (0, import_react38.useState)(false);
|
|
16554
16627
|
const isCollapsed = mode === "collapsed";
|
|
16555
16628
|
const isActive = item.href ? currentPage === item.href : false;
|
|
16556
16629
|
const isDisabled = !!item.isComingSoon;
|
|
@@ -16721,7 +16794,7 @@ function SidebarNav({ isExpanded, onToggle, className }) {
|
|
|
16721
16794
|
const { t } = (0, import_react_i18next13.useTranslation)();
|
|
16722
16795
|
const menuItems = useMenuItemsPC();
|
|
16723
16796
|
const mode = isExpanded ? "expanded" : "collapsed";
|
|
16724
|
-
const asideStyle = (0,
|
|
16797
|
+
const asideStyle = (0, import_react39.useMemo)(
|
|
16725
16798
|
() => ({
|
|
16726
16799
|
position: "sticky",
|
|
16727
16800
|
top: TOP_BAR_HEIGHT,
|
|
@@ -16738,7 +16811,7 @@ function SidebarNav({ isExpanded, onToggle, className }) {
|
|
|
16738
16811
|
}),
|
|
16739
16812
|
[isExpanded]
|
|
16740
16813
|
);
|
|
16741
|
-
const flatNavItems = (0,
|
|
16814
|
+
const flatNavItems = (0, import_react39.useMemo)(
|
|
16742
16815
|
() => menuItems.filter((item) => Boolean(item.href)),
|
|
16743
16816
|
[menuItems]
|
|
16744
16817
|
);
|
|
@@ -16805,7 +16878,7 @@ function SidebarNav({ isExpanded, onToggle, className }) {
|
|
|
16805
16878
|
}
|
|
16806
16879
|
|
|
16807
16880
|
// src/RedactoPrivacyCenter/components/AppShell/MobileNavDrawer.tsx
|
|
16808
|
-
var
|
|
16881
|
+
var import_react40 = require("react");
|
|
16809
16882
|
var import_react_dom2 = require("react-dom");
|
|
16810
16883
|
var import_react_i18next14 = require("react-i18next");
|
|
16811
16884
|
var import_lucide_react10 = require("lucide-react");
|
|
@@ -16817,17 +16890,17 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
16817
16890
|
const branding = useBranding();
|
|
16818
16891
|
const { organization } = useOrganization();
|
|
16819
16892
|
const displayName = (branding == null ? void 0 : branding.brand_name) || (organization == null ? void 0 : organization.name) || "";
|
|
16820
|
-
const drawerRef = (0,
|
|
16821
|
-
const firstNavRef = (0,
|
|
16893
|
+
const drawerRef = (0, import_react40.useRef)(null);
|
|
16894
|
+
const firstNavRef = (0, import_react40.useRef)(null);
|
|
16822
16895
|
const appearanceAttributes = useAppearanceAttributes();
|
|
16823
16896
|
const scopeAttributes = usePrivacyCenterScopeAttributes();
|
|
16824
16897
|
const isRtl = ((_a = usePrivacyCenterScope()) == null ? void 0 : _a.dir) === "rtl";
|
|
16825
16898
|
const { sheetOverlays } = useAppearanceLayout();
|
|
16826
|
-
const flatNavItems = (0,
|
|
16899
|
+
const flatNavItems = (0, import_react40.useMemo)(
|
|
16827
16900
|
() => menuItems.filter((item) => Boolean(item.href)),
|
|
16828
16901
|
[menuItems]
|
|
16829
16902
|
);
|
|
16830
|
-
(0,
|
|
16903
|
+
(0, import_react40.useEffect)(() => {
|
|
16831
16904
|
if (typeof document === "undefined") return;
|
|
16832
16905
|
if (!isOpen) return;
|
|
16833
16906
|
const previous = document.body.style.overflow;
|
|
@@ -16836,7 +16909,7 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
16836
16909
|
document.body.style.overflow = previous;
|
|
16837
16910
|
};
|
|
16838
16911
|
}, [isOpen]);
|
|
16839
|
-
(0,
|
|
16912
|
+
(0, import_react40.useEffect)(() => {
|
|
16840
16913
|
if (!isOpen || typeof window === "undefined") return;
|
|
16841
16914
|
const onKey = (event) => {
|
|
16842
16915
|
if (event.key === "Escape") {
|
|
@@ -16858,8 +16931,8 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
16858
16931
|
window.clearTimeout(focusTimer);
|
|
16859
16932
|
};
|
|
16860
16933
|
}, [isOpen, onClose]);
|
|
16861
|
-
const wasOpenRef = (0,
|
|
16862
|
-
(0,
|
|
16934
|
+
const wasOpenRef = (0, import_react40.useRef)(false);
|
|
16935
|
+
(0, import_react40.useEffect)(() => {
|
|
16863
16936
|
if (isOpen) {
|
|
16864
16937
|
wasOpenRef.current = true;
|
|
16865
16938
|
return;
|
|
@@ -16872,7 +16945,7 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
16872
16945
|
const t2 = window.setTimeout(() => node.focus(), 0);
|
|
16873
16946
|
return () => window.clearTimeout(t2);
|
|
16874
16947
|
}, [isOpen, returnFocusRef]);
|
|
16875
|
-
const handleNavigate = (0,
|
|
16948
|
+
const handleNavigate = (0, import_react40.useCallback)(() => {
|
|
16876
16949
|
onClose();
|
|
16877
16950
|
}, [onClose]);
|
|
16878
16951
|
const overlayStyle = {
|
|
@@ -17051,25 +17124,25 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
17051
17124
|
var import_react_i18next15 = require("react-i18next");
|
|
17052
17125
|
|
|
17053
17126
|
// src/RedactoPrivacyCenter/context/PageChromeContext.tsx
|
|
17054
|
-
var
|
|
17127
|
+
var import_react41 = require("react");
|
|
17055
17128
|
var import_jsx_runtime41 = require("react/jsx-runtime");
|
|
17056
|
-
var PageChromeContext = (0,
|
|
17129
|
+
var PageChromeContext = (0, import_react41.createContext)(null);
|
|
17057
17130
|
function PageChromeProvider({ children }) {
|
|
17058
|
-
const [pageChromeOverride, setPageChromeOverrideState] = (0,
|
|
17059
|
-
const [headerStatus, setHeaderStatusState] = (0,
|
|
17060
|
-
const setPageChromeOverride = (0,
|
|
17131
|
+
const [pageChromeOverride, setPageChromeOverrideState] = (0, import_react41.useState)(null);
|
|
17132
|
+
const [headerStatus, setHeaderStatusState] = (0, import_react41.useState)(null);
|
|
17133
|
+
const setPageChromeOverride = (0, import_react41.useCallback)(
|
|
17061
17134
|
(override) => {
|
|
17062
17135
|
setPageChromeOverrideState(override);
|
|
17063
17136
|
},
|
|
17064
17137
|
[]
|
|
17065
17138
|
);
|
|
17066
|
-
const clearPageChromeOverride = (0,
|
|
17139
|
+
const clearPageChromeOverride = (0, import_react41.useCallback)(() => {
|
|
17067
17140
|
setPageChromeOverrideState(null);
|
|
17068
17141
|
}, []);
|
|
17069
|
-
const setHeaderStatus = (0,
|
|
17142
|
+
const setHeaderStatus = (0, import_react41.useCallback)((status) => {
|
|
17070
17143
|
setHeaderStatusState(status);
|
|
17071
17144
|
}, []);
|
|
17072
|
-
const value = (0,
|
|
17145
|
+
const value = (0, import_react41.useMemo)(
|
|
17073
17146
|
() => ({
|
|
17074
17147
|
pageChromeOverride,
|
|
17075
17148
|
setPageChromeOverride,
|
|
@@ -17088,7 +17161,7 @@ function PageChromeProvider({ children }) {
|
|
|
17088
17161
|
return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(PageChromeContext.Provider, { value, children });
|
|
17089
17162
|
}
|
|
17090
17163
|
function usePageChrome() {
|
|
17091
|
-
const context = (0,
|
|
17164
|
+
const context = (0, import_react41.useContext)(PageChromeContext);
|
|
17092
17165
|
if (!context) {
|
|
17093
17166
|
throw new Error("usePageChrome must be used within a PageChromeProvider");
|
|
17094
17167
|
}
|
|
@@ -17385,27 +17458,27 @@ function AppShell({
|
|
|
17385
17458
|
}) {
|
|
17386
17459
|
const { t } = (0, import_react_i18next18.useTranslation)();
|
|
17387
17460
|
const sidebar = useSidebarState();
|
|
17388
|
-
const [locale, setLocale] = (0,
|
|
17389
|
-
const [isMobileNavOpen, setMobileNavOpen] = (0,
|
|
17390
|
-
const hamburgerRef = (0,
|
|
17461
|
+
const [locale, setLocale] = (0, import_react42.useState)(i18n_default.language);
|
|
17462
|
+
const [isMobileNavOpen, setMobileNavOpen] = (0, import_react42.useState)(false);
|
|
17463
|
+
const hamburgerRef = (0, import_react42.useRef)(null);
|
|
17391
17464
|
const appearanceAttributes = useAppearanceAttributes();
|
|
17392
17465
|
const isMobile = useMediaQuery("(max-width: 639px)");
|
|
17393
17466
|
const { status } = useDataAvailability();
|
|
17394
17467
|
const hideNav = status !== "has-data";
|
|
17395
|
-
(0,
|
|
17468
|
+
(0, import_react42.useEffect)(() => {
|
|
17396
17469
|
if (!isMobile && isMobileNavOpen) setMobileNavOpen(false);
|
|
17397
17470
|
}, [isMobile, isMobileNavOpen]);
|
|
17398
|
-
(0,
|
|
17471
|
+
(0, import_react42.useEffect)(() => {
|
|
17399
17472
|
const onChange = () => setLocale(i18n_default.language);
|
|
17400
17473
|
i18n_default.on("languageChanged", onChange);
|
|
17401
17474
|
return () => i18n_default.off("languageChanged", onChange);
|
|
17402
17475
|
}, []);
|
|
17403
|
-
const handleSidebarToggle = (0,
|
|
17476
|
+
const handleSidebarToggle = (0, import_react42.useCallback)(() => {
|
|
17404
17477
|
sidebar.toggle();
|
|
17405
17478
|
}, [sidebar]);
|
|
17406
17479
|
useKeyboardShortcut(
|
|
17407
17480
|
{ key: "b", mod: true },
|
|
17408
|
-
(0,
|
|
17481
|
+
(0, import_react42.useCallback)(() => {
|
|
17409
17482
|
if (isMobile) setMobileNavOpen((prev) => !prev);
|
|
17410
17483
|
else sidebar.toggle();
|
|
17411
17484
|
}, [isMobile, sidebar])
|
|
@@ -17439,7 +17512,7 @@ function AppShell({
|
|
|
17439
17512
|
boxSizing: "border-box"
|
|
17440
17513
|
};
|
|
17441
17514
|
return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(LocaleContext.Provider, { value: { locale, setLocale }, children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
17442
|
-
|
|
17515
|
+
import_react42.Suspense,
|
|
17443
17516
|
{
|
|
17444
17517
|
fallback: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
17445
17518
|
"div",
|
|
@@ -17599,7 +17672,7 @@ function AppShell({
|
|
|
17599
17672
|
}
|
|
17600
17673
|
|
|
17601
17674
|
// src/RedactoPrivacyCenter/components/SelectUserGate.tsx
|
|
17602
|
-
var
|
|
17675
|
+
var import_react43 = require("react");
|
|
17603
17676
|
var import_react_i18next20 = require("react-i18next");
|
|
17604
17677
|
|
|
17605
17678
|
// src/RedactoPrivacyCenter/components/SelectUser.tsx
|
|
@@ -17661,12 +17734,12 @@ var SelectUserGate = ({ children }) => {
|
|
|
17661
17734
|
const workspaceId = ((_b = (_a = organization == null ? void 0 : organization.workspaces) == null ? void 0 : _a[0]) == null ? void 0 : _b.uuid) || "";
|
|
17662
17735
|
const { consentClient } = useBaseUrl();
|
|
17663
17736
|
const { accessToken, updateTokens } = useAuth();
|
|
17664
|
-
const [phase, setPhase] = (0,
|
|
17665
|
-
const [candidates, setCandidates] = (0,
|
|
17666
|
-
const [busyOrgUserId, setBusyOrgUserId] = (0,
|
|
17667
|
-
const [selectError, setSelectError] = (0,
|
|
17737
|
+
const [phase, setPhase] = (0, import_react43.useState)("checking");
|
|
17738
|
+
const [candidates, setCandidates] = (0, import_react43.useState)([]);
|
|
17739
|
+
const [busyOrgUserId, setBusyOrgUserId] = (0, import_react43.useState)(null);
|
|
17740
|
+
const [selectError, setSelectError] = (0, import_react43.useState)(null);
|
|
17668
17741
|
const tokenOrgUserId = ((_d = (_c = decodeJwtToken(accessToken)) == null ? void 0 : _c.user_data) == null ? void 0 : _d.org_user_id) || "";
|
|
17669
|
-
(0,
|
|
17742
|
+
(0, import_react43.useEffect)(() => {
|
|
17670
17743
|
let cancelled = false;
|
|
17671
17744
|
if (isSandboxMode()) {
|
|
17672
17745
|
setPhase("resolved");
|
|
@@ -17740,7 +17813,7 @@ var SelectUserGate = ({ children }) => {
|
|
|
17740
17813
|
setSelectError(t("couldNotSwitchProfile"));
|
|
17741
17814
|
}
|
|
17742
17815
|
};
|
|
17743
|
-
const switchProfile = (0,
|
|
17816
|
+
const switchProfile = (0, import_react43.useCallback)(() => {
|
|
17744
17817
|
if (typeof window !== "undefined") {
|
|
17745
17818
|
sessionStorage.removeItem(PICKED_ORG_USER_KEY);
|
|
17746
17819
|
}
|
|
@@ -17748,7 +17821,7 @@ var SelectUserGate = ({ children }) => {
|
|
|
17748
17821
|
setBusyOrgUserId(null);
|
|
17749
17822
|
setPhase("picking");
|
|
17750
17823
|
}, []);
|
|
17751
|
-
const switchValue = (0,
|
|
17824
|
+
const switchValue = (0, import_react43.useMemo)(
|
|
17752
17825
|
() => ({ canSwitch: candidates.length > 1, switchProfile }),
|
|
17753
17826
|
[candidates.length, switchProfile]
|
|
17754
17827
|
);
|
|
@@ -17772,7 +17845,7 @@ var SelectUserGate = ({ children }) => {
|
|
|
17772
17845
|
};
|
|
17773
17846
|
|
|
17774
17847
|
// src/RedactoPrivacyCenter/components/SignIn/PrivacyCenterSignIn.tsx
|
|
17775
|
-
var
|
|
17848
|
+
var import_react48 = require("react");
|
|
17776
17849
|
var import_react_i18next23 = require("react-i18next");
|
|
17777
17850
|
|
|
17778
17851
|
// src/RedactoPrivacyCenter/utils/toast.ts
|
|
@@ -17936,7 +18009,7 @@ var maskPhone = (phone) => {
|
|
|
17936
18009
|
};
|
|
17937
18010
|
|
|
17938
18011
|
// src/RedactoPrivacyCenter/components/SignIn/ContactStep.tsx
|
|
17939
|
-
var
|
|
18012
|
+
var import_react44 = require("react");
|
|
17940
18013
|
var import_react_i18next21 = require("react-i18next");
|
|
17941
18014
|
|
|
17942
18015
|
// src/RedactoPrivacyCenter/components/SignIn/SignInHeading.tsx
|
|
@@ -18007,8 +18080,8 @@ function ContactStep({
|
|
|
18007
18080
|
const { sign_in: signIn } = usePrivacyCenterSettings();
|
|
18008
18081
|
const branding = useBranding();
|
|
18009
18082
|
const copy = useSettingsCopy();
|
|
18010
|
-
const [value, setValue] = (0,
|
|
18011
|
-
const [countryCode, setCountryCode] = (0,
|
|
18083
|
+
const [value, setValue] = (0, import_react44.useState)(initialValue);
|
|
18084
|
+
const [countryCode, setCountryCode] = (0, import_react44.useState)(initialCountryCode != null ? initialCountryCode : signIn.default_country_code);
|
|
18012
18085
|
const channelCopy = CHANNEL_COPY_KEYS[signIn.channels];
|
|
18013
18086
|
const label = signIn.field_label ? copy(signIn.field_label) : t(channelCopy.fieldLabel);
|
|
18014
18087
|
const placeholder = signIn.placeholder ? copy(signIn.placeholder) : t(channelCopy.placeholder);
|
|
@@ -18103,7 +18176,7 @@ function ContactStep({
|
|
|
18103
18176
|
}
|
|
18104
18177
|
|
|
18105
18178
|
// src/RedactoPrivacyCenter/components/SignIn/OtpStep.tsx
|
|
18106
|
-
var
|
|
18179
|
+
var import_react45 = require("react");
|
|
18107
18180
|
var import_react_i18next22 = require("react-i18next");
|
|
18108
18181
|
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
18109
18182
|
var OTP_LENGTH = 6;
|
|
@@ -18147,8 +18220,8 @@ function OtpStep({
|
|
|
18147
18220
|
const { t } = (0, import_react_i18next22.useTranslation)();
|
|
18148
18221
|
const { sign_in: signIn } = usePrivacyCenterSettings();
|
|
18149
18222
|
const copy = useSettingsCopy();
|
|
18150
|
-
const [digits, setDigits] = (0,
|
|
18151
|
-
const inputs = (0,
|
|
18223
|
+
const [digits, setDigits] = (0, import_react45.useState)([...EMPTY_CODE]);
|
|
18224
|
+
const inputs = (0, import_react45.useRef)([]);
|
|
18152
18225
|
const contactDisplay = channel === "sms" ? maskPhone(contact) : contact;
|
|
18153
18226
|
const description = signIn.otp_description ? copy(signIn.otp_description, { contact: contactDisplay }) : t(channel === "sms" ? "otpDescriptionSms" : "otpDescriptionEmail");
|
|
18154
18227
|
const focus = (index) => {
|
|
@@ -18308,10 +18381,10 @@ var otpErrorKey = (error) => {
|
|
|
18308
18381
|
var import_lucide_react13 = require("lucide-react");
|
|
18309
18382
|
|
|
18310
18383
|
// src/RedactoPrivacyCenter/components/SignIn/useLocaleState.ts
|
|
18311
|
-
var
|
|
18384
|
+
var import_react46 = require("react");
|
|
18312
18385
|
var useLocaleState = () => {
|
|
18313
18386
|
const { currentLanguage } = useCurrentLanguage();
|
|
18314
|
-
const changeLocale = (0,
|
|
18387
|
+
const changeLocale = (0, import_react46.useCallback)((code) => {
|
|
18315
18388
|
rememberLanguageChoice(code);
|
|
18316
18389
|
void i18n_default.changeLanguage(code);
|
|
18317
18390
|
}, []);
|
|
@@ -18601,17 +18674,17 @@ function SignInFrame({ children }) {
|
|
|
18601
18674
|
}
|
|
18602
18675
|
|
|
18603
18676
|
// src/RedactoPrivacyCenter/components/SignIn/useCountdown.ts
|
|
18604
|
-
var
|
|
18677
|
+
var import_react47 = require("react");
|
|
18605
18678
|
var useCountdown = () => {
|
|
18606
|
-
const [remaining, setRemaining] = (0,
|
|
18607
|
-
(0,
|
|
18679
|
+
const [remaining, setRemaining] = (0, import_react47.useState)(0);
|
|
18680
|
+
(0, import_react47.useEffect)(() => {
|
|
18608
18681
|
if (remaining <= 0) {
|
|
18609
18682
|
return void 0;
|
|
18610
18683
|
}
|
|
18611
18684
|
const timer = setTimeout(() => setRemaining((value) => Math.max(0, value - 1)), 1e3);
|
|
18612
18685
|
return () => clearTimeout(timer);
|
|
18613
18686
|
}, [remaining]);
|
|
18614
|
-
const start = (0,
|
|
18687
|
+
const start = (0, import_react47.useCallback)((seconds) => setRemaining(seconds), []);
|
|
18615
18688
|
return { remaining, start };
|
|
18616
18689
|
};
|
|
18617
18690
|
|
|
@@ -18623,9 +18696,8 @@ var INVALID_CONTACT_KEYS = {
|
|
|
18623
18696
|
email: "signInInvalidContactEmail",
|
|
18624
18697
|
sms: "signInInvalidContactSms"
|
|
18625
18698
|
};
|
|
18626
|
-
var seedSession = (
|
|
18699
|
+
var seedSession = (organisationUuid, workspaceUuid, sent) => {
|
|
18627
18700
|
try {
|
|
18628
|
-
sessionStorage.setItem("pc_org_slug", slug);
|
|
18629
18701
|
sessionStorage.setItem("pc_org_id", organisationUuid);
|
|
18630
18702
|
sessionStorage.setItem("pc_workspace_id", workspaceUuid);
|
|
18631
18703
|
if (sent.channel === "email") {
|
|
@@ -18634,23 +18706,22 @@ var seedSession = (slug, organisationUuid, workspaceUuid, sent) => {
|
|
|
18634
18706
|
} catch {
|
|
18635
18707
|
}
|
|
18636
18708
|
};
|
|
18637
|
-
function PrivacyCenterSignIn(
|
|
18709
|
+
function PrivacyCenterSignIn() {
|
|
18638
18710
|
var _a;
|
|
18639
18711
|
const { t } = (0, import_react_i18next23.useTranslation)();
|
|
18640
18712
|
const { settings, organisation } = usePrivacyCenterSettingsContext();
|
|
18641
18713
|
const { consentClient } = useBaseUrl();
|
|
18642
18714
|
const { updateTokens } = useAuth();
|
|
18643
|
-
const [sent, setSent] = (0,
|
|
18644
|
-
const [step, setStep] = (0,
|
|
18645
|
-
const [typedContact, setTypedContact] = (0,
|
|
18646
|
-
const [error, setError] = (0,
|
|
18647
|
-
const [busy, setBusy] = (0,
|
|
18648
|
-
const [resending, setResending] = (0,
|
|
18715
|
+
const [sent, setSent] = (0, import_react48.useState)(null);
|
|
18716
|
+
const [step, setStep] = (0, import_react48.useState)("contact");
|
|
18717
|
+
const [typedContact, setTypedContact] = (0, import_react48.useState)("");
|
|
18718
|
+
const [error, setError] = (0, import_react48.useState)(null);
|
|
18719
|
+
const [busy, setBusy] = (0, import_react48.useState)(false);
|
|
18720
|
+
const [resending, setResending] = (0, import_react48.useState)(false);
|
|
18649
18721
|
const countdown = useCountdown();
|
|
18650
18722
|
const { organisationUuid, workspaceUuid } = organisation;
|
|
18651
18723
|
const orgUnavailable = organisation.status === "failed";
|
|
18652
|
-
const
|
|
18653
|
-
const sendCode = (0, import_react47.useCallback)(
|
|
18724
|
+
const sendCode = (0, import_react48.useCallback)(
|
|
18654
18725
|
async (contact, channel) => {
|
|
18655
18726
|
const response = await consentClient.createOtp(
|
|
18656
18727
|
organisationUuid != null ? organisationUuid : "",
|
|
@@ -18715,7 +18786,7 @@ function PrivacyCenterSignIn({ slug }) {
|
|
|
18715
18786
|
setError(t("otpErrorFallback"));
|
|
18716
18787
|
return;
|
|
18717
18788
|
}
|
|
18718
|
-
seedSession(
|
|
18789
|
+
seedSession(organisationUuid, workspaceUuid, sent);
|
|
18719
18790
|
updateTokens(accessToken, (_a2 = result == null ? void 0 : result.refresh_token) != null ? _a2 : void 0);
|
|
18720
18791
|
} catch (verifyError) {
|
|
18721
18792
|
setError(t(otpErrorKey(verifyError)));
|
|
@@ -18772,7 +18843,7 @@ function PrivacyCenterSignIn({ slug }) {
|
|
|
18772
18843
|
{
|
|
18773
18844
|
initialValue: typedContact,
|
|
18774
18845
|
initialCountryCode: (_a = sent == null ? void 0 : sent.countryCode) != null ? _a : null,
|
|
18775
|
-
busy
|
|
18846
|
+
busy,
|
|
18776
18847
|
disabled: orgUnavailable,
|
|
18777
18848
|
error: error != null ? error : orgUnavailable ? t("signInOrgUnavailable") : null,
|
|
18778
18849
|
onSubmit: (value, countryCode) => void handleContact(value, countryCode),
|
|
@@ -18782,7 +18853,7 @@ function PrivacyCenterSignIn({ slug }) {
|
|
|
18782
18853
|
}
|
|
18783
18854
|
|
|
18784
18855
|
// src/RedactoPrivacyCenter/lib/inactivityTimer.ts
|
|
18785
|
-
var
|
|
18856
|
+
var import_react49 = require("react");
|
|
18786
18857
|
var createInactivityTimer = ({
|
|
18787
18858
|
timeoutMs,
|
|
18788
18859
|
onTimeout,
|
|
@@ -18840,9 +18911,9 @@ var createInactivityTimer = ({
|
|
|
18840
18911
|
var ACTIVITY_EVENTS = ["pointerdown", "pointermove", "keydown", "wheel", "touchstart", "scroll"];
|
|
18841
18912
|
var MS_PER_MINUTE = 6e4;
|
|
18842
18913
|
var useInactivityTimeout = (timeoutMinutes, enabled, onTimeout) => {
|
|
18843
|
-
const latest = (0,
|
|
18914
|
+
const latest = (0, import_react49.useRef)(onTimeout);
|
|
18844
18915
|
latest.current = onTimeout;
|
|
18845
|
-
(0,
|
|
18916
|
+
(0, import_react49.useEffect)(() => {
|
|
18846
18917
|
if (!enabled || !timeoutMinutes || typeof window === "undefined") {
|
|
18847
18918
|
return void 0;
|
|
18848
18919
|
}
|
|
@@ -18880,51 +18951,50 @@ function PrivacyCenterLayout({ settings, ...props }) {
|
|
|
18880
18951
|
}
|
|
18881
18952
|
function PrivacyCenterLayoutContent({
|
|
18882
18953
|
children,
|
|
18883
|
-
slug,
|
|
18954
|
+
slug = "",
|
|
18884
18955
|
onBack
|
|
18885
18956
|
}) {
|
|
18886
18957
|
const { consentClient } = useBaseUrl();
|
|
18887
18958
|
const { accessToken: authAccessToken, sessionExpired, expireSession } = useAuth();
|
|
18888
18959
|
const { settings, builtInSignIn } = usePrivacyCenterSettingsContext();
|
|
18889
18960
|
const { emitReady } = usePrivacyCenterEvents();
|
|
18890
|
-
const [organization, setOrganization] = (0,
|
|
18891
|
-
const [isCheckingAuth, setIsCheckingAuth] = (0,
|
|
18892
|
-
const [isLoadingOrg, setIsLoadingOrg] = (0,
|
|
18893
|
-
const hasRedirectedRef = (0,
|
|
18894
|
-
const authCheckInProgressRef = (0,
|
|
18895
|
-
(0,
|
|
18961
|
+
const [organization, setOrganization] = (0, import_react50.useState)(null);
|
|
18962
|
+
const [isCheckingAuth, setIsCheckingAuth] = (0, import_react50.useState)(true);
|
|
18963
|
+
const [isLoadingOrg, setIsLoadingOrg] = (0, import_react50.useState)(true);
|
|
18964
|
+
const hasRedirectedRef = (0, import_react50.useRef)(false);
|
|
18965
|
+
const authCheckInProgressRef = (0, import_react50.useRef)(false);
|
|
18966
|
+
(0, import_react50.useEffect)(() => {
|
|
18967
|
+
if (slug) warnSlugDeprecated();
|
|
18968
|
+
}, [slug]);
|
|
18969
|
+
(0, import_react50.useEffect)(() => {
|
|
18896
18970
|
if (typeof window === "undefined") return;
|
|
18897
18971
|
let accessToken = sessionStorage.getItem("access_token");
|
|
18898
18972
|
let orgId = sessionStorage.getItem("pc_org_id");
|
|
18899
18973
|
let workspaceId = sessionStorage.getItem("pc_workspace_id");
|
|
18900
|
-
|
|
18901
|
-
if (authAccessToken && (!accessToken || !orgId || !workspaceId || !orgSlug)) {
|
|
18974
|
+
if (authAccessToken && (!accessToken || !orgId || !workspaceId)) {
|
|
18902
18975
|
const decoded = decodeJwtToken(authAccessToken);
|
|
18903
18976
|
if (decoded) {
|
|
18904
18977
|
accessToken = accessToken || authAccessToken;
|
|
18905
18978
|
orgId = orgId || (typeof decoded.organisation_uuid === "string" ? decoded.organisation_uuid : null);
|
|
18906
18979
|
workspaceId = workspaceId || (typeof decoded.workspace_uuid === "string" ? decoded.workspace_uuid : null);
|
|
18907
|
-
orgSlug = orgSlug || (typeof decoded.organisation_slug === "string" ? decoded.organisation_slug : null);
|
|
18908
18980
|
if (accessToken) sessionStorage.setItem("access_token", accessToken);
|
|
18909
18981
|
if (orgId) sessionStorage.setItem("pc_org_id", orgId);
|
|
18910
18982
|
if (workspaceId) sessionStorage.setItem("pc_workspace_id", workspaceId);
|
|
18911
|
-
if (orgSlug) sessionStorage.setItem("pc_org_slug", orgSlug);
|
|
18912
18983
|
const contact = resolveContactFromJwt(decoded);
|
|
18913
18984
|
if (contact) {
|
|
18914
18985
|
sessionStorage.setItem("email", contact);
|
|
18915
18986
|
}
|
|
18916
18987
|
}
|
|
18917
18988
|
}
|
|
18918
|
-
|
|
18919
|
-
if (accessToken && orgId && workspaceId && effectiveSlug) {
|
|
18989
|
+
if (accessToken && orgId && workspaceId) {
|
|
18920
18990
|
const decoded = decodeJwtToken(accessToken);
|
|
18921
18991
|
const orgNameFromJwt = decoded == null ? void 0 : decoded.organisation_name;
|
|
18922
|
-
const orgName = typeof orgNameFromJwt === "string" && orgNameFromJwt.trim() !== "" ? orgNameFromJwt :
|
|
18992
|
+
const orgName = typeof orgNameFromJwt === "string" && orgNameFromJwt.trim() !== "" ? orgNameFromJwt : "";
|
|
18923
18993
|
setOrganization({
|
|
18924
18994
|
uuid: orgId,
|
|
18925
18995
|
suid: "",
|
|
18926
18996
|
name: orgName,
|
|
18927
|
-
slug:
|
|
18997
|
+
slug: "",
|
|
18928
18998
|
description: "",
|
|
18929
18999
|
domain: "",
|
|
18930
19000
|
workspaces: [{
|
|
@@ -18945,8 +19015,8 @@ function PrivacyCenterLayoutContent({
|
|
|
18945
19015
|
setOrganization(null);
|
|
18946
19016
|
setIsLoadingOrg(false);
|
|
18947
19017
|
}
|
|
18948
|
-
}, [
|
|
18949
|
-
(0,
|
|
19018
|
+
}, [authAccessToken]);
|
|
19019
|
+
(0, import_react50.useEffect)(() => {
|
|
18950
19020
|
if (isLoadingOrg || !organization) {
|
|
18951
19021
|
return;
|
|
18952
19022
|
}
|
|
@@ -18958,7 +19028,7 @@ function PrivacyCenterLayoutContent({
|
|
|
18958
19028
|
authCheckInProgressRef.current = true;
|
|
18959
19029
|
try {
|
|
18960
19030
|
await checkAndRefreshAuth(
|
|
18961
|
-
|
|
19031
|
+
"",
|
|
18962
19032
|
organization == null ? void 0 : organization.uuid,
|
|
18963
19033
|
(_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid,
|
|
18964
19034
|
consentClient
|
|
@@ -18972,10 +19042,10 @@ function PrivacyCenterLayoutContent({
|
|
|
18972
19042
|
}
|
|
18973
19043
|
};
|
|
18974
19044
|
checkAuth();
|
|
18975
|
-
}, [
|
|
19045
|
+
}, [organization, isLoadingOrg, consentClient, authAccessToken]);
|
|
18976
19046
|
const showSignIn = builtInSignIn && !isLoadingOrg && !organization;
|
|
18977
19047
|
const showPortal = Boolean(organization) && !isLoadingOrg && !isCheckingAuth;
|
|
18978
|
-
(0,
|
|
19048
|
+
(0, import_react50.useEffect)(() => {
|
|
18979
19049
|
if (showSignIn || showPortal) {
|
|
18980
19050
|
emitReady({ signedIn: showPortal });
|
|
18981
19051
|
}
|
|
@@ -18986,7 +19056,7 @@ function PrivacyCenterLayoutContent({
|
|
|
18986
19056
|
() => expireSession("timeout")
|
|
18987
19057
|
);
|
|
18988
19058
|
if (showSignIn) {
|
|
18989
|
-
return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(PrivacyCenterSignIn, {
|
|
19059
|
+
return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(PrivacyCenterSignIn, {});
|
|
18990
19060
|
}
|
|
18991
19061
|
if (isLoadingOrg || !organization || isCheckingAuth) {
|
|
18992
19062
|
return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { style: {
|
|
@@ -19001,18 +19071,18 @@ function PrivacyCenterLayoutContent({
|
|
|
19001
19071
|
}
|
|
19002
19072
|
|
|
19003
19073
|
// src/RedactoPrivacyCenter/PrivacyCenterHomePage.tsx
|
|
19004
|
-
var
|
|
19074
|
+
var import_react78 = require("react");
|
|
19005
19075
|
|
|
19006
19076
|
// src/RedactoPrivacyCenter/PrivacyCenterConsentManagerPage.tsx
|
|
19007
|
-
var
|
|
19077
|
+
var import_react59 = require("react");
|
|
19008
19078
|
|
|
19009
19079
|
// src/RedactoPrivacyCenter/components/ConsentManager.tsx
|
|
19010
|
-
var
|
|
19080
|
+
var import_react58 = require("react");
|
|
19011
19081
|
var import_react_i18next33 = require("react-i18next");
|
|
19012
19082
|
var import_lucide_react18 = require("lucide-react");
|
|
19013
19083
|
|
|
19014
19084
|
// src/RedactoPrivacyCenter/table/AdvancedTable.tsx
|
|
19015
|
-
var
|
|
19085
|
+
var import_react51 = __toESM(require("react"));
|
|
19016
19086
|
var import_react_i18next24 = require("react-i18next");
|
|
19017
19087
|
var import_react_table = require("@tanstack/react-table");
|
|
19018
19088
|
var import_lodash = require("lodash");
|
|
@@ -19030,7 +19100,7 @@ function AdvancedTable({
|
|
|
19030
19100
|
expandedComponent
|
|
19031
19101
|
}) {
|
|
19032
19102
|
const { t } = (0, import_react_i18next24.useTranslation)();
|
|
19033
|
-
const [hoveredRowId, setHoveredRowId] =
|
|
19103
|
+
const [hoveredRowId, setHoveredRowId] = import_react51.default.useState(null);
|
|
19034
19104
|
if (!table) return null;
|
|
19035
19105
|
return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_jsx_runtime54.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
19036
19106
|
"div",
|
|
@@ -19077,7 +19147,7 @@ function AdvancedTable({
|
|
|
19077
19147
|
onRowClick(row.original, row);
|
|
19078
19148
|
} : void 0;
|
|
19079
19149
|
const rowExpandedComponent = expandedComponent || meta.expandedComponent;
|
|
19080
|
-
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
19150
|
+
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react51.default.Fragment, { children: [
|
|
19081
19151
|
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
19082
19152
|
PCTable.Row,
|
|
19083
19153
|
{
|
|
@@ -19779,7 +19849,7 @@ function AdvancedTablePagination({
|
|
|
19779
19849
|
var import_react_table4 = require("@tanstack/react-table");
|
|
19780
19850
|
|
|
19781
19851
|
// src/RedactoPrivacyCenter/lib/consent-manager/utils.tsx
|
|
19782
|
-
var
|
|
19852
|
+
var import_react52 = require("react");
|
|
19783
19853
|
var import_react_i18next26 = require("react-i18next");
|
|
19784
19854
|
|
|
19785
19855
|
// src/RedactoPrivacyCenter/utils/date.ts
|
|
@@ -19807,7 +19877,7 @@ var CSV_FORMULA_TRIGGERS = ["=", "+", "-", "@", " ", "\r"];
|
|
|
19807
19877
|
var UTF8_BOM = "\uFEFF";
|
|
19808
19878
|
var useStatusOptions = () => {
|
|
19809
19879
|
const { t } = (0, import_react_i18next26.useTranslation)();
|
|
19810
|
-
return (0,
|
|
19880
|
+
return (0, import_react52.useMemo)(
|
|
19811
19881
|
() => [
|
|
19812
19882
|
{ label: t("statusActive"), value: "ACTIVE" /* ACTIVE */ },
|
|
19813
19883
|
{ label: t("statusWithdrawn"), value: "WITHDRAW" /* WITHDRAWN */ },
|
|
@@ -19972,7 +20042,7 @@ var ConsentManagerTableSkeleton = () => {
|
|
|
19972
20042
|
};
|
|
19973
20043
|
|
|
19974
20044
|
// src/RedactoPrivacyCenter/components/ModifyConsentModal.tsx
|
|
19975
|
-
var
|
|
20045
|
+
var import_react53 = require("react");
|
|
19976
20046
|
var import_react_i18next27 = require("react-i18next");
|
|
19977
20047
|
var import_lucide_react14 = require("lucide-react");
|
|
19978
20048
|
var import_pi3 = require("react-icons/pi");
|
|
@@ -19988,11 +20058,11 @@ var ModifyConsentModal = ({
|
|
|
19988
20058
|
const { portal } = usePrivacyCenterSettings();
|
|
19989
20059
|
const copy = useSettingsCopy();
|
|
19990
20060
|
const withdrawWarning = copy(portal.withdraw_warning) || t("revokeConsentWarning");
|
|
19991
|
-
const [isAccordionOpen, setIsAccordionOpen] = (0,
|
|
19992
|
-
const [selectedDataElementUuids, setSelectedDataElementUuids] = (0,
|
|
20061
|
+
const [isAccordionOpen, setIsAccordionOpen] = (0, import_react53.useState)(false);
|
|
20062
|
+
const [selectedDataElementUuids, setSelectedDataElementUuids] = (0, import_react53.useState)([]);
|
|
19993
20063
|
const nominatorInfo = selectedRecord == null ? void 0 : selectedRecord.nominator;
|
|
19994
20064
|
const nominatorLabel = (nominatorInfo == null ? void 0 : nominatorInfo.name) || (nominatorInfo == null ? void 0 : nominatorInfo.email) || (nominatorInfo == null ? void 0 : nominatorInfo.org_user_id) || null;
|
|
19995
|
-
const actionConfig = (0,
|
|
20065
|
+
const actionConfig = (0, import_react53.useMemo)(() => {
|
|
19996
20066
|
if (!selectedRecord) return null;
|
|
19997
20067
|
const status = selectedRecord.status;
|
|
19998
20068
|
if (status === "ACTIVE" /* ACTIVE */) {
|
|
@@ -20025,24 +20095,24 @@ var ModifyConsentModal = ({
|
|
|
20025
20095
|
return null;
|
|
20026
20096
|
}, [selectedRecord, t, nominatorLabel, withdrawWarning]);
|
|
20027
20097
|
const isRegrantAction = (actionConfig == null ? void 0 : actionConfig.action) === "regrant";
|
|
20028
|
-
(0,
|
|
20098
|
+
(0, import_react53.useEffect)(() => {
|
|
20029
20099
|
setIsAccordionOpen(isRegrantAction);
|
|
20030
20100
|
}, [selectedRecord, isRegrantAction]);
|
|
20031
|
-
const regrantEligibleDataElements = (0,
|
|
20101
|
+
const regrantEligibleDataElements = (0, import_react53.useMemo)(
|
|
20032
20102
|
() => ((selectedRecord == null ? void 0 : selectedRecord.data_elements) || []).filter(
|
|
20033
20103
|
(element) => Boolean(element == null ? void 0 : element.uuid) && element.enabled
|
|
20034
20104
|
),
|
|
20035
20105
|
[selectedRecord]
|
|
20036
20106
|
);
|
|
20037
|
-
const requiredDataElementUuids = (0,
|
|
20107
|
+
const requiredDataElementUuids = (0, import_react53.useMemo)(
|
|
20038
20108
|
() => regrantEligibleDataElements.filter((element) => element.required).map((element) => element.uuid),
|
|
20039
20109
|
[regrantEligibleDataElements]
|
|
20040
20110
|
);
|
|
20041
|
-
const requiredDataElementUuidSet = (0,
|
|
20111
|
+
const requiredDataElementUuidSet = (0, import_react53.useMemo)(
|
|
20042
20112
|
() => new Set(requiredDataElementUuids),
|
|
20043
20113
|
[requiredDataElementUuids]
|
|
20044
20114
|
);
|
|
20045
|
-
(0,
|
|
20115
|
+
(0, import_react53.useEffect)(() => {
|
|
20046
20116
|
if (isRegrantAction) {
|
|
20047
20117
|
setSelectedDataElementUuids(regrantEligibleDataElements.map((element) => element.uuid));
|
|
20048
20118
|
return;
|
|
@@ -20239,7 +20309,7 @@ var ModifyConsentModal = ({
|
|
|
20239
20309
|
};
|
|
20240
20310
|
|
|
20241
20311
|
// src/RedactoPrivacyCenter/components/ConsentManagerGroupedColumns.tsx
|
|
20242
|
-
var
|
|
20312
|
+
var import_react54 = require("react");
|
|
20243
20313
|
var import_react_i18next28 = require("react-i18next");
|
|
20244
20314
|
var import_lucide_react15 = require("lucide-react");
|
|
20245
20315
|
var import_react_table2 = require("@tanstack/react-table");
|
|
@@ -20388,7 +20458,7 @@ var ProductAvatar = ({ name, seed }) => {
|
|
|
20388
20458
|
var columnHelper = (0, import_react_table2.createColumnHelper)();
|
|
20389
20459
|
var useConsentManagerGroupedColumns = () => {
|
|
20390
20460
|
const { t } = (0, import_react_i18next28.useTranslation)();
|
|
20391
|
-
return (0,
|
|
20461
|
+
return (0, import_react54.useMemo)(
|
|
20392
20462
|
() => [
|
|
20393
20463
|
columnHelper.display({
|
|
20394
20464
|
id: "expander",
|
|
@@ -20536,7 +20606,7 @@ var useConsentManagerGroupedColumns = () => {
|
|
|
20536
20606
|
};
|
|
20537
20607
|
|
|
20538
20608
|
// src/RedactoPrivacyCenter/components/ConsentManagerColumns.tsx
|
|
20539
|
-
var
|
|
20609
|
+
var import_react55 = require("react");
|
|
20540
20610
|
var import_react_i18next29 = require("react-i18next");
|
|
20541
20611
|
var import_react_table3 = require("@tanstack/react-table");
|
|
20542
20612
|
|
|
@@ -20713,7 +20783,7 @@ var useConsentManagerColumns = ({
|
|
|
20713
20783
|
onOpenModal
|
|
20714
20784
|
}) => {
|
|
20715
20785
|
const { t } = (0, import_react_i18next29.useTranslation)();
|
|
20716
|
-
return (0,
|
|
20786
|
+
return (0, import_react55.useMemo)(
|
|
20717
20787
|
() => [
|
|
20718
20788
|
columnHelper2.accessor("name", {
|
|
20719
20789
|
id: "purpose",
|
|
@@ -20958,21 +21028,21 @@ var ConsentManagerExpandedRow = ({
|
|
|
20958
21028
|
};
|
|
20959
21029
|
|
|
20960
21030
|
// src/RedactoPrivacyCenter/components/ConsentManagerProductCards.tsx
|
|
20961
|
-
var
|
|
21031
|
+
var import_react57 = require("react");
|
|
20962
21032
|
var import_react_i18next31 = require("react-i18next");
|
|
20963
21033
|
var import_dayjs4 = __toESM(require("dayjs"));
|
|
20964
21034
|
var import_relativeTime3 = __toESM(require("dayjs/plugin/relativeTime"));
|
|
20965
21035
|
var import_lucide_react17 = require("lucide-react");
|
|
20966
21036
|
|
|
20967
21037
|
// src/shared/Collapse.tsx
|
|
20968
|
-
var
|
|
21038
|
+
var import_react56 = require("react");
|
|
20969
21039
|
var import_jsx_runtime62 = require("react/jsx-runtime");
|
|
20970
21040
|
var Collapse = ({ open, id, children }) => {
|
|
20971
|
-
const [mounted, setMounted] = (0,
|
|
20972
|
-
const [expanded, setExpanded] = (0,
|
|
20973
|
-
const frameRef = (0,
|
|
20974
|
-
const rootRef = (0,
|
|
20975
|
-
(0,
|
|
21041
|
+
const [mounted, setMounted] = (0, import_react56.useState)(open);
|
|
21042
|
+
const [expanded, setExpanded] = (0, import_react56.useState)(open);
|
|
21043
|
+
const frameRef = (0, import_react56.useRef)(null);
|
|
21044
|
+
const rootRef = (0, import_react56.useRef)(null);
|
|
21045
|
+
(0, import_react56.useEffect)(() => {
|
|
20976
21046
|
if (open) {
|
|
20977
21047
|
setMounted(true);
|
|
20978
21048
|
frameRef.current = requestAnimationFrame(() => {
|
|
@@ -21105,11 +21175,11 @@ function ConsentManagerProductCards({
|
|
|
21105
21175
|
cardKeyFor
|
|
21106
21176
|
}) {
|
|
21107
21177
|
const { t } = (0, import_react_i18next31.useTranslation)();
|
|
21108
|
-
const [expandedCards, setExpandedCards] = (0,
|
|
21178
|
+
const [expandedCards, setExpandedCards] = (0, import_react57.useState)({});
|
|
21109
21179
|
const handleToggle = (key) => {
|
|
21110
21180
|
setExpandedCards((prev) => ({ ...prev, [key]: !prev[key] }));
|
|
21111
21181
|
};
|
|
21112
|
-
const getStatusItems = (0,
|
|
21182
|
+
const getStatusItems = (0, import_react57.useMemo)(
|
|
21113
21183
|
() => (group) => {
|
|
21114
21184
|
const items = [];
|
|
21115
21185
|
if (group.active_purposes > 0) {
|
|
@@ -21354,69 +21424,69 @@ function ConsentManager({ variant }) {
|
|
|
21354
21424
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
21355
21425
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
21356
21426
|
const contact = sessionStorage.getItem("email") || "";
|
|
21357
|
-
const authContext = (0,
|
|
21427
|
+
const authContext = (0, import_react58.useMemo)(() => ({
|
|
21358
21428
|
accessToken,
|
|
21359
21429
|
refreshToken,
|
|
21360
21430
|
onError,
|
|
21361
21431
|
updateTokens
|
|
21362
21432
|
}), [accessToken, refreshToken, onError, updateTokens]);
|
|
21363
21433
|
const { langParam } = useCurrentLanguage();
|
|
21364
|
-
const [activeTab, setActiveTab] = (0,
|
|
21365
|
-
const [viewMode, setViewMode] = (0,
|
|
21366
|
-
const [consentDetail, setConsentDetail] = (0,
|
|
21367
|
-
const [consentGroups, setConsentGroups] = (0,
|
|
21368
|
-
const [consentRows, setConsentRows] = (0,
|
|
21369
|
-
const [isLoading, setIsLoading] = (0,
|
|
21370
|
-
const [searchQuery, setSearchQuery] = (0,
|
|
21371
|
-
const [debouncedSearch, setDebouncedSearch] = (0,
|
|
21372
|
-
const [statusFilter, setStatusFilter] = (0,
|
|
21434
|
+
const [activeTab, setActiveTab] = (0, import_react58.useState)("direct");
|
|
21435
|
+
const [viewMode, setViewMode] = (0, import_react58.useState)("product");
|
|
21436
|
+
const [consentDetail, setConsentDetail] = (0, import_react58.useState)(null);
|
|
21437
|
+
const [consentGroups, setConsentGroups] = (0, import_react58.useState)([]);
|
|
21438
|
+
const [consentRows, setConsentRows] = (0, import_react58.useState)([]);
|
|
21439
|
+
const [isLoading, setIsLoading] = (0, import_react58.useState)(true);
|
|
21440
|
+
const [searchQuery, setSearchQuery] = (0, import_react58.useState)("");
|
|
21441
|
+
const [debouncedSearch, setDebouncedSearch] = (0, import_react58.useState)("");
|
|
21442
|
+
const [statusFilter, setStatusFilter] = (0, import_react58.useState)(
|
|
21373
21443
|
null
|
|
21374
21444
|
);
|
|
21375
|
-
const [productFilter, setProductFilter] = (0,
|
|
21376
|
-
const [productOptions, setProductOptions] = (0,
|
|
21445
|
+
const [productFilter, setProductFilter] = (0, import_react58.useState)(null);
|
|
21446
|
+
const [productOptions, setProductOptions] = (0, import_react58.useState)(
|
|
21377
21447
|
[]
|
|
21378
21448
|
);
|
|
21379
|
-
const [isModalOpen, setIsModalOpen] = (0,
|
|
21380
|
-
const [selectedRecord, setSelectedRecord] = (0,
|
|
21449
|
+
const [isModalOpen, setIsModalOpen] = (0, import_react58.useState)(false);
|
|
21450
|
+
const [selectedRecord, setSelectedRecord] = (0, import_react58.useState)(
|
|
21381
21451
|
null
|
|
21382
21452
|
);
|
|
21383
|
-
const [exportModal, setExportModal] = (0,
|
|
21384
|
-
const [isManageLoading, setIsManageLoading] = (0,
|
|
21385
|
-
const [currentPage, setCurrentPage] = (0,
|
|
21386
|
-
const [pageSize, setPageSize] = (0,
|
|
21387
|
-
const [expanded, setExpanded] = (0,
|
|
21388
|
-
const [extraPurposesByKey, setExtraPurposesByKey] = (0,
|
|
21389
|
-
const [hasMoreByKey, setHasMoreByKey] = (0,
|
|
21390
|
-
const [loadingMoreByKey, setLoadingMoreByKey] = (0,
|
|
21391
|
-
const composedSearchPlaceholder = (0,
|
|
21453
|
+
const [exportModal, setExportModal] = (0, import_react58.useState)(false);
|
|
21454
|
+
const [isManageLoading, setIsManageLoading] = (0, import_react58.useState)(false);
|
|
21455
|
+
const [currentPage, setCurrentPage] = (0, import_react58.useState)(DEFAULT_PAGE);
|
|
21456
|
+
const [pageSize, setPageSize] = (0, import_react58.useState)(DEFAULT_PAGE_SIZE);
|
|
21457
|
+
const [expanded, setExpanded] = (0, import_react58.useState)({});
|
|
21458
|
+
const [extraPurposesByKey, setExtraPurposesByKey] = (0, import_react58.useState)({});
|
|
21459
|
+
const [hasMoreByKey, setHasMoreByKey] = (0, import_react58.useState)({});
|
|
21460
|
+
const [loadingMoreByKey, setLoadingMoreByKey] = (0, import_react58.useState)({});
|
|
21461
|
+
const composedSearchPlaceholder = (0, import_react58.useMemo)(
|
|
21392
21462
|
() => `${t("search")} ${t("consent")}, ${t("product")}, ${t("purpose")}...`,
|
|
21393
21463
|
[t]
|
|
21394
21464
|
);
|
|
21395
|
-
const allStatusOption = (0,
|
|
21465
|
+
const allStatusOption = (0, import_react58.useMemo)(
|
|
21396
21466
|
() => ({
|
|
21397
21467
|
label: `${t("all")} ${t("status")}`,
|
|
21398
21468
|
value: "__all__"
|
|
21399
21469
|
}),
|
|
21400
21470
|
[t]
|
|
21401
21471
|
);
|
|
21402
|
-
const allProductOption = (0,
|
|
21472
|
+
const allProductOption = (0, import_react58.useMemo)(
|
|
21403
21473
|
() => ({
|
|
21404
21474
|
label: `${t("all")} ${t("product")}`,
|
|
21405
21475
|
value: "__all__"
|
|
21406
21476
|
}),
|
|
21407
21477
|
[t]
|
|
21408
21478
|
);
|
|
21409
|
-
const statusFilterOptions = (0,
|
|
21479
|
+
const statusFilterOptions = (0, import_react58.useMemo)(
|
|
21410
21480
|
() => [allStatusOption, ...statusOptions],
|
|
21411
21481
|
[allStatusOption, statusOptions]
|
|
21412
21482
|
);
|
|
21413
|
-
const productFilterOptions = (0,
|
|
21483
|
+
const productFilterOptions = (0, import_react58.useMemo)(
|
|
21414
21484
|
() => [allProductOption, ...productOptions],
|
|
21415
21485
|
[allProductOption, productOptions]
|
|
21416
21486
|
);
|
|
21417
21487
|
const statusSelectValue = statusFilter != null ? statusFilter : allStatusOption;
|
|
21418
21488
|
const productSelectValue = productFilter != null ? productFilter : allProductOption;
|
|
21419
|
-
(0,
|
|
21489
|
+
(0, import_react58.useEffect)(() => {
|
|
21420
21490
|
if (statusFilter) {
|
|
21421
21491
|
const updated = statusOptions.find((opt) => opt.value === statusFilter.value);
|
|
21422
21492
|
if (updated && updated.label !== statusFilter.label) {
|
|
@@ -21424,7 +21494,7 @@ function ConsentManager({ variant }) {
|
|
|
21424
21494
|
}
|
|
21425
21495
|
}
|
|
21426
21496
|
}, [statusOptions, statusFilter]);
|
|
21427
|
-
(0,
|
|
21497
|
+
(0, import_react58.useEffect)(() => {
|
|
21428
21498
|
if (productFilter) {
|
|
21429
21499
|
const updated = productOptions.find((opt) => opt.value === productFilter.value);
|
|
21430
21500
|
if (updated && updated.label !== productFilter.label) {
|
|
@@ -21432,7 +21502,7 @@ function ConsentManager({ variant }) {
|
|
|
21432
21502
|
}
|
|
21433
21503
|
}
|
|
21434
21504
|
}, [productOptions, productFilter]);
|
|
21435
|
-
(0,
|
|
21505
|
+
(0, import_react58.useEffect)(() => {
|
|
21436
21506
|
const status = consentDetail == null ? void 0 : consentDetail.user_status;
|
|
21437
21507
|
if (status === "TRANSFERRED") {
|
|
21438
21508
|
setHeaderStatus({ label: t("statusTransferred"), variant: "warning" });
|
|
@@ -21443,25 +21513,25 @@ function ConsentManager({ variant }) {
|
|
|
21443
21513
|
}
|
|
21444
21514
|
return () => setHeaderStatus(null);
|
|
21445
21515
|
}, [consentDetail == null ? void 0 : consentDetail.user_status, setHeaderStatus, t]);
|
|
21446
|
-
(0,
|
|
21516
|
+
(0, import_react58.useEffect)(() => {
|
|
21447
21517
|
const timer = setTimeout(() => {
|
|
21448
21518
|
setDebouncedSearch(searchQuery);
|
|
21449
21519
|
}, SEARCH_DEBOUNCE_DELAY);
|
|
21450
21520
|
return () => clearTimeout(timer);
|
|
21451
21521
|
}, [searchQuery]);
|
|
21452
|
-
const handleOpenModal = (0,
|
|
21522
|
+
const handleOpenModal = (0, import_react58.useCallback)((record) => {
|
|
21453
21523
|
setSelectedRecord(record);
|
|
21454
21524
|
setIsModalOpen(true);
|
|
21455
21525
|
}, []);
|
|
21456
|
-
const getCardKey = (0,
|
|
21526
|
+
const getCardKey = (0, import_react58.useCallback)(
|
|
21457
21527
|
(group) => group.nominator ? `nominated:${group.nominator.uuid}:${group.product_uuid}` : `direct:${group.product_uuid}`,
|
|
21458
21528
|
[]
|
|
21459
21529
|
);
|
|
21460
|
-
const handleCloseModal = (0,
|
|
21530
|
+
const handleCloseModal = (0, import_react58.useCallback)(() => {
|
|
21461
21531
|
setIsModalOpen(false);
|
|
21462
21532
|
setSelectedRecord(null);
|
|
21463
21533
|
}, []);
|
|
21464
|
-
const matchesPurpose = (0,
|
|
21534
|
+
const matchesPurpose = (0, import_react58.useCallback)(
|
|
21465
21535
|
(purpose, group, normalizedSearch, statusValue) => {
|
|
21466
21536
|
var _a2;
|
|
21467
21537
|
const matchesSearch = !normalizedSearch || [
|
|
@@ -21477,7 +21547,7 @@ function ConsentManager({ variant }) {
|
|
|
21477
21547
|
},
|
|
21478
21548
|
[]
|
|
21479
21549
|
);
|
|
21480
|
-
const buildDisplayGroups = (0,
|
|
21550
|
+
const buildDisplayGroups = (0, import_react58.useCallback)(
|
|
21481
21551
|
(groups, search, statusValue, productUuid) => {
|
|
21482
21552
|
if (!groups || groups.length === 0) return [];
|
|
21483
21553
|
const normalizedSearch = search.trim().toLowerCase();
|
|
@@ -21534,7 +21604,7 @@ function ConsentManager({ variant }) {
|
|
|
21534
21604
|
},
|
|
21535
21605
|
[matchesPurpose]
|
|
21536
21606
|
);
|
|
21537
|
-
const flattenProductGroups = (0,
|
|
21607
|
+
const flattenProductGroups = (0, import_react58.useCallback)(
|
|
21538
21608
|
(groups) => {
|
|
21539
21609
|
if (!groups || groups.length === 0) return [];
|
|
21540
21610
|
return groups.flatMap(
|
|
@@ -21549,7 +21619,7 @@ function ConsentManager({ variant }) {
|
|
|
21549
21619
|
},
|
|
21550
21620
|
[]
|
|
21551
21621
|
);
|
|
21552
|
-
const filterConsentRows = (0,
|
|
21622
|
+
const filterConsentRows = (0, import_react58.useCallback)(
|
|
21553
21623
|
(rows, search, statusValue, productUuid) => {
|
|
21554
21624
|
const normalizedSearch = search.trim().toLowerCase();
|
|
21555
21625
|
return rows.filter((row) => {
|
|
@@ -21571,7 +21641,7 @@ function ConsentManager({ variant }) {
|
|
|
21571
21641
|
},
|
|
21572
21642
|
[]
|
|
21573
21643
|
);
|
|
21574
|
-
const buildProductOptionsFromGroups = (0,
|
|
21644
|
+
const buildProductOptionsFromGroups = (0, import_react58.useCallback)(
|
|
21575
21645
|
(groups) => {
|
|
21576
21646
|
if (!groups || groups.length === 0) return [];
|
|
21577
21647
|
const productMap = /* @__PURE__ */ new Map();
|
|
@@ -21591,7 +21661,7 @@ function ConsentManager({ variant }) {
|
|
|
21591
21661
|
const purposeColumns = useConsentManagerColumns({
|
|
21592
21662
|
onOpenModal: handleOpenModal
|
|
21593
21663
|
});
|
|
21594
|
-
const groupedTableClassNames = (0,
|
|
21664
|
+
const groupedTableClassNames = (0, import_react58.useMemo)(
|
|
21595
21665
|
() => ({
|
|
21596
21666
|
container: "pc-consent-table-container",
|
|
21597
21667
|
tableClassName: "pc-consent-table",
|
|
@@ -21605,7 +21675,7 @@ function ConsentManager({ variant }) {
|
|
|
21605
21675
|
}),
|
|
21606
21676
|
[]
|
|
21607
21677
|
);
|
|
21608
|
-
const purposeTableClassNames = (0,
|
|
21678
|
+
const purposeTableClassNames = (0, import_react58.useMemo)(
|
|
21609
21679
|
() => ({
|
|
21610
21680
|
container: "pc-consent-table-container",
|
|
21611
21681
|
tableClassName: "pc-consent-table pc-consent-table-purpose",
|
|
@@ -21617,7 +21687,7 @@ function ConsentManager({ variant }) {
|
|
|
21617
21687
|
}),
|
|
21618
21688
|
[]
|
|
21619
21689
|
);
|
|
21620
|
-
const fetchData = (0,
|
|
21690
|
+
const fetchData = (0, import_react58.useCallback)(async () => {
|
|
21621
21691
|
if (!organizationId || !workspaceId) {
|
|
21622
21692
|
return;
|
|
21623
21693
|
}
|
|
@@ -21702,15 +21772,15 @@ function ConsentManager({ variant }) {
|
|
|
21702
21772
|
buildProductOptionsFromGroups,
|
|
21703
21773
|
t
|
|
21704
21774
|
]);
|
|
21705
|
-
(0,
|
|
21775
|
+
(0, import_react58.useEffect)(() => {
|
|
21706
21776
|
fetchData();
|
|
21707
21777
|
}, [fetchData]);
|
|
21708
|
-
const groupedPurposeCount = (0,
|
|
21778
|
+
const groupedPurposeCount = (0, import_react58.useMemo)(
|
|
21709
21779
|
() => consentGroups.reduce((sum, group) => sum + group.purposes.length, 0),
|
|
21710
21780
|
[consentGroups]
|
|
21711
21781
|
);
|
|
21712
21782
|
const visibleConsentCount = viewMode === "product" ? groupedPurposeCount : consentRows.length;
|
|
21713
|
-
const visibleProductCount = (0,
|
|
21783
|
+
const visibleProductCount = (0, import_react58.useMemo)(() => {
|
|
21714
21784
|
if (viewMode === "product") {
|
|
21715
21785
|
return consentGroups.length;
|
|
21716
21786
|
}
|
|
@@ -21720,13 +21790,13 @@ function ConsentManager({ variant }) {
|
|
|
21720
21790
|
productIds.delete("");
|
|
21721
21791
|
return productIds.size;
|
|
21722
21792
|
}, [viewMode, consentGroups, consentRows]);
|
|
21723
|
-
const tableTotalCount = (0,
|
|
21793
|
+
const tableTotalCount = (0, import_react58.useMemo)(() => {
|
|
21724
21794
|
var _a2;
|
|
21725
21795
|
const pagination = activeTab === "direct" ? consentDetail == null ? void 0 : consentDetail.direct_pagination : consentDetail == null ? void 0 : consentDetail.nominated_pagination;
|
|
21726
21796
|
return (_a2 = pagination == null ? void 0 : pagination.total_count) != null ? _a2 : 0;
|
|
21727
21797
|
}, [activeTab, consentDetail]);
|
|
21728
21798
|
const tablePageCount = Math.ceil(tableTotalCount / pageSize) || 0;
|
|
21729
|
-
const handlePaginationChange = (0,
|
|
21799
|
+
const handlePaginationChange = (0, import_react58.useCallback)(
|
|
21730
21800
|
(updater) => {
|
|
21731
21801
|
const next = typeof updater === "function" ? updater({ pageIndex: currentPage - 1, pageSize }) : updater;
|
|
21732
21802
|
const nextPage = next.pageIndex + 1;
|
|
@@ -21826,7 +21896,7 @@ function ConsentManager({ variant }) {
|
|
|
21826
21896
|
setCurrentPage(DEFAULT_PAGE);
|
|
21827
21897
|
setExpanded({});
|
|
21828
21898
|
};
|
|
21829
|
-
const handleExport = (0,
|
|
21899
|
+
const handleExport = (0, import_react58.useCallback)(() => {
|
|
21830
21900
|
const toRow = (purpose, productName) => {
|
|
21831
21901
|
var _a2, _b2;
|
|
21832
21902
|
return {
|
|
@@ -21847,7 +21917,7 @@ function ConsentManager({ variant }) {
|
|
|
21847
21917
|
exportTableToCSV(rows);
|
|
21848
21918
|
setExportModal(false);
|
|
21849
21919
|
}, [viewMode, productTable, purposeTable, t]);
|
|
21850
|
-
const handleLoadMorePurposes = (0,
|
|
21920
|
+
const handleLoadMorePurposes = (0, import_react58.useCallback)(
|
|
21851
21921
|
async (group) => {
|
|
21852
21922
|
var _a2, _b2, _c2;
|
|
21853
21923
|
if (!organizationId || !workspaceId) return;
|
|
@@ -21907,7 +21977,7 @@ function ConsentManager({ variant }) {
|
|
|
21907
21977
|
t
|
|
21908
21978
|
]
|
|
21909
21979
|
);
|
|
21910
|
-
const handleManageConsent = (0,
|
|
21980
|
+
const handleManageConsent = (0, import_react58.useCallback)(
|
|
21911
21981
|
async (purposeId, action, nominatorContact, dataElementUuids, productUuid, nominatorUuid) => {
|
|
21912
21982
|
var _a2, _b2, _c2;
|
|
21913
21983
|
if (!organizationId || !workspaceId || !contact) {
|
|
@@ -22439,7 +22509,7 @@ function WelcomeBanner() {
|
|
|
22439
22509
|
// src/RedactoPrivacyCenter/PrivacyCenterConsentManagerPage.tsx
|
|
22440
22510
|
var import_jsx_runtime67 = require("react/jsx-runtime");
|
|
22441
22511
|
function PrivacyCenterConsentManagerPage() {
|
|
22442
|
-
(0,
|
|
22512
|
+
(0, import_react59.useEffect)(() => {
|
|
22443
22513
|
if (!i18n_default.language) {
|
|
22444
22514
|
i18n_default.changeLanguage("en");
|
|
22445
22515
|
}
|
|
@@ -22451,7 +22521,7 @@ function PrivacyCenterConsentManagerPage() {
|
|
|
22451
22521
|
}
|
|
22452
22522
|
|
|
22453
22523
|
// src/RedactoPrivacyCenter/PrivacyCenterFormPage.tsx
|
|
22454
|
-
var
|
|
22524
|
+
var import_react66 = require("react");
|
|
22455
22525
|
var import_react_i18next45 = require("react-i18next");
|
|
22456
22526
|
var import_io55 = require("react-icons/io5");
|
|
22457
22527
|
|
|
@@ -22571,7 +22641,7 @@ function FormBlockWrapper({
|
|
|
22571
22641
|
|
|
22572
22642
|
// src/RedactoPrivacyCenter/components/Form.tsx
|
|
22573
22643
|
var import_react_query = require("@tanstack/react-query");
|
|
22574
|
-
var
|
|
22644
|
+
var import_react62 = require("react");
|
|
22575
22645
|
var import_react_i18next40 = require("react-i18next");
|
|
22576
22646
|
var import_ai = require("react-icons/ai");
|
|
22577
22647
|
var import_pi4 = require("react-icons/pi");
|
|
@@ -22976,7 +23046,7 @@ function NominationDataSection({
|
|
|
22976
23046
|
}
|
|
22977
23047
|
|
|
22978
23048
|
// src/RedactoPrivacyCenter/components/DataRequest/ProductSelectionSection.tsx
|
|
22979
|
-
var
|
|
23049
|
+
var import_react60 = require("react");
|
|
22980
23050
|
var import_react_i18next37 = require("react-i18next");
|
|
22981
23051
|
var import_jsx_runtime72 = require("react/jsx-runtime");
|
|
22982
23052
|
var getVar18 = (varName) => `var(${varName})`;
|
|
@@ -23055,7 +23125,7 @@ function ProductSelectionSection({
|
|
|
23055
23125
|
const totalGroups = directGroups.length + nominatedGroups.length;
|
|
23056
23126
|
const isSingleGroup = totalGroups === 1;
|
|
23057
23127
|
const singleGroup = isSingleGroup ? (_b = (_a = directGroups[0]) != null ? _a : nominatedGroups[0]) != null ? _b : null : null;
|
|
23058
|
-
(0,
|
|
23128
|
+
(0, import_react60.useEffect)(() => {
|
|
23059
23129
|
if (!singleGroup) {
|
|
23060
23130
|
return;
|
|
23061
23131
|
}
|
|
@@ -23150,7 +23220,7 @@ function ProductSelectionSection({
|
|
|
23150
23220
|
// src/RedactoPrivacyCenter/components/DataRequest/PurposeSelectionSection.tsx
|
|
23151
23221
|
var import_lucide_react19 = require("lucide-react");
|
|
23152
23222
|
var import_react_i18next38 = require("react-i18next");
|
|
23153
|
-
var
|
|
23223
|
+
var import_react61 = require("react");
|
|
23154
23224
|
var import_jsx_runtime73 = require("react/jsx-runtime");
|
|
23155
23225
|
var getVar19 = (varName) => `var(${varName})`;
|
|
23156
23226
|
function PurposeSelectionSection({
|
|
@@ -23161,9 +23231,9 @@ function PurposeSelectionSection({
|
|
|
23161
23231
|
}) {
|
|
23162
23232
|
const isAccess = requestType === "ACCESS" /* ACCESS */;
|
|
23163
23233
|
const isErasure = requestType === "erasure" /* ERASURE */;
|
|
23164
|
-
const [selectAllChecked, setSelectAllChecked] = (0,
|
|
23165
|
-
const [openIndexes, setOpenIndexes] = (0,
|
|
23166
|
-
(0,
|
|
23234
|
+
const [selectAllChecked, setSelectAllChecked] = (0, import_react61.useState)(false);
|
|
23235
|
+
const [openIndexes, setOpenIndexes] = (0, import_react61.useState)([]);
|
|
23236
|
+
(0, import_react61.useEffect)(() => {
|
|
23167
23237
|
setSelectAllChecked(false);
|
|
23168
23238
|
setOpenIndexes([]);
|
|
23169
23239
|
}, [requestType]);
|
|
@@ -23180,7 +23250,7 @@ function PurposeSelectionSection({
|
|
|
23180
23250
|
}));
|
|
23181
23251
|
setPurposes(updated);
|
|
23182
23252
|
};
|
|
23183
|
-
(0,
|
|
23253
|
+
(0, import_react61.useEffect)(() => {
|
|
23184
23254
|
const allSelected = purposes.every(
|
|
23185
23255
|
(p) => p.data_elements.every((de) => de.selected)
|
|
23186
23256
|
);
|
|
@@ -23790,24 +23860,23 @@ function Form({
|
|
|
23790
23860
|
const queryClient = (0, import_react_query.useQueryClient)();
|
|
23791
23861
|
const timePeriodOptions = useTimePeriodOptions();
|
|
23792
23862
|
const { organization } = useOrganization();
|
|
23793
|
-
const orgSlug = (organization == null ? void 0 : organization.slug) || (organization == null ? void 0 : organization.name) || "";
|
|
23794
23863
|
const isCaseManagementContext = typeof window !== "undefined" && window.location.pathname.includes("/case-management");
|
|
23795
|
-
const [requestType, setRequestType] = (0,
|
|
23796
|
-
const [timePeriod, setTimePeriod] = (0,
|
|
23797
|
-
const [isSubmitted, setIsSubmitted] = (0,
|
|
23864
|
+
const [requestType, setRequestType] = (0, import_react62.useState)(null);
|
|
23865
|
+
const [timePeriod, setTimePeriod] = (0, import_react62.useState)("");
|
|
23866
|
+
const [isSubmitted, setIsSubmitted] = (0, import_react62.useState)(false);
|
|
23798
23867
|
const { t } = (0, import_react_i18next40.useTranslation)();
|
|
23799
23868
|
const { accessToken, refreshToken, onError, updateTokens } = useAuth();
|
|
23800
23869
|
const { consentClient, baseUrl } = useBaseUrl();
|
|
23801
23870
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
23802
23871
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
23803
|
-
const authContext = (0,
|
|
23872
|
+
const authContext = (0, import_react62.useMemo)(() => ({
|
|
23804
23873
|
accessToken,
|
|
23805
23874
|
refreshToken,
|
|
23806
23875
|
onError,
|
|
23807
23876
|
updateTokens
|
|
23808
23877
|
}), [accessToken, refreshToken, onError, updateTokens]);
|
|
23809
|
-
const [data, setData] = (0,
|
|
23810
|
-
const [formData, setFormData] = (0,
|
|
23878
|
+
const [data, setData] = (0, import_react62.useState)(null);
|
|
23879
|
+
const [formData, setFormData] = (0, import_react62.useState)({
|
|
23811
23880
|
uuid: "",
|
|
23812
23881
|
case_id: "",
|
|
23813
23882
|
name: "",
|
|
@@ -23818,38 +23887,38 @@ function Form({
|
|
|
23818
23887
|
additionalNote: "",
|
|
23819
23888
|
confirmCheckBox: false
|
|
23820
23889
|
});
|
|
23821
|
-
const [selectedProductKey, setSelectedProductKey] = (0,
|
|
23890
|
+
const [selectedProductKey, setSelectedProductKey] = (0, import_react62.useState)(
|
|
23822
23891
|
null
|
|
23823
23892
|
);
|
|
23824
|
-
const [selectedPurposes, setSelectedPurposes] = (0,
|
|
23825
|
-
const [selectedCorrectionElements, setSelectedCorrectionElements] = (0,
|
|
23826
|
-
const [correctionValues, setCorrectionValues] = (0,
|
|
23827
|
-
const [submittedCase, setSubmittedCase] = (0,
|
|
23893
|
+
const [selectedPurposes, setSelectedPurposes] = (0, import_react62.useState)([]);
|
|
23894
|
+
const [selectedCorrectionElements, setSelectedCorrectionElements] = (0, import_react62.useState)([]);
|
|
23895
|
+
const [correctionValues, setCorrectionValues] = (0, import_react62.useState)({});
|
|
23896
|
+
const [submittedCase, setSubmittedCase] = (0, import_react62.useState)(
|
|
23828
23897
|
null
|
|
23829
23898
|
);
|
|
23830
|
-
const fileInputRef = (0,
|
|
23831
|
-
const englishDataRef = (0,
|
|
23832
|
-
const [uploadedDocumentId, setUploadedDocumentId] = (0,
|
|
23833
|
-
const [uploadedDocuments, setUploadedDocuments] = (0,
|
|
23834
|
-
const [isDocumentUploading, setIsDocumentUploading] = (0,
|
|
23835
|
-
const [isDocument, setIsDocument] = (0,
|
|
23836
|
-
const [isPopupFormEnabled, setIsPopupFormEnabled] = (0,
|
|
23837
|
-
const [isVerifyingContact, setIsVerifyingContact] = (0,
|
|
23899
|
+
const fileInputRef = (0, import_react62.useRef)(null);
|
|
23900
|
+
const englishDataRef = (0, import_react62.useRef)(null);
|
|
23901
|
+
const [uploadedDocumentId, setUploadedDocumentId] = (0, import_react62.useState)([]);
|
|
23902
|
+
const [uploadedDocuments, setUploadedDocuments] = (0, import_react62.useState)([]);
|
|
23903
|
+
const [isDocumentUploading, setIsDocumentUploading] = (0, import_react62.useState)(false);
|
|
23904
|
+
const [isDocument, setIsDocument] = (0, import_react62.useState)(false);
|
|
23905
|
+
const [isPopupFormEnabled, setIsPopupFormEnabled] = (0, import_react62.useState)(!isPopup);
|
|
23906
|
+
const [isVerifyingContact, setIsVerifyingContact] = (0, import_react62.useState)(false);
|
|
23838
23907
|
const requestTypeLabels = useRequestTypeLabels();
|
|
23839
23908
|
const {
|
|
23840
23909
|
settings: { portal },
|
|
23841
23910
|
isCustomised
|
|
23842
23911
|
} = usePrivacyCenterSettingsContext();
|
|
23843
23912
|
const { emitRequestSubmit } = usePrivacyCenterEvents();
|
|
23844
|
-
const [serverRequestTypes, setServerRequestTypes] = (0,
|
|
23845
|
-
const [rawGrievanceOptions, setGrievanceOptions] = (0,
|
|
23913
|
+
const [serverRequestTypes, setServerRequestTypes] = (0, import_react62.useState)(null);
|
|
23914
|
+
const [rawGrievanceOptions, setGrievanceOptions] = (0, import_react62.useState)(
|
|
23846
23915
|
[]
|
|
23847
23916
|
);
|
|
23848
|
-
const grievanceOptions = (0,
|
|
23917
|
+
const grievanceOptions = (0, import_react62.useMemo)(
|
|
23849
23918
|
() => filterGrievanceOptions(rawGrievanceOptions, portal.grievance_categories),
|
|
23850
23919
|
[rawGrievanceOptions, portal.grievance_categories]
|
|
23851
23920
|
);
|
|
23852
|
-
const requestTypeSelectOptions = (0,
|
|
23921
|
+
const requestTypeSelectOptions = (0, import_react62.useMemo)(
|
|
23853
23922
|
() => requestTypeOptions(portal.request_types, serverRequestTypes, !isCustomised).map((option2) => {
|
|
23854
23923
|
var _a2;
|
|
23855
23924
|
return {
|
|
@@ -23859,27 +23928,27 @@ function Form({
|
|
|
23859
23928
|
}),
|
|
23860
23929
|
[portal.request_types, serverRequestTypes, isCustomised, requestTypeLabels]
|
|
23861
23930
|
);
|
|
23862
|
-
(0,
|
|
23931
|
+
(0, import_react62.useEffect)(() => {
|
|
23863
23932
|
if (requestType && !requestTypeSelectOptions.some((option2) => option2.value === requestType)) {
|
|
23864
23933
|
setRequestType(null);
|
|
23865
23934
|
}
|
|
23866
23935
|
}, [requestType, requestTypeSelectOptions]);
|
|
23867
|
-
const [selectedGrievances, setSelectedGrievances] = (0,
|
|
23868
|
-
const [nominationData, setNominationData] = (0,
|
|
23936
|
+
const [selectedGrievances, setSelectedGrievances] = (0, import_react62.useState)({});
|
|
23937
|
+
const [nominationData, setNominationData] = (0, import_react62.useState)({
|
|
23869
23938
|
nominee_email: "",
|
|
23870
23939
|
nominee_mobile: ""
|
|
23871
23940
|
});
|
|
23872
|
-
const [isLoading, setIsLoading] = (0,
|
|
23873
|
-
const [isTranslating, setIsTranslating] = (0,
|
|
23874
|
-
const [isRequestDetailsExpanded, setIsRequestDetailsExpanded] = (0,
|
|
23875
|
-
const [isErasureConsentModalOpen, setIsErasureConsentModalOpen] = (0,
|
|
23876
|
-
const [revokeConsentOnFulfilment, setRevokeConsentOnFulfilment] = (0,
|
|
23941
|
+
const [isLoading, setIsLoading] = (0, import_react62.useState)(false);
|
|
23942
|
+
const [isTranslating, setIsTranslating] = (0, import_react62.useState)(false);
|
|
23943
|
+
const [isRequestDetailsExpanded, setIsRequestDetailsExpanded] = (0, import_react62.useState)(true);
|
|
23944
|
+
const [isErasureConsentModalOpen, setIsErasureConsentModalOpen] = (0, import_react62.useState)(false);
|
|
23945
|
+
const [revokeConsentOnFulfilment, setRevokeConsentOnFulfilment] = (0, import_react62.useState)(false);
|
|
23877
23946
|
const resetFileInput = () => {
|
|
23878
23947
|
if (fileInputRef.current) {
|
|
23879
23948
|
fileInputRef.current.value = "";
|
|
23880
23949
|
}
|
|
23881
23950
|
};
|
|
23882
|
-
const allGroups = (0,
|
|
23951
|
+
const allGroups = (0, import_react62.useMemo)(() => {
|
|
23883
23952
|
var _a2, _b2;
|
|
23884
23953
|
if (!data) {
|
|
23885
23954
|
return [];
|
|
@@ -23898,7 +23967,7 @@ function Form({
|
|
|
23898
23967
|
return [flatGroup];
|
|
23899
23968
|
}, [data, t]);
|
|
23900
23969
|
const skipProductStep = allGroups.length === 1;
|
|
23901
|
-
const selectedGroup = (0,
|
|
23970
|
+
const selectedGroup = (0, import_react62.useMemo)(() => {
|
|
23902
23971
|
var _a2, _b2;
|
|
23903
23972
|
if (selectedProductKey) {
|
|
23904
23973
|
return (_a2 = allGroups.find((g) => productGroupKey(g) === selectedProductKey)) != null ? _a2 : null;
|
|
@@ -23908,13 +23977,13 @@ function Form({
|
|
|
23908
23977
|
}
|
|
23909
23978
|
return null;
|
|
23910
23979
|
}, [allGroups, selectedProductKey, skipProductStep]);
|
|
23911
|
-
const handleProductSelect = (0,
|
|
23980
|
+
const handleProductSelect = (0, import_react62.useCallback)(
|
|
23912
23981
|
(key, _group) => {
|
|
23913
23982
|
setSelectedProductKey(key);
|
|
23914
23983
|
},
|
|
23915
23984
|
[]
|
|
23916
23985
|
);
|
|
23917
|
-
const withUserConsentPickerGroups = (0,
|
|
23986
|
+
const withUserConsentPickerGroups = (0, import_react62.useCallback)(
|
|
23918
23987
|
async (form, language) => {
|
|
23919
23988
|
var _a2, _b2;
|
|
23920
23989
|
if (isPopup || isCaseManagementContext || !organizationId || !workspaceId) {
|
|
@@ -23952,7 +24021,7 @@ function Form({
|
|
|
23952
24021
|
consentClient
|
|
23953
24022
|
]
|
|
23954
24023
|
);
|
|
23955
|
-
const fetchAndApplyTranslations = (0,
|
|
24024
|
+
const fetchAndApplyTranslations = (0, import_react62.useCallback)(async (langValue) => {
|
|
23956
24025
|
if (!organizationId || !workspaceId || !data) {
|
|
23957
24026
|
return;
|
|
23958
24027
|
}
|
|
@@ -24000,7 +24069,7 @@ function Form({
|
|
|
24000
24069
|
setIsTranslating(false);
|
|
24001
24070
|
}
|
|
24002
24071
|
}, [organizationId, workspaceId, data, formData.contact, isPopup, isCaseManagementContext, authContext, consentClient, selectedGrievances, t, withUserConsentPickerGroups, portal.grievance_categories]);
|
|
24003
|
-
(0,
|
|
24072
|
+
(0, import_react62.useEffect)(() => {
|
|
24004
24073
|
if (!skipProductStep) {
|
|
24005
24074
|
setSelectedProductKey(null);
|
|
24006
24075
|
}
|
|
@@ -24016,7 +24085,7 @@ function Form({
|
|
|
24016
24085
|
setSelectedGrievances(resetGrievances);
|
|
24017
24086
|
}
|
|
24018
24087
|
}, [requestType, grievanceOptions, skipProductStep]);
|
|
24019
|
-
(0,
|
|
24088
|
+
(0, import_react62.useEffect)(() => {
|
|
24020
24089
|
if (!skipProductStep) {
|
|
24021
24090
|
return;
|
|
24022
24091
|
}
|
|
@@ -24027,7 +24096,7 @@ function Form({
|
|
|
24027
24096
|
const key = productGroupKey(onlyGroup);
|
|
24028
24097
|
setSelectedProductKey((prev) => prev === key ? prev : key);
|
|
24029
24098
|
}, [skipProductStep, allGroups, requestType]);
|
|
24030
|
-
(0,
|
|
24099
|
+
(0, import_react62.useEffect)(() => {
|
|
24031
24100
|
if (!selectedGroup || !isProductScopedRequestType(requestType)) {
|
|
24032
24101
|
setSelectedPurposes([]);
|
|
24033
24102
|
setSelectedCorrectionElements([]);
|
|
@@ -24038,7 +24107,7 @@ function Form({
|
|
|
24038
24107
|
setSelectedCorrectionElements([]);
|
|
24039
24108
|
setCorrectionValues({});
|
|
24040
24109
|
}, [selectedGroup, requestType]);
|
|
24041
|
-
(0,
|
|
24110
|
+
(0, import_react62.useEffect)(() => {
|
|
24042
24111
|
const handleLanguageChanged = () => {
|
|
24043
24112
|
const lang = i18n_default.language;
|
|
24044
24113
|
if (organizationId && workspaceId && data) {
|
|
@@ -24053,7 +24122,7 @@ function Form({
|
|
|
24053
24122
|
i18n_default.off("languageChanged", handleLanguageChanged);
|
|
24054
24123
|
};
|
|
24055
24124
|
}, [organizationId, workspaceId, data, formData.contact, fetchAndApplyTranslations]);
|
|
24056
|
-
(0,
|
|
24125
|
+
(0, import_react62.useEffect)(() => {
|
|
24057
24126
|
const initializePrivacyCenterForm = async () => {
|
|
24058
24127
|
if (isPopup) {
|
|
24059
24128
|
return;
|
|
@@ -24136,7 +24205,7 @@ function Form({
|
|
|
24136
24205
|
};
|
|
24137
24206
|
void initializePrivacyCenterForm();
|
|
24138
24207
|
}, [organizationId, workspaceId, isPopup, authContext, consentClient, withUserConsentPickerGroups]);
|
|
24139
|
-
const getEnglishDataElementName = (0,
|
|
24208
|
+
const getEnglishDataElementName = (0, import_react62.useCallback)((translatedName) => {
|
|
24140
24209
|
var _a2, _b2, _c2;
|
|
24141
24210
|
if (!((_a2 = englishDataRef.current) == null ? void 0 : _a2.purposes)) {
|
|
24142
24211
|
return translatedName;
|
|
@@ -24162,11 +24231,11 @@ function Form({
|
|
|
24162
24231
|
}
|
|
24163
24232
|
return translatedName;
|
|
24164
24233
|
}, [data]);
|
|
24165
|
-
const selectedErasurePurposeList = (0,
|
|
24234
|
+
const selectedErasurePurposeList = (0, import_react62.useMemo)(
|
|
24166
24235
|
() => selectedPurposes.filter((p) => p.selected || p.data_elements.some((de) => de.selected)).map((p) => p.name).filter(Boolean),
|
|
24167
24236
|
[selectedPurposes]
|
|
24168
24237
|
);
|
|
24169
|
-
const selectedErasurePurposeNames = (0,
|
|
24238
|
+
const selectedErasurePurposeNames = (0, import_react62.useMemo)(() => {
|
|
24170
24239
|
if (selectedErasurePurposeList.length === 0 || selectedErasurePurposeList.length > MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL) {
|
|
24171
24240
|
return t("revokeConsentModalYourPurposes");
|
|
24172
24241
|
}
|
|
@@ -24301,7 +24370,7 @@ function Form({
|
|
|
24301
24370
|
setIsLoading(false);
|
|
24302
24371
|
}
|
|
24303
24372
|
};
|
|
24304
|
-
const isRequestDetailsValid = (0,
|
|
24373
|
+
const isRequestDetailsValid = (0, import_react62.useCallback)(() => {
|
|
24305
24374
|
var _a2, _b2;
|
|
24306
24375
|
if (!requestType) {
|
|
24307
24376
|
return false;
|
|
@@ -24348,7 +24417,7 @@ function Form({
|
|
|
24348
24417
|
grievanceOptions,
|
|
24349
24418
|
nominationData
|
|
24350
24419
|
]);
|
|
24351
|
-
const isFormValid = (0,
|
|
24420
|
+
const isFormValid = (0, import_react62.useMemo)(() => {
|
|
24352
24421
|
var _a2;
|
|
24353
24422
|
return (!isPopup || isPopupFormEnabled) && !!((_a2 = formData.contact) == null ? void 0 : _a2.trim()) && !!requestType && isRequestDetailsValid() && formData.confirmCheckBox;
|
|
24354
24423
|
}, [
|
|
@@ -24381,7 +24450,7 @@ function Form({
|
|
|
24381
24450
|
if (!organizationId || !workspaceId) {
|
|
24382
24451
|
throw new Error("Organization ID and Workspace ID are required for file upload");
|
|
24383
24452
|
}
|
|
24384
|
-
const authToken = await ensureValidToken(organizationId, workspaceId,
|
|
24453
|
+
const authToken = await ensureValidToken(organizationId, workspaceId, void 0, authContext, consentClient);
|
|
24385
24454
|
if (!authToken) {
|
|
24386
24455
|
throw new Error("Authentication token is required for file upload");
|
|
24387
24456
|
}
|
|
@@ -25228,7 +25297,7 @@ function Form({
|
|
|
25228
25297
|
}
|
|
25229
25298
|
|
|
25230
25299
|
// src/RedactoPrivacyCenter/components/CaseHistory.tsx
|
|
25231
|
-
var
|
|
25300
|
+
var import_react65 = require("react");
|
|
25232
25301
|
var import_react_i18next44 = require("react-i18next");
|
|
25233
25302
|
var import_fi3 = require("react-icons/fi");
|
|
25234
25303
|
var import_io54 = require("react-icons/io5");
|
|
@@ -25328,7 +25397,7 @@ var useSubmitDocumentForRequest = (organizationId, workspaceId, caseUuid, authCo
|
|
|
25328
25397
|
var import_react_table7 = require("@tanstack/react-table");
|
|
25329
25398
|
|
|
25330
25399
|
// src/RedactoPrivacyCenter/components/caseHistoryColumns.tsx
|
|
25331
|
-
var
|
|
25400
|
+
var import_react63 = require("react");
|
|
25332
25401
|
var import_react_i18next41 = require("react-i18next");
|
|
25333
25402
|
var import_fi2 = require("react-icons/fi");
|
|
25334
25403
|
var import_react_table5 = require("@tanstack/react-table");
|
|
@@ -25351,7 +25420,7 @@ var getCaseStatusVariant = (status) => {
|
|
|
25351
25420
|
var formatCaseStatus = (s) => s.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
25352
25421
|
var useCaseHistoryColumns = () => {
|
|
25353
25422
|
const { t } = (0, import_react_i18next41.useTranslation)();
|
|
25354
|
-
return (0,
|
|
25423
|
+
return (0, import_react63.useMemo)(
|
|
25355
25424
|
() => [
|
|
25356
25425
|
columnHelper3.accessor("case_id", {
|
|
25357
25426
|
id: "case_id",
|
|
@@ -25475,7 +25544,7 @@ var useCaseHistoryColumns = () => {
|
|
|
25475
25544
|
};
|
|
25476
25545
|
|
|
25477
25546
|
// src/RedactoPrivacyCenter/components/GrievanceTable.tsx
|
|
25478
|
-
var
|
|
25547
|
+
var import_react64 = require("react");
|
|
25479
25548
|
var import_react_i18next42 = require("react-i18next");
|
|
25480
25549
|
var import_react_table6 = require("@tanstack/react-table");
|
|
25481
25550
|
var import_jsx_runtime77 = require("react/jsx-runtime");
|
|
@@ -25491,7 +25560,7 @@ function GrievanceTable({
|
|
|
25491
25560
|
if (!table) return null;
|
|
25492
25561
|
const rowModel = table.getRowModel();
|
|
25493
25562
|
const allRows = rowModel.rows;
|
|
25494
|
-
const paginatedRows = (0,
|
|
25563
|
+
const paginatedRows = (0, import_react64.useMemo)(() => {
|
|
25495
25564
|
const start = pageIndex * pageSize;
|
|
25496
25565
|
const end = start + pageSize;
|
|
25497
25566
|
return allRows.slice(start, end);
|
|
@@ -25943,19 +26012,19 @@ function CaseHistory({ onCreateRequest }) {
|
|
|
25943
26012
|
const { navigateTo, setSelectedCase } = useInternalNavigation();
|
|
25944
26013
|
const grievanceTabs = useGrievanceTabs();
|
|
25945
26014
|
const requestTypeLabels = useRequestTypeLabels();
|
|
25946
|
-
const [activeTab, setActiveTab] = (0,
|
|
25947
|
-
const [searchQuery, setSearchQuery] = (0,
|
|
25948
|
-
const [selectedRequestTypes, setSelectedRequestTypes] = (0,
|
|
26015
|
+
const [activeTab, setActiveTab] = (0, import_react65.useState)(GRIEVANCE_TAB_IDS.ALL);
|
|
26016
|
+
const [searchQuery, setSearchQuery] = (0, import_react65.useState)("");
|
|
26017
|
+
const [selectedRequestTypes, setSelectedRequestTypes] = (0, import_react65.useState)(
|
|
25949
26018
|
Object.values(RequestTypeEnum)
|
|
25950
26019
|
);
|
|
25951
|
-
const [pageIndex, setPageIndex] = (0,
|
|
25952
|
-
const [pageSize, setPageSize] = (0,
|
|
26020
|
+
const [pageIndex, setPageIndex] = (0, import_react65.useState)(0);
|
|
26021
|
+
const [pageSize, setPageSize] = (0, import_react65.useState)(10);
|
|
25953
26022
|
const { organization } = useOrganization();
|
|
25954
26023
|
const { accessToken, refreshToken, onError, updateTokens } = useAuth();
|
|
25955
26024
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
25956
26025
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
25957
26026
|
const contact = typeof window !== "undefined" ? sessionStorage.getItem("email") || "" : "";
|
|
25958
|
-
const authContext = (0,
|
|
26027
|
+
const authContext = (0, import_react65.useMemo)(() => ({
|
|
25959
26028
|
accessToken,
|
|
25960
26029
|
refreshToken,
|
|
25961
26030
|
onError,
|
|
@@ -25967,7 +26036,7 @@ function CaseHistory({ onCreateRequest }) {
|
|
|
25967
26036
|
error,
|
|
25968
26037
|
isError
|
|
25969
26038
|
} = useCaseHistory(organizationId, workspaceId, contact, authContext);
|
|
25970
|
-
const filteredCases = (0,
|
|
26039
|
+
const filteredCases = (0, import_react65.useMemo)(() => {
|
|
25971
26040
|
return (cases || []).filter((item) => {
|
|
25972
26041
|
var _a2, _b, _c, _d, _e, _f, _g, _h;
|
|
25973
26042
|
const statusLower = item.status.toLowerCase();
|
|
@@ -26001,12 +26070,12 @@ function CaseHistory({ onCreateRequest }) {
|
|
|
26001
26070
|
return true;
|
|
26002
26071
|
});
|
|
26003
26072
|
}, [cases, activeTab, selectedRequestTypes, searchQuery]);
|
|
26004
|
-
const handleViewDetails = (0,
|
|
26073
|
+
const handleViewDetails = (0, import_react65.useCallback)((caseRequest) => {
|
|
26005
26074
|
setSelectedCase(caseRequest);
|
|
26006
26075
|
navigateTo("case-details");
|
|
26007
26076
|
}, [navigateTo, setSelectedCase]);
|
|
26008
26077
|
const columns = useCaseHistoryColumns();
|
|
26009
|
-
(0,
|
|
26078
|
+
(0, import_react65.useEffect)(() => {
|
|
26010
26079
|
setPageIndex(0);
|
|
26011
26080
|
}, [activeTab, searchQuery, selectedRequestTypes]);
|
|
26012
26081
|
const table = (0, import_react_table7.useReactTable)({
|
|
@@ -26285,7 +26354,7 @@ var import_jsx_runtime80 = require("react/jsx-runtime");
|
|
|
26285
26354
|
var getVar25 = (varName) => `var(${varName})`;
|
|
26286
26355
|
function PrivacyCenterFormPage() {
|
|
26287
26356
|
const { t } = (0, import_react_i18next45.useTranslation)();
|
|
26288
|
-
const [showForm, setShowForm] = (0,
|
|
26357
|
+
const [showForm, setShowForm] = (0, import_react66.useState)(() => {
|
|
26289
26358
|
try {
|
|
26290
26359
|
return sessionStorage.getItem("pc_grievance_view") === "form";
|
|
26291
26360
|
} catch {
|
|
@@ -26293,18 +26362,18 @@ function PrivacyCenterFormPage() {
|
|
|
26293
26362
|
}
|
|
26294
26363
|
});
|
|
26295
26364
|
const { setPageChromeOverride, clearPageChromeOverride } = usePageChrome();
|
|
26296
|
-
(0,
|
|
26365
|
+
(0, import_react66.useEffect)(() => {
|
|
26297
26366
|
if (!i18n_default.language) {
|
|
26298
26367
|
i18n_default.changeLanguage("en");
|
|
26299
26368
|
}
|
|
26300
26369
|
}, []);
|
|
26301
|
-
(0,
|
|
26370
|
+
(0, import_react66.useEffect)(() => {
|
|
26302
26371
|
try {
|
|
26303
26372
|
sessionStorage.setItem("pc_grievance_view", showForm ? "form" : "list");
|
|
26304
26373
|
} catch {
|
|
26305
26374
|
}
|
|
26306
26375
|
}, [showForm]);
|
|
26307
|
-
(0,
|
|
26376
|
+
(0, import_react66.useEffect)(() => {
|
|
26308
26377
|
if (showForm) {
|
|
26309
26378
|
setPageChromeOverride({
|
|
26310
26379
|
titleKey: "yourPrivacyCenter",
|
|
@@ -26336,15 +26405,15 @@ function PrivacyCenterFormPage() {
|
|
|
26336
26405
|
}
|
|
26337
26406
|
|
|
26338
26407
|
// src/RedactoPrivacyCenter/PrivacyCenterActivityPage.tsx
|
|
26339
|
-
var
|
|
26408
|
+
var import_react69 = require("react");
|
|
26340
26409
|
|
|
26341
26410
|
// src/RedactoPrivacyCenter/components/ActivitiesList.tsx
|
|
26342
|
-
var
|
|
26411
|
+
var import_react68 = require("react");
|
|
26343
26412
|
var import_react_i18next47 = require("react-i18next");
|
|
26344
26413
|
var import_lucide_react22 = require("lucide-react");
|
|
26345
26414
|
|
|
26346
26415
|
// src/RedactoPrivacyCenter/components/ActivityTimeline.tsx
|
|
26347
|
-
var
|
|
26416
|
+
var import_react67 = require("react");
|
|
26348
26417
|
var import_react_i18next46 = require("react-i18next");
|
|
26349
26418
|
var import_dayjs5 = __toESM(require("dayjs"));
|
|
26350
26419
|
var import_lucide_react21 = require("lucide-react");
|
|
@@ -26361,7 +26430,7 @@ function ActivityTimeline({
|
|
|
26361
26430
|
activities
|
|
26362
26431
|
}) {
|
|
26363
26432
|
const { t } = (0, import_react_i18next46.useTranslation)();
|
|
26364
|
-
const groups = (0,
|
|
26433
|
+
const groups = (0, import_react67.useMemo)(() => {
|
|
26365
26434
|
const ordered = [];
|
|
26366
26435
|
const byKey = /* @__PURE__ */ new Map();
|
|
26367
26436
|
for (const activity of activities) {
|
|
@@ -26554,26 +26623,26 @@ function ActivitiesList() {
|
|
|
26554
26623
|
const { consentClient } = useBaseUrl();
|
|
26555
26624
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
26556
26625
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
26557
|
-
const authContext = (0,
|
|
26626
|
+
const authContext = (0, import_react68.useMemo)(() => ({
|
|
26558
26627
|
accessToken,
|
|
26559
26628
|
refreshToken,
|
|
26560
26629
|
onError,
|
|
26561
26630
|
updateTokens
|
|
26562
26631
|
}), [accessToken, refreshToken, onError, updateTokens]);
|
|
26563
26632
|
const { langParam } = useCurrentLanguage();
|
|
26564
|
-
const [activities, setActivities] = (0,
|
|
26565
|
-
const [totalCount, setTotalCount] = (0,
|
|
26566
|
-
const [isLoadingInitial, setIsLoadingInitial] = (0,
|
|
26567
|
-
const [isLoadingMore, setIsLoadingMore] = (0,
|
|
26633
|
+
const [activities, setActivities] = (0, import_react68.useState)([]);
|
|
26634
|
+
const [totalCount, setTotalCount] = (0, import_react68.useState)(0);
|
|
26635
|
+
const [isLoadingInitial, setIsLoadingInitial] = (0, import_react68.useState)(true);
|
|
26636
|
+
const [isLoadingMore, setIsLoadingMore] = (0, import_react68.useState)(false);
|
|
26568
26637
|
const hasMore = activities.length < totalCount;
|
|
26569
|
-
const isFetchingRef = (0,
|
|
26570
|
-
const requestVersionRef = (0,
|
|
26571
|
-
const hasMoreRef = (0,
|
|
26638
|
+
const isFetchingRef = (0, import_react68.useRef)(false);
|
|
26639
|
+
const requestVersionRef = (0, import_react68.useRef)(0);
|
|
26640
|
+
const hasMoreRef = (0, import_react68.useRef)(hasMore);
|
|
26572
26641
|
hasMoreRef.current = hasMore;
|
|
26573
|
-
const countRef = (0,
|
|
26642
|
+
const countRef = (0, import_react68.useRef)(0);
|
|
26574
26643
|
countRef.current = activities.length;
|
|
26575
|
-
const sentinelRef = (0,
|
|
26576
|
-
const fetchPage = (0,
|
|
26644
|
+
const sentinelRef = (0, import_react68.useRef)(null);
|
|
26645
|
+
const fetchPage = (0, import_react68.useCallback)(
|
|
26577
26646
|
async (offset) => {
|
|
26578
26647
|
if (!organizationId || !workspaceId) return null;
|
|
26579
26648
|
return fetchActivities(
|
|
@@ -26588,7 +26657,7 @@ function ActivitiesList() {
|
|
|
26588
26657
|
},
|
|
26589
26658
|
[organizationId, workspaceId, authContext, consentClient, langParam]
|
|
26590
26659
|
);
|
|
26591
|
-
(0,
|
|
26660
|
+
(0, import_react68.useEffect)(() => {
|
|
26592
26661
|
let cancelled = false;
|
|
26593
26662
|
const requestVersion = ++requestVersionRef.current;
|
|
26594
26663
|
isFetchingRef.current = false;
|
|
@@ -26625,7 +26694,7 @@ function ActivitiesList() {
|
|
|
26625
26694
|
cancelled = true;
|
|
26626
26695
|
};
|
|
26627
26696
|
}, [fetchPage, organizationId, workspaceId, t]);
|
|
26628
|
-
const loadMore = (0,
|
|
26697
|
+
const loadMore = (0, import_react68.useCallback)(async () => {
|
|
26629
26698
|
if (isFetchingRef.current || !hasMoreRef.current) {
|
|
26630
26699
|
return;
|
|
26631
26700
|
}
|
|
@@ -26661,7 +26730,7 @@ function ActivitiesList() {
|
|
|
26661
26730
|
}
|
|
26662
26731
|
}
|
|
26663
26732
|
}, [fetchPage, t]);
|
|
26664
|
-
(0,
|
|
26733
|
+
(0, import_react68.useEffect)(() => {
|
|
26665
26734
|
const node = sentinelRef.current;
|
|
26666
26735
|
if (!node || isLoadingInitial) {
|
|
26667
26736
|
return;
|
|
@@ -26757,7 +26826,7 @@ function ActivityTimelineSkeleton() {
|
|
|
26757
26826
|
// src/RedactoPrivacyCenter/PrivacyCenterActivityPage.tsx
|
|
26758
26827
|
var import_jsx_runtime83 = require("react/jsx-runtime");
|
|
26759
26828
|
function PrivacyCenterActivityPage() {
|
|
26760
|
-
(0,
|
|
26829
|
+
(0, import_react69.useEffect)(() => {
|
|
26761
26830
|
if (!i18n_default.language) {
|
|
26762
26831
|
i18n_default.changeLanguage("en");
|
|
26763
26832
|
}
|
|
@@ -26766,17 +26835,17 @@ function PrivacyCenterActivityPage() {
|
|
|
26766
26835
|
}
|
|
26767
26836
|
|
|
26768
26837
|
// src/RedactoPrivacyCenter/PrivacyCenterMyReceiptPage.tsx
|
|
26769
|
-
var
|
|
26838
|
+
var import_react72 = require("react");
|
|
26770
26839
|
|
|
26771
26840
|
// src/RedactoPrivacyCenter/components/ReceiptsList.tsx
|
|
26772
|
-
var
|
|
26841
|
+
var import_react71 = require("react");
|
|
26773
26842
|
var import_react_i18next49 = require("react-i18next");
|
|
26774
26843
|
var import_react_table9 = require("@tanstack/react-table");
|
|
26775
26844
|
var import_dayjs7 = __toESM(require("dayjs"));
|
|
26776
26845
|
var import_lucide_react24 = require("lucide-react");
|
|
26777
26846
|
|
|
26778
26847
|
// src/RedactoPrivacyCenter/components/receiptColumns.tsx
|
|
26779
|
-
var
|
|
26848
|
+
var import_react70 = require("react");
|
|
26780
26849
|
var import_react_i18next48 = require("react-i18next");
|
|
26781
26850
|
var import_react_table8 = require("@tanstack/react-table");
|
|
26782
26851
|
var import_dayjs6 = __toESM(require("dayjs"));
|
|
@@ -26812,7 +26881,7 @@ var useReceiptColumns = ({
|
|
|
26812
26881
|
downloadingUuid
|
|
26813
26882
|
}) => {
|
|
26814
26883
|
const { t } = (0, import_react_i18next48.useTranslation)();
|
|
26815
|
-
return (0,
|
|
26884
|
+
return (0, import_react70.useMemo)(
|
|
26816
26885
|
() => [
|
|
26817
26886
|
columnHelper4.accessor("event_type", {
|
|
26818
26887
|
id: "event",
|
|
@@ -26991,23 +27060,23 @@ function ReceiptsList() {
|
|
|
26991
27060
|
const { langParam } = useCurrentLanguage();
|
|
26992
27061
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
26993
27062
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
26994
|
-
const authContext = (0,
|
|
27063
|
+
const authContext = (0, import_react71.useMemo)(
|
|
26995
27064
|
() => ({ accessToken, refreshToken, onError, updateTokens }),
|
|
26996
27065
|
[accessToken, refreshToken, onError, updateTokens]
|
|
26997
27066
|
);
|
|
26998
|
-
const [receipts, setReceipts] = (0,
|
|
26999
|
-
const [totalCount, setTotalCount] = (0,
|
|
27000
|
-
const [isLoading, setIsLoading] = (0,
|
|
27001
|
-
const [currentPage, setCurrentPage] = (0,
|
|
27002
|
-
const [pageSize, setPageSize] = (0,
|
|
27003
|
-
const [downloadingUuid, setDownloadingUuid] = (0,
|
|
27004
|
-
const [previousData, setPreviousData] = (0,
|
|
27005
|
-
const [previousTotalCount, setPreviousTotalCount] = (0,
|
|
27006
|
-
const [eventType, setEventType] = (0,
|
|
27007
|
-
const [datePreset, setDatePreset] = (0,
|
|
27008
|
-
const [customFrom, setCustomFrom] = (0,
|
|
27009
|
-
const [customTo, setCustomTo] = (0,
|
|
27010
|
-
const eventTypeOptions = (0,
|
|
27067
|
+
const [receipts, setReceipts] = (0, import_react71.useState)([]);
|
|
27068
|
+
const [totalCount, setTotalCount] = (0, import_react71.useState)(0);
|
|
27069
|
+
const [isLoading, setIsLoading] = (0, import_react71.useState)(false);
|
|
27070
|
+
const [currentPage, setCurrentPage] = (0, import_react71.useState)(1);
|
|
27071
|
+
const [pageSize, setPageSize] = (0, import_react71.useState)(10);
|
|
27072
|
+
const [downloadingUuid, setDownloadingUuid] = (0, import_react71.useState)(null);
|
|
27073
|
+
const [previousData, setPreviousData] = (0, import_react71.useState)([]);
|
|
27074
|
+
const [previousTotalCount, setPreviousTotalCount] = (0, import_react71.useState)(0);
|
|
27075
|
+
const [eventType, setEventType] = (0, import_react71.useState)("");
|
|
27076
|
+
const [datePreset, setDatePreset] = (0, import_react71.useState)("");
|
|
27077
|
+
const [customFrom, setCustomFrom] = (0, import_react71.useState)("");
|
|
27078
|
+
const [customTo, setCustomTo] = (0, import_react71.useState)("");
|
|
27079
|
+
const eventTypeOptions = (0, import_react71.useMemo)(
|
|
27011
27080
|
() => [
|
|
27012
27081
|
{ value: "", label: t("all") },
|
|
27013
27082
|
{ value: "GRANTED", label: t("consentGranted") },
|
|
@@ -27017,7 +27086,7 @@ function ReceiptsList() {
|
|
|
27017
27086
|
],
|
|
27018
27087
|
[t]
|
|
27019
27088
|
);
|
|
27020
|
-
const dateOptions = (0,
|
|
27089
|
+
const dateOptions = (0, import_react71.useMemo)(
|
|
27021
27090
|
() => [
|
|
27022
27091
|
{ value: "", label: t("allTime") },
|
|
27023
27092
|
{ value: "1", label: t("today") },
|
|
@@ -27031,11 +27100,11 @@ function ReceiptsList() {
|
|
|
27031
27100
|
const eventValue = (_b = eventTypeOptions.find((o) => o.value === eventType)) != null ? _b : null;
|
|
27032
27101
|
const dateValue = (_c = dateOptions.find((o) => o.value === datePreset)) != null ? _c : null;
|
|
27033
27102
|
const hasActiveFilters = Boolean(eventType || datePreset);
|
|
27034
|
-
const isCustomRangeInvalid = (0,
|
|
27103
|
+
const isCustomRangeInvalid = (0, import_react71.useMemo)(
|
|
27035
27104
|
() => datePreset === "custom" && Boolean(customFrom && customTo && (0, import_dayjs7.default)(customFrom).isAfter((0, import_dayjs7.default)(customTo), "day")),
|
|
27036
27105
|
[datePreset, customFrom, customTo]
|
|
27037
27106
|
);
|
|
27038
|
-
const activeFilterLabels = (0,
|
|
27107
|
+
const activeFilterLabels = (0, import_react71.useMemo)(() => {
|
|
27039
27108
|
const filters = [];
|
|
27040
27109
|
if (eventType && (eventValue == null ? void 0 : eventValue.label)) {
|
|
27041
27110
|
filters.push({ id: "event", label: t("event"), value: eventValue.label });
|
|
@@ -27071,7 +27140,7 @@ function ReceiptsList() {
|
|
|
27071
27140
|
setCustomTo("");
|
|
27072
27141
|
setCurrentPage(1);
|
|
27073
27142
|
};
|
|
27074
|
-
const handleGetReceipts = (0,
|
|
27143
|
+
const handleGetReceipts = (0, import_react71.useCallback)(
|
|
27075
27144
|
async (page = currentPage, size = pageSize) => {
|
|
27076
27145
|
if (!organizationId || !workspaceId) return;
|
|
27077
27146
|
if (isCustomRangeInvalid) return;
|
|
@@ -27125,7 +27194,7 @@ function ReceiptsList() {
|
|
|
27125
27194
|
t
|
|
27126
27195
|
]
|
|
27127
27196
|
);
|
|
27128
|
-
const handleDownload = (0,
|
|
27197
|
+
const handleDownload = (0, import_react71.useCallback)(
|
|
27129
27198
|
async (receipt) => {
|
|
27130
27199
|
if (!organizationId || !workspaceId || !receipt.uuid) return;
|
|
27131
27200
|
setDownloadingUuid(receipt.uuid);
|
|
@@ -27156,13 +27225,13 @@ function ReceiptsList() {
|
|
|
27156
27225
|
[organizationId, workspaceId, authContext, consentClient, t]
|
|
27157
27226
|
);
|
|
27158
27227
|
const columns = useReceiptColumns({ onDownload: handleDownload, downloadingUuid });
|
|
27159
|
-
(0,
|
|
27228
|
+
(0, import_react71.useEffect)(() => {
|
|
27160
27229
|
if (receipts.length > 0) {
|
|
27161
27230
|
setPreviousData(receipts);
|
|
27162
27231
|
setPreviousTotalCount(totalCount);
|
|
27163
27232
|
}
|
|
27164
27233
|
}, [receipts, totalCount]);
|
|
27165
|
-
(0,
|
|
27234
|
+
(0, import_react71.useEffect)(() => {
|
|
27166
27235
|
void handleGetReceipts();
|
|
27167
27236
|
}, [organizationId, workspaceId, handleGetReceipts]);
|
|
27168
27237
|
const displayData = isLoading && receipts.length === 0 ? previousData : receipts;
|
|
@@ -27349,7 +27418,7 @@ function ReceiptsList() {
|
|
|
27349
27418
|
// src/RedactoPrivacyCenter/PrivacyCenterMyReceiptPage.tsx
|
|
27350
27419
|
var import_jsx_runtime86 = require("react/jsx-runtime");
|
|
27351
27420
|
function PrivacyCenterMyReceiptPage() {
|
|
27352
|
-
(0,
|
|
27421
|
+
(0, import_react72.useEffect)(() => {
|
|
27353
27422
|
if (!i18n_default.language) {
|
|
27354
27423
|
i18n_default.changeLanguage("en");
|
|
27355
27424
|
}
|
|
@@ -27369,7 +27438,7 @@ function PrivacyCenterMyReceiptPage() {
|
|
|
27369
27438
|
}
|
|
27370
27439
|
|
|
27371
27440
|
// src/RedactoPrivacyCenter/PrivacyCenterCaseDetailsPage.tsx
|
|
27372
|
-
var
|
|
27441
|
+
var import_react76 = require("react");
|
|
27373
27442
|
var import_react_i18next56 = require("react-i18next");
|
|
27374
27443
|
var import_io511 = require("react-icons/io5");
|
|
27375
27444
|
|
|
@@ -27430,7 +27499,7 @@ function getUploadErrorMessage(error) {
|
|
|
27430
27499
|
}
|
|
27431
27500
|
|
|
27432
27501
|
// src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
|
|
27433
|
-
var
|
|
27502
|
+
var import_react75 = require("react");
|
|
27434
27503
|
var import_react_i18next54 = require("react-i18next");
|
|
27435
27504
|
var import_io510 = require("react-icons/io5");
|
|
27436
27505
|
|
|
@@ -27782,47 +27851,47 @@ var MessageComposer = ({
|
|
|
27782
27851
|
};
|
|
27783
27852
|
|
|
27784
27853
|
// src/RedactoPrivacyCenter/components/CaseDetails/useMessagePolling.ts
|
|
27785
|
-
var
|
|
27854
|
+
var import_react73 = require("react");
|
|
27786
27855
|
function useMessagePolling(refetch, messages, isPaused) {
|
|
27787
|
-
const scrollContainerRef = (0,
|
|
27788
|
-
const isNearBottomRef = (0,
|
|
27789
|
-
const shouldAutoScrollRef = (0,
|
|
27790
|
-
const isPausedRef = (0,
|
|
27856
|
+
const scrollContainerRef = (0, import_react73.useRef)(null);
|
|
27857
|
+
const isNearBottomRef = (0, import_react73.useRef)(true);
|
|
27858
|
+
const shouldAutoScrollRef = (0, import_react73.useRef)(true);
|
|
27859
|
+
const isPausedRef = (0, import_react73.useRef)(isPaused);
|
|
27791
27860
|
isPausedRef.current = isPaused;
|
|
27792
|
-
(0,
|
|
27861
|
+
(0, import_react73.useEffect)(() => {
|
|
27793
27862
|
const interval = setInterval(() => {
|
|
27794
27863
|
var _a;
|
|
27795
27864
|
if (!((_a = isPausedRef.current) == null ? void 0 : _a.call(isPausedRef))) refetch();
|
|
27796
27865
|
}, 3e4);
|
|
27797
27866
|
return () => clearInterval(interval);
|
|
27798
27867
|
}, [refetch]);
|
|
27799
|
-
const handleScroll = (0,
|
|
27868
|
+
const handleScroll = (0, import_react73.useCallback)(() => {
|
|
27800
27869
|
const el = scrollContainerRef.current;
|
|
27801
27870
|
if (!el) return;
|
|
27802
27871
|
isNearBottomRef.current = el.scrollHeight - el.scrollTop - el.clientHeight < 100;
|
|
27803
27872
|
}, []);
|
|
27804
|
-
(0,
|
|
27873
|
+
(0, import_react73.useLayoutEffect)(() => {
|
|
27805
27874
|
const el = scrollContainerRef.current;
|
|
27806
27875
|
if (el && (isNearBottomRef.current || shouldAutoScrollRef.current)) {
|
|
27807
27876
|
el.scrollTop = el.scrollHeight;
|
|
27808
27877
|
shouldAutoScrollRef.current = false;
|
|
27809
27878
|
}
|
|
27810
27879
|
}, [messages]);
|
|
27811
|
-
const scrollToBottom = (0,
|
|
27880
|
+
const scrollToBottom = (0, import_react73.useCallback)(() => {
|
|
27812
27881
|
shouldAutoScrollRef.current = true;
|
|
27813
27882
|
}, []);
|
|
27814
27883
|
return { scrollContainerRef, handleScroll, scrollToBottom };
|
|
27815
27884
|
}
|
|
27816
27885
|
|
|
27817
27886
|
// src/RedactoPrivacyCenter/components/CaseDetails/useFileUpload.ts
|
|
27818
|
-
var
|
|
27887
|
+
var import_react74 = require("react");
|
|
27819
27888
|
function useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom) {
|
|
27820
|
-
const [pendingUpload, setPendingUpload] = (0,
|
|
27821
|
-
const [submittingForRequest, setSubmittingForRequest] = (0,
|
|
27822
|
-
const attachInputRef = (0,
|
|
27823
|
-
const submitInputRef = (0,
|
|
27824
|
-
const pendingRequestRef = (0,
|
|
27825
|
-
const handleAttachFile = (0,
|
|
27889
|
+
const [pendingUpload, setPendingUpload] = (0, import_react74.useState)(null);
|
|
27890
|
+
const [submittingForRequest, setSubmittingForRequest] = (0, import_react74.useState)(null);
|
|
27891
|
+
const attachInputRef = (0, import_react74.useRef)(null);
|
|
27892
|
+
const submitInputRef = (0, import_react74.useRef)(null);
|
|
27893
|
+
const pendingRequestRef = (0, import_react74.useRef)(null);
|
|
27894
|
+
const handleAttachFile = (0, import_react74.useCallback)((e) => {
|
|
27826
27895
|
var _a;
|
|
27827
27896
|
const file = (_a = e.target.files) == null ? void 0 : _a[0];
|
|
27828
27897
|
if (!file) return;
|
|
@@ -27846,7 +27915,7 @@ function useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom)
|
|
|
27846
27915
|
}
|
|
27847
27916
|
});
|
|
27848
27917
|
}, [uploadMutation]);
|
|
27849
|
-
const handleSubmitForRequest = (0,
|
|
27918
|
+
const handleSubmitForRequest = (0, import_react74.useCallback)((requestEventUuid, file) => {
|
|
27850
27919
|
const validationError = validateUploadFile(file);
|
|
27851
27920
|
if (validationError) {
|
|
27852
27921
|
toast.error(validationError);
|
|
@@ -27882,7 +27951,7 @@ function useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom)
|
|
|
27882
27951
|
}
|
|
27883
27952
|
});
|
|
27884
27953
|
}, [uploadMutation, submitMutation, refetch, scrollToBottom]);
|
|
27885
|
-
const handleSubmitInputChange = (0,
|
|
27954
|
+
const handleSubmitInputChange = (0, import_react74.useCallback)((e) => {
|
|
27886
27955
|
var _a;
|
|
27887
27956
|
const file = (_a = e.target.files) == null ? void 0 : _a[0];
|
|
27888
27957
|
e.target.value = "";
|
|
@@ -27892,7 +27961,7 @@ function useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom)
|
|
|
27892
27961
|
handleSubmitForRequest(requestUuid, file);
|
|
27893
27962
|
}
|
|
27894
27963
|
}, [handleSubmitForRequest]);
|
|
27895
|
-
const triggerUploadForRequest = (0,
|
|
27964
|
+
const triggerUploadForRequest = (0, import_react74.useCallback)((requestEventUuid) => {
|
|
27896
27965
|
var _a;
|
|
27897
27966
|
pendingRequestRef.current = requestEventUuid;
|
|
27898
27967
|
(_a = submitInputRef.current) == null ? void 0 : _a.click();
|
|
@@ -27918,7 +27987,7 @@ var MessagesTab = ({ caseUuid, caseStatus }) => {
|
|
|
27918
27987
|
const caseFinalizedTooltip = useCaseFinalizedTooltip();
|
|
27919
27988
|
const { organization } = useOrganization();
|
|
27920
27989
|
const { accessToken, refreshToken, onError, updateTokens } = useAuth();
|
|
27921
|
-
const authContext = (0,
|
|
27990
|
+
const authContext = (0, import_react75.useMemo)(
|
|
27922
27991
|
() => ({ accessToken, refreshToken, onError, updateTokens }),
|
|
27923
27992
|
[accessToken, refreshToken, onError, updateTokens]
|
|
27924
27993
|
);
|
|
@@ -27933,7 +28002,7 @@ var MessagesTab = ({ caseUuid, caseStatus }) => {
|
|
|
27933
28002
|
const sendMutation = useSendCaseMessage(organizationId, workspaceId, caseUuid, authContext);
|
|
27934
28003
|
const uploadMutation = useUploadCaseDocument(organizationId, workspaceId, caseUuid, authContext);
|
|
27935
28004
|
const submitMutation = useSubmitDocumentForRequest(organizationId, workspaceId, caseUuid, authContext);
|
|
27936
|
-
const isPollingPaused = (0,
|
|
28005
|
+
const isPollingPaused = (0, import_react75.useCallback)(() => isRefreshBlocked(authContext), [authContext]);
|
|
27937
28006
|
const { scrollContainerRef, handleScroll, scrollToBottom } = useMessagePolling(refetch, messages, isPollingPaused);
|
|
27938
28007
|
const {
|
|
27939
28008
|
pendingUpload,
|
|
@@ -27945,8 +28014,8 @@ var MessagesTab = ({ caseUuid, caseStatus }) => {
|
|
|
27945
28014
|
handleSubmitInputChange,
|
|
27946
28015
|
triggerUploadForRequest
|
|
27947
28016
|
} = useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom);
|
|
27948
|
-
const [messageText, setMessageText] = (0,
|
|
27949
|
-
const handleSend = (0,
|
|
28017
|
+
const [messageText, setMessageText] = (0, import_react75.useState)("");
|
|
28018
|
+
const handleSend = (0, import_react75.useCallback)(() => {
|
|
27950
28019
|
if (sendMutation.isPending || uploadMutation.isPending) return;
|
|
27951
28020
|
const trimmedBody = messageText.trim();
|
|
27952
28021
|
if (!trimmedBody && !pendingUpload) return;
|
|
@@ -28133,13 +28202,13 @@ var PrivacyCenterCaseDetailsPage = () => {
|
|
|
28133
28202
|
var _a, _b;
|
|
28134
28203
|
const { t } = (0, import_react_i18next56.useTranslation)();
|
|
28135
28204
|
const { navigateTo, selectedCase, setSelectedCase, pendingCaseUuid } = useInternalNavigation();
|
|
28136
|
-
const [activeTab, setActiveTab] = (0,
|
|
28205
|
+
const [activeTab, setActiveTab] = (0, import_react76.useState)("request-details");
|
|
28137
28206
|
const { organization } = useOrganization();
|
|
28138
28207
|
const { accessToken, refreshToken, onError, updateTokens } = useAuth();
|
|
28139
28208
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
28140
28209
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
28141
28210
|
const contact = typeof window !== "undefined" ? sessionStorage.getItem("email") || "" : "";
|
|
28142
|
-
const authContext = (0,
|
|
28211
|
+
const authContext = (0, import_react76.useMemo)(() => ({
|
|
28143
28212
|
accessToken,
|
|
28144
28213
|
refreshToken,
|
|
28145
28214
|
onError,
|
|
@@ -28152,7 +28221,7 @@ var PrivacyCenterCaseDetailsPage = () => {
|
|
|
28152
28221
|
contact,
|
|
28153
28222
|
authContext
|
|
28154
28223
|
);
|
|
28155
|
-
(0,
|
|
28224
|
+
(0, import_react76.useEffect)(() => {
|
|
28156
28225
|
if (!cases) return;
|
|
28157
28226
|
if (cases.length === 0) {
|
|
28158
28227
|
navigateTo("form");
|
|
@@ -28166,13 +28235,13 @@ var PrivacyCenterCaseDetailsPage = () => {
|
|
|
28166
28235
|
navigateTo("form");
|
|
28167
28236
|
}
|
|
28168
28237
|
}, [cases, targetUuid, setSelectedCase, navigateTo]);
|
|
28169
|
-
(0,
|
|
28238
|
+
(0, import_react76.useEffect)(() => {
|
|
28170
28239
|
if (!targetUuid || isLoading || cases !== void 0) return;
|
|
28171
28240
|
if (!organizationId || !workspaceId || !contact) {
|
|
28172
28241
|
navigateTo("form");
|
|
28173
28242
|
}
|
|
28174
28243
|
}, [targetUuid, organizationId, workspaceId, contact, cases, isLoading, navigateTo]);
|
|
28175
|
-
(0,
|
|
28244
|
+
(0, import_react76.useEffect)(() => {
|
|
28176
28245
|
if (!selectedCase && !targetUuid && !isLoading) {
|
|
28177
28246
|
navigateTo("form");
|
|
28178
28247
|
}
|
|
@@ -28239,7 +28308,7 @@ var PrivacyCenterCaseDetailsPage = () => {
|
|
|
28239
28308
|
};
|
|
28240
28309
|
|
|
28241
28310
|
// src/RedactoPrivacyCenter/NotificationsPage.tsx
|
|
28242
|
-
var
|
|
28311
|
+
var import_react77 = require("react");
|
|
28243
28312
|
var import_io512 = require("react-icons/io5");
|
|
28244
28313
|
var import_react_i18next59 = require("react-i18next");
|
|
28245
28314
|
|
|
@@ -28406,20 +28475,20 @@ var NotificationsPage = () => {
|
|
|
28406
28475
|
handleAcknowledge,
|
|
28407
28476
|
handleCTAClick
|
|
28408
28477
|
} = useNotificationActions();
|
|
28409
|
-
const [notifications, setNotifications] = (0,
|
|
28410
|
-
const [summary, setSummary] = (0,
|
|
28411
|
-
const [activeTab, setActiveTab] = (0,
|
|
28412
|
-
const [isLoading, setIsLoading] = (0,
|
|
28413
|
-
const [isRefreshing2, setIsRefreshing] = (0,
|
|
28414
|
-
const [totalCount, setTotalCount] = (0,
|
|
28415
|
-
const [skip, setSkip] = (0,
|
|
28416
|
-
const pollRef = (0,
|
|
28417
|
-
const loadNotificationsRef = (0,
|
|
28418
|
-
(0,
|
|
28478
|
+
const [notifications, setNotifications] = (0, import_react77.useState)([]);
|
|
28479
|
+
const [summary, setSummary] = (0, import_react77.useState)({ total: 0, unread: 0, action_needed: 0, acknowledged: 0 });
|
|
28480
|
+
const [activeTab, setActiveTab] = (0, import_react77.useState)("all");
|
|
28481
|
+
const [isLoading, setIsLoading] = (0, import_react77.useState)(true);
|
|
28482
|
+
const [isRefreshing2, setIsRefreshing] = (0, import_react77.useState)(false);
|
|
28483
|
+
const [totalCount, setTotalCount] = (0, import_react77.useState)(0);
|
|
28484
|
+
const [skip, setSkip] = (0, import_react77.useState)(0);
|
|
28485
|
+
const pollRef = (0, import_react77.useRef)(null);
|
|
28486
|
+
const loadNotificationsRef = (0, import_react77.useRef)();
|
|
28487
|
+
(0, import_react77.useEffect)(() => {
|
|
28419
28488
|
setPageChromeOverride({ titleKey: "notificationHub", descriptionKey: "notificationHubSubtitle" });
|
|
28420
28489
|
return () => clearPageChromeOverride();
|
|
28421
28490
|
}, [setPageChromeOverride, clearPageChromeOverride]);
|
|
28422
|
-
const loadNotifications = (0,
|
|
28491
|
+
const loadNotifications = (0, import_react77.useCallback)(async (includeSummary = false, silent = false) => {
|
|
28423
28492
|
if (!organizationId || !workspaceId) {
|
|
28424
28493
|
return;
|
|
28425
28494
|
}
|
|
@@ -28450,13 +28519,13 @@ var NotificationsPage = () => {
|
|
|
28450
28519
|
setIsRefreshing(false);
|
|
28451
28520
|
}
|
|
28452
28521
|
}, [organizationId, workspaceId, activeTab, skip, authContext, consentClient, langParam]);
|
|
28453
|
-
(0,
|
|
28522
|
+
(0, import_react77.useEffect)(() => {
|
|
28454
28523
|
loadNotifications(true);
|
|
28455
28524
|
}, [loadNotifications]);
|
|
28456
|
-
(0,
|
|
28525
|
+
(0, import_react77.useEffect)(() => {
|
|
28457
28526
|
loadNotificationsRef.current = loadNotifications;
|
|
28458
28527
|
}, [loadNotifications]);
|
|
28459
|
-
(0,
|
|
28528
|
+
(0, import_react77.useEffect)(() => {
|
|
28460
28529
|
pollRef.current = setInterval(() => {
|
|
28461
28530
|
var _a;
|
|
28462
28531
|
(_a = loadNotificationsRef.current) == null ? void 0 : _a.call(loadNotificationsRef, false, true);
|
|
@@ -28467,10 +28536,10 @@ var NotificationsPage = () => {
|
|
|
28467
28536
|
}
|
|
28468
28537
|
};
|
|
28469
28538
|
}, []);
|
|
28470
|
-
(0,
|
|
28539
|
+
(0, import_react77.useEffect)(() => {
|
|
28471
28540
|
setSkip(0);
|
|
28472
28541
|
}, [activeTab]);
|
|
28473
|
-
const onNotificationClick = (0,
|
|
28542
|
+
const onNotificationClick = (0, import_react77.useCallback)(async (notification) => {
|
|
28474
28543
|
if (!organizationId || !workspaceId) {
|
|
28475
28544
|
return;
|
|
28476
28545
|
}
|
|
@@ -28493,7 +28562,7 @@ var NotificationsPage = () => {
|
|
|
28493
28562
|
acknowledged: prev.acknowledged + (acknowledged && !notification.is_acknowledged ? 1 : 0)
|
|
28494
28563
|
}));
|
|
28495
28564
|
}, [organizationId, workspaceId, hasAcknowledgeCTA, handleMarkRead, handleAcknowledge]);
|
|
28496
|
-
const onCTAClick = (0,
|
|
28565
|
+
const onCTAClick = (0, import_react77.useCallback)(async (notification, cta) => {
|
|
28497
28566
|
const result = await handleCTAClick(notification, cta);
|
|
28498
28567
|
if (result === "acknowledged") {
|
|
28499
28568
|
setNotifications((prev) => prev.map(
|
|
@@ -28508,7 +28577,7 @@ var NotificationsPage = () => {
|
|
|
28508
28577
|
onNotificationClick(notification);
|
|
28509
28578
|
}
|
|
28510
28579
|
}, [handleCTAClick, onNotificationClick]);
|
|
28511
|
-
const onMarkAllRead = (0,
|
|
28580
|
+
const onMarkAllRead = (0, import_react77.useCallback)(async () => {
|
|
28512
28581
|
const ok = await handleMarkAllRead();
|
|
28513
28582
|
if (!ok) {
|
|
28514
28583
|
return;
|
|
@@ -28516,11 +28585,11 @@ var NotificationsPage = () => {
|
|
|
28516
28585
|
setNotifications((prev) => prev.map((n) => ({ ...n, is_read: true })));
|
|
28517
28586
|
setSummary((prev) => ({ ...prev, unread: 0 }));
|
|
28518
28587
|
}, [handleMarkAllRead]);
|
|
28519
|
-
const onRefresh = (0,
|
|
28588
|
+
const onRefresh = (0, import_react77.useCallback)(() => {
|
|
28520
28589
|
setIsRefreshing(true);
|
|
28521
28590
|
loadNotifications(true);
|
|
28522
28591
|
}, [loadNotifications]);
|
|
28523
|
-
const onBack = (0,
|
|
28592
|
+
const onBack = (0, import_react77.useCallback)(() => navigateTo("consent-manager"), [navigateTo]);
|
|
28524
28593
|
return /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)("div", { className: "pc-notification-page", children: [
|
|
28525
28594
|
/* @__PURE__ */ (0, import_jsx_runtime100.jsxs)("button", { type: "button", onClick: onBack, className: "pc-notification-back-btn", children: [
|
|
28526
28595
|
/* @__PURE__ */ (0, import_jsx_runtime100.jsx)(import_io512.IoChevronBackOutline, { size: 14 }),
|
|
@@ -28556,7 +28625,7 @@ var NotificationsPage = () => {
|
|
|
28556
28625
|
var import_jsx_runtime101 = require("react/jsx-runtime");
|
|
28557
28626
|
function PrivacyCenterHomePage() {
|
|
28558
28627
|
const { currentPage } = useInternalNavigation();
|
|
28559
|
-
(0,
|
|
28628
|
+
(0, import_react78.useEffect)(() => {
|
|
28560
28629
|
if (!i18n_default.language) {
|
|
28561
28630
|
i18n_default.changeLanguage("en");
|
|
28562
28631
|
}
|
|
@@ -28580,47 +28649,23 @@ function PrivacyCenterHomePage() {
|
|
|
28580
28649
|
}
|
|
28581
28650
|
|
|
28582
28651
|
// src/RedactoPrivacyCenter/context/PrivacyCenterSettingsContext.tsx
|
|
28583
|
-
var
|
|
28584
|
-
|
|
28585
|
-
// src/RedactoPrivacyCenter/api/organizationLookup.ts
|
|
28586
|
-
var cache = /* @__PURE__ */ new Map();
|
|
28587
|
-
var isOrganisation = (value) => typeof value === "object" && value !== null && typeof value.uuid === "string";
|
|
28588
|
-
var fetchOrganisationBySlug = (slug, consentBaseUrl) => {
|
|
28589
|
-
const url = `${userServiceBaseUrl(consentBaseUrl)}/organizations/exists?slug=${encodeURIComponent(slug)}`;
|
|
28590
|
-
const cached = cache.get(url);
|
|
28591
|
-
if (cached) {
|
|
28592
|
-
return cached;
|
|
28593
|
-
}
|
|
28594
|
-
const request = apiFetch(url, { method: "GET" }).then((body) => {
|
|
28595
|
-
if (isOrganisation(body)) {
|
|
28596
|
-
return body;
|
|
28597
|
-
}
|
|
28598
|
-
cache.delete(url);
|
|
28599
|
-
return null;
|
|
28600
|
-
}).catch((error) => {
|
|
28601
|
-
cache.delete(url);
|
|
28602
|
-
console.warn("[RedactoPrivacyCenter] organisation lookup failed:", error);
|
|
28603
|
-
return null;
|
|
28604
|
-
});
|
|
28605
|
-
cache.set(url, request);
|
|
28606
|
-
return request;
|
|
28607
|
-
};
|
|
28652
|
+
var import_react79 = require("react");
|
|
28608
28653
|
|
|
28609
28654
|
// src/RedactoPrivacyCenter/settings/api.ts
|
|
28610
|
-
var
|
|
28655
|
+
var cache = /* @__PURE__ */ new Map();
|
|
28611
28656
|
var freshEntry = (url) => {
|
|
28612
|
-
const entry =
|
|
28657
|
+
const entry = cache.get(url);
|
|
28613
28658
|
if (!entry) {
|
|
28614
28659
|
return null;
|
|
28615
28660
|
}
|
|
28616
28661
|
if (Date.now() >= entry.expiresAt) {
|
|
28617
|
-
|
|
28662
|
+
cache.delete(url);
|
|
28618
28663
|
return null;
|
|
28619
28664
|
}
|
|
28620
28665
|
return entry;
|
|
28621
28666
|
};
|
|
28622
28667
|
var trimTrailingSlash = (url) => url.replace(/\/+$/, "");
|
|
28623
|
-
var privacyCenterSettingsUrl = (baseUrl, organisationUuid, language) => `${trimTrailingSlash(baseUrl)}/public/organisations/${encodeURIComponent(
|
|
28668
|
+
var privacyCenterSettingsUrl = (baseUrl, organisationUuid, language) => `${trimTrailingSlash(resolveEndpoints(baseUrl).baseUrl)}/public/organisations/${encodeURIComponent(
|
|
28624
28669
|
organisationUuid
|
|
28625
28670
|
)}/privacy-center-settings/?${SETTINGS_LANG_PARAM}=${encodeURIComponent(language)}`;
|
|
28626
28671
|
var isSettingsResponse = (value) => typeof value === "object" && value !== null && "settings" in value && typeof value.settings === "object" && value.settings !== null;
|
|
@@ -28632,8 +28677,8 @@ var fetchPublicPrivacyCenterSettings = (baseUrl, organisationUuid, language) =>
|
|
|
28632
28677
|
}
|
|
28633
28678
|
const forget = () => {
|
|
28634
28679
|
var _a;
|
|
28635
|
-
if (((_a =
|
|
28636
|
-
|
|
28680
|
+
if (((_a = cache.get(url)) == null ? void 0 : _a.request) === request) {
|
|
28681
|
+
cache.delete(url);
|
|
28637
28682
|
}
|
|
28638
28683
|
};
|
|
28639
28684
|
const request = apiFetch(url, {
|
|
@@ -28651,7 +28696,7 @@ var fetchPublicPrivacyCenterSettings = (baseUrl, organisationUuid, language) =>
|
|
|
28651
28696
|
}
|
|
28652
28697
|
return null;
|
|
28653
28698
|
});
|
|
28654
|
-
|
|
28699
|
+
cache.set(url, { request, expiresAt: Date.now() + SETTINGS_CACHE_TTL_MS });
|
|
28655
28700
|
return request;
|
|
28656
28701
|
};
|
|
28657
28702
|
var hasCachedPrivacyCenterSettings = (baseUrl, organisationUuid, language) => freshEntry(privacyCenterSettingsUrl(baseUrl, organisationUuid, language)) !== null;
|
|
@@ -28668,15 +28713,15 @@ var readSession = (key) => {
|
|
|
28668
28713
|
var resolveOrganisationIds = ({
|
|
28669
28714
|
organisationUuid,
|
|
28670
28715
|
workspaceUuid,
|
|
28671
|
-
accessToken
|
|
28672
|
-
slug
|
|
28716
|
+
accessToken
|
|
28673
28717
|
}) => {
|
|
28674
28718
|
var _a, _b, _c, _d;
|
|
28675
28719
|
const claims = accessToken ? decodeJwtToken(accessToken) : null;
|
|
28676
|
-
const
|
|
28677
|
-
const
|
|
28720
|
+
const storedOrganisation = readSession("pc_org_id");
|
|
28721
|
+
const organisation = (_b = (_a = clean(organisationUuid)) != null ? _a : clean(claims == null ? void 0 : claims.organisation_uuid)) != null ? _b : storedOrganisation;
|
|
28722
|
+
const sessionMatches = organisation !== null && organisation === storedOrganisation;
|
|
28678
28723
|
return {
|
|
28679
|
-
organisationUuid:
|
|
28724
|
+
organisationUuid: organisation,
|
|
28680
28725
|
workspaceUuid: (_d = (_c = clean(workspaceUuid)) != null ? _c : clean(claims == null ? void 0 : claims.workspace_uuid)) != null ? _d : sessionMatches ? readSession("pc_workspace_id") : null
|
|
28681
28726
|
};
|
|
28682
28727
|
};
|
|
@@ -28935,55 +28980,9 @@ var resolveBrandContact = (raw) => {
|
|
|
28935
28980
|
// src/RedactoPrivacyCenter/context/PrivacyCenterSettingsContext.tsx
|
|
28936
28981
|
var import_jsx_runtime102 = require("react/jsx-runtime");
|
|
28937
28982
|
var requestLanguageFor = (language) => LANGUAGE_CODES.includes(language) ? language : "en";
|
|
28938
|
-
var useResolvedOrganisation = (baseUrl, slug, known, canLookUp) => {
|
|
28939
|
-
const needsLookup = canLookUp && Boolean(slug) && (!known.organisationUuid || !known.workspaceUuid);
|
|
28940
|
-
const lookupKey = `${baseUrl}|${slug}`;
|
|
28941
|
-
const [lookup, setLookup] = (0, import_react78.useState)(null);
|
|
28942
|
-
(0, import_react78.useEffect)(() => {
|
|
28943
|
-
if (!needsLookup) {
|
|
28944
|
-
return void 0;
|
|
28945
|
-
}
|
|
28946
|
-
let cancelled = false;
|
|
28947
|
-
void fetchOrganisationBySlug(slug, baseUrl).then((organisation) => {
|
|
28948
|
-
var _a, _b, _c;
|
|
28949
|
-
if (cancelled) {
|
|
28950
|
-
return;
|
|
28951
|
-
}
|
|
28952
|
-
setLookup({
|
|
28953
|
-
key: lookupKey,
|
|
28954
|
-
ids: organisation ? {
|
|
28955
|
-
organisationUuid: organisation.uuid,
|
|
28956
|
-
workspaceUuid: (_c = (_b = (_a = organisation.workspaces) == null ? void 0 : _a[0]) == null ? void 0 : _b.uuid) != null ? _c : null
|
|
28957
|
-
} : null
|
|
28958
|
-
});
|
|
28959
|
-
});
|
|
28960
|
-
return () => {
|
|
28961
|
-
cancelled = true;
|
|
28962
|
-
};
|
|
28963
|
-
}, [needsLookup, slug, baseUrl, lookupKey]);
|
|
28964
|
-
return (0, import_react78.useMemo)(() => {
|
|
28965
|
-
var _a, _b, _c, _d;
|
|
28966
|
-
if (!needsLookup) {
|
|
28967
|
-
return { ...known, status: "resolved" };
|
|
28968
|
-
}
|
|
28969
|
-
if ((lookup == null ? void 0 : lookup.key) !== lookupKey) {
|
|
28970
|
-
return { ...known, status: "resolving" };
|
|
28971
|
-
}
|
|
28972
|
-
const found = lookup.ids;
|
|
28973
|
-
const sameOrganisation = !known.organisationUuid || known.organisationUuid === (found == null ? void 0 : found.organisationUuid);
|
|
28974
|
-
const organisationUuid = (_b = (_a = known.organisationUuid) != null ? _a : found == null ? void 0 : found.organisationUuid) != null ? _b : null;
|
|
28975
|
-
const workspaceUuid = (_d = known.workspaceUuid) != null ? _d : sameOrganisation ? (_c = found == null ? void 0 : found.workspaceUuid) != null ? _c : null : null;
|
|
28976
|
-
return {
|
|
28977
|
-
organisationUuid,
|
|
28978
|
-
workspaceUuid,
|
|
28979
|
-
status: organisationUuid && workspaceUuid ? "resolved" : "failed"
|
|
28980
|
-
};
|
|
28981
|
-
}, [needsLookup, known, lookup, lookupKey]);
|
|
28982
|
-
};
|
|
28983
28983
|
var PrivacyCenterSettingsProvider = ({
|
|
28984
28984
|
children,
|
|
28985
28985
|
baseUrl,
|
|
28986
|
-
slug,
|
|
28987
28986
|
accessToken,
|
|
28988
28987
|
organisationUuid,
|
|
28989
28988
|
workspaceUuid,
|
|
@@ -28991,16 +28990,18 @@ var PrivacyCenterSettingsProvider = ({
|
|
|
28991
28990
|
builtInSignIn = false
|
|
28992
28991
|
}) => {
|
|
28993
28992
|
const { currentLanguage } = useCurrentLanguage();
|
|
28994
|
-
const
|
|
28995
|
-
|
|
28996
|
-
|
|
28997
|
-
|
|
28998
|
-
|
|
28993
|
+
const organisation = (0, import_react79.useMemo)(() => {
|
|
28994
|
+
const known = resolveOrganisationIds({ organisationUuid, workspaceUuid, accessToken });
|
|
28995
|
+
return {
|
|
28996
|
+
...known,
|
|
28997
|
+
status: known.organisationUuid && known.workspaceUuid ? "resolved" : "failed"
|
|
28998
|
+
};
|
|
28999
|
+
}, [organisationUuid, workspaceUuid, accessToken]);
|
|
28999
29000
|
const orgUuid = organisation.organisationUuid;
|
|
29000
29001
|
const requestLanguage = requestLanguageFor(currentLanguage);
|
|
29001
|
-
const [remote, setRemote] = (0,
|
|
29002
|
-
const [status, setStatus] = (0,
|
|
29003
|
-
(0,
|
|
29002
|
+
const [remote, setRemote] = (0, import_react79.useState)(null);
|
|
29003
|
+
const [status, setStatus] = (0, import_react79.useState)("idle");
|
|
29004
|
+
(0, import_react79.useEffect)(() => {
|
|
29004
29005
|
if (!orgUuid) {
|
|
29005
29006
|
return void 0;
|
|
29006
29007
|
}
|
|
@@ -29025,12 +29026,12 @@ var PrivacyCenterSettingsProvider = ({
|
|
|
29025
29026
|
}, [baseUrl, orgUuid, requestLanguage]);
|
|
29026
29027
|
const overridesKey = JSON.stringify(overrides != null ? overrides : null);
|
|
29027
29028
|
const activeRemote = remote && remote.organisationUuid === orgUuid ? remote.response : null;
|
|
29028
|
-
const settings = (0,
|
|
29029
|
+
const settings = (0, import_react79.useMemo)(
|
|
29029
29030
|
() => resolvePrivacyCenterSettings(activeRemote == null ? void 0 : activeRemote.settings, overrides),
|
|
29030
29031
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
29031
29032
|
[activeRemote, overridesKey]
|
|
29032
29033
|
);
|
|
29033
|
-
const brandContact = (0,
|
|
29034
|
+
const brandContact = (0, import_react79.useMemo)(
|
|
29034
29035
|
() => resolveBrandContact(activeRemote == null ? void 0 : activeRemote.brand_contact),
|
|
29035
29036
|
[activeRemote]
|
|
29036
29037
|
);
|
|
@@ -29039,16 +29040,16 @@ var PrivacyCenterSettingsProvider = ({
|
|
|
29039
29040
|
);
|
|
29040
29041
|
const isCustomised = isPublished || hasHostOverrides(overrides);
|
|
29041
29042
|
useLanguagePolicy(settings, isCustomised);
|
|
29042
|
-
const value = (0,
|
|
29043
|
-
() => ({ settings, status, isCustomised, organisation,
|
|
29044
|
-
[settings, status, isCustomised, organisation,
|
|
29043
|
+
const value = (0, import_react79.useMemo)(
|
|
29044
|
+
() => ({ settings, status, isCustomised, organisation, builtInSignIn, brandContact }),
|
|
29045
|
+
[settings, status, isCustomised, organisation, builtInSignIn, brandContact]
|
|
29045
29046
|
);
|
|
29046
29047
|
return /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(PrivacyCenterSettingsContext.Provider, { value, children });
|
|
29047
29048
|
};
|
|
29048
29049
|
var languagePolicyOwner = null;
|
|
29049
29050
|
var useLanguagePolicy = (settings, isCustomised) => {
|
|
29050
|
-
const [ownerId] = (0,
|
|
29051
|
-
(0,
|
|
29051
|
+
const [ownerId] = (0, import_react79.useState)(() => /* @__PURE__ */ Symbol("language-policy"));
|
|
29052
|
+
(0, import_react79.useEffect)(() => {
|
|
29052
29053
|
if (languagePolicyOwner === null) {
|
|
29053
29054
|
languagePolicyOwner = ownerId;
|
|
29054
29055
|
}
|
|
@@ -29059,7 +29060,7 @@ var useLanguagePolicy = (settings, isCustomised) => {
|
|
|
29059
29060
|
};
|
|
29060
29061
|
}, [ownerId]);
|
|
29061
29062
|
const policyKey = isCustomised ? JSON.stringify(settings.languages) : "";
|
|
29062
|
-
(0,
|
|
29063
|
+
(0, import_react79.useEffect)(() => {
|
|
29063
29064
|
if (!policyKey || languagePolicyOwner !== ownerId) {
|
|
29064
29065
|
return;
|
|
29065
29066
|
}
|
|
@@ -29072,7 +29073,7 @@ var useLanguagePolicy = (settings, isCustomised) => {
|
|
|
29072
29073
|
|
|
29073
29074
|
// src/RedactoPrivacyCenter/context/PrivacyCenterScopeContext.tsx
|
|
29074
29075
|
var React3 = __toESM(require("react"));
|
|
29075
|
-
var
|
|
29076
|
+
var import_react80 = require("react");
|
|
29076
29077
|
|
|
29077
29078
|
// src/shared/appearance/scopedCss.ts
|
|
29078
29079
|
var escapesScope = (style) => {
|
|
@@ -29110,7 +29111,7 @@ var PC_CUSTOM_CSS_ATTRIBUTE = "data-redacto-pc-css";
|
|
|
29110
29111
|
var fallbackScopeCounter = 0;
|
|
29111
29112
|
var useScopeId = () => {
|
|
29112
29113
|
const reactUseId = React3.useId;
|
|
29113
|
-
const [fallback] = (0,
|
|
29114
|
+
const [fallback] = (0, import_react80.useState)(() => {
|
|
29114
29115
|
fallbackScopeCounter += 1;
|
|
29115
29116
|
return `pc-${fallbackScopeCounter}`;
|
|
29116
29117
|
});
|
|
@@ -29135,7 +29136,7 @@ var PrivacyCenterRoot = ({ children }) => {
|
|
|
29135
29136
|
css: customCss
|
|
29136
29137
|
});
|
|
29137
29138
|
}, [customCss, id]);
|
|
29138
|
-
const value = (0,
|
|
29139
|
+
const value = (0, import_react80.useMemo)(() => ({ id, dir }), [id, dir]);
|
|
29139
29140
|
return /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(ScopeContext.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime103.jsx)("div", { ...{ [PC_SCOPE_ATTRIBUTE]: id }, dir, style: { display: "contents" }, children }) });
|
|
29140
29141
|
};
|
|
29141
29142
|
|
|
@@ -32270,7 +32271,7 @@ function SettingsAppearance({ children }) {
|
|
|
32270
32271
|
function RedactoPrivacyCenter({
|
|
32271
32272
|
baseUrl,
|
|
32272
32273
|
ledgerBaseUrl,
|
|
32273
|
-
slug,
|
|
32274
|
+
slug = "",
|
|
32274
32275
|
accessToken,
|
|
32275
32276
|
refreshToken,
|
|
32276
32277
|
token,
|
|
@@ -32297,13 +32298,12 @@ function RedactoPrivacyCenter({
|
|
|
32297
32298
|
PrivacyCenterSettingsProvider,
|
|
32298
32299
|
{
|
|
32299
32300
|
baseUrl,
|
|
32300
|
-
slug,
|
|
32301
32301
|
accessToken,
|
|
32302
32302
|
organisationUuid,
|
|
32303
32303
|
workspaceUuid,
|
|
32304
32304
|
overrides: settings,
|
|
32305
32305
|
builtInSignIn: builtInSignIn && !token,
|
|
32306
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(PrivacyCenterRoot, { children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(SettingsAppearance, { children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(BrandingProvider, {
|
|
32306
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(PrivacyCenterRoot, { children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(SettingsAppearance, { children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(BrandingProvider, { baseUrl, children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(BaseUrlProvider, { baseUrl, ledgerBaseUrl, children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(
|
|
32307
32307
|
AuthProvider,
|
|
32308
32308
|
{
|
|
32309
32309
|
accessToken,
|
|
@@ -32314,7 +32314,6 @@ function RedactoPrivacyCenter({
|
|
|
32314
32314
|
sandboxMobile: mobile,
|
|
32315
32315
|
organisationUuid,
|
|
32316
32316
|
workspaceUuid,
|
|
32317
|
-
slug,
|
|
32318
32317
|
onError,
|
|
32319
32318
|
children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(NavigationProvider, { initialPage, children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(PageChromeProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(PrivacyCenterLayout, { slug, onBack, children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(PrivacyCenterHomePage, {}) }) }) })
|
|
32320
32319
|
}
|