@redacto.io/consent-sdk-react 10.4.0-beta.1 → 11.0.0-beta.3
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 +39 -5
- package/dist/index.d.ts +39 -5
- package/dist/index.js +418 -293
- package/dist/index.mjs +77 -14
- package/dist/privacy-center.d.mts +67 -22
- package/dist/privacy-center.d.ts +67 -22
- package/dist/privacy-center.js +726 -701
- package/dist/privacy-center.mjs +175 -211
- package/dist/{types-Bwtzvz4W.d.mts → types-B8qroG0j.d.mts} +2 -0
- package/dist/{types-Bwtzvz4W.d.ts → types-B8qroG0j.d.ts} +2 -0
- 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;
|
|
@@ -14786,6 +14859,7 @@ var LANGUAGE_CODES = [
|
|
|
14786
14859
|
];
|
|
14787
14860
|
var RTL_LANGUAGES = /* @__PURE__ */ new Set(["ur", "sd", "ks"]);
|
|
14788
14861
|
var COUNTRY_CODES = ["+91", "+971", "+65", "+44", "+1"];
|
|
14862
|
+
var LOGO_ALIGNMENTS = ["auto", "left", "center", "right"];
|
|
14789
14863
|
var FONT_FAMILIES = [
|
|
14790
14864
|
"Inter",
|
|
14791
14865
|
"Montserrat",
|
|
@@ -14838,6 +14912,7 @@ var DEFAULT_PRIVACY_CENTER_SETTINGS = {
|
|
|
14838
14912
|
display_name: null,
|
|
14839
14913
|
logo_url: null,
|
|
14840
14914
|
logo_height: null,
|
|
14915
|
+
logo_align: "auto",
|
|
14841
14916
|
inherit_colors: true,
|
|
14842
14917
|
primary_color: null,
|
|
14843
14918
|
accent_color: null,
|
|
@@ -14940,17 +15015,16 @@ var DEFAULT_CONTEXT = {
|
|
|
14940
15015
|
status: "idle",
|
|
14941
15016
|
isCustomised: false,
|
|
14942
15017
|
organisation: { organisationUuid: null, workspaceUuid: null, status: "failed" },
|
|
14943
|
-
slug: "",
|
|
14944
15018
|
builtInSignIn: false,
|
|
14945
15019
|
brandContact: EMPTY_BRAND_CONTACT
|
|
14946
15020
|
};
|
|
14947
|
-
var PrivacyCenterSettingsContext = (0,
|
|
14948
|
-
var usePrivacyCenterSettingsContext = () => (0,
|
|
14949
|
-
var usePrivacyCenterSettings = () => (0,
|
|
15021
|
+
var PrivacyCenterSettingsContext = (0, import_react23.createContext)(DEFAULT_CONTEXT);
|
|
15022
|
+
var usePrivacyCenterSettingsContext = () => (0, import_react23.useContext)(PrivacyCenterSettingsContext);
|
|
15023
|
+
var usePrivacyCenterSettings = () => (0, import_react23.useContext)(PrivacyCenterSettingsContext).settings;
|
|
14950
15024
|
|
|
14951
15025
|
// src/RedactoPrivacyCenter/context/BrandingContext.tsx
|
|
14952
15026
|
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
14953
|
-
var BrandingContext = (0,
|
|
15027
|
+
var BrandingContext = (0, import_react24.createContext)(null);
|
|
14954
15028
|
var withIdentityOverride = (branding, settings) => {
|
|
14955
15029
|
var _a;
|
|
14956
15030
|
if (settings.inherit_identity) {
|
|
@@ -14967,18 +15041,20 @@ var withIdentityOverride = (branding, settings) => {
|
|
|
14967
15041
|
};
|
|
14968
15042
|
var BrandingProvider = ({
|
|
14969
15043
|
children,
|
|
14970
|
-
slug,
|
|
14971
15044
|
baseUrl
|
|
14972
15045
|
}) => {
|
|
14973
15046
|
var _a;
|
|
14974
|
-
const [branding, setBranding] = (0,
|
|
14975
|
-
const {
|
|
15047
|
+
const [branding, setBranding] = (0, import_react24.useState)(null);
|
|
15048
|
+
const { settings, organisation } = usePrivacyCenterSettingsContext();
|
|
15049
|
+
const brandingSettings = settings.branding;
|
|
15050
|
+
const organisationUuid = organisation.organisationUuid;
|
|
14976
15051
|
const scope = usePrivacyCenterScope();
|
|
14977
15052
|
const scopeId = (_a = scope == null ? void 0 : scope.id) != null ? _a : null;
|
|
14978
|
-
(0,
|
|
14979
|
-
|
|
15053
|
+
(0, import_react24.useEffect)(() => {
|
|
15054
|
+
setBranding(null);
|
|
15055
|
+
if (!organisationUuid) return;
|
|
14980
15056
|
let cancelled = false;
|
|
14981
|
-
|
|
15057
|
+
fetchOrgBrandingForOrganisation(organisationUuid, baseUrl).then((data) => {
|
|
14982
15058
|
if (!cancelled) setBranding(data);
|
|
14983
15059
|
}).catch((error) => {
|
|
14984
15060
|
console.warn("[RedactoPrivacyCenter] org branding fetch failed:", error);
|
|
@@ -14986,8 +15062,8 @@ var BrandingProvider = ({
|
|
|
14986
15062
|
return () => {
|
|
14987
15063
|
cancelled = true;
|
|
14988
15064
|
};
|
|
14989
|
-
}, [
|
|
14990
|
-
const themeVars = (0,
|
|
15065
|
+
}, [organisationUuid, baseUrl]);
|
|
15066
|
+
const themeVars = (0, import_react24.useMemo)(
|
|
14991
15067
|
() => ({
|
|
14992
15068
|
...(branding == null ? void 0 : branding.theme) ? brandingThemeVars(branding.theme) : {},
|
|
14993
15069
|
...settingsThemeVars(brandingSettings)
|
|
@@ -14995,7 +15071,7 @@ var BrandingProvider = ({
|
|
|
14995
15071
|
[branding, brandingSettings]
|
|
14996
15072
|
);
|
|
14997
15073
|
const themeKey = JSON.stringify(themeVars);
|
|
14998
|
-
(0,
|
|
15074
|
+
(0, import_react24.useEffect)(() => {
|
|
14999
15075
|
if (scopeId) {
|
|
15000
15076
|
return applyScopedTheme(PC_SCOPE_ATTRIBUTE, scopeId, themeVars);
|
|
15001
15077
|
}
|
|
@@ -15005,7 +15081,7 @@ var BrandingProvider = ({
|
|
|
15005
15081
|
applyBrandingTheme(branding.theme);
|
|
15006
15082
|
return clearBrandingTheme;
|
|
15007
15083
|
}, [scopeId, themeKey]);
|
|
15008
|
-
const value = (0,
|
|
15084
|
+
const value = (0, import_react24.useMemo)(
|
|
15009
15085
|
() => ({ branding: withIdentityOverride(branding, brandingSettings) }),
|
|
15010
15086
|
[branding, brandingSettings]
|
|
15011
15087
|
);
|
|
@@ -15013,12 +15089,12 @@ var BrandingProvider = ({
|
|
|
15013
15089
|
};
|
|
15014
15090
|
var useBranding = () => {
|
|
15015
15091
|
var _a;
|
|
15016
|
-
const ctx = (0,
|
|
15092
|
+
const ctx = (0, import_react24.useContext)(BrandingContext);
|
|
15017
15093
|
return (_a = ctx == null ? void 0 : ctx.branding) != null ? _a : null;
|
|
15018
15094
|
};
|
|
15019
15095
|
|
|
15020
15096
|
// src/RedactoPrivacyCenter/settings/copy.ts
|
|
15021
|
-
var
|
|
15097
|
+
var import_react25 = require("react");
|
|
15022
15098
|
var import_react_i18next3 = require("react-i18next");
|
|
15023
15099
|
|
|
15024
15100
|
// src/RedactoPrivacyCenter/settings/placeholders.ts
|
|
@@ -15046,20 +15122,19 @@ var resolvePlaceholders = (text2, context) => {
|
|
|
15046
15122
|
};
|
|
15047
15123
|
|
|
15048
15124
|
// 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
15125
|
var usePlaceholderContext = () => {
|
|
15051
15126
|
var _a, _b;
|
|
15052
15127
|
const branding = useBranding();
|
|
15053
|
-
const {
|
|
15054
|
-
const organizationName = (_b = (_a = (0,
|
|
15055
|
-
const brand = (branding == null ? void 0 : branding.brand_name) || organizationName ||
|
|
15128
|
+
const { brandContact } = usePrivacyCenterSettingsContext();
|
|
15129
|
+
const organizationName = (_b = (_a = (0, import_react25.useContext)(OrganizationContext)) == null ? void 0 : _a.organization) == null ? void 0 : _b.name;
|
|
15130
|
+
const brand = (branding == null ? void 0 : branding.brand_name) || organizationName || "";
|
|
15056
15131
|
const legal = brandContact.legal_entity_name || (branding == null ? void 0 : branding.legal_name) || null;
|
|
15057
|
-
return (0,
|
|
15132
|
+
return (0, import_react25.useMemo)(() => ({ brand, legal }), [brand, legal]);
|
|
15058
15133
|
};
|
|
15059
15134
|
var useSettingsCopy = () => {
|
|
15060
15135
|
const { t } = (0, import_react_i18next3.useTranslation)();
|
|
15061
15136
|
const context = usePlaceholderContext();
|
|
15062
|
-
return (0,
|
|
15137
|
+
return (0, import_react25.useCallback)(
|
|
15063
15138
|
(value, extra) => {
|
|
15064
15139
|
if (!value) {
|
|
15065
15140
|
return "";
|
|
@@ -15208,11 +15283,11 @@ function Footer() {
|
|
|
15208
15283
|
}
|
|
15209
15284
|
|
|
15210
15285
|
// src/RedactoNoticeConsent/useMediaQuery.ts
|
|
15211
|
-
var
|
|
15286
|
+
var import_react26 = require("react");
|
|
15212
15287
|
var useMediaQuery = (query) => {
|
|
15213
15288
|
const getMatches = () => typeof window !== "undefined" ? window.matchMedia(query).matches : false;
|
|
15214
|
-
const [matches, setMatches] = (0,
|
|
15215
|
-
(0,
|
|
15289
|
+
const [matches, setMatches] = (0, import_react26.useState)(getMatches);
|
|
15290
|
+
(0, import_react26.useEffect)(() => {
|
|
15216
15291
|
if (typeof window === "undefined") return;
|
|
15217
15292
|
const media = window.matchMedia(query);
|
|
15218
15293
|
const listener = (e) => {
|
|
@@ -15235,7 +15310,7 @@ var useMediaQuery = (query) => {
|
|
|
15235
15310
|
};
|
|
15236
15311
|
|
|
15237
15312
|
// src/RedactoPrivacyCenter/components/AppShell/hooks/useSidebarState.ts
|
|
15238
|
-
var
|
|
15313
|
+
var import_react27 = require("react");
|
|
15239
15314
|
var STORAGE_KEY = "redacto-pc-sidebar-state";
|
|
15240
15315
|
var EXPAND_MIN_WIDTH = "(min-width: 1024px)";
|
|
15241
15316
|
function getDefaultState() {
|
|
@@ -15263,18 +15338,18 @@ function writeStored(value) {
|
|
|
15263
15338
|
}
|
|
15264
15339
|
}
|
|
15265
15340
|
function useSidebarState() {
|
|
15266
|
-
const [state, setStateRaw] = (0,
|
|
15267
|
-
(0,
|
|
15341
|
+
const [state, setStateRaw] = (0, import_react27.useState)(void 0);
|
|
15342
|
+
(0, import_react27.useEffect)(() => {
|
|
15268
15343
|
var _a;
|
|
15269
15344
|
setStateRaw((_a = readStored()) != null ? _a : getDefaultState());
|
|
15270
15345
|
}, []);
|
|
15271
|
-
(0,
|
|
15346
|
+
(0, import_react27.useEffect)(() => {
|
|
15272
15347
|
if (state) writeStored(state);
|
|
15273
15348
|
}, [state]);
|
|
15274
|
-
const setState = (0,
|
|
15349
|
+
const setState = (0, import_react27.useCallback)((next) => {
|
|
15275
15350
|
setStateRaw(next);
|
|
15276
15351
|
}, []);
|
|
15277
|
-
const toggle = (0,
|
|
15352
|
+
const toggle = (0, import_react27.useCallback)(() => {
|
|
15278
15353
|
setStateRaw((prev) => prev === "expanded" ? "collapsed" : "expanded");
|
|
15279
15354
|
}, []);
|
|
15280
15355
|
return {
|
|
@@ -15287,7 +15362,7 @@ function useSidebarState() {
|
|
|
15287
15362
|
}
|
|
15288
15363
|
|
|
15289
15364
|
// src/RedactoPrivacyCenter/components/AppShell/hooks/useKeyboardShortcut.ts
|
|
15290
|
-
var
|
|
15365
|
+
var import_react28 = require("react");
|
|
15291
15366
|
function isEditableTarget(target) {
|
|
15292
15367
|
if (!target || !(target instanceof HTMLElement)) return false;
|
|
15293
15368
|
const tag = target.tagName;
|
|
@@ -15296,7 +15371,7 @@ function isEditableTarget(target) {
|
|
|
15296
15371
|
return false;
|
|
15297
15372
|
}
|
|
15298
15373
|
function useKeyboardShortcut(combo, handler) {
|
|
15299
|
-
(0,
|
|
15374
|
+
(0, import_react28.useEffect)(() => {
|
|
15300
15375
|
if (typeof window === "undefined") return;
|
|
15301
15376
|
const onKey = (event) => {
|
|
15302
15377
|
if (event.key.toLowerCase() !== combo.key.toLowerCase()) return;
|
|
@@ -15316,12 +15391,12 @@ function useKeyboardShortcut(combo, handler) {
|
|
|
15316
15391
|
}
|
|
15317
15392
|
|
|
15318
15393
|
// src/RedactoPrivacyCenter/components/AppShell/TopAppBar.tsx
|
|
15319
|
-
var
|
|
15394
|
+
var import_react37 = require("react");
|
|
15320
15395
|
var import_react_i18next12 = require("react-i18next");
|
|
15321
15396
|
var import_lucide_react8 = require("lucide-react");
|
|
15322
15397
|
|
|
15323
15398
|
// src/RedactoPrivacyCenter/context/NavigationContext.tsx
|
|
15324
|
-
var
|
|
15399
|
+
var import_react29 = require("react");
|
|
15325
15400
|
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
15326
15401
|
var NAV_STORAGE_KEY = "pc_current_page";
|
|
15327
15402
|
var CASE_UUID_STORAGE_KEY = "pc_selected_case_uuid";
|
|
@@ -15352,18 +15427,18 @@ function getStoredCaseUuid() {
|
|
|
15352
15427
|
return null;
|
|
15353
15428
|
}
|
|
15354
15429
|
}
|
|
15355
|
-
var NavigationContext = (0,
|
|
15430
|
+
var NavigationContext = (0, import_react29.createContext)(null);
|
|
15356
15431
|
var NavigationProvider = ({
|
|
15357
15432
|
children,
|
|
15358
15433
|
initialPage = "consent-manager"
|
|
15359
15434
|
}) => {
|
|
15360
15435
|
var _a;
|
|
15361
|
-
const [currentPage, setCurrentPage] = (0,
|
|
15436
|
+
const [currentPage, setCurrentPage] = (0, import_react29.useState)(
|
|
15362
15437
|
() => getStoredPage(initialPage)
|
|
15363
15438
|
);
|
|
15364
|
-
const [selectedCase, setSelectedCaseState] = (0,
|
|
15365
|
-
const [pendingCaseUuid] = (0,
|
|
15366
|
-
const setSelectedCase = (0,
|
|
15439
|
+
const [selectedCase, setSelectedCaseState] = (0, import_react29.useState)(null);
|
|
15440
|
+
const [pendingCaseUuid] = (0, import_react29.useState)(() => getStoredCaseUuid());
|
|
15441
|
+
const setSelectedCase = (0, import_react29.useCallback)((c) => {
|
|
15367
15442
|
setSelectedCaseState(c);
|
|
15368
15443
|
try {
|
|
15369
15444
|
if (c == null ? void 0 : c.uuid) {
|
|
@@ -15375,16 +15450,16 @@ var NavigationProvider = ({
|
|
|
15375
15450
|
}
|
|
15376
15451
|
}, []);
|
|
15377
15452
|
const { portal } = usePrivacyCenterSettings();
|
|
15378
|
-
const enabledPages = (0,
|
|
15453
|
+
const enabledPages = (0, import_react29.useMemo)(
|
|
15379
15454
|
() => portal.sections.filter((section) => section.enabled).map((section) => section.key),
|
|
15380
15455
|
[portal.sections]
|
|
15381
15456
|
);
|
|
15382
|
-
const isPageAllowed = (0,
|
|
15457
|
+
const isPageAllowed = (0, import_react29.useCallback)(
|
|
15383
15458
|
(page) => page === "case-details" || enabledPages.includes(page),
|
|
15384
15459
|
[enabledPages]
|
|
15385
15460
|
);
|
|
15386
15461
|
const effectivePage = isPageAllowed(currentPage) ? currentPage : (_a = enabledPages[0]) != null ? _a : "consent-manager";
|
|
15387
|
-
const navigateTo = (0,
|
|
15462
|
+
const navigateTo = (0, import_react29.useCallback)((page) => {
|
|
15388
15463
|
if (!isPageAllowed(page)) {
|
|
15389
15464
|
return;
|
|
15390
15465
|
}
|
|
@@ -15400,7 +15475,7 @@ var NavigationProvider = ({
|
|
|
15400
15475
|
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(NavigationContext.Provider, { value: { currentPage: effectivePage, navigateTo, selectedCase, setSelectedCase, pendingCaseUuid }, children });
|
|
15401
15476
|
};
|
|
15402
15477
|
var useInternalNavigation = () => {
|
|
15403
|
-
const context = (0,
|
|
15478
|
+
const context = (0, import_react29.useContext)(NavigationContext);
|
|
15404
15479
|
if (!context) {
|
|
15405
15480
|
throw new Error("useInternalNavigation must be used within a NavigationProvider");
|
|
15406
15481
|
}
|
|
@@ -15434,7 +15509,7 @@ var rememberLanguageChoice = (code) => {
|
|
|
15434
15509
|
};
|
|
15435
15510
|
|
|
15436
15511
|
// src/RedactoPrivacyCenter/settings/hooks.ts
|
|
15437
|
-
var
|
|
15512
|
+
var import_react30 = require("react");
|
|
15438
15513
|
var import_react_i18next5 = require("react-i18next");
|
|
15439
15514
|
|
|
15440
15515
|
// src/RedactoPrivacyCenter/components/SideMenuBarPC/constants.tsx
|
|
@@ -15466,7 +15541,7 @@ var menuItemsPC = [
|
|
|
15466
15541
|
// src/RedactoPrivacyCenter/settings/hooks.ts
|
|
15467
15542
|
var useIsSectionEnabled = () => {
|
|
15468
15543
|
const { portal } = usePrivacyCenterSettings();
|
|
15469
|
-
return (0,
|
|
15544
|
+
return (0, import_react30.useCallback)(
|
|
15470
15545
|
(key) => {
|
|
15471
15546
|
var _a, _b;
|
|
15472
15547
|
return (_b = (_a = portal.sections.find((section) => section.key === key)) == null ? void 0 : _a.enabled) != null ? _b : true;
|
|
@@ -15477,7 +15552,7 @@ var useIsSectionEnabled = () => {
|
|
|
15477
15552
|
var useMenuItemsPC = () => {
|
|
15478
15553
|
const { t } = (0, import_react_i18next5.useTranslation)();
|
|
15479
15554
|
const { portal } = usePrivacyCenterSettings();
|
|
15480
|
-
return (0,
|
|
15555
|
+
return (0, import_react30.useMemo)(
|
|
15481
15556
|
() => portal.sections.filter((section) => section.enabled).flatMap((section) => {
|
|
15482
15557
|
var _a;
|
|
15483
15558
|
const item = menuItemsPC.find((candidate) => candidate.href === section.key);
|
|
@@ -15488,14 +15563,14 @@ var useMenuItemsPC = () => {
|
|
|
15488
15563
|
};
|
|
15489
15564
|
var useLanguageOptions = () => {
|
|
15490
15565
|
const { languages } = usePrivacyCenterSettings();
|
|
15491
|
-
return (0,
|
|
15566
|
+
return (0, import_react30.useMemo)(() => {
|
|
15492
15567
|
const options = languageOptions.filter((option2) => languages.enabled.includes(option2.value));
|
|
15493
15568
|
return { options, showSwitcher: languages.show_switcher && options.length >= 2 };
|
|
15494
15569
|
}, [languages]);
|
|
15495
15570
|
};
|
|
15496
15571
|
|
|
15497
15572
|
// src/RedactoPrivacyCenter/components/NotificationHub/NotificationBell.tsx
|
|
15498
|
-
var
|
|
15573
|
+
var import_react32 = require("react");
|
|
15499
15574
|
var import_react_i18next9 = require("react-i18next");
|
|
15500
15575
|
var import_io53 = require("react-icons/io5");
|
|
15501
15576
|
|
|
@@ -15708,7 +15783,7 @@ var NotificationDropdown = ({
|
|
|
15708
15783
|
};
|
|
15709
15784
|
|
|
15710
15785
|
// src/RedactoPrivacyCenter/components/NotificationHub/useNotificationActions.ts
|
|
15711
|
-
var
|
|
15786
|
+
var import_react31 = require("react");
|
|
15712
15787
|
var useNotificationActions = () => {
|
|
15713
15788
|
var _a;
|
|
15714
15789
|
const { navigateTo, setSelectedCase } = useInternalNavigation();
|
|
@@ -15718,38 +15793,38 @@ var useNotificationActions = () => {
|
|
|
15718
15793
|
const { langParam } = useCurrentLanguage();
|
|
15719
15794
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
15720
15795
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
15721
|
-
const authContext = (0,
|
|
15796
|
+
const authContext = (0, import_react31.useMemo)(() => ({
|
|
15722
15797
|
accessToken,
|
|
15723
15798
|
refreshToken,
|
|
15724
15799
|
onError,
|
|
15725
15800
|
updateTokens
|
|
15726
15801
|
}), [accessToken, refreshToken, onError, updateTokens]);
|
|
15727
|
-
const hasAcknowledgeCTA = (0,
|
|
15802
|
+
const hasAcknowledgeCTA = (0, import_react31.useCallback)((notification) => {
|
|
15728
15803
|
var _a2, _b;
|
|
15729
15804
|
return (_b = (_a2 = notification.ctas) == null ? void 0 : _a2.some((cta) => cta.action_type === "acknowledge")) != null ? _b : false;
|
|
15730
15805
|
}, []);
|
|
15731
|
-
const handleMarkRead = (0,
|
|
15806
|
+
const handleMarkRead = (0, import_react31.useCallback)(async (notificationUuid) => {
|
|
15732
15807
|
if (!organizationId || !workspaceId) {
|
|
15733
15808
|
return false;
|
|
15734
15809
|
}
|
|
15735
15810
|
const result = await markNotificationRead(organizationId, workspaceId, notificationUuid, authContext, consentClient);
|
|
15736
15811
|
return result !== null;
|
|
15737
15812
|
}, [organizationId, workspaceId, authContext, consentClient]);
|
|
15738
|
-
const handleMarkAllRead = (0,
|
|
15813
|
+
const handleMarkAllRead = (0, import_react31.useCallback)(async () => {
|
|
15739
15814
|
if (!organizationId || !workspaceId) {
|
|
15740
15815
|
return false;
|
|
15741
15816
|
}
|
|
15742
15817
|
const result = await markAllRead(organizationId, workspaceId, authContext, consentClient);
|
|
15743
15818
|
return result !== null;
|
|
15744
15819
|
}, [organizationId, workspaceId, authContext, consentClient]);
|
|
15745
|
-
const handleAcknowledge = (0,
|
|
15820
|
+
const handleAcknowledge = (0, import_react31.useCallback)(async (notificationUuid) => {
|
|
15746
15821
|
if (!organizationId || !workspaceId) {
|
|
15747
15822
|
return false;
|
|
15748
15823
|
}
|
|
15749
15824
|
const result = await acknowledgeNotification(organizationId, workspaceId, notificationUuid, authContext, consentClient);
|
|
15750
15825
|
return result !== null;
|
|
15751
15826
|
}, [organizationId, workspaceId, authContext, consentClient]);
|
|
15752
|
-
const handleCTAClick = (0,
|
|
15827
|
+
const handleCTAClick = (0, import_react31.useCallback)(async (notification, cta) => {
|
|
15753
15828
|
var _a2;
|
|
15754
15829
|
if (cta.action_type === "acknowledge") {
|
|
15755
15830
|
const ok = await handleAcknowledge(notification.uuid);
|
|
@@ -15807,11 +15882,11 @@ var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
|
15807
15882
|
var NotificationBell = () => {
|
|
15808
15883
|
const { t } = (0, import_react_i18next9.useTranslation)();
|
|
15809
15884
|
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,
|
|
15885
|
+
const [notifications, setNotifications] = (0, import_react32.useState)([]);
|
|
15886
|
+
const [unreadCount, setUnreadCount] = (0, import_react32.useState)(0);
|
|
15887
|
+
const [isRefreshing2, setIsRefreshing] = (0, import_react32.useState)(false);
|
|
15888
|
+
const pollRef = (0, import_react32.useRef)(null);
|
|
15889
|
+
const tenantRequestRef = (0, import_react32.useRef)(0);
|
|
15815
15890
|
const {
|
|
15816
15891
|
organizationId,
|
|
15817
15892
|
workspaceId,
|
|
@@ -15822,7 +15897,7 @@ var NotificationBell = () => {
|
|
|
15822
15897
|
handleMarkAllRead,
|
|
15823
15898
|
handleCTAClick
|
|
15824
15899
|
} = useNotificationActions();
|
|
15825
|
-
const pollUnreadCount = (0,
|
|
15900
|
+
const pollUnreadCount = (0, import_react32.useCallback)(async () => {
|
|
15826
15901
|
if (!organizationId || !workspaceId) {
|
|
15827
15902
|
return;
|
|
15828
15903
|
}
|
|
@@ -15838,7 +15913,7 @@ var NotificationBell = () => {
|
|
|
15838
15913
|
setUnreadCount(result.count);
|
|
15839
15914
|
}
|
|
15840
15915
|
}, [organizationId, workspaceId, authContext, consentClient]);
|
|
15841
|
-
const loadDropdownNotifications = (0,
|
|
15916
|
+
const loadDropdownNotifications = (0, import_react32.useCallback)(async () => {
|
|
15842
15917
|
if (!organizationId || !workspaceId) {
|
|
15843
15918
|
return;
|
|
15844
15919
|
}
|
|
@@ -15854,7 +15929,7 @@ var NotificationBell = () => {
|
|
|
15854
15929
|
}
|
|
15855
15930
|
}
|
|
15856
15931
|
}, [organizationId, workspaceId, authContext, consentClient, langParam]);
|
|
15857
|
-
(0,
|
|
15932
|
+
(0, import_react32.useEffect)(() => {
|
|
15858
15933
|
tenantRequestRef.current += 1;
|
|
15859
15934
|
setNotifications([]);
|
|
15860
15935
|
setUnreadCount(0);
|
|
@@ -15862,11 +15937,11 @@ var NotificationBell = () => {
|
|
|
15862
15937
|
tenantRequestRef.current += 1;
|
|
15863
15938
|
};
|
|
15864
15939
|
}, [organizationId, workspaceId]);
|
|
15865
|
-
const pollUnreadCountRef = (0,
|
|
15866
|
-
(0,
|
|
15940
|
+
const pollUnreadCountRef = (0, import_react32.useRef)(pollUnreadCount);
|
|
15941
|
+
(0, import_react32.useEffect)(() => {
|
|
15867
15942
|
pollUnreadCountRef.current = pollUnreadCount;
|
|
15868
15943
|
}, [pollUnreadCount]);
|
|
15869
|
-
(0,
|
|
15944
|
+
(0, import_react32.useEffect)(() => {
|
|
15870
15945
|
if (!organizationId || !workspaceId) {
|
|
15871
15946
|
if (pollRef.current) {
|
|
15872
15947
|
clearInterval(pollRef.current);
|
|
@@ -15882,7 +15957,7 @@ var NotificationBell = () => {
|
|
|
15882
15957
|
}
|
|
15883
15958
|
};
|
|
15884
15959
|
}, [organizationId, workspaceId]);
|
|
15885
|
-
const onRefresh = (0,
|
|
15960
|
+
const onRefresh = (0, import_react32.useCallback)(async () => {
|
|
15886
15961
|
setIsRefreshing(true);
|
|
15887
15962
|
try {
|
|
15888
15963
|
await loadDropdownNotifications();
|
|
@@ -15890,7 +15965,7 @@ var NotificationBell = () => {
|
|
|
15890
15965
|
setIsRefreshing(false);
|
|
15891
15966
|
}
|
|
15892
15967
|
}, [loadDropdownNotifications]);
|
|
15893
|
-
const onMarkAllRead = (0,
|
|
15968
|
+
const onMarkAllRead = (0, import_react32.useCallback)(async () => {
|
|
15894
15969
|
const ok = await handleMarkAllRead();
|
|
15895
15970
|
if (!ok) {
|
|
15896
15971
|
return;
|
|
@@ -15898,7 +15973,7 @@ var NotificationBell = () => {
|
|
|
15898
15973
|
setNotifications((prev) => prev.map((n) => ({ ...n, is_read: true })));
|
|
15899
15974
|
setUnreadCount(0);
|
|
15900
15975
|
}, [handleMarkAllRead]);
|
|
15901
|
-
const onNotificationClick = (0,
|
|
15976
|
+
const onNotificationClick = (0, import_react32.useCallback)(async (notification) => {
|
|
15902
15977
|
if (!notification.is_read) {
|
|
15903
15978
|
const ok = await handleMarkRead(notification.uuid);
|
|
15904
15979
|
if (!ok) {
|
|
@@ -15908,7 +15983,7 @@ var NotificationBell = () => {
|
|
|
15908
15983
|
setUnreadCount((prev) => Math.max(0, prev - 1));
|
|
15909
15984
|
}
|
|
15910
15985
|
}, [handleMarkRead]);
|
|
15911
|
-
const onCTAClick = (0,
|
|
15986
|
+
const onCTAClick = (0, import_react32.useCallback)(async (notification, cta) => {
|
|
15912
15987
|
const result = await handleCTAClick(notification, cta);
|
|
15913
15988
|
if (result === "acknowledged") {
|
|
15914
15989
|
setNotifications((prev) => prev.map(
|
|
@@ -15952,28 +16027,28 @@ var NotificationBell = () => {
|
|
|
15952
16027
|
};
|
|
15953
16028
|
|
|
15954
16029
|
// src/RedactoPrivacyCenter/components/AppShell/UserMenu.tsx
|
|
15955
|
-
var
|
|
16030
|
+
var import_react35 = require("react");
|
|
15956
16031
|
var import_lucide_react6 = require("lucide-react");
|
|
15957
16032
|
var import_react_i18next11 = require("react-i18next");
|
|
15958
16033
|
|
|
15959
16034
|
// src/RedactoPrivacyCenter/context/ProfileSwitchContext.tsx
|
|
15960
|
-
var
|
|
15961
|
-
var ProfileSwitchContext = (0,
|
|
16035
|
+
var import_react33 = require("react");
|
|
16036
|
+
var ProfileSwitchContext = (0, import_react33.createContext)({
|
|
15962
16037
|
canSwitch: false,
|
|
15963
16038
|
switchProfile: () => {
|
|
15964
16039
|
}
|
|
15965
16040
|
});
|
|
15966
16041
|
var ProfileSwitchProvider = ProfileSwitchContext.Provider;
|
|
15967
|
-
var useProfileSwitch = () => (0,
|
|
16042
|
+
var useProfileSwitch = () => (0, import_react33.useContext)(ProfileSwitchContext);
|
|
15968
16043
|
|
|
15969
16044
|
// src/RedactoPrivacyCenter/components/AppShell/usePrivacyCenterExitAction.ts
|
|
15970
|
-
var
|
|
16045
|
+
var import_react34 = require("react");
|
|
15971
16046
|
var import_react_i18next10 = require("react-i18next");
|
|
15972
16047
|
var import_lucide_react5 = require("lucide-react");
|
|
15973
16048
|
function usePrivacyCenterExitAction(onBack) {
|
|
15974
16049
|
const { t } = (0, import_react_i18next10.useTranslation)();
|
|
15975
16050
|
const { emitSignOut } = usePrivacyCenterEvents();
|
|
15976
|
-
const handleAction = (0,
|
|
16051
|
+
const handleAction = (0, import_react34.useCallback)(() => {
|
|
15977
16052
|
if (onBack === "back") {
|
|
15978
16053
|
window.history.back();
|
|
15979
16054
|
} else if (onBack === "signout") {
|
|
@@ -16017,8 +16092,8 @@ function UserMenu({ onBack }) {
|
|
|
16017
16092
|
const branding = useBranding();
|
|
16018
16093
|
const { organization } = useOrganization();
|
|
16019
16094
|
const { accessToken } = useAuth();
|
|
16020
|
-
const [email, setEmail] = (0,
|
|
16021
|
-
(0,
|
|
16095
|
+
const [email, setEmail] = (0, import_react35.useState)("");
|
|
16096
|
+
(0, import_react35.useEffect)(() => {
|
|
16022
16097
|
setEmail(readEmail());
|
|
16023
16098
|
}, []);
|
|
16024
16099
|
const { handleAction, label: actionLabel, Icon: ActionIcon } = usePrivacyCenterExitAction(onBack);
|
|
@@ -16208,14 +16283,14 @@ function UserMenu({ onBack }) {
|
|
|
16208
16283
|
}
|
|
16209
16284
|
|
|
16210
16285
|
// src/RedactoPrivacyCenter/components/AppShell/CompactLanguageMenu.tsx
|
|
16211
|
-
var
|
|
16286
|
+
var import_react36 = require("react");
|
|
16212
16287
|
var import_lucide_react7 = require("lucide-react");
|
|
16213
16288
|
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
16214
16289
|
function CompactLanguageMenu({ locale, options, onChange }) {
|
|
16215
16290
|
var _a, _b;
|
|
16216
|
-
const containerRef = (0,
|
|
16217
|
-
const [open, setOpen] = (0,
|
|
16218
|
-
(0,
|
|
16291
|
+
const containerRef = (0, import_react36.useRef)(null);
|
|
16292
|
+
const [open, setOpen] = (0, import_react36.useState)(false);
|
|
16293
|
+
(0, import_react36.useEffect)(() => {
|
|
16219
16294
|
if (!open) return;
|
|
16220
16295
|
const onDocMouseDown = (event) => {
|
|
16221
16296
|
var _a2;
|
|
@@ -16344,9 +16419,20 @@ function CompactLanguageMenu({ locale, options, onChange }) {
|
|
|
16344
16419
|
|
|
16345
16420
|
// src/RedactoPrivacyCenter/components/AppShell/TopAppBar.tsx
|
|
16346
16421
|
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
16422
|
+
var LOGO_GROUP_PLACEMENT = {
|
|
16423
|
+
// `left`, not `insetInlineStart`: the translation is physical, so a logical
|
|
16424
|
+
// offset would measure from the right under RTL and land off centre.
|
|
16425
|
+
center: {
|
|
16426
|
+
position: "absolute",
|
|
16427
|
+
left: "50%",
|
|
16428
|
+
transform: "translateX(-50%)"
|
|
16429
|
+
},
|
|
16430
|
+
right: { order: 1 }
|
|
16431
|
+
};
|
|
16432
|
+
var hamburgerLeadsHeader = (logoAlign) => logoAlign === "center" || logoAlign === "right";
|
|
16347
16433
|
var TOP_BAR_LOGO_HEIGHT = 32;
|
|
16348
16434
|
var TOP_BAR_LOGO_MAX_HEIGHT = 40;
|
|
16349
|
-
var TopAppBar = (0,
|
|
16435
|
+
var TopAppBar = (0, import_react37.forwardRef)(function TopAppBar2({ onOpenMobileNav, showHamburger, locale, onLocaleChange, onBack, showNotifications = true }, hamburgerRef) {
|
|
16350
16436
|
var _a, _b;
|
|
16351
16437
|
const { t } = (0, import_react_i18next12.useTranslation)();
|
|
16352
16438
|
const branding = useBranding();
|
|
@@ -16360,7 +16446,7 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16360
16446
|
const displayName = (branding == null ? void 0 : branding.brand_name) || (organization == null ? void 0 : organization.name) || "";
|
|
16361
16447
|
const hasLogoImage = Boolean(branding == null ? void 0 : branding.logo_url);
|
|
16362
16448
|
const logoHeight = brandingSettings.logo_height ? Math.min(brandingSettings.logo_height, TOP_BAR_LOGO_MAX_HEIGHT) : TOP_BAR_LOGO_HEIGHT;
|
|
16363
|
-
const changeLanguage = (0,
|
|
16449
|
+
const changeLanguage = (0, import_react37.useCallback)(
|
|
16364
16450
|
(value) => {
|
|
16365
16451
|
rememberLanguageChoice(value);
|
|
16366
16452
|
void i18n_default.changeLanguage(value);
|
|
@@ -16368,7 +16454,7 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16368
16454
|
},
|
|
16369
16455
|
[onLocaleChange]
|
|
16370
16456
|
);
|
|
16371
|
-
const handleLanguageChange = (0,
|
|
16457
|
+
const handleLanguageChange = (0, import_react37.useCallback)(
|
|
16372
16458
|
(value) => {
|
|
16373
16459
|
const langValue = value;
|
|
16374
16460
|
if (!langValue) return;
|
|
@@ -16406,6 +16492,22 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16406
16492
|
fontFamily: "inherit",
|
|
16407
16493
|
flexShrink: 0
|
|
16408
16494
|
};
|
|
16495
|
+
const logoAlign = brandingSettings.logo_align;
|
|
16496
|
+
const hamburgerIsOwnItem = hamburgerLeadsHeader(logoAlign);
|
|
16497
|
+
const logoGroupStyle = {
|
|
16498
|
+
display: "flex",
|
|
16499
|
+
alignItems: "center",
|
|
16500
|
+
gap: 8,
|
|
16501
|
+
minWidth: 0,
|
|
16502
|
+
...LOGO_GROUP_PLACEMENT[logoAlign]
|
|
16503
|
+
};
|
|
16504
|
+
const actionsStyle = {
|
|
16505
|
+
display: "flex",
|
|
16506
|
+
alignItems: "center",
|
|
16507
|
+
gap: 8,
|
|
16508
|
+
flexShrink: 0,
|
|
16509
|
+
...logoAlign === "right" ? { order: 0 } : null
|
|
16510
|
+
};
|
|
16409
16511
|
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [
|
|
16410
16512
|
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
|
|
16411
16513
|
"header",
|
|
@@ -16415,8 +16517,16 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16415
16517
|
style: headerStyle,
|
|
16416
16518
|
...partAttribute("topbar"),
|
|
16417
16519
|
children: [
|
|
16418
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.
|
|
16419
|
-
|
|
16520
|
+
showHamburger && hamburgerIsOwnItem && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
16521
|
+
HamburgerButton,
|
|
16522
|
+
{
|
|
16523
|
+
ref: hamburgerRef,
|
|
16524
|
+
onClick: onOpenMobileNav,
|
|
16525
|
+
label: t("openSidebarMenu")
|
|
16526
|
+
}
|
|
16527
|
+
),
|
|
16528
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { style: logoGroupStyle, children: [
|
|
16529
|
+
showHamburger && !hamburgerIsOwnItem && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
16420
16530
|
HamburgerButton,
|
|
16421
16531
|
{
|
|
16422
16532
|
ref: hamburgerRef,
|
|
@@ -16466,48 +16576,36 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16466
16576
|
}
|
|
16467
16577
|
)
|
|
16468
16578
|
] }),
|
|
16469
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
|
|
16470
|
-
|
|
16471
|
-
|
|
16472
|
-
|
|
16473
|
-
|
|
16474
|
-
|
|
16475
|
-
|
|
16476
|
-
|
|
16477
|
-
|
|
16478
|
-
|
|
16479
|
-
|
|
16480
|
-
|
|
16481
|
-
|
|
16482
|
-
|
|
16483
|
-
|
|
16484
|
-
|
|
16485
|
-
|
|
16486
|
-
|
|
16487
|
-
|
|
16488
|
-
|
|
16489
|
-
|
|
16490
|
-
|
|
16491
|
-
|
|
16492
|
-
|
|
16493
|
-
|
|
16494
|
-
|
|
16495
|
-
|
|
16496
|
-
|
|
16497
|
-
|
|
16498
|
-
|
|
16499
|
-
flexShrink: 0
|
|
16500
|
-
},
|
|
16501
|
-
options: [...languageOptions2],
|
|
16502
|
-
value: languageOptions2.find((opt) => opt.value === locale) || null,
|
|
16503
|
-
onChange: handleLanguageChange
|
|
16504
|
-
}
|
|
16505
|
-
),
|
|
16506
|
-
showNotifications && isSectionEnabled("notifications") && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(NotificationBell, {}),
|
|
16507
|
-
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(UserMenu, { onBack })
|
|
16508
|
-
]
|
|
16509
|
-
}
|
|
16510
|
-
)
|
|
16579
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { style: actionsStyle, className: "pc-shell-topbar-actions", children: [
|
|
16580
|
+
!showSwitcher ? null : showHamburger ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
16581
|
+
CompactLanguageMenu,
|
|
16582
|
+
{
|
|
16583
|
+
locale,
|
|
16584
|
+
options: languageOptions2,
|
|
16585
|
+
onChange: changeLanguage
|
|
16586
|
+
}
|
|
16587
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
16588
|
+
PCSelect,
|
|
16589
|
+
{
|
|
16590
|
+
size: "sm",
|
|
16591
|
+
searchable: true,
|
|
16592
|
+
prefix: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react8.Globe2, { size: 12, strokeWidth: 1.8 }),
|
|
16593
|
+
searchPlaceholder: t("searchPlaceholder"),
|
|
16594
|
+
noOptionsMessage: t("noOptionsFound"),
|
|
16595
|
+
style: {
|
|
16596
|
+
width: "auto",
|
|
16597
|
+
minWidth: 120,
|
|
16598
|
+
maxWidth: "min(60vw, 280px)",
|
|
16599
|
+
flexShrink: 0
|
|
16600
|
+
},
|
|
16601
|
+
options: [...languageOptions2],
|
|
16602
|
+
value: languageOptions2.find((opt) => opt.value === locale) || null,
|
|
16603
|
+
onChange: handleLanguageChange
|
|
16604
|
+
}
|
|
16605
|
+
),
|
|
16606
|
+
showNotifications && isSectionEnabled("notifications") && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(NotificationBell, {}),
|
|
16607
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(UserMenu, { onBack })
|
|
16608
|
+
] })
|
|
16511
16609
|
]
|
|
16512
16610
|
}
|
|
16513
16611
|
),
|
|
@@ -16519,7 +16617,7 @@ var TopAppBar = (0, import_react36.forwardRef)(function TopAppBar2({ onOpenMobil
|
|
|
16519
16617
|
` })
|
|
16520
16618
|
] });
|
|
16521
16619
|
});
|
|
16522
|
-
var HamburgerButton = (0,
|
|
16620
|
+
var HamburgerButton = (0, import_react37.forwardRef)(
|
|
16523
16621
|
function HamburgerButton2({ onClick, label }, ref) {
|
|
16524
16622
|
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
16525
16623
|
PCActionIcon,
|
|
@@ -16541,16 +16639,16 @@ var HamburgerButton = (0, import_react36.forwardRef)(
|
|
|
16541
16639
|
);
|
|
16542
16640
|
|
|
16543
16641
|
// src/RedactoPrivacyCenter/components/AppShell/SidebarNav.tsx
|
|
16544
|
-
var
|
|
16642
|
+
var import_react39 = require("react");
|
|
16545
16643
|
var import_react_i18next13 = require("react-i18next");
|
|
16546
16644
|
var import_lucide_react9 = require("lucide-react");
|
|
16547
16645
|
|
|
16548
16646
|
// src/RedactoPrivacyCenter/components/AppShell/NavItem.tsx
|
|
16549
|
-
var
|
|
16647
|
+
var import_react38 = require("react");
|
|
16550
16648
|
var import_jsx_runtime38 = require("react/jsx-runtime");
|
|
16551
16649
|
function NavItem({ item, mode, onNavigate }) {
|
|
16552
16650
|
const { currentPage, navigateTo } = useInternalNavigation();
|
|
16553
|
-
const [hover, setHover] = (0,
|
|
16651
|
+
const [hover, setHover] = (0, import_react38.useState)(false);
|
|
16554
16652
|
const isCollapsed = mode === "collapsed";
|
|
16555
16653
|
const isActive = item.href ? currentPage === item.href : false;
|
|
16556
16654
|
const isDisabled = !!item.isComingSoon;
|
|
@@ -16721,7 +16819,7 @@ function SidebarNav({ isExpanded, onToggle, className }) {
|
|
|
16721
16819
|
const { t } = (0, import_react_i18next13.useTranslation)();
|
|
16722
16820
|
const menuItems = useMenuItemsPC();
|
|
16723
16821
|
const mode = isExpanded ? "expanded" : "collapsed";
|
|
16724
|
-
const asideStyle = (0,
|
|
16822
|
+
const asideStyle = (0, import_react39.useMemo)(
|
|
16725
16823
|
() => ({
|
|
16726
16824
|
position: "sticky",
|
|
16727
16825
|
top: TOP_BAR_HEIGHT,
|
|
@@ -16738,7 +16836,7 @@ function SidebarNav({ isExpanded, onToggle, className }) {
|
|
|
16738
16836
|
}),
|
|
16739
16837
|
[isExpanded]
|
|
16740
16838
|
);
|
|
16741
|
-
const flatNavItems = (0,
|
|
16839
|
+
const flatNavItems = (0, import_react39.useMemo)(
|
|
16742
16840
|
() => menuItems.filter((item) => Boolean(item.href)),
|
|
16743
16841
|
[menuItems]
|
|
16744
16842
|
);
|
|
@@ -16805,7 +16903,7 @@ function SidebarNav({ isExpanded, onToggle, className }) {
|
|
|
16805
16903
|
}
|
|
16806
16904
|
|
|
16807
16905
|
// src/RedactoPrivacyCenter/components/AppShell/MobileNavDrawer.tsx
|
|
16808
|
-
var
|
|
16906
|
+
var import_react40 = require("react");
|
|
16809
16907
|
var import_react_dom2 = require("react-dom");
|
|
16810
16908
|
var import_react_i18next14 = require("react-i18next");
|
|
16811
16909
|
var import_lucide_react10 = require("lucide-react");
|
|
@@ -16817,17 +16915,17 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
16817
16915
|
const branding = useBranding();
|
|
16818
16916
|
const { organization } = useOrganization();
|
|
16819
16917
|
const displayName = (branding == null ? void 0 : branding.brand_name) || (organization == null ? void 0 : organization.name) || "";
|
|
16820
|
-
const drawerRef = (0,
|
|
16821
|
-
const firstNavRef = (0,
|
|
16918
|
+
const drawerRef = (0, import_react40.useRef)(null);
|
|
16919
|
+
const firstNavRef = (0, import_react40.useRef)(null);
|
|
16822
16920
|
const appearanceAttributes = useAppearanceAttributes();
|
|
16823
16921
|
const scopeAttributes = usePrivacyCenterScopeAttributes();
|
|
16824
16922
|
const isRtl = ((_a = usePrivacyCenterScope()) == null ? void 0 : _a.dir) === "rtl";
|
|
16825
16923
|
const { sheetOverlays } = useAppearanceLayout();
|
|
16826
|
-
const flatNavItems = (0,
|
|
16924
|
+
const flatNavItems = (0, import_react40.useMemo)(
|
|
16827
16925
|
() => menuItems.filter((item) => Boolean(item.href)),
|
|
16828
16926
|
[menuItems]
|
|
16829
16927
|
);
|
|
16830
|
-
(0,
|
|
16928
|
+
(0, import_react40.useEffect)(() => {
|
|
16831
16929
|
if (typeof document === "undefined") return;
|
|
16832
16930
|
if (!isOpen) return;
|
|
16833
16931
|
const previous = document.body.style.overflow;
|
|
@@ -16836,7 +16934,7 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
16836
16934
|
document.body.style.overflow = previous;
|
|
16837
16935
|
};
|
|
16838
16936
|
}, [isOpen]);
|
|
16839
|
-
(0,
|
|
16937
|
+
(0, import_react40.useEffect)(() => {
|
|
16840
16938
|
if (!isOpen || typeof window === "undefined") return;
|
|
16841
16939
|
const onKey = (event) => {
|
|
16842
16940
|
if (event.key === "Escape") {
|
|
@@ -16858,8 +16956,8 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
16858
16956
|
window.clearTimeout(focusTimer);
|
|
16859
16957
|
};
|
|
16860
16958
|
}, [isOpen, onClose]);
|
|
16861
|
-
const wasOpenRef = (0,
|
|
16862
|
-
(0,
|
|
16959
|
+
const wasOpenRef = (0, import_react40.useRef)(false);
|
|
16960
|
+
(0, import_react40.useEffect)(() => {
|
|
16863
16961
|
if (isOpen) {
|
|
16864
16962
|
wasOpenRef.current = true;
|
|
16865
16963
|
return;
|
|
@@ -16872,7 +16970,7 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
16872
16970
|
const t2 = window.setTimeout(() => node.focus(), 0);
|
|
16873
16971
|
return () => window.clearTimeout(t2);
|
|
16874
16972
|
}, [isOpen, returnFocusRef]);
|
|
16875
|
-
const handleNavigate = (0,
|
|
16973
|
+
const handleNavigate = (0, import_react40.useCallback)(() => {
|
|
16876
16974
|
onClose();
|
|
16877
16975
|
}, [onClose]);
|
|
16878
16976
|
const overlayStyle = {
|
|
@@ -17051,25 +17149,25 @@ function MobileNavDrawer({ isOpen, onClose, returnFocusRef }) {
|
|
|
17051
17149
|
var import_react_i18next15 = require("react-i18next");
|
|
17052
17150
|
|
|
17053
17151
|
// src/RedactoPrivacyCenter/context/PageChromeContext.tsx
|
|
17054
|
-
var
|
|
17152
|
+
var import_react41 = require("react");
|
|
17055
17153
|
var import_jsx_runtime41 = require("react/jsx-runtime");
|
|
17056
|
-
var PageChromeContext = (0,
|
|
17154
|
+
var PageChromeContext = (0, import_react41.createContext)(null);
|
|
17057
17155
|
function PageChromeProvider({ children }) {
|
|
17058
|
-
const [pageChromeOverride, setPageChromeOverrideState] = (0,
|
|
17059
|
-
const [headerStatus, setHeaderStatusState] = (0,
|
|
17060
|
-
const setPageChromeOverride = (0,
|
|
17156
|
+
const [pageChromeOverride, setPageChromeOverrideState] = (0, import_react41.useState)(null);
|
|
17157
|
+
const [headerStatus, setHeaderStatusState] = (0, import_react41.useState)(null);
|
|
17158
|
+
const setPageChromeOverride = (0, import_react41.useCallback)(
|
|
17061
17159
|
(override) => {
|
|
17062
17160
|
setPageChromeOverrideState(override);
|
|
17063
17161
|
},
|
|
17064
17162
|
[]
|
|
17065
17163
|
);
|
|
17066
|
-
const clearPageChromeOverride = (0,
|
|
17164
|
+
const clearPageChromeOverride = (0, import_react41.useCallback)(() => {
|
|
17067
17165
|
setPageChromeOverrideState(null);
|
|
17068
17166
|
}, []);
|
|
17069
|
-
const setHeaderStatus = (0,
|
|
17167
|
+
const setHeaderStatus = (0, import_react41.useCallback)((status) => {
|
|
17070
17168
|
setHeaderStatusState(status);
|
|
17071
17169
|
}, []);
|
|
17072
|
-
const value = (0,
|
|
17170
|
+
const value = (0, import_react41.useMemo)(
|
|
17073
17171
|
() => ({
|
|
17074
17172
|
pageChromeOverride,
|
|
17075
17173
|
setPageChromeOverride,
|
|
@@ -17088,7 +17186,7 @@ function PageChromeProvider({ children }) {
|
|
|
17088
17186
|
return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(PageChromeContext.Provider, { value, children });
|
|
17089
17187
|
}
|
|
17090
17188
|
function usePageChrome() {
|
|
17091
|
-
const context = (0,
|
|
17189
|
+
const context = (0, import_react41.useContext)(PageChromeContext);
|
|
17092
17190
|
if (!context) {
|
|
17093
17191
|
throw new Error("usePageChrome must be used within a PageChromeProvider");
|
|
17094
17192
|
}
|
|
@@ -17385,27 +17483,27 @@ function AppShell({
|
|
|
17385
17483
|
}) {
|
|
17386
17484
|
const { t } = (0, import_react_i18next18.useTranslation)();
|
|
17387
17485
|
const sidebar = useSidebarState();
|
|
17388
|
-
const [locale, setLocale] = (0,
|
|
17389
|
-
const [isMobileNavOpen, setMobileNavOpen] = (0,
|
|
17390
|
-
const hamburgerRef = (0,
|
|
17486
|
+
const [locale, setLocale] = (0, import_react42.useState)(i18n_default.language);
|
|
17487
|
+
const [isMobileNavOpen, setMobileNavOpen] = (0, import_react42.useState)(false);
|
|
17488
|
+
const hamburgerRef = (0, import_react42.useRef)(null);
|
|
17391
17489
|
const appearanceAttributes = useAppearanceAttributes();
|
|
17392
17490
|
const isMobile = useMediaQuery("(max-width: 639px)");
|
|
17393
17491
|
const { status } = useDataAvailability();
|
|
17394
17492
|
const hideNav = status !== "has-data";
|
|
17395
|
-
(0,
|
|
17493
|
+
(0, import_react42.useEffect)(() => {
|
|
17396
17494
|
if (!isMobile && isMobileNavOpen) setMobileNavOpen(false);
|
|
17397
17495
|
}, [isMobile, isMobileNavOpen]);
|
|
17398
|
-
(0,
|
|
17496
|
+
(0, import_react42.useEffect)(() => {
|
|
17399
17497
|
const onChange = () => setLocale(i18n_default.language);
|
|
17400
17498
|
i18n_default.on("languageChanged", onChange);
|
|
17401
17499
|
return () => i18n_default.off("languageChanged", onChange);
|
|
17402
17500
|
}, []);
|
|
17403
|
-
const handleSidebarToggle = (0,
|
|
17501
|
+
const handleSidebarToggle = (0, import_react42.useCallback)(() => {
|
|
17404
17502
|
sidebar.toggle();
|
|
17405
17503
|
}, [sidebar]);
|
|
17406
17504
|
useKeyboardShortcut(
|
|
17407
17505
|
{ key: "b", mod: true },
|
|
17408
|
-
(0,
|
|
17506
|
+
(0, import_react42.useCallback)(() => {
|
|
17409
17507
|
if (isMobile) setMobileNavOpen((prev) => !prev);
|
|
17410
17508
|
else sidebar.toggle();
|
|
17411
17509
|
}, [isMobile, sidebar])
|
|
@@ -17439,7 +17537,7 @@ function AppShell({
|
|
|
17439
17537
|
boxSizing: "border-box"
|
|
17440
17538
|
};
|
|
17441
17539
|
return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(LocaleContext.Provider, { value: { locale, setLocale }, children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
17442
|
-
|
|
17540
|
+
import_react42.Suspense,
|
|
17443
17541
|
{
|
|
17444
17542
|
fallback: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
17445
17543
|
"div",
|
|
@@ -17599,7 +17697,7 @@ function AppShell({
|
|
|
17599
17697
|
}
|
|
17600
17698
|
|
|
17601
17699
|
// src/RedactoPrivacyCenter/components/SelectUserGate.tsx
|
|
17602
|
-
var
|
|
17700
|
+
var import_react43 = require("react");
|
|
17603
17701
|
var import_react_i18next20 = require("react-i18next");
|
|
17604
17702
|
|
|
17605
17703
|
// src/RedactoPrivacyCenter/components/SelectUser.tsx
|
|
@@ -17661,12 +17759,12 @@ var SelectUserGate = ({ children }) => {
|
|
|
17661
17759
|
const workspaceId = ((_b = (_a = organization == null ? void 0 : organization.workspaces) == null ? void 0 : _a[0]) == null ? void 0 : _b.uuid) || "";
|
|
17662
17760
|
const { consentClient } = useBaseUrl();
|
|
17663
17761
|
const { accessToken, updateTokens } = useAuth();
|
|
17664
|
-
const [phase, setPhase] = (0,
|
|
17665
|
-
const [candidates, setCandidates] = (0,
|
|
17666
|
-
const [busyOrgUserId, setBusyOrgUserId] = (0,
|
|
17667
|
-
const [selectError, setSelectError] = (0,
|
|
17762
|
+
const [phase, setPhase] = (0, import_react43.useState)("checking");
|
|
17763
|
+
const [candidates, setCandidates] = (0, import_react43.useState)([]);
|
|
17764
|
+
const [busyOrgUserId, setBusyOrgUserId] = (0, import_react43.useState)(null);
|
|
17765
|
+
const [selectError, setSelectError] = (0, import_react43.useState)(null);
|
|
17668
17766
|
const tokenOrgUserId = ((_d = (_c = decodeJwtToken(accessToken)) == null ? void 0 : _c.user_data) == null ? void 0 : _d.org_user_id) || "";
|
|
17669
|
-
(0,
|
|
17767
|
+
(0, import_react43.useEffect)(() => {
|
|
17670
17768
|
let cancelled = false;
|
|
17671
17769
|
if (isSandboxMode()) {
|
|
17672
17770
|
setPhase("resolved");
|
|
@@ -17740,7 +17838,7 @@ var SelectUserGate = ({ children }) => {
|
|
|
17740
17838
|
setSelectError(t("couldNotSwitchProfile"));
|
|
17741
17839
|
}
|
|
17742
17840
|
};
|
|
17743
|
-
const switchProfile = (0,
|
|
17841
|
+
const switchProfile = (0, import_react43.useCallback)(() => {
|
|
17744
17842
|
if (typeof window !== "undefined") {
|
|
17745
17843
|
sessionStorage.removeItem(PICKED_ORG_USER_KEY);
|
|
17746
17844
|
}
|
|
@@ -17748,7 +17846,7 @@ var SelectUserGate = ({ children }) => {
|
|
|
17748
17846
|
setBusyOrgUserId(null);
|
|
17749
17847
|
setPhase("picking");
|
|
17750
17848
|
}, []);
|
|
17751
|
-
const switchValue = (0,
|
|
17849
|
+
const switchValue = (0, import_react43.useMemo)(
|
|
17752
17850
|
() => ({ canSwitch: candidates.length > 1, switchProfile }),
|
|
17753
17851
|
[candidates.length, switchProfile]
|
|
17754
17852
|
);
|
|
@@ -17772,7 +17870,7 @@ var SelectUserGate = ({ children }) => {
|
|
|
17772
17870
|
};
|
|
17773
17871
|
|
|
17774
17872
|
// src/RedactoPrivacyCenter/components/SignIn/PrivacyCenterSignIn.tsx
|
|
17775
|
-
var
|
|
17873
|
+
var import_react48 = require("react");
|
|
17776
17874
|
var import_react_i18next23 = require("react-i18next");
|
|
17777
17875
|
|
|
17778
17876
|
// src/RedactoPrivacyCenter/utils/toast.ts
|
|
@@ -17936,7 +18034,7 @@ var maskPhone = (phone) => {
|
|
|
17936
18034
|
};
|
|
17937
18035
|
|
|
17938
18036
|
// src/RedactoPrivacyCenter/components/SignIn/ContactStep.tsx
|
|
17939
|
-
var
|
|
18037
|
+
var import_react44 = require("react");
|
|
17940
18038
|
var import_react_i18next21 = require("react-i18next");
|
|
17941
18039
|
|
|
17942
18040
|
// src/RedactoPrivacyCenter/components/SignIn/SignInHeading.tsx
|
|
@@ -18007,8 +18105,8 @@ function ContactStep({
|
|
|
18007
18105
|
const { sign_in: signIn } = usePrivacyCenterSettings();
|
|
18008
18106
|
const branding = useBranding();
|
|
18009
18107
|
const copy = useSettingsCopy();
|
|
18010
|
-
const [value, setValue] = (0,
|
|
18011
|
-
const [countryCode, setCountryCode] = (0,
|
|
18108
|
+
const [value, setValue] = (0, import_react44.useState)(initialValue);
|
|
18109
|
+
const [countryCode, setCountryCode] = (0, import_react44.useState)(initialCountryCode != null ? initialCountryCode : signIn.default_country_code);
|
|
18012
18110
|
const channelCopy = CHANNEL_COPY_KEYS[signIn.channels];
|
|
18013
18111
|
const label = signIn.field_label ? copy(signIn.field_label) : t(channelCopy.fieldLabel);
|
|
18014
18112
|
const placeholder = signIn.placeholder ? copy(signIn.placeholder) : t(channelCopy.placeholder);
|
|
@@ -18103,7 +18201,7 @@ function ContactStep({
|
|
|
18103
18201
|
}
|
|
18104
18202
|
|
|
18105
18203
|
// src/RedactoPrivacyCenter/components/SignIn/OtpStep.tsx
|
|
18106
|
-
var
|
|
18204
|
+
var import_react45 = require("react");
|
|
18107
18205
|
var import_react_i18next22 = require("react-i18next");
|
|
18108
18206
|
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
18109
18207
|
var OTP_LENGTH = 6;
|
|
@@ -18147,8 +18245,8 @@ function OtpStep({
|
|
|
18147
18245
|
const { t } = (0, import_react_i18next22.useTranslation)();
|
|
18148
18246
|
const { sign_in: signIn } = usePrivacyCenterSettings();
|
|
18149
18247
|
const copy = useSettingsCopy();
|
|
18150
|
-
const [digits, setDigits] = (0,
|
|
18151
|
-
const inputs = (0,
|
|
18248
|
+
const [digits, setDigits] = (0, import_react45.useState)([...EMPTY_CODE]);
|
|
18249
|
+
const inputs = (0, import_react45.useRef)([]);
|
|
18152
18250
|
const contactDisplay = channel === "sms" ? maskPhone(contact) : contact;
|
|
18153
18251
|
const description = signIn.otp_description ? copy(signIn.otp_description, { contact: contactDisplay }) : t(channel === "sms" ? "otpDescriptionSms" : "otpDescriptionEmail");
|
|
18154
18252
|
const focus = (index) => {
|
|
@@ -18308,10 +18406,10 @@ var otpErrorKey = (error) => {
|
|
|
18308
18406
|
var import_lucide_react13 = require("lucide-react");
|
|
18309
18407
|
|
|
18310
18408
|
// src/RedactoPrivacyCenter/components/SignIn/useLocaleState.ts
|
|
18311
|
-
var
|
|
18409
|
+
var import_react46 = require("react");
|
|
18312
18410
|
var useLocaleState = () => {
|
|
18313
18411
|
const { currentLanguage } = useCurrentLanguage();
|
|
18314
|
-
const changeLocale = (0,
|
|
18412
|
+
const changeLocale = (0, import_react46.useCallback)((code) => {
|
|
18315
18413
|
rememberLanguageChoice(code);
|
|
18316
18414
|
void i18n_default.changeLanguage(code);
|
|
18317
18415
|
}, []);
|
|
@@ -18601,17 +18699,17 @@ function SignInFrame({ children }) {
|
|
|
18601
18699
|
}
|
|
18602
18700
|
|
|
18603
18701
|
// src/RedactoPrivacyCenter/components/SignIn/useCountdown.ts
|
|
18604
|
-
var
|
|
18702
|
+
var import_react47 = require("react");
|
|
18605
18703
|
var useCountdown = () => {
|
|
18606
|
-
const [remaining, setRemaining] = (0,
|
|
18607
|
-
(0,
|
|
18704
|
+
const [remaining, setRemaining] = (0, import_react47.useState)(0);
|
|
18705
|
+
(0, import_react47.useEffect)(() => {
|
|
18608
18706
|
if (remaining <= 0) {
|
|
18609
18707
|
return void 0;
|
|
18610
18708
|
}
|
|
18611
18709
|
const timer = setTimeout(() => setRemaining((value) => Math.max(0, value - 1)), 1e3);
|
|
18612
18710
|
return () => clearTimeout(timer);
|
|
18613
18711
|
}, [remaining]);
|
|
18614
|
-
const start = (0,
|
|
18712
|
+
const start = (0, import_react47.useCallback)((seconds) => setRemaining(seconds), []);
|
|
18615
18713
|
return { remaining, start };
|
|
18616
18714
|
};
|
|
18617
18715
|
|
|
@@ -18623,9 +18721,8 @@ var INVALID_CONTACT_KEYS = {
|
|
|
18623
18721
|
email: "signInInvalidContactEmail",
|
|
18624
18722
|
sms: "signInInvalidContactSms"
|
|
18625
18723
|
};
|
|
18626
|
-
var seedSession = (
|
|
18724
|
+
var seedSession = (organisationUuid, workspaceUuid, sent) => {
|
|
18627
18725
|
try {
|
|
18628
|
-
sessionStorage.setItem("pc_org_slug", slug);
|
|
18629
18726
|
sessionStorage.setItem("pc_org_id", organisationUuid);
|
|
18630
18727
|
sessionStorage.setItem("pc_workspace_id", workspaceUuid);
|
|
18631
18728
|
if (sent.channel === "email") {
|
|
@@ -18634,23 +18731,22 @@ var seedSession = (slug, organisationUuid, workspaceUuid, sent) => {
|
|
|
18634
18731
|
} catch {
|
|
18635
18732
|
}
|
|
18636
18733
|
};
|
|
18637
|
-
function PrivacyCenterSignIn(
|
|
18734
|
+
function PrivacyCenterSignIn() {
|
|
18638
18735
|
var _a;
|
|
18639
18736
|
const { t } = (0, import_react_i18next23.useTranslation)();
|
|
18640
18737
|
const { settings, organisation } = usePrivacyCenterSettingsContext();
|
|
18641
18738
|
const { consentClient } = useBaseUrl();
|
|
18642
18739
|
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,
|
|
18740
|
+
const [sent, setSent] = (0, import_react48.useState)(null);
|
|
18741
|
+
const [step, setStep] = (0, import_react48.useState)("contact");
|
|
18742
|
+
const [typedContact, setTypedContact] = (0, import_react48.useState)("");
|
|
18743
|
+
const [error, setError] = (0, import_react48.useState)(null);
|
|
18744
|
+
const [busy, setBusy] = (0, import_react48.useState)(false);
|
|
18745
|
+
const [resending, setResending] = (0, import_react48.useState)(false);
|
|
18649
18746
|
const countdown = useCountdown();
|
|
18650
18747
|
const { organisationUuid, workspaceUuid } = organisation;
|
|
18651
18748
|
const orgUnavailable = organisation.status === "failed";
|
|
18652
|
-
const
|
|
18653
|
-
const sendCode = (0, import_react47.useCallback)(
|
|
18749
|
+
const sendCode = (0, import_react48.useCallback)(
|
|
18654
18750
|
async (contact, channel) => {
|
|
18655
18751
|
const response = await consentClient.createOtp(
|
|
18656
18752
|
organisationUuid != null ? organisationUuid : "",
|
|
@@ -18715,7 +18811,7 @@ function PrivacyCenterSignIn({ slug }) {
|
|
|
18715
18811
|
setError(t("otpErrorFallback"));
|
|
18716
18812
|
return;
|
|
18717
18813
|
}
|
|
18718
|
-
seedSession(
|
|
18814
|
+
seedSession(organisationUuid, workspaceUuid, sent);
|
|
18719
18815
|
updateTokens(accessToken, (_a2 = result == null ? void 0 : result.refresh_token) != null ? _a2 : void 0);
|
|
18720
18816
|
} catch (verifyError) {
|
|
18721
18817
|
setError(t(otpErrorKey(verifyError)));
|
|
@@ -18772,7 +18868,7 @@ function PrivacyCenterSignIn({ slug }) {
|
|
|
18772
18868
|
{
|
|
18773
18869
|
initialValue: typedContact,
|
|
18774
18870
|
initialCountryCode: (_a = sent == null ? void 0 : sent.countryCode) != null ? _a : null,
|
|
18775
|
-
busy
|
|
18871
|
+
busy,
|
|
18776
18872
|
disabled: orgUnavailable,
|
|
18777
18873
|
error: error != null ? error : orgUnavailable ? t("signInOrgUnavailable") : null,
|
|
18778
18874
|
onSubmit: (value, countryCode) => void handleContact(value, countryCode),
|
|
@@ -18782,7 +18878,7 @@ function PrivacyCenterSignIn({ slug }) {
|
|
|
18782
18878
|
}
|
|
18783
18879
|
|
|
18784
18880
|
// src/RedactoPrivacyCenter/lib/inactivityTimer.ts
|
|
18785
|
-
var
|
|
18881
|
+
var import_react49 = require("react");
|
|
18786
18882
|
var createInactivityTimer = ({
|
|
18787
18883
|
timeoutMs,
|
|
18788
18884
|
onTimeout,
|
|
@@ -18840,9 +18936,9 @@ var createInactivityTimer = ({
|
|
|
18840
18936
|
var ACTIVITY_EVENTS = ["pointerdown", "pointermove", "keydown", "wheel", "touchstart", "scroll"];
|
|
18841
18937
|
var MS_PER_MINUTE = 6e4;
|
|
18842
18938
|
var useInactivityTimeout = (timeoutMinutes, enabled, onTimeout) => {
|
|
18843
|
-
const latest = (0,
|
|
18939
|
+
const latest = (0, import_react49.useRef)(onTimeout);
|
|
18844
18940
|
latest.current = onTimeout;
|
|
18845
|
-
(0,
|
|
18941
|
+
(0, import_react49.useEffect)(() => {
|
|
18846
18942
|
if (!enabled || !timeoutMinutes || typeof window === "undefined") {
|
|
18847
18943
|
return void 0;
|
|
18848
18944
|
}
|
|
@@ -18880,51 +18976,50 @@ function PrivacyCenterLayout({ settings, ...props }) {
|
|
|
18880
18976
|
}
|
|
18881
18977
|
function PrivacyCenterLayoutContent({
|
|
18882
18978
|
children,
|
|
18883
|
-
slug,
|
|
18979
|
+
slug = "",
|
|
18884
18980
|
onBack
|
|
18885
18981
|
}) {
|
|
18886
18982
|
const { consentClient } = useBaseUrl();
|
|
18887
18983
|
const { accessToken: authAccessToken, sessionExpired, expireSession } = useAuth();
|
|
18888
18984
|
const { settings, builtInSignIn } = usePrivacyCenterSettingsContext();
|
|
18889
18985
|
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,
|
|
18986
|
+
const [organization, setOrganization] = (0, import_react50.useState)(null);
|
|
18987
|
+
const [isCheckingAuth, setIsCheckingAuth] = (0, import_react50.useState)(true);
|
|
18988
|
+
const [isLoadingOrg, setIsLoadingOrg] = (0, import_react50.useState)(true);
|
|
18989
|
+
const hasRedirectedRef = (0, import_react50.useRef)(false);
|
|
18990
|
+
const authCheckInProgressRef = (0, import_react50.useRef)(false);
|
|
18991
|
+
(0, import_react50.useEffect)(() => {
|
|
18992
|
+
if (slug) warnSlugDeprecated();
|
|
18993
|
+
}, [slug]);
|
|
18994
|
+
(0, import_react50.useEffect)(() => {
|
|
18896
18995
|
if (typeof window === "undefined") return;
|
|
18897
18996
|
let accessToken = sessionStorage.getItem("access_token");
|
|
18898
18997
|
let orgId = sessionStorage.getItem("pc_org_id");
|
|
18899
18998
|
let workspaceId = sessionStorage.getItem("pc_workspace_id");
|
|
18900
|
-
|
|
18901
|
-
if (authAccessToken && (!accessToken || !orgId || !workspaceId || !orgSlug)) {
|
|
18999
|
+
if (authAccessToken && (!accessToken || !orgId || !workspaceId)) {
|
|
18902
19000
|
const decoded = decodeJwtToken(authAccessToken);
|
|
18903
19001
|
if (decoded) {
|
|
18904
19002
|
accessToken = accessToken || authAccessToken;
|
|
18905
19003
|
orgId = orgId || (typeof decoded.organisation_uuid === "string" ? decoded.organisation_uuid : null);
|
|
18906
19004
|
workspaceId = workspaceId || (typeof decoded.workspace_uuid === "string" ? decoded.workspace_uuid : null);
|
|
18907
|
-
orgSlug = orgSlug || (typeof decoded.organisation_slug === "string" ? decoded.organisation_slug : null);
|
|
18908
19005
|
if (accessToken) sessionStorage.setItem("access_token", accessToken);
|
|
18909
19006
|
if (orgId) sessionStorage.setItem("pc_org_id", orgId);
|
|
18910
19007
|
if (workspaceId) sessionStorage.setItem("pc_workspace_id", workspaceId);
|
|
18911
|
-
if (orgSlug) sessionStorage.setItem("pc_org_slug", orgSlug);
|
|
18912
19008
|
const contact = resolveContactFromJwt(decoded);
|
|
18913
19009
|
if (contact) {
|
|
18914
19010
|
sessionStorage.setItem("email", contact);
|
|
18915
19011
|
}
|
|
18916
19012
|
}
|
|
18917
19013
|
}
|
|
18918
|
-
|
|
18919
|
-
if (accessToken && orgId && workspaceId && effectiveSlug) {
|
|
19014
|
+
if (accessToken && orgId && workspaceId) {
|
|
18920
19015
|
const decoded = decodeJwtToken(accessToken);
|
|
18921
19016
|
const orgNameFromJwt = decoded == null ? void 0 : decoded.organisation_name;
|
|
18922
|
-
const orgName = typeof orgNameFromJwt === "string" && orgNameFromJwt.trim() !== "" ? orgNameFromJwt :
|
|
19017
|
+
const orgName = typeof orgNameFromJwt === "string" && orgNameFromJwt.trim() !== "" ? orgNameFromJwt : "";
|
|
18923
19018
|
setOrganization({
|
|
18924
19019
|
uuid: orgId,
|
|
18925
19020
|
suid: "",
|
|
18926
19021
|
name: orgName,
|
|
18927
|
-
slug:
|
|
19022
|
+
slug: "",
|
|
18928
19023
|
description: "",
|
|
18929
19024
|
domain: "",
|
|
18930
19025
|
workspaces: [{
|
|
@@ -18945,8 +19040,8 @@ function PrivacyCenterLayoutContent({
|
|
|
18945
19040
|
setOrganization(null);
|
|
18946
19041
|
setIsLoadingOrg(false);
|
|
18947
19042
|
}
|
|
18948
|
-
}, [
|
|
18949
|
-
(0,
|
|
19043
|
+
}, [authAccessToken]);
|
|
19044
|
+
(0, import_react50.useEffect)(() => {
|
|
18950
19045
|
if (isLoadingOrg || !organization) {
|
|
18951
19046
|
return;
|
|
18952
19047
|
}
|
|
@@ -18958,7 +19053,7 @@ function PrivacyCenterLayoutContent({
|
|
|
18958
19053
|
authCheckInProgressRef.current = true;
|
|
18959
19054
|
try {
|
|
18960
19055
|
await checkAndRefreshAuth(
|
|
18961
|
-
|
|
19056
|
+
"",
|
|
18962
19057
|
organization == null ? void 0 : organization.uuid,
|
|
18963
19058
|
(_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid,
|
|
18964
19059
|
consentClient
|
|
@@ -18972,10 +19067,10 @@ function PrivacyCenterLayoutContent({
|
|
|
18972
19067
|
}
|
|
18973
19068
|
};
|
|
18974
19069
|
checkAuth();
|
|
18975
|
-
}, [
|
|
19070
|
+
}, [organization, isLoadingOrg, consentClient, authAccessToken]);
|
|
18976
19071
|
const showSignIn = builtInSignIn && !isLoadingOrg && !organization;
|
|
18977
19072
|
const showPortal = Boolean(organization) && !isLoadingOrg && !isCheckingAuth;
|
|
18978
|
-
(0,
|
|
19073
|
+
(0, import_react50.useEffect)(() => {
|
|
18979
19074
|
if (showSignIn || showPortal) {
|
|
18980
19075
|
emitReady({ signedIn: showPortal });
|
|
18981
19076
|
}
|
|
@@ -18986,7 +19081,7 @@ function PrivacyCenterLayoutContent({
|
|
|
18986
19081
|
() => expireSession("timeout")
|
|
18987
19082
|
);
|
|
18988
19083
|
if (showSignIn) {
|
|
18989
|
-
return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(PrivacyCenterSignIn, {
|
|
19084
|
+
return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(PrivacyCenterSignIn, {});
|
|
18990
19085
|
}
|
|
18991
19086
|
if (isLoadingOrg || !organization || isCheckingAuth) {
|
|
18992
19087
|
return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { style: {
|
|
@@ -19001,18 +19096,18 @@ function PrivacyCenterLayoutContent({
|
|
|
19001
19096
|
}
|
|
19002
19097
|
|
|
19003
19098
|
// src/RedactoPrivacyCenter/PrivacyCenterHomePage.tsx
|
|
19004
|
-
var
|
|
19099
|
+
var import_react78 = require("react");
|
|
19005
19100
|
|
|
19006
19101
|
// src/RedactoPrivacyCenter/PrivacyCenterConsentManagerPage.tsx
|
|
19007
|
-
var
|
|
19102
|
+
var import_react59 = require("react");
|
|
19008
19103
|
|
|
19009
19104
|
// src/RedactoPrivacyCenter/components/ConsentManager.tsx
|
|
19010
|
-
var
|
|
19105
|
+
var import_react58 = require("react");
|
|
19011
19106
|
var import_react_i18next33 = require("react-i18next");
|
|
19012
19107
|
var import_lucide_react18 = require("lucide-react");
|
|
19013
19108
|
|
|
19014
19109
|
// src/RedactoPrivacyCenter/table/AdvancedTable.tsx
|
|
19015
|
-
var
|
|
19110
|
+
var import_react51 = __toESM(require("react"));
|
|
19016
19111
|
var import_react_i18next24 = require("react-i18next");
|
|
19017
19112
|
var import_react_table = require("@tanstack/react-table");
|
|
19018
19113
|
var import_lodash = require("lodash");
|
|
@@ -19030,7 +19125,7 @@ function AdvancedTable({
|
|
|
19030
19125
|
expandedComponent
|
|
19031
19126
|
}) {
|
|
19032
19127
|
const { t } = (0, import_react_i18next24.useTranslation)();
|
|
19033
|
-
const [hoveredRowId, setHoveredRowId] =
|
|
19128
|
+
const [hoveredRowId, setHoveredRowId] = import_react51.default.useState(null);
|
|
19034
19129
|
if (!table) return null;
|
|
19035
19130
|
return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_jsx_runtime54.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
19036
19131
|
"div",
|
|
@@ -19077,7 +19172,7 @@ function AdvancedTable({
|
|
|
19077
19172
|
onRowClick(row.original, row);
|
|
19078
19173
|
} : void 0;
|
|
19079
19174
|
const rowExpandedComponent = expandedComponent || meta.expandedComponent;
|
|
19080
|
-
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
19175
|
+
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react51.default.Fragment, { children: [
|
|
19081
19176
|
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
19082
19177
|
PCTable.Row,
|
|
19083
19178
|
{
|
|
@@ -19779,7 +19874,7 @@ function AdvancedTablePagination({
|
|
|
19779
19874
|
var import_react_table4 = require("@tanstack/react-table");
|
|
19780
19875
|
|
|
19781
19876
|
// src/RedactoPrivacyCenter/lib/consent-manager/utils.tsx
|
|
19782
|
-
var
|
|
19877
|
+
var import_react52 = require("react");
|
|
19783
19878
|
var import_react_i18next26 = require("react-i18next");
|
|
19784
19879
|
|
|
19785
19880
|
// src/RedactoPrivacyCenter/utils/date.ts
|
|
@@ -19807,7 +19902,7 @@ var CSV_FORMULA_TRIGGERS = ["=", "+", "-", "@", " ", "\r"];
|
|
|
19807
19902
|
var UTF8_BOM = "\uFEFF";
|
|
19808
19903
|
var useStatusOptions = () => {
|
|
19809
19904
|
const { t } = (0, import_react_i18next26.useTranslation)();
|
|
19810
|
-
return (0,
|
|
19905
|
+
return (0, import_react52.useMemo)(
|
|
19811
19906
|
() => [
|
|
19812
19907
|
{ label: t("statusActive"), value: "ACTIVE" /* ACTIVE */ },
|
|
19813
19908
|
{ label: t("statusWithdrawn"), value: "WITHDRAW" /* WITHDRAWN */ },
|
|
@@ -19972,7 +20067,7 @@ var ConsentManagerTableSkeleton = () => {
|
|
|
19972
20067
|
};
|
|
19973
20068
|
|
|
19974
20069
|
// src/RedactoPrivacyCenter/components/ModifyConsentModal.tsx
|
|
19975
|
-
var
|
|
20070
|
+
var import_react53 = require("react");
|
|
19976
20071
|
var import_react_i18next27 = require("react-i18next");
|
|
19977
20072
|
var import_lucide_react14 = require("lucide-react");
|
|
19978
20073
|
var import_pi3 = require("react-icons/pi");
|
|
@@ -19988,11 +20083,11 @@ var ModifyConsentModal = ({
|
|
|
19988
20083
|
const { portal } = usePrivacyCenterSettings();
|
|
19989
20084
|
const copy = useSettingsCopy();
|
|
19990
20085
|
const withdrawWarning = copy(portal.withdraw_warning) || t("revokeConsentWarning");
|
|
19991
|
-
const [isAccordionOpen, setIsAccordionOpen] = (0,
|
|
19992
|
-
const [selectedDataElementUuids, setSelectedDataElementUuids] = (0,
|
|
20086
|
+
const [isAccordionOpen, setIsAccordionOpen] = (0, import_react53.useState)(false);
|
|
20087
|
+
const [selectedDataElementUuids, setSelectedDataElementUuids] = (0, import_react53.useState)([]);
|
|
19993
20088
|
const nominatorInfo = selectedRecord == null ? void 0 : selectedRecord.nominator;
|
|
19994
20089
|
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,
|
|
20090
|
+
const actionConfig = (0, import_react53.useMemo)(() => {
|
|
19996
20091
|
if (!selectedRecord) return null;
|
|
19997
20092
|
const status = selectedRecord.status;
|
|
19998
20093
|
if (status === "ACTIVE" /* ACTIVE */) {
|
|
@@ -20025,24 +20120,24 @@ var ModifyConsentModal = ({
|
|
|
20025
20120
|
return null;
|
|
20026
20121
|
}, [selectedRecord, t, nominatorLabel, withdrawWarning]);
|
|
20027
20122
|
const isRegrantAction = (actionConfig == null ? void 0 : actionConfig.action) === "regrant";
|
|
20028
|
-
(0,
|
|
20123
|
+
(0, import_react53.useEffect)(() => {
|
|
20029
20124
|
setIsAccordionOpen(isRegrantAction);
|
|
20030
20125
|
}, [selectedRecord, isRegrantAction]);
|
|
20031
|
-
const regrantEligibleDataElements = (0,
|
|
20126
|
+
const regrantEligibleDataElements = (0, import_react53.useMemo)(
|
|
20032
20127
|
() => ((selectedRecord == null ? void 0 : selectedRecord.data_elements) || []).filter(
|
|
20033
20128
|
(element) => Boolean(element == null ? void 0 : element.uuid) && element.enabled
|
|
20034
20129
|
),
|
|
20035
20130
|
[selectedRecord]
|
|
20036
20131
|
);
|
|
20037
|
-
const requiredDataElementUuids = (0,
|
|
20132
|
+
const requiredDataElementUuids = (0, import_react53.useMemo)(
|
|
20038
20133
|
() => regrantEligibleDataElements.filter((element) => element.required).map((element) => element.uuid),
|
|
20039
20134
|
[regrantEligibleDataElements]
|
|
20040
20135
|
);
|
|
20041
|
-
const requiredDataElementUuidSet = (0,
|
|
20136
|
+
const requiredDataElementUuidSet = (0, import_react53.useMemo)(
|
|
20042
20137
|
() => new Set(requiredDataElementUuids),
|
|
20043
20138
|
[requiredDataElementUuids]
|
|
20044
20139
|
);
|
|
20045
|
-
(0,
|
|
20140
|
+
(0, import_react53.useEffect)(() => {
|
|
20046
20141
|
if (isRegrantAction) {
|
|
20047
20142
|
setSelectedDataElementUuids(regrantEligibleDataElements.map((element) => element.uuid));
|
|
20048
20143
|
return;
|
|
@@ -20239,7 +20334,7 @@ var ModifyConsentModal = ({
|
|
|
20239
20334
|
};
|
|
20240
20335
|
|
|
20241
20336
|
// src/RedactoPrivacyCenter/components/ConsentManagerGroupedColumns.tsx
|
|
20242
|
-
var
|
|
20337
|
+
var import_react54 = require("react");
|
|
20243
20338
|
var import_react_i18next28 = require("react-i18next");
|
|
20244
20339
|
var import_lucide_react15 = require("lucide-react");
|
|
20245
20340
|
var import_react_table2 = require("@tanstack/react-table");
|
|
@@ -20388,7 +20483,7 @@ var ProductAvatar = ({ name, seed }) => {
|
|
|
20388
20483
|
var columnHelper = (0, import_react_table2.createColumnHelper)();
|
|
20389
20484
|
var useConsentManagerGroupedColumns = () => {
|
|
20390
20485
|
const { t } = (0, import_react_i18next28.useTranslation)();
|
|
20391
|
-
return (0,
|
|
20486
|
+
return (0, import_react54.useMemo)(
|
|
20392
20487
|
() => [
|
|
20393
20488
|
columnHelper.display({
|
|
20394
20489
|
id: "expander",
|
|
@@ -20536,7 +20631,7 @@ var useConsentManagerGroupedColumns = () => {
|
|
|
20536
20631
|
};
|
|
20537
20632
|
|
|
20538
20633
|
// src/RedactoPrivacyCenter/components/ConsentManagerColumns.tsx
|
|
20539
|
-
var
|
|
20634
|
+
var import_react55 = require("react");
|
|
20540
20635
|
var import_react_i18next29 = require("react-i18next");
|
|
20541
20636
|
var import_react_table3 = require("@tanstack/react-table");
|
|
20542
20637
|
|
|
@@ -20713,7 +20808,7 @@ var useConsentManagerColumns = ({
|
|
|
20713
20808
|
onOpenModal
|
|
20714
20809
|
}) => {
|
|
20715
20810
|
const { t } = (0, import_react_i18next29.useTranslation)();
|
|
20716
|
-
return (0,
|
|
20811
|
+
return (0, import_react55.useMemo)(
|
|
20717
20812
|
() => [
|
|
20718
20813
|
columnHelper2.accessor("name", {
|
|
20719
20814
|
id: "purpose",
|
|
@@ -20958,21 +21053,21 @@ var ConsentManagerExpandedRow = ({
|
|
|
20958
21053
|
};
|
|
20959
21054
|
|
|
20960
21055
|
// src/RedactoPrivacyCenter/components/ConsentManagerProductCards.tsx
|
|
20961
|
-
var
|
|
21056
|
+
var import_react57 = require("react");
|
|
20962
21057
|
var import_react_i18next31 = require("react-i18next");
|
|
20963
21058
|
var import_dayjs4 = __toESM(require("dayjs"));
|
|
20964
21059
|
var import_relativeTime3 = __toESM(require("dayjs/plugin/relativeTime"));
|
|
20965
21060
|
var import_lucide_react17 = require("lucide-react");
|
|
20966
21061
|
|
|
20967
21062
|
// src/shared/Collapse.tsx
|
|
20968
|
-
var
|
|
21063
|
+
var import_react56 = require("react");
|
|
20969
21064
|
var import_jsx_runtime62 = require("react/jsx-runtime");
|
|
20970
21065
|
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,
|
|
21066
|
+
const [mounted, setMounted] = (0, import_react56.useState)(open);
|
|
21067
|
+
const [expanded, setExpanded] = (0, import_react56.useState)(open);
|
|
21068
|
+
const frameRef = (0, import_react56.useRef)(null);
|
|
21069
|
+
const rootRef = (0, import_react56.useRef)(null);
|
|
21070
|
+
(0, import_react56.useEffect)(() => {
|
|
20976
21071
|
if (open) {
|
|
20977
21072
|
setMounted(true);
|
|
20978
21073
|
frameRef.current = requestAnimationFrame(() => {
|
|
@@ -21105,11 +21200,11 @@ function ConsentManagerProductCards({
|
|
|
21105
21200
|
cardKeyFor
|
|
21106
21201
|
}) {
|
|
21107
21202
|
const { t } = (0, import_react_i18next31.useTranslation)();
|
|
21108
|
-
const [expandedCards, setExpandedCards] = (0,
|
|
21203
|
+
const [expandedCards, setExpandedCards] = (0, import_react57.useState)({});
|
|
21109
21204
|
const handleToggle = (key) => {
|
|
21110
21205
|
setExpandedCards((prev) => ({ ...prev, [key]: !prev[key] }));
|
|
21111
21206
|
};
|
|
21112
|
-
const getStatusItems = (0,
|
|
21207
|
+
const getStatusItems = (0, import_react57.useMemo)(
|
|
21113
21208
|
() => (group) => {
|
|
21114
21209
|
const items = [];
|
|
21115
21210
|
if (group.active_purposes > 0) {
|
|
@@ -21354,69 +21449,69 @@ function ConsentManager({ variant }) {
|
|
|
21354
21449
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
21355
21450
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
21356
21451
|
const contact = sessionStorage.getItem("email") || "";
|
|
21357
|
-
const authContext = (0,
|
|
21452
|
+
const authContext = (0, import_react58.useMemo)(() => ({
|
|
21358
21453
|
accessToken,
|
|
21359
21454
|
refreshToken,
|
|
21360
21455
|
onError,
|
|
21361
21456
|
updateTokens
|
|
21362
21457
|
}), [accessToken, refreshToken, onError, updateTokens]);
|
|
21363
21458
|
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,
|
|
21459
|
+
const [activeTab, setActiveTab] = (0, import_react58.useState)("direct");
|
|
21460
|
+
const [viewMode, setViewMode] = (0, import_react58.useState)("product");
|
|
21461
|
+
const [consentDetail, setConsentDetail] = (0, import_react58.useState)(null);
|
|
21462
|
+
const [consentGroups, setConsentGroups] = (0, import_react58.useState)([]);
|
|
21463
|
+
const [consentRows, setConsentRows] = (0, import_react58.useState)([]);
|
|
21464
|
+
const [isLoading, setIsLoading] = (0, import_react58.useState)(true);
|
|
21465
|
+
const [searchQuery, setSearchQuery] = (0, import_react58.useState)("");
|
|
21466
|
+
const [debouncedSearch, setDebouncedSearch] = (0, import_react58.useState)("");
|
|
21467
|
+
const [statusFilter, setStatusFilter] = (0, import_react58.useState)(
|
|
21373
21468
|
null
|
|
21374
21469
|
);
|
|
21375
|
-
const [productFilter, setProductFilter] = (0,
|
|
21376
|
-
const [productOptions, setProductOptions] = (0,
|
|
21470
|
+
const [productFilter, setProductFilter] = (0, import_react58.useState)(null);
|
|
21471
|
+
const [productOptions, setProductOptions] = (0, import_react58.useState)(
|
|
21377
21472
|
[]
|
|
21378
21473
|
);
|
|
21379
|
-
const [isModalOpen, setIsModalOpen] = (0,
|
|
21380
|
-
const [selectedRecord, setSelectedRecord] = (0,
|
|
21474
|
+
const [isModalOpen, setIsModalOpen] = (0, import_react58.useState)(false);
|
|
21475
|
+
const [selectedRecord, setSelectedRecord] = (0, import_react58.useState)(
|
|
21381
21476
|
null
|
|
21382
21477
|
);
|
|
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,
|
|
21478
|
+
const [exportModal, setExportModal] = (0, import_react58.useState)(false);
|
|
21479
|
+
const [isManageLoading, setIsManageLoading] = (0, import_react58.useState)(false);
|
|
21480
|
+
const [currentPage, setCurrentPage] = (0, import_react58.useState)(DEFAULT_PAGE);
|
|
21481
|
+
const [pageSize, setPageSize] = (0, import_react58.useState)(DEFAULT_PAGE_SIZE);
|
|
21482
|
+
const [expanded, setExpanded] = (0, import_react58.useState)({});
|
|
21483
|
+
const [extraPurposesByKey, setExtraPurposesByKey] = (0, import_react58.useState)({});
|
|
21484
|
+
const [hasMoreByKey, setHasMoreByKey] = (0, import_react58.useState)({});
|
|
21485
|
+
const [loadingMoreByKey, setLoadingMoreByKey] = (0, import_react58.useState)({});
|
|
21486
|
+
const composedSearchPlaceholder = (0, import_react58.useMemo)(
|
|
21392
21487
|
() => `${t("search")} ${t("consent")}, ${t("product")}, ${t("purpose")}...`,
|
|
21393
21488
|
[t]
|
|
21394
21489
|
);
|
|
21395
|
-
const allStatusOption = (0,
|
|
21490
|
+
const allStatusOption = (0, import_react58.useMemo)(
|
|
21396
21491
|
() => ({
|
|
21397
21492
|
label: `${t("all")} ${t("status")}`,
|
|
21398
21493
|
value: "__all__"
|
|
21399
21494
|
}),
|
|
21400
21495
|
[t]
|
|
21401
21496
|
);
|
|
21402
|
-
const allProductOption = (0,
|
|
21497
|
+
const allProductOption = (0, import_react58.useMemo)(
|
|
21403
21498
|
() => ({
|
|
21404
21499
|
label: `${t("all")} ${t("product")}`,
|
|
21405
21500
|
value: "__all__"
|
|
21406
21501
|
}),
|
|
21407
21502
|
[t]
|
|
21408
21503
|
);
|
|
21409
|
-
const statusFilterOptions = (0,
|
|
21504
|
+
const statusFilterOptions = (0, import_react58.useMemo)(
|
|
21410
21505
|
() => [allStatusOption, ...statusOptions],
|
|
21411
21506
|
[allStatusOption, statusOptions]
|
|
21412
21507
|
);
|
|
21413
|
-
const productFilterOptions = (0,
|
|
21508
|
+
const productFilterOptions = (0, import_react58.useMemo)(
|
|
21414
21509
|
() => [allProductOption, ...productOptions],
|
|
21415
21510
|
[allProductOption, productOptions]
|
|
21416
21511
|
);
|
|
21417
21512
|
const statusSelectValue = statusFilter != null ? statusFilter : allStatusOption;
|
|
21418
21513
|
const productSelectValue = productFilter != null ? productFilter : allProductOption;
|
|
21419
|
-
(0,
|
|
21514
|
+
(0, import_react58.useEffect)(() => {
|
|
21420
21515
|
if (statusFilter) {
|
|
21421
21516
|
const updated = statusOptions.find((opt) => opt.value === statusFilter.value);
|
|
21422
21517
|
if (updated && updated.label !== statusFilter.label) {
|
|
@@ -21424,7 +21519,7 @@ function ConsentManager({ variant }) {
|
|
|
21424
21519
|
}
|
|
21425
21520
|
}
|
|
21426
21521
|
}, [statusOptions, statusFilter]);
|
|
21427
|
-
(0,
|
|
21522
|
+
(0, import_react58.useEffect)(() => {
|
|
21428
21523
|
if (productFilter) {
|
|
21429
21524
|
const updated = productOptions.find((opt) => opt.value === productFilter.value);
|
|
21430
21525
|
if (updated && updated.label !== productFilter.label) {
|
|
@@ -21432,7 +21527,7 @@ function ConsentManager({ variant }) {
|
|
|
21432
21527
|
}
|
|
21433
21528
|
}
|
|
21434
21529
|
}, [productOptions, productFilter]);
|
|
21435
|
-
(0,
|
|
21530
|
+
(0, import_react58.useEffect)(() => {
|
|
21436
21531
|
const status = consentDetail == null ? void 0 : consentDetail.user_status;
|
|
21437
21532
|
if (status === "TRANSFERRED") {
|
|
21438
21533
|
setHeaderStatus({ label: t("statusTransferred"), variant: "warning" });
|
|
@@ -21443,25 +21538,25 @@ function ConsentManager({ variant }) {
|
|
|
21443
21538
|
}
|
|
21444
21539
|
return () => setHeaderStatus(null);
|
|
21445
21540
|
}, [consentDetail == null ? void 0 : consentDetail.user_status, setHeaderStatus, t]);
|
|
21446
|
-
(0,
|
|
21541
|
+
(0, import_react58.useEffect)(() => {
|
|
21447
21542
|
const timer = setTimeout(() => {
|
|
21448
21543
|
setDebouncedSearch(searchQuery);
|
|
21449
21544
|
}, SEARCH_DEBOUNCE_DELAY);
|
|
21450
21545
|
return () => clearTimeout(timer);
|
|
21451
21546
|
}, [searchQuery]);
|
|
21452
|
-
const handleOpenModal = (0,
|
|
21547
|
+
const handleOpenModal = (0, import_react58.useCallback)((record) => {
|
|
21453
21548
|
setSelectedRecord(record);
|
|
21454
21549
|
setIsModalOpen(true);
|
|
21455
21550
|
}, []);
|
|
21456
|
-
const getCardKey = (0,
|
|
21551
|
+
const getCardKey = (0, import_react58.useCallback)(
|
|
21457
21552
|
(group) => group.nominator ? `nominated:${group.nominator.uuid}:${group.product_uuid}` : `direct:${group.product_uuid}`,
|
|
21458
21553
|
[]
|
|
21459
21554
|
);
|
|
21460
|
-
const handleCloseModal = (0,
|
|
21555
|
+
const handleCloseModal = (0, import_react58.useCallback)(() => {
|
|
21461
21556
|
setIsModalOpen(false);
|
|
21462
21557
|
setSelectedRecord(null);
|
|
21463
21558
|
}, []);
|
|
21464
|
-
const matchesPurpose = (0,
|
|
21559
|
+
const matchesPurpose = (0, import_react58.useCallback)(
|
|
21465
21560
|
(purpose, group, normalizedSearch, statusValue) => {
|
|
21466
21561
|
var _a2;
|
|
21467
21562
|
const matchesSearch = !normalizedSearch || [
|
|
@@ -21477,7 +21572,7 @@ function ConsentManager({ variant }) {
|
|
|
21477
21572
|
},
|
|
21478
21573
|
[]
|
|
21479
21574
|
);
|
|
21480
|
-
const buildDisplayGroups = (0,
|
|
21575
|
+
const buildDisplayGroups = (0, import_react58.useCallback)(
|
|
21481
21576
|
(groups, search, statusValue, productUuid) => {
|
|
21482
21577
|
if (!groups || groups.length === 0) return [];
|
|
21483
21578
|
const normalizedSearch = search.trim().toLowerCase();
|
|
@@ -21534,7 +21629,7 @@ function ConsentManager({ variant }) {
|
|
|
21534
21629
|
},
|
|
21535
21630
|
[matchesPurpose]
|
|
21536
21631
|
);
|
|
21537
|
-
const flattenProductGroups = (0,
|
|
21632
|
+
const flattenProductGroups = (0, import_react58.useCallback)(
|
|
21538
21633
|
(groups) => {
|
|
21539
21634
|
if (!groups || groups.length === 0) return [];
|
|
21540
21635
|
return groups.flatMap(
|
|
@@ -21549,7 +21644,7 @@ function ConsentManager({ variant }) {
|
|
|
21549
21644
|
},
|
|
21550
21645
|
[]
|
|
21551
21646
|
);
|
|
21552
|
-
const filterConsentRows = (0,
|
|
21647
|
+
const filterConsentRows = (0, import_react58.useCallback)(
|
|
21553
21648
|
(rows, search, statusValue, productUuid) => {
|
|
21554
21649
|
const normalizedSearch = search.trim().toLowerCase();
|
|
21555
21650
|
return rows.filter((row) => {
|
|
@@ -21571,7 +21666,7 @@ function ConsentManager({ variant }) {
|
|
|
21571
21666
|
},
|
|
21572
21667
|
[]
|
|
21573
21668
|
);
|
|
21574
|
-
const buildProductOptionsFromGroups = (0,
|
|
21669
|
+
const buildProductOptionsFromGroups = (0, import_react58.useCallback)(
|
|
21575
21670
|
(groups) => {
|
|
21576
21671
|
if (!groups || groups.length === 0) return [];
|
|
21577
21672
|
const productMap = /* @__PURE__ */ new Map();
|
|
@@ -21591,7 +21686,7 @@ function ConsentManager({ variant }) {
|
|
|
21591
21686
|
const purposeColumns = useConsentManagerColumns({
|
|
21592
21687
|
onOpenModal: handleOpenModal
|
|
21593
21688
|
});
|
|
21594
|
-
const groupedTableClassNames = (0,
|
|
21689
|
+
const groupedTableClassNames = (0, import_react58.useMemo)(
|
|
21595
21690
|
() => ({
|
|
21596
21691
|
container: "pc-consent-table-container",
|
|
21597
21692
|
tableClassName: "pc-consent-table",
|
|
@@ -21605,7 +21700,7 @@ function ConsentManager({ variant }) {
|
|
|
21605
21700
|
}),
|
|
21606
21701
|
[]
|
|
21607
21702
|
);
|
|
21608
|
-
const purposeTableClassNames = (0,
|
|
21703
|
+
const purposeTableClassNames = (0, import_react58.useMemo)(
|
|
21609
21704
|
() => ({
|
|
21610
21705
|
container: "pc-consent-table-container",
|
|
21611
21706
|
tableClassName: "pc-consent-table pc-consent-table-purpose",
|
|
@@ -21617,7 +21712,7 @@ function ConsentManager({ variant }) {
|
|
|
21617
21712
|
}),
|
|
21618
21713
|
[]
|
|
21619
21714
|
);
|
|
21620
|
-
const fetchData = (0,
|
|
21715
|
+
const fetchData = (0, import_react58.useCallback)(async () => {
|
|
21621
21716
|
if (!organizationId || !workspaceId) {
|
|
21622
21717
|
return;
|
|
21623
21718
|
}
|
|
@@ -21702,15 +21797,15 @@ function ConsentManager({ variant }) {
|
|
|
21702
21797
|
buildProductOptionsFromGroups,
|
|
21703
21798
|
t
|
|
21704
21799
|
]);
|
|
21705
|
-
(0,
|
|
21800
|
+
(0, import_react58.useEffect)(() => {
|
|
21706
21801
|
fetchData();
|
|
21707
21802
|
}, [fetchData]);
|
|
21708
|
-
const groupedPurposeCount = (0,
|
|
21803
|
+
const groupedPurposeCount = (0, import_react58.useMemo)(
|
|
21709
21804
|
() => consentGroups.reduce((sum, group) => sum + group.purposes.length, 0),
|
|
21710
21805
|
[consentGroups]
|
|
21711
21806
|
);
|
|
21712
21807
|
const visibleConsentCount = viewMode === "product" ? groupedPurposeCount : consentRows.length;
|
|
21713
|
-
const visibleProductCount = (0,
|
|
21808
|
+
const visibleProductCount = (0, import_react58.useMemo)(() => {
|
|
21714
21809
|
if (viewMode === "product") {
|
|
21715
21810
|
return consentGroups.length;
|
|
21716
21811
|
}
|
|
@@ -21720,13 +21815,13 @@ function ConsentManager({ variant }) {
|
|
|
21720
21815
|
productIds.delete("");
|
|
21721
21816
|
return productIds.size;
|
|
21722
21817
|
}, [viewMode, consentGroups, consentRows]);
|
|
21723
|
-
const tableTotalCount = (0,
|
|
21818
|
+
const tableTotalCount = (0, import_react58.useMemo)(() => {
|
|
21724
21819
|
var _a2;
|
|
21725
21820
|
const pagination = activeTab === "direct" ? consentDetail == null ? void 0 : consentDetail.direct_pagination : consentDetail == null ? void 0 : consentDetail.nominated_pagination;
|
|
21726
21821
|
return (_a2 = pagination == null ? void 0 : pagination.total_count) != null ? _a2 : 0;
|
|
21727
21822
|
}, [activeTab, consentDetail]);
|
|
21728
21823
|
const tablePageCount = Math.ceil(tableTotalCount / pageSize) || 0;
|
|
21729
|
-
const handlePaginationChange = (0,
|
|
21824
|
+
const handlePaginationChange = (0, import_react58.useCallback)(
|
|
21730
21825
|
(updater) => {
|
|
21731
21826
|
const next = typeof updater === "function" ? updater({ pageIndex: currentPage - 1, pageSize }) : updater;
|
|
21732
21827
|
const nextPage = next.pageIndex + 1;
|
|
@@ -21826,7 +21921,7 @@ function ConsentManager({ variant }) {
|
|
|
21826
21921
|
setCurrentPage(DEFAULT_PAGE);
|
|
21827
21922
|
setExpanded({});
|
|
21828
21923
|
};
|
|
21829
|
-
const handleExport = (0,
|
|
21924
|
+
const handleExport = (0, import_react58.useCallback)(() => {
|
|
21830
21925
|
const toRow = (purpose, productName) => {
|
|
21831
21926
|
var _a2, _b2;
|
|
21832
21927
|
return {
|
|
@@ -21847,7 +21942,7 @@ function ConsentManager({ variant }) {
|
|
|
21847
21942
|
exportTableToCSV(rows);
|
|
21848
21943
|
setExportModal(false);
|
|
21849
21944
|
}, [viewMode, productTable, purposeTable, t]);
|
|
21850
|
-
const handleLoadMorePurposes = (0,
|
|
21945
|
+
const handleLoadMorePurposes = (0, import_react58.useCallback)(
|
|
21851
21946
|
async (group) => {
|
|
21852
21947
|
var _a2, _b2, _c2;
|
|
21853
21948
|
if (!organizationId || !workspaceId) return;
|
|
@@ -21907,7 +22002,7 @@ function ConsentManager({ variant }) {
|
|
|
21907
22002
|
t
|
|
21908
22003
|
]
|
|
21909
22004
|
);
|
|
21910
|
-
const handleManageConsent = (0,
|
|
22005
|
+
const handleManageConsent = (0, import_react58.useCallback)(
|
|
21911
22006
|
async (purposeId, action, nominatorContact, dataElementUuids, productUuid, nominatorUuid) => {
|
|
21912
22007
|
var _a2, _b2, _c2;
|
|
21913
22008
|
if (!organizationId || !workspaceId || !contact) {
|
|
@@ -22439,7 +22534,7 @@ function WelcomeBanner() {
|
|
|
22439
22534
|
// src/RedactoPrivacyCenter/PrivacyCenterConsentManagerPage.tsx
|
|
22440
22535
|
var import_jsx_runtime67 = require("react/jsx-runtime");
|
|
22441
22536
|
function PrivacyCenterConsentManagerPage() {
|
|
22442
|
-
(0,
|
|
22537
|
+
(0, import_react59.useEffect)(() => {
|
|
22443
22538
|
if (!i18n_default.language) {
|
|
22444
22539
|
i18n_default.changeLanguage("en");
|
|
22445
22540
|
}
|
|
@@ -22451,7 +22546,7 @@ function PrivacyCenterConsentManagerPage() {
|
|
|
22451
22546
|
}
|
|
22452
22547
|
|
|
22453
22548
|
// src/RedactoPrivacyCenter/PrivacyCenterFormPage.tsx
|
|
22454
|
-
var
|
|
22549
|
+
var import_react66 = require("react");
|
|
22455
22550
|
var import_react_i18next45 = require("react-i18next");
|
|
22456
22551
|
var import_io55 = require("react-icons/io5");
|
|
22457
22552
|
|
|
@@ -22571,7 +22666,7 @@ function FormBlockWrapper({
|
|
|
22571
22666
|
|
|
22572
22667
|
// src/RedactoPrivacyCenter/components/Form.tsx
|
|
22573
22668
|
var import_react_query = require("@tanstack/react-query");
|
|
22574
|
-
var
|
|
22669
|
+
var import_react62 = require("react");
|
|
22575
22670
|
var import_react_i18next40 = require("react-i18next");
|
|
22576
22671
|
var import_ai = require("react-icons/ai");
|
|
22577
22672
|
var import_pi4 = require("react-icons/pi");
|
|
@@ -22976,7 +23071,7 @@ function NominationDataSection({
|
|
|
22976
23071
|
}
|
|
22977
23072
|
|
|
22978
23073
|
// src/RedactoPrivacyCenter/components/DataRequest/ProductSelectionSection.tsx
|
|
22979
|
-
var
|
|
23074
|
+
var import_react60 = require("react");
|
|
22980
23075
|
var import_react_i18next37 = require("react-i18next");
|
|
22981
23076
|
var import_jsx_runtime72 = require("react/jsx-runtime");
|
|
22982
23077
|
var getVar18 = (varName) => `var(${varName})`;
|
|
@@ -23055,7 +23150,7 @@ function ProductSelectionSection({
|
|
|
23055
23150
|
const totalGroups = directGroups.length + nominatedGroups.length;
|
|
23056
23151
|
const isSingleGroup = totalGroups === 1;
|
|
23057
23152
|
const singleGroup = isSingleGroup ? (_b = (_a = directGroups[0]) != null ? _a : nominatedGroups[0]) != null ? _b : null : null;
|
|
23058
|
-
(0,
|
|
23153
|
+
(0, import_react60.useEffect)(() => {
|
|
23059
23154
|
if (!singleGroup) {
|
|
23060
23155
|
return;
|
|
23061
23156
|
}
|
|
@@ -23150,7 +23245,7 @@ function ProductSelectionSection({
|
|
|
23150
23245
|
// src/RedactoPrivacyCenter/components/DataRequest/PurposeSelectionSection.tsx
|
|
23151
23246
|
var import_lucide_react19 = require("lucide-react");
|
|
23152
23247
|
var import_react_i18next38 = require("react-i18next");
|
|
23153
|
-
var
|
|
23248
|
+
var import_react61 = require("react");
|
|
23154
23249
|
var import_jsx_runtime73 = require("react/jsx-runtime");
|
|
23155
23250
|
var getVar19 = (varName) => `var(${varName})`;
|
|
23156
23251
|
function PurposeSelectionSection({
|
|
@@ -23161,9 +23256,9 @@ function PurposeSelectionSection({
|
|
|
23161
23256
|
}) {
|
|
23162
23257
|
const isAccess = requestType === "ACCESS" /* ACCESS */;
|
|
23163
23258
|
const isErasure = requestType === "erasure" /* ERASURE */;
|
|
23164
|
-
const [selectAllChecked, setSelectAllChecked] = (0,
|
|
23165
|
-
const [openIndexes, setOpenIndexes] = (0,
|
|
23166
|
-
(0,
|
|
23259
|
+
const [selectAllChecked, setSelectAllChecked] = (0, import_react61.useState)(false);
|
|
23260
|
+
const [openIndexes, setOpenIndexes] = (0, import_react61.useState)([]);
|
|
23261
|
+
(0, import_react61.useEffect)(() => {
|
|
23167
23262
|
setSelectAllChecked(false);
|
|
23168
23263
|
setOpenIndexes([]);
|
|
23169
23264
|
}, [requestType]);
|
|
@@ -23180,7 +23275,7 @@ function PurposeSelectionSection({
|
|
|
23180
23275
|
}));
|
|
23181
23276
|
setPurposes(updated);
|
|
23182
23277
|
};
|
|
23183
|
-
(0,
|
|
23278
|
+
(0, import_react61.useEffect)(() => {
|
|
23184
23279
|
const allSelected = purposes.every(
|
|
23185
23280
|
(p) => p.data_elements.every((de) => de.selected)
|
|
23186
23281
|
);
|
|
@@ -23790,24 +23885,23 @@ function Form({
|
|
|
23790
23885
|
const queryClient = (0, import_react_query.useQueryClient)();
|
|
23791
23886
|
const timePeriodOptions = useTimePeriodOptions();
|
|
23792
23887
|
const { organization } = useOrganization();
|
|
23793
|
-
const orgSlug = (organization == null ? void 0 : organization.slug) || (organization == null ? void 0 : organization.name) || "";
|
|
23794
23888
|
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,
|
|
23889
|
+
const [requestType, setRequestType] = (0, import_react62.useState)(null);
|
|
23890
|
+
const [timePeriod, setTimePeriod] = (0, import_react62.useState)("");
|
|
23891
|
+
const [isSubmitted, setIsSubmitted] = (0, import_react62.useState)(false);
|
|
23798
23892
|
const { t } = (0, import_react_i18next40.useTranslation)();
|
|
23799
23893
|
const { accessToken, refreshToken, onError, updateTokens } = useAuth();
|
|
23800
23894
|
const { consentClient, baseUrl } = useBaseUrl();
|
|
23801
23895
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
23802
23896
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
23803
|
-
const authContext = (0,
|
|
23897
|
+
const authContext = (0, import_react62.useMemo)(() => ({
|
|
23804
23898
|
accessToken,
|
|
23805
23899
|
refreshToken,
|
|
23806
23900
|
onError,
|
|
23807
23901
|
updateTokens
|
|
23808
23902
|
}), [accessToken, refreshToken, onError, updateTokens]);
|
|
23809
|
-
const [data, setData] = (0,
|
|
23810
|
-
const [formData, setFormData] = (0,
|
|
23903
|
+
const [data, setData] = (0, import_react62.useState)(null);
|
|
23904
|
+
const [formData, setFormData] = (0, import_react62.useState)({
|
|
23811
23905
|
uuid: "",
|
|
23812
23906
|
case_id: "",
|
|
23813
23907
|
name: "",
|
|
@@ -23818,38 +23912,38 @@ function Form({
|
|
|
23818
23912
|
additionalNote: "",
|
|
23819
23913
|
confirmCheckBox: false
|
|
23820
23914
|
});
|
|
23821
|
-
const [selectedProductKey, setSelectedProductKey] = (0,
|
|
23915
|
+
const [selectedProductKey, setSelectedProductKey] = (0, import_react62.useState)(
|
|
23822
23916
|
null
|
|
23823
23917
|
);
|
|
23824
|
-
const [selectedPurposes, setSelectedPurposes] = (0,
|
|
23825
|
-
const [selectedCorrectionElements, setSelectedCorrectionElements] = (0,
|
|
23826
|
-
const [correctionValues, setCorrectionValues] = (0,
|
|
23827
|
-
const [submittedCase, setSubmittedCase] = (0,
|
|
23918
|
+
const [selectedPurposes, setSelectedPurposes] = (0, import_react62.useState)([]);
|
|
23919
|
+
const [selectedCorrectionElements, setSelectedCorrectionElements] = (0, import_react62.useState)([]);
|
|
23920
|
+
const [correctionValues, setCorrectionValues] = (0, import_react62.useState)({});
|
|
23921
|
+
const [submittedCase, setSubmittedCase] = (0, import_react62.useState)(
|
|
23828
23922
|
null
|
|
23829
23923
|
);
|
|
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,
|
|
23924
|
+
const fileInputRef = (0, import_react62.useRef)(null);
|
|
23925
|
+
const englishDataRef = (0, import_react62.useRef)(null);
|
|
23926
|
+
const [uploadedDocumentId, setUploadedDocumentId] = (0, import_react62.useState)([]);
|
|
23927
|
+
const [uploadedDocuments, setUploadedDocuments] = (0, import_react62.useState)([]);
|
|
23928
|
+
const [isDocumentUploading, setIsDocumentUploading] = (0, import_react62.useState)(false);
|
|
23929
|
+
const [isDocument, setIsDocument] = (0, import_react62.useState)(false);
|
|
23930
|
+
const [isPopupFormEnabled, setIsPopupFormEnabled] = (0, import_react62.useState)(!isPopup);
|
|
23931
|
+
const [isVerifyingContact, setIsVerifyingContact] = (0, import_react62.useState)(false);
|
|
23838
23932
|
const requestTypeLabels = useRequestTypeLabels();
|
|
23839
23933
|
const {
|
|
23840
23934
|
settings: { portal },
|
|
23841
23935
|
isCustomised
|
|
23842
23936
|
} = usePrivacyCenterSettingsContext();
|
|
23843
23937
|
const { emitRequestSubmit } = usePrivacyCenterEvents();
|
|
23844
|
-
const [serverRequestTypes, setServerRequestTypes] = (0,
|
|
23845
|
-
const [rawGrievanceOptions, setGrievanceOptions] = (0,
|
|
23938
|
+
const [serverRequestTypes, setServerRequestTypes] = (0, import_react62.useState)(null);
|
|
23939
|
+
const [rawGrievanceOptions, setGrievanceOptions] = (0, import_react62.useState)(
|
|
23846
23940
|
[]
|
|
23847
23941
|
);
|
|
23848
|
-
const grievanceOptions = (0,
|
|
23942
|
+
const grievanceOptions = (0, import_react62.useMemo)(
|
|
23849
23943
|
() => filterGrievanceOptions(rawGrievanceOptions, portal.grievance_categories),
|
|
23850
23944
|
[rawGrievanceOptions, portal.grievance_categories]
|
|
23851
23945
|
);
|
|
23852
|
-
const requestTypeSelectOptions = (0,
|
|
23946
|
+
const requestTypeSelectOptions = (0, import_react62.useMemo)(
|
|
23853
23947
|
() => requestTypeOptions(portal.request_types, serverRequestTypes, !isCustomised).map((option2) => {
|
|
23854
23948
|
var _a2;
|
|
23855
23949
|
return {
|
|
@@ -23859,27 +23953,27 @@ function Form({
|
|
|
23859
23953
|
}),
|
|
23860
23954
|
[portal.request_types, serverRequestTypes, isCustomised, requestTypeLabels]
|
|
23861
23955
|
);
|
|
23862
|
-
(0,
|
|
23956
|
+
(0, import_react62.useEffect)(() => {
|
|
23863
23957
|
if (requestType && !requestTypeSelectOptions.some((option2) => option2.value === requestType)) {
|
|
23864
23958
|
setRequestType(null);
|
|
23865
23959
|
}
|
|
23866
23960
|
}, [requestType, requestTypeSelectOptions]);
|
|
23867
|
-
const [selectedGrievances, setSelectedGrievances] = (0,
|
|
23868
|
-
const [nominationData, setNominationData] = (0,
|
|
23961
|
+
const [selectedGrievances, setSelectedGrievances] = (0, import_react62.useState)({});
|
|
23962
|
+
const [nominationData, setNominationData] = (0, import_react62.useState)({
|
|
23869
23963
|
nominee_email: "",
|
|
23870
23964
|
nominee_mobile: ""
|
|
23871
23965
|
});
|
|
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,
|
|
23966
|
+
const [isLoading, setIsLoading] = (0, import_react62.useState)(false);
|
|
23967
|
+
const [isTranslating, setIsTranslating] = (0, import_react62.useState)(false);
|
|
23968
|
+
const [isRequestDetailsExpanded, setIsRequestDetailsExpanded] = (0, import_react62.useState)(true);
|
|
23969
|
+
const [isErasureConsentModalOpen, setIsErasureConsentModalOpen] = (0, import_react62.useState)(false);
|
|
23970
|
+
const [revokeConsentOnFulfilment, setRevokeConsentOnFulfilment] = (0, import_react62.useState)(false);
|
|
23877
23971
|
const resetFileInput = () => {
|
|
23878
23972
|
if (fileInputRef.current) {
|
|
23879
23973
|
fileInputRef.current.value = "";
|
|
23880
23974
|
}
|
|
23881
23975
|
};
|
|
23882
|
-
const allGroups = (0,
|
|
23976
|
+
const allGroups = (0, import_react62.useMemo)(() => {
|
|
23883
23977
|
var _a2, _b2;
|
|
23884
23978
|
if (!data) {
|
|
23885
23979
|
return [];
|
|
@@ -23898,7 +23992,7 @@ function Form({
|
|
|
23898
23992
|
return [flatGroup];
|
|
23899
23993
|
}, [data, t]);
|
|
23900
23994
|
const skipProductStep = allGroups.length === 1;
|
|
23901
|
-
const selectedGroup = (0,
|
|
23995
|
+
const selectedGroup = (0, import_react62.useMemo)(() => {
|
|
23902
23996
|
var _a2, _b2;
|
|
23903
23997
|
if (selectedProductKey) {
|
|
23904
23998
|
return (_a2 = allGroups.find((g) => productGroupKey(g) === selectedProductKey)) != null ? _a2 : null;
|
|
@@ -23908,13 +24002,13 @@ function Form({
|
|
|
23908
24002
|
}
|
|
23909
24003
|
return null;
|
|
23910
24004
|
}, [allGroups, selectedProductKey, skipProductStep]);
|
|
23911
|
-
const handleProductSelect = (0,
|
|
24005
|
+
const handleProductSelect = (0, import_react62.useCallback)(
|
|
23912
24006
|
(key, _group) => {
|
|
23913
24007
|
setSelectedProductKey(key);
|
|
23914
24008
|
},
|
|
23915
24009
|
[]
|
|
23916
24010
|
);
|
|
23917
|
-
const withUserConsentPickerGroups = (0,
|
|
24011
|
+
const withUserConsentPickerGroups = (0, import_react62.useCallback)(
|
|
23918
24012
|
async (form, language) => {
|
|
23919
24013
|
var _a2, _b2;
|
|
23920
24014
|
if (isPopup || isCaseManagementContext || !organizationId || !workspaceId) {
|
|
@@ -23952,7 +24046,7 @@ function Form({
|
|
|
23952
24046
|
consentClient
|
|
23953
24047
|
]
|
|
23954
24048
|
);
|
|
23955
|
-
const fetchAndApplyTranslations = (0,
|
|
24049
|
+
const fetchAndApplyTranslations = (0, import_react62.useCallback)(async (langValue) => {
|
|
23956
24050
|
if (!organizationId || !workspaceId || !data) {
|
|
23957
24051
|
return;
|
|
23958
24052
|
}
|
|
@@ -24000,7 +24094,7 @@ function Form({
|
|
|
24000
24094
|
setIsTranslating(false);
|
|
24001
24095
|
}
|
|
24002
24096
|
}, [organizationId, workspaceId, data, formData.contact, isPopup, isCaseManagementContext, authContext, consentClient, selectedGrievances, t, withUserConsentPickerGroups, portal.grievance_categories]);
|
|
24003
|
-
(0,
|
|
24097
|
+
(0, import_react62.useEffect)(() => {
|
|
24004
24098
|
if (!skipProductStep) {
|
|
24005
24099
|
setSelectedProductKey(null);
|
|
24006
24100
|
}
|
|
@@ -24016,7 +24110,7 @@ function Form({
|
|
|
24016
24110
|
setSelectedGrievances(resetGrievances);
|
|
24017
24111
|
}
|
|
24018
24112
|
}, [requestType, grievanceOptions, skipProductStep]);
|
|
24019
|
-
(0,
|
|
24113
|
+
(0, import_react62.useEffect)(() => {
|
|
24020
24114
|
if (!skipProductStep) {
|
|
24021
24115
|
return;
|
|
24022
24116
|
}
|
|
@@ -24027,7 +24121,7 @@ function Form({
|
|
|
24027
24121
|
const key = productGroupKey(onlyGroup);
|
|
24028
24122
|
setSelectedProductKey((prev) => prev === key ? prev : key);
|
|
24029
24123
|
}, [skipProductStep, allGroups, requestType]);
|
|
24030
|
-
(0,
|
|
24124
|
+
(0, import_react62.useEffect)(() => {
|
|
24031
24125
|
if (!selectedGroup || !isProductScopedRequestType(requestType)) {
|
|
24032
24126
|
setSelectedPurposes([]);
|
|
24033
24127
|
setSelectedCorrectionElements([]);
|
|
@@ -24038,7 +24132,7 @@ function Form({
|
|
|
24038
24132
|
setSelectedCorrectionElements([]);
|
|
24039
24133
|
setCorrectionValues({});
|
|
24040
24134
|
}, [selectedGroup, requestType]);
|
|
24041
|
-
(0,
|
|
24135
|
+
(0, import_react62.useEffect)(() => {
|
|
24042
24136
|
const handleLanguageChanged = () => {
|
|
24043
24137
|
const lang = i18n_default.language;
|
|
24044
24138
|
if (organizationId && workspaceId && data) {
|
|
@@ -24053,7 +24147,7 @@ function Form({
|
|
|
24053
24147
|
i18n_default.off("languageChanged", handleLanguageChanged);
|
|
24054
24148
|
};
|
|
24055
24149
|
}, [organizationId, workspaceId, data, formData.contact, fetchAndApplyTranslations]);
|
|
24056
|
-
(0,
|
|
24150
|
+
(0, import_react62.useEffect)(() => {
|
|
24057
24151
|
const initializePrivacyCenterForm = async () => {
|
|
24058
24152
|
if (isPopup) {
|
|
24059
24153
|
return;
|
|
@@ -24136,7 +24230,7 @@ function Form({
|
|
|
24136
24230
|
};
|
|
24137
24231
|
void initializePrivacyCenterForm();
|
|
24138
24232
|
}, [organizationId, workspaceId, isPopup, authContext, consentClient, withUserConsentPickerGroups]);
|
|
24139
|
-
const getEnglishDataElementName = (0,
|
|
24233
|
+
const getEnglishDataElementName = (0, import_react62.useCallback)((translatedName) => {
|
|
24140
24234
|
var _a2, _b2, _c2;
|
|
24141
24235
|
if (!((_a2 = englishDataRef.current) == null ? void 0 : _a2.purposes)) {
|
|
24142
24236
|
return translatedName;
|
|
@@ -24162,11 +24256,11 @@ function Form({
|
|
|
24162
24256
|
}
|
|
24163
24257
|
return translatedName;
|
|
24164
24258
|
}, [data]);
|
|
24165
|
-
const selectedErasurePurposeList = (0,
|
|
24259
|
+
const selectedErasurePurposeList = (0, import_react62.useMemo)(
|
|
24166
24260
|
() => selectedPurposes.filter((p) => p.selected || p.data_elements.some((de) => de.selected)).map((p) => p.name).filter(Boolean),
|
|
24167
24261
|
[selectedPurposes]
|
|
24168
24262
|
);
|
|
24169
|
-
const selectedErasurePurposeNames = (0,
|
|
24263
|
+
const selectedErasurePurposeNames = (0, import_react62.useMemo)(() => {
|
|
24170
24264
|
if (selectedErasurePurposeList.length === 0 || selectedErasurePurposeList.length > MAX_DISPLAYED_PURPOSE_NAMES_IN_ERASURE_MODAL) {
|
|
24171
24265
|
return t("revokeConsentModalYourPurposes");
|
|
24172
24266
|
}
|
|
@@ -24301,7 +24395,7 @@ function Form({
|
|
|
24301
24395
|
setIsLoading(false);
|
|
24302
24396
|
}
|
|
24303
24397
|
};
|
|
24304
|
-
const isRequestDetailsValid = (0,
|
|
24398
|
+
const isRequestDetailsValid = (0, import_react62.useCallback)(() => {
|
|
24305
24399
|
var _a2, _b2;
|
|
24306
24400
|
if (!requestType) {
|
|
24307
24401
|
return false;
|
|
@@ -24348,7 +24442,7 @@ function Form({
|
|
|
24348
24442
|
grievanceOptions,
|
|
24349
24443
|
nominationData
|
|
24350
24444
|
]);
|
|
24351
|
-
const isFormValid = (0,
|
|
24445
|
+
const isFormValid = (0, import_react62.useMemo)(() => {
|
|
24352
24446
|
var _a2;
|
|
24353
24447
|
return (!isPopup || isPopupFormEnabled) && !!((_a2 = formData.contact) == null ? void 0 : _a2.trim()) && !!requestType && isRequestDetailsValid() && formData.confirmCheckBox;
|
|
24354
24448
|
}, [
|
|
@@ -24381,7 +24475,7 @@ function Form({
|
|
|
24381
24475
|
if (!organizationId || !workspaceId) {
|
|
24382
24476
|
throw new Error("Organization ID and Workspace ID are required for file upload");
|
|
24383
24477
|
}
|
|
24384
|
-
const authToken = await ensureValidToken(organizationId, workspaceId,
|
|
24478
|
+
const authToken = await ensureValidToken(organizationId, workspaceId, void 0, authContext, consentClient);
|
|
24385
24479
|
if (!authToken) {
|
|
24386
24480
|
throw new Error("Authentication token is required for file upload");
|
|
24387
24481
|
}
|
|
@@ -25228,7 +25322,7 @@ function Form({
|
|
|
25228
25322
|
}
|
|
25229
25323
|
|
|
25230
25324
|
// src/RedactoPrivacyCenter/components/CaseHistory.tsx
|
|
25231
|
-
var
|
|
25325
|
+
var import_react65 = require("react");
|
|
25232
25326
|
var import_react_i18next44 = require("react-i18next");
|
|
25233
25327
|
var import_fi3 = require("react-icons/fi");
|
|
25234
25328
|
var import_io54 = require("react-icons/io5");
|
|
@@ -25328,7 +25422,7 @@ var useSubmitDocumentForRequest = (organizationId, workspaceId, caseUuid, authCo
|
|
|
25328
25422
|
var import_react_table7 = require("@tanstack/react-table");
|
|
25329
25423
|
|
|
25330
25424
|
// src/RedactoPrivacyCenter/components/caseHistoryColumns.tsx
|
|
25331
|
-
var
|
|
25425
|
+
var import_react63 = require("react");
|
|
25332
25426
|
var import_react_i18next41 = require("react-i18next");
|
|
25333
25427
|
var import_fi2 = require("react-icons/fi");
|
|
25334
25428
|
var import_react_table5 = require("@tanstack/react-table");
|
|
@@ -25351,7 +25445,7 @@ var getCaseStatusVariant = (status) => {
|
|
|
25351
25445
|
var formatCaseStatus = (s) => s.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
25352
25446
|
var useCaseHistoryColumns = () => {
|
|
25353
25447
|
const { t } = (0, import_react_i18next41.useTranslation)();
|
|
25354
|
-
return (0,
|
|
25448
|
+
return (0, import_react63.useMemo)(
|
|
25355
25449
|
() => [
|
|
25356
25450
|
columnHelper3.accessor("case_id", {
|
|
25357
25451
|
id: "case_id",
|
|
@@ -25475,7 +25569,7 @@ var useCaseHistoryColumns = () => {
|
|
|
25475
25569
|
};
|
|
25476
25570
|
|
|
25477
25571
|
// src/RedactoPrivacyCenter/components/GrievanceTable.tsx
|
|
25478
|
-
var
|
|
25572
|
+
var import_react64 = require("react");
|
|
25479
25573
|
var import_react_i18next42 = require("react-i18next");
|
|
25480
25574
|
var import_react_table6 = require("@tanstack/react-table");
|
|
25481
25575
|
var import_jsx_runtime77 = require("react/jsx-runtime");
|
|
@@ -25491,7 +25585,7 @@ function GrievanceTable({
|
|
|
25491
25585
|
if (!table) return null;
|
|
25492
25586
|
const rowModel = table.getRowModel();
|
|
25493
25587
|
const allRows = rowModel.rows;
|
|
25494
|
-
const paginatedRows = (0,
|
|
25588
|
+
const paginatedRows = (0, import_react64.useMemo)(() => {
|
|
25495
25589
|
const start = pageIndex * pageSize;
|
|
25496
25590
|
const end = start + pageSize;
|
|
25497
25591
|
return allRows.slice(start, end);
|
|
@@ -25943,19 +26037,19 @@ function CaseHistory({ onCreateRequest }) {
|
|
|
25943
26037
|
const { navigateTo, setSelectedCase } = useInternalNavigation();
|
|
25944
26038
|
const grievanceTabs = useGrievanceTabs();
|
|
25945
26039
|
const requestTypeLabels = useRequestTypeLabels();
|
|
25946
|
-
const [activeTab, setActiveTab] = (0,
|
|
25947
|
-
const [searchQuery, setSearchQuery] = (0,
|
|
25948
|
-
const [selectedRequestTypes, setSelectedRequestTypes] = (0,
|
|
26040
|
+
const [activeTab, setActiveTab] = (0, import_react65.useState)(GRIEVANCE_TAB_IDS.ALL);
|
|
26041
|
+
const [searchQuery, setSearchQuery] = (0, import_react65.useState)("");
|
|
26042
|
+
const [selectedRequestTypes, setSelectedRequestTypes] = (0, import_react65.useState)(
|
|
25949
26043
|
Object.values(RequestTypeEnum)
|
|
25950
26044
|
);
|
|
25951
|
-
const [pageIndex, setPageIndex] = (0,
|
|
25952
|
-
const [pageSize, setPageSize] = (0,
|
|
26045
|
+
const [pageIndex, setPageIndex] = (0, import_react65.useState)(0);
|
|
26046
|
+
const [pageSize, setPageSize] = (0, import_react65.useState)(10);
|
|
25953
26047
|
const { organization } = useOrganization();
|
|
25954
26048
|
const { accessToken, refreshToken, onError, updateTokens } = useAuth();
|
|
25955
26049
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
25956
26050
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
25957
26051
|
const contact = typeof window !== "undefined" ? sessionStorage.getItem("email") || "" : "";
|
|
25958
|
-
const authContext = (0,
|
|
26052
|
+
const authContext = (0, import_react65.useMemo)(() => ({
|
|
25959
26053
|
accessToken,
|
|
25960
26054
|
refreshToken,
|
|
25961
26055
|
onError,
|
|
@@ -25967,7 +26061,7 @@ function CaseHistory({ onCreateRequest }) {
|
|
|
25967
26061
|
error,
|
|
25968
26062
|
isError
|
|
25969
26063
|
} = useCaseHistory(organizationId, workspaceId, contact, authContext);
|
|
25970
|
-
const filteredCases = (0,
|
|
26064
|
+
const filteredCases = (0, import_react65.useMemo)(() => {
|
|
25971
26065
|
return (cases || []).filter((item) => {
|
|
25972
26066
|
var _a2, _b, _c, _d, _e, _f, _g, _h;
|
|
25973
26067
|
const statusLower = item.status.toLowerCase();
|
|
@@ -26001,12 +26095,12 @@ function CaseHistory({ onCreateRequest }) {
|
|
|
26001
26095
|
return true;
|
|
26002
26096
|
});
|
|
26003
26097
|
}, [cases, activeTab, selectedRequestTypes, searchQuery]);
|
|
26004
|
-
const handleViewDetails = (0,
|
|
26098
|
+
const handleViewDetails = (0, import_react65.useCallback)((caseRequest) => {
|
|
26005
26099
|
setSelectedCase(caseRequest);
|
|
26006
26100
|
navigateTo("case-details");
|
|
26007
26101
|
}, [navigateTo, setSelectedCase]);
|
|
26008
26102
|
const columns = useCaseHistoryColumns();
|
|
26009
|
-
(0,
|
|
26103
|
+
(0, import_react65.useEffect)(() => {
|
|
26010
26104
|
setPageIndex(0);
|
|
26011
26105
|
}, [activeTab, searchQuery, selectedRequestTypes]);
|
|
26012
26106
|
const table = (0, import_react_table7.useReactTable)({
|
|
@@ -26285,7 +26379,7 @@ var import_jsx_runtime80 = require("react/jsx-runtime");
|
|
|
26285
26379
|
var getVar25 = (varName) => `var(${varName})`;
|
|
26286
26380
|
function PrivacyCenterFormPage() {
|
|
26287
26381
|
const { t } = (0, import_react_i18next45.useTranslation)();
|
|
26288
|
-
const [showForm, setShowForm] = (0,
|
|
26382
|
+
const [showForm, setShowForm] = (0, import_react66.useState)(() => {
|
|
26289
26383
|
try {
|
|
26290
26384
|
return sessionStorage.getItem("pc_grievance_view") === "form";
|
|
26291
26385
|
} catch {
|
|
@@ -26293,18 +26387,18 @@ function PrivacyCenterFormPage() {
|
|
|
26293
26387
|
}
|
|
26294
26388
|
});
|
|
26295
26389
|
const { setPageChromeOverride, clearPageChromeOverride } = usePageChrome();
|
|
26296
|
-
(0,
|
|
26390
|
+
(0, import_react66.useEffect)(() => {
|
|
26297
26391
|
if (!i18n_default.language) {
|
|
26298
26392
|
i18n_default.changeLanguage("en");
|
|
26299
26393
|
}
|
|
26300
26394
|
}, []);
|
|
26301
|
-
(0,
|
|
26395
|
+
(0, import_react66.useEffect)(() => {
|
|
26302
26396
|
try {
|
|
26303
26397
|
sessionStorage.setItem("pc_grievance_view", showForm ? "form" : "list");
|
|
26304
26398
|
} catch {
|
|
26305
26399
|
}
|
|
26306
26400
|
}, [showForm]);
|
|
26307
|
-
(0,
|
|
26401
|
+
(0, import_react66.useEffect)(() => {
|
|
26308
26402
|
if (showForm) {
|
|
26309
26403
|
setPageChromeOverride({
|
|
26310
26404
|
titleKey: "yourPrivacyCenter",
|
|
@@ -26336,15 +26430,15 @@ function PrivacyCenterFormPage() {
|
|
|
26336
26430
|
}
|
|
26337
26431
|
|
|
26338
26432
|
// src/RedactoPrivacyCenter/PrivacyCenterActivityPage.tsx
|
|
26339
|
-
var
|
|
26433
|
+
var import_react69 = require("react");
|
|
26340
26434
|
|
|
26341
26435
|
// src/RedactoPrivacyCenter/components/ActivitiesList.tsx
|
|
26342
|
-
var
|
|
26436
|
+
var import_react68 = require("react");
|
|
26343
26437
|
var import_react_i18next47 = require("react-i18next");
|
|
26344
26438
|
var import_lucide_react22 = require("lucide-react");
|
|
26345
26439
|
|
|
26346
26440
|
// src/RedactoPrivacyCenter/components/ActivityTimeline.tsx
|
|
26347
|
-
var
|
|
26441
|
+
var import_react67 = require("react");
|
|
26348
26442
|
var import_react_i18next46 = require("react-i18next");
|
|
26349
26443
|
var import_dayjs5 = __toESM(require("dayjs"));
|
|
26350
26444
|
var import_lucide_react21 = require("lucide-react");
|
|
@@ -26361,7 +26455,7 @@ function ActivityTimeline({
|
|
|
26361
26455
|
activities
|
|
26362
26456
|
}) {
|
|
26363
26457
|
const { t } = (0, import_react_i18next46.useTranslation)();
|
|
26364
|
-
const groups = (0,
|
|
26458
|
+
const groups = (0, import_react67.useMemo)(() => {
|
|
26365
26459
|
const ordered = [];
|
|
26366
26460
|
const byKey = /* @__PURE__ */ new Map();
|
|
26367
26461
|
for (const activity of activities) {
|
|
@@ -26554,26 +26648,26 @@ function ActivitiesList() {
|
|
|
26554
26648
|
const { consentClient } = useBaseUrl();
|
|
26555
26649
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
26556
26650
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
26557
|
-
const authContext = (0,
|
|
26651
|
+
const authContext = (0, import_react68.useMemo)(() => ({
|
|
26558
26652
|
accessToken,
|
|
26559
26653
|
refreshToken,
|
|
26560
26654
|
onError,
|
|
26561
26655
|
updateTokens
|
|
26562
26656
|
}), [accessToken, refreshToken, onError, updateTokens]);
|
|
26563
26657
|
const { langParam } = useCurrentLanguage();
|
|
26564
|
-
const [activities, setActivities] = (0,
|
|
26565
|
-
const [totalCount, setTotalCount] = (0,
|
|
26566
|
-
const [isLoadingInitial, setIsLoadingInitial] = (0,
|
|
26567
|
-
const [isLoadingMore, setIsLoadingMore] = (0,
|
|
26658
|
+
const [activities, setActivities] = (0, import_react68.useState)([]);
|
|
26659
|
+
const [totalCount, setTotalCount] = (0, import_react68.useState)(0);
|
|
26660
|
+
const [isLoadingInitial, setIsLoadingInitial] = (0, import_react68.useState)(true);
|
|
26661
|
+
const [isLoadingMore, setIsLoadingMore] = (0, import_react68.useState)(false);
|
|
26568
26662
|
const hasMore = activities.length < totalCount;
|
|
26569
|
-
const isFetchingRef = (0,
|
|
26570
|
-
const requestVersionRef = (0,
|
|
26571
|
-
const hasMoreRef = (0,
|
|
26663
|
+
const isFetchingRef = (0, import_react68.useRef)(false);
|
|
26664
|
+
const requestVersionRef = (0, import_react68.useRef)(0);
|
|
26665
|
+
const hasMoreRef = (0, import_react68.useRef)(hasMore);
|
|
26572
26666
|
hasMoreRef.current = hasMore;
|
|
26573
|
-
const countRef = (0,
|
|
26667
|
+
const countRef = (0, import_react68.useRef)(0);
|
|
26574
26668
|
countRef.current = activities.length;
|
|
26575
|
-
const sentinelRef = (0,
|
|
26576
|
-
const fetchPage = (0,
|
|
26669
|
+
const sentinelRef = (0, import_react68.useRef)(null);
|
|
26670
|
+
const fetchPage = (0, import_react68.useCallback)(
|
|
26577
26671
|
async (offset) => {
|
|
26578
26672
|
if (!organizationId || !workspaceId) return null;
|
|
26579
26673
|
return fetchActivities(
|
|
@@ -26588,7 +26682,7 @@ function ActivitiesList() {
|
|
|
26588
26682
|
},
|
|
26589
26683
|
[organizationId, workspaceId, authContext, consentClient, langParam]
|
|
26590
26684
|
);
|
|
26591
|
-
(0,
|
|
26685
|
+
(0, import_react68.useEffect)(() => {
|
|
26592
26686
|
let cancelled = false;
|
|
26593
26687
|
const requestVersion = ++requestVersionRef.current;
|
|
26594
26688
|
isFetchingRef.current = false;
|
|
@@ -26625,7 +26719,7 @@ function ActivitiesList() {
|
|
|
26625
26719
|
cancelled = true;
|
|
26626
26720
|
};
|
|
26627
26721
|
}, [fetchPage, organizationId, workspaceId, t]);
|
|
26628
|
-
const loadMore = (0,
|
|
26722
|
+
const loadMore = (0, import_react68.useCallback)(async () => {
|
|
26629
26723
|
if (isFetchingRef.current || !hasMoreRef.current) {
|
|
26630
26724
|
return;
|
|
26631
26725
|
}
|
|
@@ -26661,7 +26755,7 @@ function ActivitiesList() {
|
|
|
26661
26755
|
}
|
|
26662
26756
|
}
|
|
26663
26757
|
}, [fetchPage, t]);
|
|
26664
|
-
(0,
|
|
26758
|
+
(0, import_react68.useEffect)(() => {
|
|
26665
26759
|
const node = sentinelRef.current;
|
|
26666
26760
|
if (!node || isLoadingInitial) {
|
|
26667
26761
|
return;
|
|
@@ -26757,7 +26851,7 @@ function ActivityTimelineSkeleton() {
|
|
|
26757
26851
|
// src/RedactoPrivacyCenter/PrivacyCenterActivityPage.tsx
|
|
26758
26852
|
var import_jsx_runtime83 = require("react/jsx-runtime");
|
|
26759
26853
|
function PrivacyCenterActivityPage() {
|
|
26760
|
-
(0,
|
|
26854
|
+
(0, import_react69.useEffect)(() => {
|
|
26761
26855
|
if (!i18n_default.language) {
|
|
26762
26856
|
i18n_default.changeLanguage("en");
|
|
26763
26857
|
}
|
|
@@ -26766,17 +26860,17 @@ function PrivacyCenterActivityPage() {
|
|
|
26766
26860
|
}
|
|
26767
26861
|
|
|
26768
26862
|
// src/RedactoPrivacyCenter/PrivacyCenterMyReceiptPage.tsx
|
|
26769
|
-
var
|
|
26863
|
+
var import_react72 = require("react");
|
|
26770
26864
|
|
|
26771
26865
|
// src/RedactoPrivacyCenter/components/ReceiptsList.tsx
|
|
26772
|
-
var
|
|
26866
|
+
var import_react71 = require("react");
|
|
26773
26867
|
var import_react_i18next49 = require("react-i18next");
|
|
26774
26868
|
var import_react_table9 = require("@tanstack/react-table");
|
|
26775
26869
|
var import_dayjs7 = __toESM(require("dayjs"));
|
|
26776
26870
|
var import_lucide_react24 = require("lucide-react");
|
|
26777
26871
|
|
|
26778
26872
|
// src/RedactoPrivacyCenter/components/receiptColumns.tsx
|
|
26779
|
-
var
|
|
26873
|
+
var import_react70 = require("react");
|
|
26780
26874
|
var import_react_i18next48 = require("react-i18next");
|
|
26781
26875
|
var import_react_table8 = require("@tanstack/react-table");
|
|
26782
26876
|
var import_dayjs6 = __toESM(require("dayjs"));
|
|
@@ -26812,7 +26906,7 @@ var useReceiptColumns = ({
|
|
|
26812
26906
|
downloadingUuid
|
|
26813
26907
|
}) => {
|
|
26814
26908
|
const { t } = (0, import_react_i18next48.useTranslation)();
|
|
26815
|
-
return (0,
|
|
26909
|
+
return (0, import_react70.useMemo)(
|
|
26816
26910
|
() => [
|
|
26817
26911
|
columnHelper4.accessor("event_type", {
|
|
26818
26912
|
id: "event",
|
|
@@ -26991,23 +27085,23 @@ function ReceiptsList() {
|
|
|
26991
27085
|
const { langParam } = useCurrentLanguage();
|
|
26992
27086
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
26993
27087
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
26994
|
-
const authContext = (0,
|
|
27088
|
+
const authContext = (0, import_react71.useMemo)(
|
|
26995
27089
|
() => ({ accessToken, refreshToken, onError, updateTokens }),
|
|
26996
27090
|
[accessToken, refreshToken, onError, updateTokens]
|
|
26997
27091
|
);
|
|
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,
|
|
27092
|
+
const [receipts, setReceipts] = (0, import_react71.useState)([]);
|
|
27093
|
+
const [totalCount, setTotalCount] = (0, import_react71.useState)(0);
|
|
27094
|
+
const [isLoading, setIsLoading] = (0, import_react71.useState)(false);
|
|
27095
|
+
const [currentPage, setCurrentPage] = (0, import_react71.useState)(1);
|
|
27096
|
+
const [pageSize, setPageSize] = (0, import_react71.useState)(10);
|
|
27097
|
+
const [downloadingUuid, setDownloadingUuid] = (0, import_react71.useState)(null);
|
|
27098
|
+
const [previousData, setPreviousData] = (0, import_react71.useState)([]);
|
|
27099
|
+
const [previousTotalCount, setPreviousTotalCount] = (0, import_react71.useState)(0);
|
|
27100
|
+
const [eventType, setEventType] = (0, import_react71.useState)("");
|
|
27101
|
+
const [datePreset, setDatePreset] = (0, import_react71.useState)("");
|
|
27102
|
+
const [customFrom, setCustomFrom] = (0, import_react71.useState)("");
|
|
27103
|
+
const [customTo, setCustomTo] = (0, import_react71.useState)("");
|
|
27104
|
+
const eventTypeOptions = (0, import_react71.useMemo)(
|
|
27011
27105
|
() => [
|
|
27012
27106
|
{ value: "", label: t("all") },
|
|
27013
27107
|
{ value: "GRANTED", label: t("consentGranted") },
|
|
@@ -27017,7 +27111,7 @@ function ReceiptsList() {
|
|
|
27017
27111
|
],
|
|
27018
27112
|
[t]
|
|
27019
27113
|
);
|
|
27020
|
-
const dateOptions = (0,
|
|
27114
|
+
const dateOptions = (0, import_react71.useMemo)(
|
|
27021
27115
|
() => [
|
|
27022
27116
|
{ value: "", label: t("allTime") },
|
|
27023
27117
|
{ value: "1", label: t("today") },
|
|
@@ -27031,11 +27125,11 @@ function ReceiptsList() {
|
|
|
27031
27125
|
const eventValue = (_b = eventTypeOptions.find((o) => o.value === eventType)) != null ? _b : null;
|
|
27032
27126
|
const dateValue = (_c = dateOptions.find((o) => o.value === datePreset)) != null ? _c : null;
|
|
27033
27127
|
const hasActiveFilters = Boolean(eventType || datePreset);
|
|
27034
|
-
const isCustomRangeInvalid = (0,
|
|
27128
|
+
const isCustomRangeInvalid = (0, import_react71.useMemo)(
|
|
27035
27129
|
() => datePreset === "custom" && Boolean(customFrom && customTo && (0, import_dayjs7.default)(customFrom).isAfter((0, import_dayjs7.default)(customTo), "day")),
|
|
27036
27130
|
[datePreset, customFrom, customTo]
|
|
27037
27131
|
);
|
|
27038
|
-
const activeFilterLabels = (0,
|
|
27132
|
+
const activeFilterLabels = (0, import_react71.useMemo)(() => {
|
|
27039
27133
|
const filters = [];
|
|
27040
27134
|
if (eventType && (eventValue == null ? void 0 : eventValue.label)) {
|
|
27041
27135
|
filters.push({ id: "event", label: t("event"), value: eventValue.label });
|
|
@@ -27071,7 +27165,7 @@ function ReceiptsList() {
|
|
|
27071
27165
|
setCustomTo("");
|
|
27072
27166
|
setCurrentPage(1);
|
|
27073
27167
|
};
|
|
27074
|
-
const handleGetReceipts = (0,
|
|
27168
|
+
const handleGetReceipts = (0, import_react71.useCallback)(
|
|
27075
27169
|
async (page = currentPage, size = pageSize) => {
|
|
27076
27170
|
if (!organizationId || !workspaceId) return;
|
|
27077
27171
|
if (isCustomRangeInvalid) return;
|
|
@@ -27125,7 +27219,7 @@ function ReceiptsList() {
|
|
|
27125
27219
|
t
|
|
27126
27220
|
]
|
|
27127
27221
|
);
|
|
27128
|
-
const handleDownload = (0,
|
|
27222
|
+
const handleDownload = (0, import_react71.useCallback)(
|
|
27129
27223
|
async (receipt) => {
|
|
27130
27224
|
if (!organizationId || !workspaceId || !receipt.uuid) return;
|
|
27131
27225
|
setDownloadingUuid(receipt.uuid);
|
|
@@ -27156,13 +27250,13 @@ function ReceiptsList() {
|
|
|
27156
27250
|
[organizationId, workspaceId, authContext, consentClient, t]
|
|
27157
27251
|
);
|
|
27158
27252
|
const columns = useReceiptColumns({ onDownload: handleDownload, downloadingUuid });
|
|
27159
|
-
(0,
|
|
27253
|
+
(0, import_react71.useEffect)(() => {
|
|
27160
27254
|
if (receipts.length > 0) {
|
|
27161
27255
|
setPreviousData(receipts);
|
|
27162
27256
|
setPreviousTotalCount(totalCount);
|
|
27163
27257
|
}
|
|
27164
27258
|
}, [receipts, totalCount]);
|
|
27165
|
-
(0,
|
|
27259
|
+
(0, import_react71.useEffect)(() => {
|
|
27166
27260
|
void handleGetReceipts();
|
|
27167
27261
|
}, [organizationId, workspaceId, handleGetReceipts]);
|
|
27168
27262
|
const displayData = isLoading && receipts.length === 0 ? previousData : receipts;
|
|
@@ -27349,7 +27443,7 @@ function ReceiptsList() {
|
|
|
27349
27443
|
// src/RedactoPrivacyCenter/PrivacyCenterMyReceiptPage.tsx
|
|
27350
27444
|
var import_jsx_runtime86 = require("react/jsx-runtime");
|
|
27351
27445
|
function PrivacyCenterMyReceiptPage() {
|
|
27352
|
-
(0,
|
|
27446
|
+
(0, import_react72.useEffect)(() => {
|
|
27353
27447
|
if (!i18n_default.language) {
|
|
27354
27448
|
i18n_default.changeLanguage("en");
|
|
27355
27449
|
}
|
|
@@ -27369,7 +27463,7 @@ function PrivacyCenterMyReceiptPage() {
|
|
|
27369
27463
|
}
|
|
27370
27464
|
|
|
27371
27465
|
// src/RedactoPrivacyCenter/PrivacyCenterCaseDetailsPage.tsx
|
|
27372
|
-
var
|
|
27466
|
+
var import_react76 = require("react");
|
|
27373
27467
|
var import_react_i18next56 = require("react-i18next");
|
|
27374
27468
|
var import_io511 = require("react-icons/io5");
|
|
27375
27469
|
|
|
@@ -27430,7 +27524,7 @@ function getUploadErrorMessage(error) {
|
|
|
27430
27524
|
}
|
|
27431
27525
|
|
|
27432
27526
|
// src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx
|
|
27433
|
-
var
|
|
27527
|
+
var import_react75 = require("react");
|
|
27434
27528
|
var import_react_i18next54 = require("react-i18next");
|
|
27435
27529
|
var import_io510 = require("react-icons/io5");
|
|
27436
27530
|
|
|
@@ -27782,47 +27876,47 @@ var MessageComposer = ({
|
|
|
27782
27876
|
};
|
|
27783
27877
|
|
|
27784
27878
|
// src/RedactoPrivacyCenter/components/CaseDetails/useMessagePolling.ts
|
|
27785
|
-
var
|
|
27879
|
+
var import_react73 = require("react");
|
|
27786
27880
|
function useMessagePolling(refetch, messages, isPaused) {
|
|
27787
|
-
const scrollContainerRef = (0,
|
|
27788
|
-
const isNearBottomRef = (0,
|
|
27789
|
-
const shouldAutoScrollRef = (0,
|
|
27790
|
-
const isPausedRef = (0,
|
|
27881
|
+
const scrollContainerRef = (0, import_react73.useRef)(null);
|
|
27882
|
+
const isNearBottomRef = (0, import_react73.useRef)(true);
|
|
27883
|
+
const shouldAutoScrollRef = (0, import_react73.useRef)(true);
|
|
27884
|
+
const isPausedRef = (0, import_react73.useRef)(isPaused);
|
|
27791
27885
|
isPausedRef.current = isPaused;
|
|
27792
|
-
(0,
|
|
27886
|
+
(0, import_react73.useEffect)(() => {
|
|
27793
27887
|
const interval = setInterval(() => {
|
|
27794
27888
|
var _a;
|
|
27795
27889
|
if (!((_a = isPausedRef.current) == null ? void 0 : _a.call(isPausedRef))) refetch();
|
|
27796
27890
|
}, 3e4);
|
|
27797
27891
|
return () => clearInterval(interval);
|
|
27798
27892
|
}, [refetch]);
|
|
27799
|
-
const handleScroll = (0,
|
|
27893
|
+
const handleScroll = (0, import_react73.useCallback)(() => {
|
|
27800
27894
|
const el = scrollContainerRef.current;
|
|
27801
27895
|
if (!el) return;
|
|
27802
27896
|
isNearBottomRef.current = el.scrollHeight - el.scrollTop - el.clientHeight < 100;
|
|
27803
27897
|
}, []);
|
|
27804
|
-
(0,
|
|
27898
|
+
(0, import_react73.useLayoutEffect)(() => {
|
|
27805
27899
|
const el = scrollContainerRef.current;
|
|
27806
27900
|
if (el && (isNearBottomRef.current || shouldAutoScrollRef.current)) {
|
|
27807
27901
|
el.scrollTop = el.scrollHeight;
|
|
27808
27902
|
shouldAutoScrollRef.current = false;
|
|
27809
27903
|
}
|
|
27810
27904
|
}, [messages]);
|
|
27811
|
-
const scrollToBottom = (0,
|
|
27905
|
+
const scrollToBottom = (0, import_react73.useCallback)(() => {
|
|
27812
27906
|
shouldAutoScrollRef.current = true;
|
|
27813
27907
|
}, []);
|
|
27814
27908
|
return { scrollContainerRef, handleScroll, scrollToBottom };
|
|
27815
27909
|
}
|
|
27816
27910
|
|
|
27817
27911
|
// src/RedactoPrivacyCenter/components/CaseDetails/useFileUpload.ts
|
|
27818
|
-
var
|
|
27912
|
+
var import_react74 = require("react");
|
|
27819
27913
|
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,
|
|
27914
|
+
const [pendingUpload, setPendingUpload] = (0, import_react74.useState)(null);
|
|
27915
|
+
const [submittingForRequest, setSubmittingForRequest] = (0, import_react74.useState)(null);
|
|
27916
|
+
const attachInputRef = (0, import_react74.useRef)(null);
|
|
27917
|
+
const submitInputRef = (0, import_react74.useRef)(null);
|
|
27918
|
+
const pendingRequestRef = (0, import_react74.useRef)(null);
|
|
27919
|
+
const handleAttachFile = (0, import_react74.useCallback)((e) => {
|
|
27826
27920
|
var _a;
|
|
27827
27921
|
const file = (_a = e.target.files) == null ? void 0 : _a[0];
|
|
27828
27922
|
if (!file) return;
|
|
@@ -27846,7 +27940,7 @@ function useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom)
|
|
|
27846
27940
|
}
|
|
27847
27941
|
});
|
|
27848
27942
|
}, [uploadMutation]);
|
|
27849
|
-
const handleSubmitForRequest = (0,
|
|
27943
|
+
const handleSubmitForRequest = (0, import_react74.useCallback)((requestEventUuid, file) => {
|
|
27850
27944
|
const validationError = validateUploadFile(file);
|
|
27851
27945
|
if (validationError) {
|
|
27852
27946
|
toast.error(validationError);
|
|
@@ -27882,7 +27976,7 @@ function useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom)
|
|
|
27882
27976
|
}
|
|
27883
27977
|
});
|
|
27884
27978
|
}, [uploadMutation, submitMutation, refetch, scrollToBottom]);
|
|
27885
|
-
const handleSubmitInputChange = (0,
|
|
27979
|
+
const handleSubmitInputChange = (0, import_react74.useCallback)((e) => {
|
|
27886
27980
|
var _a;
|
|
27887
27981
|
const file = (_a = e.target.files) == null ? void 0 : _a[0];
|
|
27888
27982
|
e.target.value = "";
|
|
@@ -27892,7 +27986,7 @@ function useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom)
|
|
|
27892
27986
|
handleSubmitForRequest(requestUuid, file);
|
|
27893
27987
|
}
|
|
27894
27988
|
}, [handleSubmitForRequest]);
|
|
27895
|
-
const triggerUploadForRequest = (0,
|
|
27989
|
+
const triggerUploadForRequest = (0, import_react74.useCallback)((requestEventUuid) => {
|
|
27896
27990
|
var _a;
|
|
27897
27991
|
pendingRequestRef.current = requestEventUuid;
|
|
27898
27992
|
(_a = submitInputRef.current) == null ? void 0 : _a.click();
|
|
@@ -27918,7 +28012,7 @@ var MessagesTab = ({ caseUuid, caseStatus }) => {
|
|
|
27918
28012
|
const caseFinalizedTooltip = useCaseFinalizedTooltip();
|
|
27919
28013
|
const { organization } = useOrganization();
|
|
27920
28014
|
const { accessToken, refreshToken, onError, updateTokens } = useAuth();
|
|
27921
|
-
const authContext = (0,
|
|
28015
|
+
const authContext = (0, import_react75.useMemo)(
|
|
27922
28016
|
() => ({ accessToken, refreshToken, onError, updateTokens }),
|
|
27923
28017
|
[accessToken, refreshToken, onError, updateTokens]
|
|
27924
28018
|
);
|
|
@@ -27933,7 +28027,7 @@ var MessagesTab = ({ caseUuid, caseStatus }) => {
|
|
|
27933
28027
|
const sendMutation = useSendCaseMessage(organizationId, workspaceId, caseUuid, authContext);
|
|
27934
28028
|
const uploadMutation = useUploadCaseDocument(organizationId, workspaceId, caseUuid, authContext);
|
|
27935
28029
|
const submitMutation = useSubmitDocumentForRequest(organizationId, workspaceId, caseUuid, authContext);
|
|
27936
|
-
const isPollingPaused = (0,
|
|
28030
|
+
const isPollingPaused = (0, import_react75.useCallback)(() => isRefreshBlocked(authContext), [authContext]);
|
|
27937
28031
|
const { scrollContainerRef, handleScroll, scrollToBottom } = useMessagePolling(refetch, messages, isPollingPaused);
|
|
27938
28032
|
const {
|
|
27939
28033
|
pendingUpload,
|
|
@@ -27945,8 +28039,8 @@ var MessagesTab = ({ caseUuid, caseStatus }) => {
|
|
|
27945
28039
|
handleSubmitInputChange,
|
|
27946
28040
|
triggerUploadForRequest
|
|
27947
28041
|
} = useFileUpload(uploadMutation, submitMutation, refetch, scrollToBottom);
|
|
27948
|
-
const [messageText, setMessageText] = (0,
|
|
27949
|
-
const handleSend = (0,
|
|
28042
|
+
const [messageText, setMessageText] = (0, import_react75.useState)("");
|
|
28043
|
+
const handleSend = (0, import_react75.useCallback)(() => {
|
|
27950
28044
|
if (sendMutation.isPending || uploadMutation.isPending) return;
|
|
27951
28045
|
const trimmedBody = messageText.trim();
|
|
27952
28046
|
if (!trimmedBody && !pendingUpload) return;
|
|
@@ -28133,13 +28227,13 @@ var PrivacyCenterCaseDetailsPage = () => {
|
|
|
28133
28227
|
var _a, _b;
|
|
28134
28228
|
const { t } = (0, import_react_i18next56.useTranslation)();
|
|
28135
28229
|
const { navigateTo, selectedCase, setSelectedCase, pendingCaseUuid } = useInternalNavigation();
|
|
28136
|
-
const [activeTab, setActiveTab] = (0,
|
|
28230
|
+
const [activeTab, setActiveTab] = (0, import_react76.useState)("request-details");
|
|
28137
28231
|
const { organization } = useOrganization();
|
|
28138
28232
|
const { accessToken, refreshToken, onError, updateTokens } = useAuth();
|
|
28139
28233
|
const organizationId = organization == null ? void 0 : organization.uuid;
|
|
28140
28234
|
const workspaceId = (_a = organization == null ? void 0 : organization.workspaces[0]) == null ? void 0 : _a.uuid;
|
|
28141
28235
|
const contact = typeof window !== "undefined" ? sessionStorage.getItem("email") || "" : "";
|
|
28142
|
-
const authContext = (0,
|
|
28236
|
+
const authContext = (0, import_react76.useMemo)(() => ({
|
|
28143
28237
|
accessToken,
|
|
28144
28238
|
refreshToken,
|
|
28145
28239
|
onError,
|
|
@@ -28152,7 +28246,7 @@ var PrivacyCenterCaseDetailsPage = () => {
|
|
|
28152
28246
|
contact,
|
|
28153
28247
|
authContext
|
|
28154
28248
|
);
|
|
28155
|
-
(0,
|
|
28249
|
+
(0, import_react76.useEffect)(() => {
|
|
28156
28250
|
if (!cases) return;
|
|
28157
28251
|
if (cases.length === 0) {
|
|
28158
28252
|
navigateTo("form");
|
|
@@ -28166,13 +28260,13 @@ var PrivacyCenterCaseDetailsPage = () => {
|
|
|
28166
28260
|
navigateTo("form");
|
|
28167
28261
|
}
|
|
28168
28262
|
}, [cases, targetUuid, setSelectedCase, navigateTo]);
|
|
28169
|
-
(0,
|
|
28263
|
+
(0, import_react76.useEffect)(() => {
|
|
28170
28264
|
if (!targetUuid || isLoading || cases !== void 0) return;
|
|
28171
28265
|
if (!organizationId || !workspaceId || !contact) {
|
|
28172
28266
|
navigateTo("form");
|
|
28173
28267
|
}
|
|
28174
28268
|
}, [targetUuid, organizationId, workspaceId, contact, cases, isLoading, navigateTo]);
|
|
28175
|
-
(0,
|
|
28269
|
+
(0, import_react76.useEffect)(() => {
|
|
28176
28270
|
if (!selectedCase && !targetUuid && !isLoading) {
|
|
28177
28271
|
navigateTo("form");
|
|
28178
28272
|
}
|
|
@@ -28239,7 +28333,7 @@ var PrivacyCenterCaseDetailsPage = () => {
|
|
|
28239
28333
|
};
|
|
28240
28334
|
|
|
28241
28335
|
// src/RedactoPrivacyCenter/NotificationsPage.tsx
|
|
28242
|
-
var
|
|
28336
|
+
var import_react77 = require("react");
|
|
28243
28337
|
var import_io512 = require("react-icons/io5");
|
|
28244
28338
|
var import_react_i18next59 = require("react-i18next");
|
|
28245
28339
|
|
|
@@ -28406,20 +28500,20 @@ var NotificationsPage = () => {
|
|
|
28406
28500
|
handleAcknowledge,
|
|
28407
28501
|
handleCTAClick
|
|
28408
28502
|
} = 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,
|
|
28503
|
+
const [notifications, setNotifications] = (0, import_react77.useState)([]);
|
|
28504
|
+
const [summary, setSummary] = (0, import_react77.useState)({ total: 0, unread: 0, action_needed: 0, acknowledged: 0 });
|
|
28505
|
+
const [activeTab, setActiveTab] = (0, import_react77.useState)("all");
|
|
28506
|
+
const [isLoading, setIsLoading] = (0, import_react77.useState)(true);
|
|
28507
|
+
const [isRefreshing2, setIsRefreshing] = (0, import_react77.useState)(false);
|
|
28508
|
+
const [totalCount, setTotalCount] = (0, import_react77.useState)(0);
|
|
28509
|
+
const [skip, setSkip] = (0, import_react77.useState)(0);
|
|
28510
|
+
const pollRef = (0, import_react77.useRef)(null);
|
|
28511
|
+
const loadNotificationsRef = (0, import_react77.useRef)();
|
|
28512
|
+
(0, import_react77.useEffect)(() => {
|
|
28419
28513
|
setPageChromeOverride({ titleKey: "notificationHub", descriptionKey: "notificationHubSubtitle" });
|
|
28420
28514
|
return () => clearPageChromeOverride();
|
|
28421
28515
|
}, [setPageChromeOverride, clearPageChromeOverride]);
|
|
28422
|
-
const loadNotifications = (0,
|
|
28516
|
+
const loadNotifications = (0, import_react77.useCallback)(async (includeSummary = false, silent = false) => {
|
|
28423
28517
|
if (!organizationId || !workspaceId) {
|
|
28424
28518
|
return;
|
|
28425
28519
|
}
|
|
@@ -28450,13 +28544,13 @@ var NotificationsPage = () => {
|
|
|
28450
28544
|
setIsRefreshing(false);
|
|
28451
28545
|
}
|
|
28452
28546
|
}, [organizationId, workspaceId, activeTab, skip, authContext, consentClient, langParam]);
|
|
28453
|
-
(0,
|
|
28547
|
+
(0, import_react77.useEffect)(() => {
|
|
28454
28548
|
loadNotifications(true);
|
|
28455
28549
|
}, [loadNotifications]);
|
|
28456
|
-
(0,
|
|
28550
|
+
(0, import_react77.useEffect)(() => {
|
|
28457
28551
|
loadNotificationsRef.current = loadNotifications;
|
|
28458
28552
|
}, [loadNotifications]);
|
|
28459
|
-
(0,
|
|
28553
|
+
(0, import_react77.useEffect)(() => {
|
|
28460
28554
|
pollRef.current = setInterval(() => {
|
|
28461
28555
|
var _a;
|
|
28462
28556
|
(_a = loadNotificationsRef.current) == null ? void 0 : _a.call(loadNotificationsRef, false, true);
|
|
@@ -28467,10 +28561,10 @@ var NotificationsPage = () => {
|
|
|
28467
28561
|
}
|
|
28468
28562
|
};
|
|
28469
28563
|
}, []);
|
|
28470
|
-
(0,
|
|
28564
|
+
(0, import_react77.useEffect)(() => {
|
|
28471
28565
|
setSkip(0);
|
|
28472
28566
|
}, [activeTab]);
|
|
28473
|
-
const onNotificationClick = (0,
|
|
28567
|
+
const onNotificationClick = (0, import_react77.useCallback)(async (notification) => {
|
|
28474
28568
|
if (!organizationId || !workspaceId) {
|
|
28475
28569
|
return;
|
|
28476
28570
|
}
|
|
@@ -28493,7 +28587,7 @@ var NotificationsPage = () => {
|
|
|
28493
28587
|
acknowledged: prev.acknowledged + (acknowledged && !notification.is_acknowledged ? 1 : 0)
|
|
28494
28588
|
}));
|
|
28495
28589
|
}, [organizationId, workspaceId, hasAcknowledgeCTA, handleMarkRead, handleAcknowledge]);
|
|
28496
|
-
const onCTAClick = (0,
|
|
28590
|
+
const onCTAClick = (0, import_react77.useCallback)(async (notification, cta) => {
|
|
28497
28591
|
const result = await handleCTAClick(notification, cta);
|
|
28498
28592
|
if (result === "acknowledged") {
|
|
28499
28593
|
setNotifications((prev) => prev.map(
|
|
@@ -28508,7 +28602,7 @@ var NotificationsPage = () => {
|
|
|
28508
28602
|
onNotificationClick(notification);
|
|
28509
28603
|
}
|
|
28510
28604
|
}, [handleCTAClick, onNotificationClick]);
|
|
28511
|
-
const onMarkAllRead = (0,
|
|
28605
|
+
const onMarkAllRead = (0, import_react77.useCallback)(async () => {
|
|
28512
28606
|
const ok = await handleMarkAllRead();
|
|
28513
28607
|
if (!ok) {
|
|
28514
28608
|
return;
|
|
@@ -28516,11 +28610,11 @@ var NotificationsPage = () => {
|
|
|
28516
28610
|
setNotifications((prev) => prev.map((n) => ({ ...n, is_read: true })));
|
|
28517
28611
|
setSummary((prev) => ({ ...prev, unread: 0 }));
|
|
28518
28612
|
}, [handleMarkAllRead]);
|
|
28519
|
-
const onRefresh = (0,
|
|
28613
|
+
const onRefresh = (0, import_react77.useCallback)(() => {
|
|
28520
28614
|
setIsRefreshing(true);
|
|
28521
28615
|
loadNotifications(true);
|
|
28522
28616
|
}, [loadNotifications]);
|
|
28523
|
-
const onBack = (0,
|
|
28617
|
+
const onBack = (0, import_react77.useCallback)(() => navigateTo("consent-manager"), [navigateTo]);
|
|
28524
28618
|
return /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)("div", { className: "pc-notification-page", children: [
|
|
28525
28619
|
/* @__PURE__ */ (0, import_jsx_runtime100.jsxs)("button", { type: "button", onClick: onBack, className: "pc-notification-back-btn", children: [
|
|
28526
28620
|
/* @__PURE__ */ (0, import_jsx_runtime100.jsx)(import_io512.IoChevronBackOutline, { size: 14 }),
|
|
@@ -28556,7 +28650,7 @@ var NotificationsPage = () => {
|
|
|
28556
28650
|
var import_jsx_runtime101 = require("react/jsx-runtime");
|
|
28557
28651
|
function PrivacyCenterHomePage() {
|
|
28558
28652
|
const { currentPage } = useInternalNavigation();
|
|
28559
|
-
(0,
|
|
28653
|
+
(0, import_react78.useEffect)(() => {
|
|
28560
28654
|
if (!i18n_default.language) {
|
|
28561
28655
|
i18n_default.changeLanguage("en");
|
|
28562
28656
|
}
|
|
@@ -28580,47 +28674,23 @@ function PrivacyCenterHomePage() {
|
|
|
28580
28674
|
}
|
|
28581
28675
|
|
|
28582
28676
|
// 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
|
-
};
|
|
28677
|
+
var import_react79 = require("react");
|
|
28608
28678
|
|
|
28609
28679
|
// src/RedactoPrivacyCenter/settings/api.ts
|
|
28610
|
-
var
|
|
28680
|
+
var cache = /* @__PURE__ */ new Map();
|
|
28611
28681
|
var freshEntry = (url) => {
|
|
28612
|
-
const entry =
|
|
28682
|
+
const entry = cache.get(url);
|
|
28613
28683
|
if (!entry) {
|
|
28614
28684
|
return null;
|
|
28615
28685
|
}
|
|
28616
28686
|
if (Date.now() >= entry.expiresAt) {
|
|
28617
|
-
|
|
28687
|
+
cache.delete(url);
|
|
28618
28688
|
return null;
|
|
28619
28689
|
}
|
|
28620
28690
|
return entry;
|
|
28621
28691
|
};
|
|
28622
28692
|
var trimTrailingSlash = (url) => url.replace(/\/+$/, "");
|
|
28623
|
-
var privacyCenterSettingsUrl = (baseUrl, organisationUuid, language) => `${trimTrailingSlash(baseUrl)}/public/organisations/${encodeURIComponent(
|
|
28693
|
+
var privacyCenterSettingsUrl = (baseUrl, organisationUuid, language) => `${trimTrailingSlash(resolveEndpoints(baseUrl).baseUrl)}/public/organisations/${encodeURIComponent(
|
|
28624
28694
|
organisationUuid
|
|
28625
28695
|
)}/privacy-center-settings/?${SETTINGS_LANG_PARAM}=${encodeURIComponent(language)}`;
|
|
28626
28696
|
var isSettingsResponse = (value) => typeof value === "object" && value !== null && "settings" in value && typeof value.settings === "object" && value.settings !== null;
|
|
@@ -28632,8 +28702,8 @@ var fetchPublicPrivacyCenterSettings = (baseUrl, organisationUuid, language) =>
|
|
|
28632
28702
|
}
|
|
28633
28703
|
const forget = () => {
|
|
28634
28704
|
var _a;
|
|
28635
|
-
if (((_a =
|
|
28636
|
-
|
|
28705
|
+
if (((_a = cache.get(url)) == null ? void 0 : _a.request) === request) {
|
|
28706
|
+
cache.delete(url);
|
|
28637
28707
|
}
|
|
28638
28708
|
};
|
|
28639
28709
|
const request = apiFetch(url, {
|
|
@@ -28651,7 +28721,7 @@ var fetchPublicPrivacyCenterSettings = (baseUrl, organisationUuid, language) =>
|
|
|
28651
28721
|
}
|
|
28652
28722
|
return null;
|
|
28653
28723
|
});
|
|
28654
|
-
|
|
28724
|
+
cache.set(url, { request, expiresAt: Date.now() + SETTINGS_CACHE_TTL_MS });
|
|
28655
28725
|
return request;
|
|
28656
28726
|
};
|
|
28657
28727
|
var hasCachedPrivacyCenterSettings = (baseUrl, organisationUuid, language) => freshEntry(privacyCenterSettingsUrl(baseUrl, organisationUuid, language)) !== null;
|
|
@@ -28668,15 +28738,15 @@ var readSession = (key) => {
|
|
|
28668
28738
|
var resolveOrganisationIds = ({
|
|
28669
28739
|
organisationUuid,
|
|
28670
28740
|
workspaceUuid,
|
|
28671
|
-
accessToken
|
|
28672
|
-
slug
|
|
28741
|
+
accessToken
|
|
28673
28742
|
}) => {
|
|
28674
28743
|
var _a, _b, _c, _d;
|
|
28675
28744
|
const claims = accessToken ? decodeJwtToken(accessToken) : null;
|
|
28676
|
-
const
|
|
28677
|
-
const
|
|
28745
|
+
const storedOrganisation = readSession("pc_org_id");
|
|
28746
|
+
const organisation = (_b = (_a = clean(organisationUuid)) != null ? _a : clean(claims == null ? void 0 : claims.organisation_uuid)) != null ? _b : storedOrganisation;
|
|
28747
|
+
const sessionMatches = organisation !== null && organisation === storedOrganisation;
|
|
28678
28748
|
return {
|
|
28679
|
-
organisationUuid:
|
|
28749
|
+
organisationUuid: organisation,
|
|
28680
28750
|
workspaceUuid: (_d = (_c = clean(workspaceUuid)) != null ? _c : clean(claims == null ? void 0 : claims.workspace_uuid)) != null ? _d : sessionMatches ? readSession("pc_workspace_id") : null
|
|
28681
28751
|
};
|
|
28682
28752
|
};
|
|
@@ -28761,7 +28831,7 @@ var orderedToggles = (raw, keys, defaults) => {
|
|
|
28761
28831
|
};
|
|
28762
28832
|
var stringList = (raw, max) => Array.isArray(raw) ? raw.filter((item) => typeof item === "string").map((item) => item.trim()).filter(Boolean).slice(0, max) : [];
|
|
28763
28833
|
var resolveBranding = (raw) => {
|
|
28764
|
-
var _a;
|
|
28834
|
+
var _a, _b;
|
|
28765
28835
|
const base = DEFAULT_PRIVACY_CENTER_SETTINGS.branding;
|
|
28766
28836
|
const font = raw.font_family;
|
|
28767
28837
|
return {
|
|
@@ -28769,11 +28839,12 @@ var resolveBranding = (raw) => {
|
|
|
28769
28839
|
display_name: nullableText(raw.display_name, base.display_name),
|
|
28770
28840
|
logo_url: nullableUrl(raw.logo_url, base.logo_url),
|
|
28771
28841
|
logo_height: clampedInt(raw.logo_height, LOGO_HEIGHT_MIN, LOGO_HEIGHT_MAX, base.logo_height),
|
|
28842
|
+
logo_align: (_a = LOGO_ALIGNMENTS.find((value) => value === raw.logo_align)) != null ? _a : base.logo_align,
|
|
28772
28843
|
inherit_colors: bool(raw.inherit_colors, base.inherit_colors),
|
|
28773
28844
|
primary_color: hex(raw.primary_color, base.primary_color),
|
|
28774
28845
|
accent_color: hex(raw.accent_color, base.accent_color),
|
|
28775
28846
|
inherit_font: bool(raw.inherit_font, base.inherit_font),
|
|
28776
|
-
font_family: font === null ? null : (
|
|
28847
|
+
font_family: font === null ? null : (_b = FONT_FAMILIES.find((family) => family === font)) != null ? _b : base.font_family,
|
|
28777
28848
|
style: raw.style === void 0 ? base.style : resolveAppearance(raw.style) === "glass" ? "glass" : "classic",
|
|
28778
28849
|
corner_radius: clampedInt(raw.corner_radius, CORNER_RADIUS_MIN, CORNER_RADIUS_MAX, base.corner_radius)
|
|
28779
28850
|
};
|
|
@@ -28935,55 +29006,9 @@ var resolveBrandContact = (raw) => {
|
|
|
28935
29006
|
// src/RedactoPrivacyCenter/context/PrivacyCenterSettingsContext.tsx
|
|
28936
29007
|
var import_jsx_runtime102 = require("react/jsx-runtime");
|
|
28937
29008
|
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
29009
|
var PrivacyCenterSettingsProvider = ({
|
|
28984
29010
|
children,
|
|
28985
29011
|
baseUrl,
|
|
28986
|
-
slug,
|
|
28987
29012
|
accessToken,
|
|
28988
29013
|
organisationUuid,
|
|
28989
29014
|
workspaceUuid,
|
|
@@ -28991,16 +29016,18 @@ var PrivacyCenterSettingsProvider = ({
|
|
|
28991
29016
|
builtInSignIn = false
|
|
28992
29017
|
}) => {
|
|
28993
29018
|
const { currentLanguage } = useCurrentLanguage();
|
|
28994
|
-
const
|
|
28995
|
-
|
|
28996
|
-
|
|
28997
|
-
|
|
28998
|
-
|
|
29019
|
+
const organisation = (0, import_react79.useMemo)(() => {
|
|
29020
|
+
const known = resolveOrganisationIds({ organisationUuid, workspaceUuid, accessToken });
|
|
29021
|
+
return {
|
|
29022
|
+
...known,
|
|
29023
|
+
status: known.organisationUuid && known.workspaceUuid ? "resolved" : "failed"
|
|
29024
|
+
};
|
|
29025
|
+
}, [organisationUuid, workspaceUuid, accessToken]);
|
|
28999
29026
|
const orgUuid = organisation.organisationUuid;
|
|
29000
29027
|
const requestLanguage = requestLanguageFor(currentLanguage);
|
|
29001
|
-
const [remote, setRemote] = (0,
|
|
29002
|
-
const [status, setStatus] = (0,
|
|
29003
|
-
(0,
|
|
29028
|
+
const [remote, setRemote] = (0, import_react79.useState)(null);
|
|
29029
|
+
const [status, setStatus] = (0, import_react79.useState)("idle");
|
|
29030
|
+
(0, import_react79.useEffect)(() => {
|
|
29004
29031
|
if (!orgUuid) {
|
|
29005
29032
|
return void 0;
|
|
29006
29033
|
}
|
|
@@ -29025,12 +29052,12 @@ var PrivacyCenterSettingsProvider = ({
|
|
|
29025
29052
|
}, [baseUrl, orgUuid, requestLanguage]);
|
|
29026
29053
|
const overridesKey = JSON.stringify(overrides != null ? overrides : null);
|
|
29027
29054
|
const activeRemote = remote && remote.organisationUuid === orgUuid ? remote.response : null;
|
|
29028
|
-
const settings = (0,
|
|
29055
|
+
const settings = (0, import_react79.useMemo)(
|
|
29029
29056
|
() => resolvePrivacyCenterSettings(activeRemote == null ? void 0 : activeRemote.settings, overrides),
|
|
29030
29057
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
29031
29058
|
[activeRemote, overridesKey]
|
|
29032
29059
|
);
|
|
29033
|
-
const brandContact = (0,
|
|
29060
|
+
const brandContact = (0, import_react79.useMemo)(
|
|
29034
29061
|
() => resolveBrandContact(activeRemote == null ? void 0 : activeRemote.brand_contact),
|
|
29035
29062
|
[activeRemote]
|
|
29036
29063
|
);
|
|
@@ -29039,16 +29066,16 @@ var PrivacyCenterSettingsProvider = ({
|
|
|
29039
29066
|
);
|
|
29040
29067
|
const isCustomised = isPublished || hasHostOverrides(overrides);
|
|
29041
29068
|
useLanguagePolicy(settings, isCustomised);
|
|
29042
|
-
const value = (0,
|
|
29043
|
-
() => ({ settings, status, isCustomised, organisation,
|
|
29044
|
-
[settings, status, isCustomised, organisation,
|
|
29069
|
+
const value = (0, import_react79.useMemo)(
|
|
29070
|
+
() => ({ settings, status, isCustomised, organisation, builtInSignIn, brandContact }),
|
|
29071
|
+
[settings, status, isCustomised, organisation, builtInSignIn, brandContact]
|
|
29045
29072
|
);
|
|
29046
29073
|
return /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(PrivacyCenterSettingsContext.Provider, { value, children });
|
|
29047
29074
|
};
|
|
29048
29075
|
var languagePolicyOwner = null;
|
|
29049
29076
|
var useLanguagePolicy = (settings, isCustomised) => {
|
|
29050
|
-
const [ownerId] = (0,
|
|
29051
|
-
(0,
|
|
29077
|
+
const [ownerId] = (0, import_react79.useState)(() => /* @__PURE__ */ Symbol("language-policy"));
|
|
29078
|
+
(0, import_react79.useEffect)(() => {
|
|
29052
29079
|
if (languagePolicyOwner === null) {
|
|
29053
29080
|
languagePolicyOwner = ownerId;
|
|
29054
29081
|
}
|
|
@@ -29059,7 +29086,7 @@ var useLanguagePolicy = (settings, isCustomised) => {
|
|
|
29059
29086
|
};
|
|
29060
29087
|
}, [ownerId]);
|
|
29061
29088
|
const policyKey = isCustomised ? JSON.stringify(settings.languages) : "";
|
|
29062
|
-
(0,
|
|
29089
|
+
(0, import_react79.useEffect)(() => {
|
|
29063
29090
|
if (!policyKey || languagePolicyOwner !== ownerId) {
|
|
29064
29091
|
return;
|
|
29065
29092
|
}
|
|
@@ -29072,7 +29099,7 @@ var useLanguagePolicy = (settings, isCustomised) => {
|
|
|
29072
29099
|
|
|
29073
29100
|
// src/RedactoPrivacyCenter/context/PrivacyCenterScopeContext.tsx
|
|
29074
29101
|
var React3 = __toESM(require("react"));
|
|
29075
|
-
var
|
|
29102
|
+
var import_react80 = require("react");
|
|
29076
29103
|
|
|
29077
29104
|
// src/shared/appearance/scopedCss.ts
|
|
29078
29105
|
var escapesScope = (style) => {
|
|
@@ -29110,7 +29137,7 @@ var PC_CUSTOM_CSS_ATTRIBUTE = "data-redacto-pc-css";
|
|
|
29110
29137
|
var fallbackScopeCounter = 0;
|
|
29111
29138
|
var useScopeId = () => {
|
|
29112
29139
|
const reactUseId = React3.useId;
|
|
29113
|
-
const [fallback] = (0,
|
|
29140
|
+
const [fallback] = (0, import_react80.useState)(() => {
|
|
29114
29141
|
fallbackScopeCounter += 1;
|
|
29115
29142
|
return `pc-${fallbackScopeCounter}`;
|
|
29116
29143
|
});
|
|
@@ -29135,7 +29162,7 @@ var PrivacyCenterRoot = ({ children }) => {
|
|
|
29135
29162
|
css: customCss
|
|
29136
29163
|
});
|
|
29137
29164
|
}, [customCss, id]);
|
|
29138
|
-
const value = (0,
|
|
29165
|
+
const value = (0, import_react80.useMemo)(() => ({ id, dir }), [id, dir]);
|
|
29139
29166
|
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
29167
|
};
|
|
29141
29168
|
|
|
@@ -32270,7 +32297,7 @@ function SettingsAppearance({ children }) {
|
|
|
32270
32297
|
function RedactoPrivacyCenter({
|
|
32271
32298
|
baseUrl,
|
|
32272
32299
|
ledgerBaseUrl,
|
|
32273
|
-
slug,
|
|
32300
|
+
slug = "",
|
|
32274
32301
|
accessToken,
|
|
32275
32302
|
refreshToken,
|
|
32276
32303
|
token,
|
|
@@ -32297,13 +32324,12 @@ function RedactoPrivacyCenter({
|
|
|
32297
32324
|
PrivacyCenterSettingsProvider,
|
|
32298
32325
|
{
|
|
32299
32326
|
baseUrl,
|
|
32300
|
-
slug,
|
|
32301
32327
|
accessToken,
|
|
32302
32328
|
organisationUuid,
|
|
32303
32329
|
workspaceUuid,
|
|
32304
32330
|
overrides: settings,
|
|
32305
32331
|
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, {
|
|
32332
|
+
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
32333
|
AuthProvider,
|
|
32308
32334
|
{
|
|
32309
32335
|
accessToken,
|
|
@@ -32314,7 +32340,6 @@ function RedactoPrivacyCenter({
|
|
|
32314
32340
|
sandboxMobile: mobile,
|
|
32315
32341
|
organisationUuid,
|
|
32316
32342
|
workspaceUuid,
|
|
32317
|
-
slug,
|
|
32318
32343
|
onError,
|
|
32319
32344
|
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
32345
|
}
|