UNPKG

@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
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 };