@adyen/kyc-components
Version:
This guide assumes that you have already an account with Adyen. A legalEntity needs to be created, and you need to have a `legalEntityId` to instatiate a Component.
448 lines (447 loc) • 20.2 kB
JavaScript
try {
let e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "3e8bb5b4-a11a-4f62-abae-26260d5a5dac", e._sentryDebugIdIdentifier = "sentry-dbid-3e8bb5b4-a11a-4f62-abae-26260d5a5dac");
} catch (e) {}
import { a as Icon, n as addResourceBundles, r as useTranslation, t as Trans } from "./translation-BYvhW5zA.js";
import { A as _rolldown_dynamic_import_helper_default, j as useToggleContext, k as Header, r as useGetTaskStatus, v as DEFAULT_TRUST_MEMBER_REQUIREMENTS, x as Alert } from "./resolveEnvironment-DNmu53Rr.js";
import { r as Loader, t as Button } from "./Button-i8I2dHP8.js";
import { r as useLegalEntity, t as ROOT_LE } from "./useLegalEntity-CtlUQv_J.js";
import { t as LegalEntityTypes } from "./legal-entity-type-0MfCGzUf.js";
import { t as StackLayout } from "./StackLayout-IUdNMDgW.js";
import { i as TaskStatuses } from "./taskStatus-BtekPA8E.js";
import { t as CountryCodes } from "./country-code-CJk2hdPu.js";
import { t as TaskTypes } from "./taskTypes-NawDTp5n.js";
import { s as getOwnEntityAssociations } from "./entityAssociationUtil-C-wflW8q.js";
import { n as getDecisionMakerDescriptionMap } from "./decisionMaker-Dt53wKqO.js";
import { r as TrustMemberTypes, t as TRUST_DEFAULT_DESCRIPTIONS_MAP } from "./trustMemberGuidance-CgdU2v0j.js";
import { n as useToastContext } from "./invalidateRootLegalEntity-DLpPeD5p.js";
import { t as useAssociatedLegalEntity } from "./useAssociatedLegalEntity-CkuvFV-D.js";
import { t as UnincorporatedPartnershipMemberTypes } from "./unincorporated-partnership-nnTW3FnG.js";
import { t as useTrustMembers } from "./useTrustMembers-BIdqkIX1.js";
import { t as useUpdateLegalEntity } from "./useUpdateLegalEntity-B0XYfxbB.js";
import { n as getRoleTagVariant, t as getRoleName } from "./roleMetadata-v10ns9iG.js";
import { t as ContextGuidance } from "./ContextGuidance-R45SnI5u.js";
import { t as Spacer } from "./Spacer-CEHRO4Ml.js";
import { t as Tag } from "./Tag-CNeDHqKp.js";
import { t as EntityAssociation } from "./EntityAssociation-CjYJOrRt.js";
import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
//#region src/components/UnincorporatedPartnership/tasks/UnincorporatedPartnershipMembers/types.ts
var UNINCORPORATED_PARTNERSHIP__DEFAULT_DESCRIPTIONS_MAP = {
[UnincorporatedPartnershipMemberTypes.SECONDARY_PARTNER]: "provideAtLeastOneSecondaryPartner",
[UnincorporatedPartnershipMemberTypes.OWNER]: "provideAllOwners",
[UnincorporatedPartnershipMemberTypes.CONTROLLING_PERSON]: "ifNoOwnersSpecifyControllingPersons"
};
//#endregion
//#region src/utils/entityStatusUtil.ts
/**
* Determines the status of an entity based on the current and minimum values.
*
* This function compares the `current` number of entities provided with the `min` entities required.
* If the `current` value is greater than 0 and is greater than or equal to `min`,
* it returns `'satisfied'`. Otherwise, it returns `'empty'`.
*
* @param {number} current - The current value to be evaluated.
* @param {number} min - The minimum threshold that `current` must meet or exceed.
* @returns {EntityStatus} - Returns `'satisfied'` if the current value meets the condition, otherwise `'empty'`.
*/
var iconStatus = (current, min) => {
return current > 0 && current >= min ? "satisfied" : "empty";
};
var getEntityStatusRuleDescription = (country, currentTask, entityLabel) => {
const defaultMessage = getDecisionMakerDescriptionMap(country)[entityLabel];
switch (currentTask) {
case TaskTypes.TRUST_MEMBER_OVERVIEW: return TRUST_DEFAULT_DESCRIPTIONS_MAP[entityLabel];
case TaskTypes.UNINCORPORATED_PARTNERSHIP_MEMBER_OVERVIEW: return UNINCORPORATED_PARTNERSHIP__DEFAULT_DESCRIPTIONS_MAP[entityLabel] || defaultMessage;
default: return defaultMessage;
}
};
var EntityGuidanceStatus_module_default = {
"status-container": "_status-container_5vw9z_1",
statusContainer: "_status-container_5vw9z_1",
"status-tag": "_status-tag_5vw9z_8",
statusTag: "_status-tag_5vw9z_8",
"status-icon": "_status-icon_5vw9z_13",
statusIcon: "_status-icon_5vw9z_13",
"status-icon-satisfied": "_status-icon-satisfied_5vw9z_24",
statusIconSatisfied: "_status-icon-satisfied_5vw9z_24",
"status-icon-empty": "_status-icon-empty_5vw9z_29",
statusIconEmpty: "_status-icon-empty_5vw9z_29",
"status-legend": "_status-legend_5vw9z_33",
statusLegend: "_status-legend_5vw9z_33",
"status-legend-rule": "_status-legend-rule_5vw9z_40",
statusLegendRule: "_status-legend-rule_5vw9z_40",
"status-text": "_status-text_5vw9z_46",
statusText: "_status-text_5vw9z_46"
};
//#endregion
//#region src/components/Shared/EntityGuidanceStatus/EntityStatusIcon.tsx
var EntityStatusIcon = ({ status }) => {
switch (status) {
case "empty": return /* @__PURE__ */ jsx(Icon, {
name: "checkmark-circle",
className: "adyen-kyc-entity-status__icon adyen-kyc-entity-status__icon--empty",
testId: "empty-icon"
});
case "satisfied": return /* @__PURE__ */ jsx(Icon, {
name: "checkmark",
className: "adyen-kyc-entity-status__icon adyen-kyc-entity-status__icon--satisfied",
testId: "satisfied-icon"
});
default: return /* @__PURE__ */ jsx(Icon, {
name: "circle",
className: "adyen-kyc-entity-status__icon adyen-kyc-entity-status__icon--empty",
testId: "empty-icon"
});
}
};
//#endregion
//#region src/components/Shared/EntityGuidanceStatus/EntityGuidanceStatus.tsx
var EntityGuidanceStatus = ({ country, currentTask, entityLabel, status }) => {
const { t } = useTranslation("common");
return /* @__PURE__ */ jsxs("div", {
className: EntityGuidanceStatus_module_default.statusContainer,
children: [
/* @__PURE__ */ jsx(EntityStatusIcon, { status }),
/* @__PURE__ */ jsx(Tag, {
className: EntityGuidanceStatus_module_default.statusTag,
variant: getRoleTagVariant(entityLabel),
children: t(($) => $[getRoleName(entityLabel)])
}, entityLabel),
/* @__PURE__ */ jsx("span", {
className: EntityGuidanceStatus_module_default.statusText,
"data-testid": `${entityLabel}-rule--description`,
children: /* @__PURE__ */ jsx(Trans, {
t,
i18nKey: ($) => $[getEntityStatusRuleDescription(country, currentTask, entityLabel)]
})
})
]
});
};
//#endregion
//#region src/components/Trust/utils/deleteAssociatedTrustMember.ts
var deleteAssociatedTrustMember = async ({ associatedTrustMember, trust, asyncMutation }) => {
const ownEntityAssociations = getOwnEntityAssociations(trust);
await asyncMutation({
id: trust.id,
entityAssociations: ownEntityAssociations.filter((entityAssociation) => entityAssociation.legalEntityId !== associatedTrustMember.legalEntityId)
});
};
//#endregion
//#region src/components/Trust/utils/deleteUndefinedBeneficiary.ts
/**
* Undefined Beneficiaries are not entity associations,
* therefore their deletion and updation are different from that of a usual trust member
*/
var deleteUndefinedBeneficiary = async ({ undefinedBeneficiary, trust, asyncMutation }) => {
const existingUndefinedBeneficiaries = trust.trust?.undefinedBeneficiaryInfo ?? [];
await asyncMutation({
id: trust.id,
trust: { undefinedBeneficiaryInfo: existingUndefinedBeneficiaries.filter((ub) => ub.reference !== undefinedBeneficiary.reference) }
});
};
//#endregion
//#region src/components/Trust/tasks/TrustMembers/CompanyTrustMemberTaskItem.tsx
var CompanyTrustMemberTaskItem = ({ companyTrustMember, taskStatus, onEditOwner, onAddOwner, onEdit, onDelete }) => {
const { t } = useTranslation(["trust", "common"]);
const actions = [
{
icon: "edit",
onSelect: onEdit,
label: t(($) => $["editTrustMember"], { trustMember: companyTrustMember.name })
},
companyTrustMember.ownerId ? {
icon: "edit",
onSelect: onEditOwner,
label: t(($) => $["editOwnerOfTrustMember"], { trustMember: companyTrustMember.name })
} : {
icon: "plus",
onSelect: onAddOwner,
label: t(($) => $["addOwnerToTrustMember"], { trustMember: companyTrustMember.name })
},
{
icon: "bin",
onSelect: onDelete,
label: t(($) => $["removeTrustMember"], { trustMember: companyTrustMember.name })
}
];
const infoContent = companyTrustMember.ownerId ? void 0 : /* @__PURE__ */ jsx(Alert, {
title: /* @__PURE__ */ jsxs(Fragment, { children: [
t(($) => $["helpUsVerifyCompany"], { ns: "common" }),
" ",
/* @__PURE__ */ jsx(Button, {
onClick: onAddOwner,
variant: "link",
children: t(($) => $["providePersonalDetailsOfOwner"])
})
] }),
className: "add-owner-alert"
});
return /* @__PURE__ */ jsx(EntityAssociation, {
types: companyTrustMember.roles,
name: companyTrustMember.name,
status: taskStatus,
actions,
infoContent,
onNavigateToEntity: onEdit
}, companyTrustMember.legalEntityId);
};
//#endregion
//#region src/components/Trust/tasks/TrustMembers/ExemptSettlorTaskItem.tsx
var ExemptSettlorTaskItem = ({ exemptSettlor, taskStatus, onEdit, onDelete }) => {
const { t } = useTranslation("trust");
const settlorName = exemptSettlor.legalEntityType === LegalEntityTypes.INDIVIDUAL ? `${exemptSettlor.exemptSettlorName?.firstName} ${exemptSettlor.exemptSettlorName?.lastName}` : exemptSettlor.name ?? "";
const actions = [{
icon: "edit",
onSelect: onEdit,
label: t(($) => $["editTrustMember"], { trustMember: settlorName })
}, {
icon: "bin",
onSelect: onDelete,
label: t(($) => $["removeTrustMember"], { trustMember: settlorName })
}];
return /* @__PURE__ */ jsx(EntityAssociation, {
types: exemptSettlor.roles,
name: settlorName,
status: taskStatus,
actions,
onNavigateToEntity: onEdit
}, exemptSettlor.legalEntityId);
};
//#endregion
//#region src/components/Trust/tasks/TrustMembers/RegularTrustMemberTaskItem.tsx
var RegularTrustMemberTaskItem = ({ trustMember, taskStatus, onEdit, onDelete }) => {
const { t } = useTranslation("trust");
const actions = [{
icon: "edit",
onSelect: onEdit,
label: t(($) => $["editTrustMember"], { trustMember: trustMember.name })
}, {
icon: "bin",
onSelect: onDelete,
label: t(($) => $["removeTrustMember"], { trustMember: trustMember.name })
}];
return /* @__PURE__ */ jsx(EntityAssociation, {
types: trustMember.roles,
name: trustMember.name,
status: taskStatus,
actions,
onNavigateToEntity: onEdit
}, trustMember.legalEntityId);
};
//#endregion
//#region src/components/Trust/tasks/TrustMembers/RootTrusteeTaskItem.tsx
var RootTrusteeTaskItem = ({ rootTrustee, taskStatus, onEdit }) => {
const { t } = useTranslation("trust");
const actions = [{
icon: "edit",
onSelect: onEdit,
label: t(($) => $["editTrustMember"], { trustMember: rootTrustee.name })
}];
const { isFeatureEnabled } = useToggleContext();
const isAllowMoreRolesForMainRootTrustee = isFeatureEnabled("AllowMoreRolesForMainRootTrustee");
return /* @__PURE__ */ jsx(EntityAssociation, {
types: isFeatureEnabled("AllowMoreRolesForMainRootTrustee") ? rootTrustee.roles : [TrustMemberTypes.TRUSTEE],
name: rootTrustee.name,
status: taskStatus,
actions: isAllowMoreRolesForMainRootTrustee ? actions : void 0
});
};
//#endregion
//#region src/components/Trust/tasks/TrustMembers/UndefinedBeneficiaryTaskItem.tsx
var UndefinedBeneficiaryTaskItem = ({ undefinedBeneficiary, onEdit, onDelete }) => {
const { t } = useTranslation("trust");
const actions = [{
icon: "edit",
onSelect: onEdit,
label: t(($) => $["editTrustMember"], { trustMember: t(($) => $["undefinedBeneficiary"]) })
}, {
icon: "bin",
onSelect: onDelete,
label: t(($) => $["removeTrustMember"], { trustMember: t(($) => $["undefinedBeneficiary"]) })
}];
return /* @__PURE__ */ jsx(EntityAssociation, {
name: undefinedBeneficiary.description,
types: [TrustMemberTypes.UNDEFINED_BENEFICIARY],
status: TaskStatuses.FINISHED,
actions,
onNavigateToEntity: onEdit
}, undefinedBeneficiary.reference);
};
//#endregion
//#region src/components/Trust/tasks/TrustMembers/TrustMembersOverview.tsx
var TrustMembersOverview = ({ navigateBackToTaskList, navigateToEditTrustMember, navigateToEditTrustMemberOwner }) => {
const { t, i18n } = useTranslation("trust");
const { data: rootLe, isLoading } = useLegalEntity(ROOT_LE);
const { data: trustLe, refetch: refetchTrust } = useAssociatedLegalEntity(rootLe, LegalEntityTypes.TRUST);
const trustMembers = useTrustMembers();
const { mutateAsync: updateLegalEntity } = useUpdateLegalEntity();
const { showToast } = useToastContext();
addResourceBundles(i18n, [{
ns: "trust",
importFn: (lang) => _rolldown_dynamic_import_helper_default(/* @__PURE__ */ Object.assign({
"../../language/bg-BG.json": () => import("./bg-BG-qQc6pN4K.js"),
"../../language/cs-CZ.json": () => import("./cs-CZ-Jsmhr_B3.js"),
"../../language/da-DK.json": () => import("./da-DK-CXZXQspY.js"),
"../../language/de-DE.json": () => import("./de-DE-BRJ0jBty.js"),
"../../language/el-GR.json": () => import("./el-GR-BMGYrO4V.js"),
"../../language/en-US.json": () => import("./en-US-CWDI7JKT.js"),
"../../language/es-ES.json": () => import("./es-ES-pt4yy_U2.js"),
"../../language/es-LA.json": () => import("./es-LA-DU9jNyAv.js"),
"../../language/et-EE.json": () => import("./et-EE-dDMeDiTJ.js"),
"../../language/fi-FI.json": () => import("./fi-FI-iRb7nS7X.js"),
"../../language/fr-FR.json": () => import("./fr-FR-DUrcyeOg.js"),
"../../language/hr-HR.json": () => import("./hr-HR-LnDb18bf.js"),
"../../language/hu-HU.json": () => import("./hu-HU-Cc7wqn6A.js"),
"../../language/it-IT.json": () => import("./it-IT-BPA_Upt_.js"),
"../../language/ja-JP.json": () => import("./ja-JP-CYb1SAoz.js"),
"../../language/lt-LT.json": () => import("./lt-LT-B9Nm7OZQ.js"),
"../../language/lv-LV.json": () => import("./lv-LV-DkjsE74u.js"),
"../../language/nl-NL.json": () => import("./nl-NL-BtdPxlFm.js"),
"../../language/no-NO.json": () => import("./no-NO-BIhMgC99.js"),
"../../language/pl-PL.json": () => import("./pl-PL-BT6NmGgO.js"),
"../../language/pt-BR.json": () => import("./pt-BR-B0SUw4uu.js"),
"../../language/pt-PT.json": () => import("./pt-PT-KikTTc5A.js"),
"../../language/ro-RO.json": () => import("./ro-RO-DajmyI4j.js"),
"../../language/sk-SK.json": () => import("./sk-SK-DJWcs0qJ.js"),
"../../language/sl-SI.json": () => import("./sl-SI-C_QeUL6t.js"),
"../../language/sv-SE.json": () => import("./sv-SE-D3MOTV-T.js")
}), `../../language/${lang}.json`, 4)
}]);
if (isLoading || !rootLe || !trustLe) return /* @__PURE__ */ jsx(Loader, { size: "large" });
const deleteTrustMember = async (trustMember) => {
try {
switch (trustMember.trustMemberType) {
case "regular":
case "exemptSettlor":
case "company":
await deleteAssociatedTrustMember({
associatedTrustMember: trustMember,
trust: trustLe,
asyncMutation: updateLegalEntity
});
break;
case "undefinedBeneficiary":
await deleteUndefinedBeneficiary({
undefinedBeneficiary: trustMember,
trust: trustLe,
asyncMutation: updateLegalEntity
});
break;
case "rootTrustee": throw new Error("Cannot delete root trustee");
}
await refetchTrust();
showToast({
variant: "success",
label: t(($) => $["successFullyRemovedTrustMember"])
});
} catch {
showToast({
variant: "error",
label: t(($) => $["failedToRemoveTrustMember"])
});
}
};
return /* @__PURE__ */ jsx(TrustMembersOverviewInner, {
trustMembers,
deleteTrustMember,
navigateBackToTaskList,
navigateToEditTrustMember,
navigateToEditTrustMemberOwner
});
};
var TrustMembersOverviewInner = ({ trustMembers, deleteTrustMember, navigateBackToTaskList, navigateToEditTrustMember, navigateToEditTrustMemberOwner }) => {
const { t } = useTranslation(["trust", "common"]);
const trustMemberRequirements = DEFAULT_TRUST_MEMBER_REQUIREMENTS;
const trustMembersWithOneOfGivenRoles = (roleTypes) => trustMembers.filter(({ roles }) => roleTypes.some((label) => roles.includes(label)));
const { isFeatureEnabled } = useToggleContext();
const allowMoreRolesForMainRootTrustee = isFeatureEnabled("AllowMoreRolesForMainRootTrustee");
const getTaskStatus = useGetTaskStatus();
return /* @__PURE__ */ jsxs("div", {
className: "adyen-kyc-trust-members u-width-full u-margin-16",
children: [
/* @__PURE__ */ jsx(Header, {
title: t(($) => $["trustMembers"]),
description: t(($) => $["trustMembersDescription"])
}),
/* @__PURE__ */ jsx("div", { children: trustMemberRequirements.map(({ roleTypes, min, label }) => /* @__PURE__ */ jsx(EntityGuidanceStatus, {
country: CountryCodes.Australia,
currentTask: TaskTypes.TRUST_MEMBER_OVERVIEW,
entityLabel: label,
status: iconStatus(trustMembersWithOneOfGivenRoles(roleTypes).length, min)
}, label)) }),
/* @__PURE__ */ jsx(ContextGuidance, {
title: t(($) => $["whatIsTheDifferenceBetweenTheseRoles"]),
content: /* @__PURE__ */ jsx("ul", {
className: "adyen-kyc-guidance-list",
children: trustMemberRequirements.map(({ label }) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Trans, {
t,
ns: "trust",
i18nKey: ($) => $[`${label}GuideDescription`]
}) }, label))
}),
titleId: "whatIsTheDifferenceBetweenTheseRoles",
contentId: "differenceBetweenTrustMemberRoles"
}),
/* @__PURE__ */ jsx(StackLayout, {
gap: "small",
children: trustMembers.map((trustMember) => {
switch (trustMember.trustMemberType) {
case "rootTrustee": return /* @__PURE__ */ jsx(RootTrusteeTaskItem, {
rootTrustee: trustMember,
taskStatus: getTaskStatus(trustMember.legalEntityType == "organization" ? TaskTypes.TRUST_MEMBER_COMPANY : TaskTypes.TRUST_MEMBER_INDIVIDUAL, String(trustMember.legalEntityId)),
onEdit: allowMoreRolesForMainRootTrustee ? () => navigateToEditTrustMember(trustMember) : () => {}
}, trustMember.legalEntityId);
case "regular": return /* @__PURE__ */ jsx(RegularTrustMemberTaskItem, {
trustMember,
taskStatus: getTaskStatus(TaskTypes.TRUST_MEMBER_INDIVIDUAL, String(trustMember.legalEntityId)),
onEdit: () => navigateToEditTrustMember(trustMember),
onDelete: () => deleteTrustMember(trustMember)
}, trustMember.legalEntityId);
case "company": return /* @__PURE__ */ jsx(CompanyTrustMemberTaskItem, {
companyTrustMember: trustMember,
taskStatus: getTaskStatus(TaskTypes.TRUST_MEMBER_COMPANY, String(trustMember.legalEntityId)),
onEdit: () => navigateToEditTrustMember(trustMember),
onDelete: () => deleteTrustMember(trustMember),
onEditOwner: () => navigateToEditTrustMemberOwner(trustMember.ownerId, trustMember.legalEntityId),
onAddOwner: () => navigateToEditTrustMemberOwner("", trustMember.legalEntityId)
}, trustMember.legalEntityId);
case "exemptSettlor": return /* @__PURE__ */ jsx(ExemptSettlorTaskItem, {
exemptSettlor: trustMember,
taskStatus: getTaskStatus(TaskTypes.TRUST_MEMBER_INDIVIDUAL, String(trustMember.legalEntityId)),
onEdit: () => navigateToEditTrustMember(trustMember),
onDelete: () => deleteTrustMember(trustMember)
}, trustMember.legalEntityId);
case "undefinedBeneficiary": return /* @__PURE__ */ jsx(UndefinedBeneficiaryTaskItem, {
undefinedBeneficiary: trustMember,
onEdit: () => navigateToEditTrustMember(trustMember),
onDelete: () => deleteTrustMember(trustMember)
}, trustMember.reference);
}
})
}),
/* @__PURE__ */ jsx("div", {
className: "u-margin-top-24",
children: /* @__PURE__ */ jsx(Button, {
variant: "secondary",
icon: "plus",
onClick: (e) => {
e.stopPropagation();
navigateToEditTrustMember("new");
},
children: t(($) => $["addTrustMember"])
})
}),
/* @__PURE__ */ jsxs("div", {
class: "u-display-flex u-margin-top-48",
children: [/* @__PURE__ */ jsx(Spacer, {}), /* @__PURE__ */ jsx(Button, {
variant: "secondary",
onClick: navigateBackToTaskList,
children: t(($) => $["saveAndGoToOverview"], { ns: "common" })
})]
})
]
});
};
//#endregion
export { TrustMembersOverview };