@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.
944 lines (943 loc) • 40.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] = "d3dd8bb3-41cf-4083-a7db-ba9d0f824062", e._sentryDebugIdIdentifier = "sentry-dbid-d3dd8bb3-41cf-4083-a7db-ba9d0f824062");
} catch (e) {}
import { n as addResourceBundles, o as createLogger, r as useTranslation } from "./translation-BFxyJ1c5.js";
import { r as Loader } from "./Button-oj6H8OrC.js";
import { r as useLegalEntity } from "./useLegalEntity-yxi9XhLi.js";
import { t as LegalEntityTypes } from "./legal-entity-type-VIfNYnJP.js";
import { t as getLegalEntityCountry } from "./getLegalEntityCountry-C6bSV6sB.js";
import { t as useToggleContext } from "./useToggleContext-DaQUBF8O.js";
import { y as isEmpty } from "./validatorUtils-DRapRJ6z.js";
import { t as _rolldown_dynamic_import_helper_default } from "./_rolldown_dynamic_import_helper-rq_tsyLP.js";
import { t as Header } from "./Header-CPmJyuoP.js";
import { t as CountryCodes } from "./country-code-CX5KqMBr.js";
import { t as DropinLayout } from "./DropinLayout-Ce8IeTl4.js";
import { s as getOwnEntityAssociations } from "./entityAssociationUtil-BEzUdPbm.js";
import { r as TrustMemberTypes } from "./trustMemberGuidance-B3VWjXzg.js";
import { t as useToastContext } from "./useToastContext-CYgfHjSb.js";
import { t as isNewEntity } from "./isNewEntity-4QusRCpP.js";
import { t as useTrustMembers } from "./useTrustMembers-NwUmFfVc.js";
import { t as useCreateLegalEntity } from "./useCreateLegalEntity-BK1XURnK.js";
import { t as useUpdateLegalEntity } from "./useUpdateLegalEntity-CtaRaKZ6.js";
import { t as ErrorPanel } from "./ErrorPanel-B536hgSc.js";
import { n as mergeFieldMetadataIntoProps, t as createFormUtils } from "./formUtils-DCvL3uZG.js";
import { r as roleMetadata, t as getRoleName } from "./roleMetadata-CP3ZYYSI.js";
import { n as summaryStep, t as Summary } from "./Summary-B5IkOGJV.js";
import { r as summaryItem } from "./summaryItem-Dehjwp8D.js";
import { t as resolveFieldMetadata } from "./fieldConfigurations-m7oWP1DZ.js";
import { t as Field } from "./Field-pcJkjIG_.js";
import { t as TileGroup } from "./TileGroup-D0YbtzZ0.js";
import { n as SelectListItem } from "./Select-CcSRI-H0.js";
import { t as TextArea } from "./TextArea-CRLeP4x6.js";
import { t as useForm } from "./useForm-pUkvCLc9.js";
import { t as getFieldProps } from "./getProps-CkZCnNxW.js";
import { n as CountryField, t as COUNTRY_FIELD } from "./CountryField-Dh4DfjBf.js";
import { n as nameFields, t as Name } from "./Name-G92OEGxs.js";
import { t as FormNavigation } from "./FormNavigation-ikhirSjM.js";
import { a as defaultFieldMetadata, n as LegalCompanyNameField, r as defaultFieldConfig, s as getLegalCompanyNameGuidanceText, t as LEGAL_COMPANY_NAME_FIELD } from "./LegalCompanyNameField-CW82YkTh.js";
import { t as ActionBar } from "./ActionBar-Doac020y.js";
import { a as trustMemberLegalEntityTypes, i as settlorExemptionReasonWithNoneOfTheAbove, n as isExemptSettlor, r as isOrganizationAndSettlor, t as couldBeExemptSettlor } from "./types-DLViphaA.js";
import { useEffect, useState } from "preact/hooks";
import cx from "classnames";
import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
import { skipToken } from "@tanstack/preact-query";
import { useParams } from "wouter-preact";
//#region src/utils/eventHandlers/handleKeys.ts
var handleKeys = (keys, callback, propagationMode = "stopIfMatches") => (event) => {
if (propagationMode === "stop") event.stopPropagation();
if (keys.includes(event.key)) {
if (propagationMode === "stopIfMatches") event.stopPropagation();
callback();
}
};
var MultiSelectList_module_default = {
"multi-select-list": "adyen-kyc-multi-select-list",
multiSelectList: "adyen-kyc-multi-select-list",
"multi-select-list-item": "adyen-kyc-multi-select-list-item",
multiSelectListItem: "adyen-kyc-multi-select-list-item",
"multi-select-list-item-with-description": "adyen-kyc-multi-select-list-item-with-description",
multiSelectListItemWithDescription: "adyen-kyc-multi-select-list-item-with-description",
"adyen-kyc-checkbox__label": "adyen-kyc-adyen-kyc-checkbox__label",
adyenKycCheckboxLabel: "adyen-kyc-adyen-kyc-checkbox__label"
};
//#endregion
//#region src/components/ui/atoms/MultiSelectList/MultiSelectList.tsx
var MultiSelectList = ({ options, selected, onSelect, mapToSelectItem }) => /* @__PURE__ */ jsx("ul", {
className: MultiSelectList_module_default.multiSelectList,
children: options.map((option) => {
const item = mapToSelectItem(option);
const isSelected = selected.includes(option);
const handleSelect = () => {
onSelect(isSelected ? selected.filter((selectedOption) => selectedOption !== option) : [...selected, option]);
};
return /* @__PURE__ */ jsx(SelectListItem, {
id: item.id,
item,
selected: isSelected,
onKeyDown: handleKeys(["Enter", " "], handleSelect),
onSelect: handleSelect,
isMulti: true,
className: cx([MultiSelectList_module_default.multiSelectListItem, { [MultiSelectList_module_default.multiSelectListItemWithDescription]: !!item.description }])
}, item.id);
})
});
//#endregion
//#region src/utils/makeSelectItemForRole.ts
var makeSelectItemForRole = (role, t) => {
const metadata = roleMetadata[role];
if (!metadata) throw Error(`Cannot make select item for role "${role}"; no metadata found. Valid roles include: ${Object.keys(roleMetadata).join("\n")}`);
const { name, description } = metadata;
return {
id: role,
name: t(($) => $[name]),
description: description ? t(($) => $[description]) : void 0
};
};
//#endregion
//#region src/components/Trust/forms/TrustRoleAndEntityType/convertExistingTrustMember.ts
var convertExistingSettlorExemptionReasons = (existingReasons) => {
if (!existingReasons || !existingReasons.length) return ["noneOfTheAbove"];
return existingReasons;
};
var convertExistingTrustMember = (trustMember) => {
switch (trustMember.trustMemberType) {
case "undefinedBeneficiary": return {
entityType: LegalEntityTypes.INDIVIDUAL,
role: ["undefinedBeneficiary"],
descriptionUndefinedBeneficiary: trustMember.description
};
case "regular":
case "company": return {
entityType: trustMember.legalEntityType,
role: trustMember.roles,
settlorExemptionReason: ["noneOfTheAbove"],
country: trustMember.trustMemberType === "company" ? trustMember.country : void 0,
legalCompanyName: trustMember.trustMemberType === "company" ? trustMember.name : void 0
};
case "rootTrustee": return {
trustMemberType: trustMember.trustMemberType,
entityType: trustMember.legalEntityType,
role: trustMember.roles,
settlorExemptionReason: ["noneOfTheAbove"]
};
case "exemptSettlor": return {
entityType: trustMember.legalEntityType,
role: ["settlor"],
settlorExemptionReason: convertExistingSettlorExemptionReasons(trustMember.settlorExemptionReason),
firstName: trustMember.exemptSettlorName?.firstName,
lastName: trustMember.exemptSettlorName?.lastName,
legalCompanyName: trustMember.name,
country: trustMember.country
};
}
};
var convertRootTrusteeTrustMember = (trustMember) => ({
trustMemberType: trustMember.trustMemberType,
entityType: trustMember.legalEntityType,
role: trustMember.roles,
settlorExemptionReason: ["noneOfTheAbove"]
});
//#endregion
//#region src/components/Trust/forms/TrustRoleAndEntityType/getAvailableRoles.ts
/**
* For each role, there is some other roles they may also hold for the trust
*/
var allowedCrossoverRolesMatrix = {
settlor: ["secondaryTrustee", "protector"],
secondaryTrustee: [
"settlor",
"protector",
"definedBeneficiary"
],
protector: [
"settlor",
"secondaryTrustee",
"definedBeneficiary"
],
definedBeneficiary: ["secondaryTrustee", "protector"],
undefinedBeneficiary: []
};
var allowedCrossoverRolesMatrixByTrustMemberAndLegalEntityType = { rootTrustee: {
[LegalEntityTypes.INDIVIDUAL]: {
settlor: ["secondaryTrustee", "protector"],
secondaryTrustee: [
"settlor",
"protector",
"definedBeneficiary"
],
protector: [
"settlor",
"secondaryTrustee",
"definedBeneficiary"
],
definedBeneficiary: ["secondaryTrustee", "protector"],
undefinedBeneficiary: []
},
[LegalEntityTypes.ORGANIZATION]: {
settlor: ["secondaryTrustee", "protector"],
secondaryTrustee: ["settlor", "protector"],
protector: ["settlor", "secondaryTrustee"],
definedBeneficiary: [],
undefinedBeneficiary: []
}
} };
var getAllowedCrossoverRolesMatrixByTrustMemberAndLegalEntityType = (trustMember) => {
const { trustMemberType } = trustMember;
if (trustMemberType === "undefinedBeneficiary") return allowedCrossoverRolesMatrix;
const crossoverRolesByTrustMember = allowedCrossoverRolesMatrixByTrustMemberAndLegalEntityType[trustMemberType];
if (!crossoverRolesByTrustMember) return allowedCrossoverRolesMatrix;
const crossoverRoles = crossoverRolesByTrustMember[trustMember.legalEntityType];
if (!crossoverRoles) return allowedCrossoverRolesMatrix;
return crossoverRoles;
};
var availablesRolesByTrustMemberTypeAndLegalEntityType = { rootTrustee: {
[LegalEntityTypes.INDIVIDUAL]: [
"settlor",
"protector",
"definedBeneficiary"
],
[LegalEntityTypes.ORGANIZATION]: ["settlor", "protector"]
} };
var getAvailableRolesByTrustMemberTypeAndLegalEntityType = (currentRoles, trustMember) => {
if (!currentRoles?.length) {
const { trustMemberType, legalEntityType } = trustMember;
const availableRolesByTrustMemberType = availablesRolesByTrustMemberTypeAndLegalEntityType[trustMemberType];
if (!availableRolesByTrustMemberType) return Object.values(TrustMemberTypes);
const availableRoles = availableRolesByTrustMemberType[legalEntityType];
if (!availableRoles) return Object.values(TrustMemberTypes);
return availableRoles;
}
const crossoverRolesMatrix = trustMember ? getAllowedCrossoverRolesMatrixByTrustMemberAndLegalEntityType(trustMember) : allowedCrossoverRolesMatrix;
return currentRoles.map((role) => [role, ...crossoverRolesMatrix[role]]).reduce((existingAllowed, allowedForRole) => existingAllowed.filter((role) => allowedForRole.includes(role))).filter((r) => r !== "secondaryTrustee");
};
var getAvailableRoles = (currentRoles) => {
if (!currentRoles?.length) return Object.values(TrustMemberTypes);
return currentRoles.map((role) => [role, ...allowedCrossoverRolesMatrix[role]]).reduce((existingAllowed, allowedForRole) => existingAllowed.filter((role) => allowedForRole.includes(role)));
};
//#endregion
//#region src/components/Trust/forms/TrustRoleAndEntityType/validate.ts
var roleAndTypeValidationRules = {
entityType: {
modes: ["blur"],
validate: (entityType) => !isEmpty(entityType),
errorMessage: "fieldIsRequired"
},
role: {
modes: ["blur"],
validate: (role) => !!role?.length,
errorMessage: "fieldIsRequired"
},
descriptionUndefinedBeneficiary: {
modes: ["blur"],
validate: (description) => !isEmpty(description),
errorMessage: "fieldIsRequired"
},
settlorExemptionReason: {
modes: ["blur"],
validate: (reasons) => Boolean(reasons?.length),
errorMessage: "fieldIsRequired"
},
country: {
modes: ["blur"],
validate: (country) => !!country,
errorMessage: "fieldIsRequired"
},
legalCompanyName: {
modes: ["blur"],
validate: (name) => !!name,
errorMessage: "fieldIsRequired"
}
};
//#endregion
//#region src/components/Trust/forms/TrustRoleAndEntityType/TrustRoleAndEntityType.tsx
var CHARACTERS_LIMIT = 256;
var leTypeCardDetails = {
[LegalEntityTypes.INDIVIDUAL]: {
id: "individual",
name: "naturalPersonTitle",
description: "naturalPersonDescription"
},
[LegalEntityTypes.ORGANIZATION]: {
id: "organization",
name: "businessEntityTitle",
description: "businessEntityDescription"
}
};
var convertExistingTrustMemberToDefaultData = (trustMember, allowMoreRolesForMainRootTrusteeEnabled) => {
if (!trustMember) return {};
if (allowMoreRolesForMainRootTrusteeEnabled && trustMember.trustMemberType === "rootTrustee") return convertRootTrusteeTrustMember(trustMember);
return convertExistingTrustMember(trustMember);
};
var TrustRoleAndEntityType = (props) => {
const { t: commonT } = useTranslation("common");
const { t: trustT } = useTranslation("trust");
const { existingTrustMember, isOrganizationSettlorWithExemptionEnabled, onChange, id, country, fieldValidationErrors, formVerificationErrors } = props;
const trustRoleAndEntityTypeCountry = country;
let mergedProps = props;
mergedProps = mergeFieldMetadataIntoProps("legalCompanyName", resolveFieldMetadata(defaultFieldConfig[trustRoleAndEntityTypeCountry], {}, defaultFieldMetadata), mergedProps);
const { isFeatureEnabled } = useToggleContext();
const allowMoreRolesForMainRootTrusteeEnabled = isFeatureEnabled("AllowMoreRolesForMainRootTrustee");
const defaultData = convertExistingTrustMemberToDefaultData(existingTrustMember, allowMoreRolesForMainRootTrusteeEnabled);
const formUtils = createFormUtils(mergedProps, commonT);
const decideFields = (data) => {
if (data.role?.includes("undefinedBeneficiary")) return ["role", "descriptionUndefinedBeneficiary"];
if (data.role?.length) {
if (isOrganizationSettlorWithExemptionEnabled && isOrganizationAndSettlor(data)) return [
"role",
"entityType",
"settlorExemptionReason",
"country",
"legalCompanyName"
];
if (couldBeExemptSettlor(data, country)) return isExemptSettlor(data) ? [
"role",
"entityType",
"settlorExemptionReason",
"firstName",
"lastName"
] : [
"role",
"entityType",
"settlorExemptionReason"
];
return allowMoreRolesForMainRootTrusteeEnabled ? [
"role",
"entityType",
"trustMemberType"
] : ["role", "entityType"];
}
return ["role"];
};
const { data, valid, schema, errors, fieldProblems, handleChangeFor, isValid } = useForm({
...props,
schema: decideFields,
rules: roleAndTypeValidationRules,
defaultData,
fieldProblems: fieldValidationErrors
});
const availableRoles = allowMoreRolesForMainRootTrusteeEnabled && existingTrustMember?.trustMemberType === "rootTrustee" ? getAvailableRolesByTrustMemberTypeAndLegalEntityType(data.role, existingTrustMember) : getAvailableRoles(data.role);
const { data: exemptSettlorLe } = useLegalEntity(isOrganizationSettlorWithExemptionEnabled && existingTrustMember && existingTrustMember.trustMemberType === "exemptSettlor" && existingTrustMember.legalEntityId !== isNewEntity && existingTrustMember.roles !== void 0 && existingTrustMember.roles.length === 1 && existingTrustMember.roles[0] === "settlor" ? existingTrustMember.legalEntityId : skipToken);
useEffect(() => {
if (exemptSettlorLe && exemptSettlorLe.organization) handleChangeFor("country")(exemptSettlorLe.organization.registeredAddress.country);
}, [exemptSettlorLe]);
useEffect(() => {
onChange?.({
schema,
data,
errors,
valid,
isValid,
dataStoreId: id,
fieldProblems
});
}, [
schema,
data,
isValid,
commonT,
errors,
valid,
id,
fieldProblems
]);
const onInputDescription = (e) => {
const { value } = e.currentTarget;
handleChangeFor("descriptionUndefinedBeneficiary")(value);
};
const changeRoles = (roles) => {
handleChangeFor("role")(roles);
if (roles.includes("undefinedBeneficiary")) handleChangeFor("entityType")(void 0);
else handleChangeFor("descriptionUndefinedBeneficiary")(void 0);
};
const changeSettlorExemptionReasons = (exemptionReasons) => {
if (exemptionReasons.includes("noneOfTheAbove")) {
handleChangeFor("settlorExemptionReason")(data.settlorExemptionReason?.includes("noneOfTheAbove") ? exemptionReasons.filter((reason) => reason !== "noneOfTheAbove") : ["noneOfTheAbove"]);
return;
}
handleChangeFor("settlorExemptionReason")(exemptionReasons);
};
const nameProps = getFieldProps(props, nameFields);
const onEntityTypeChange = (value) => {
if (isOrganizationSettlorWithExemptionEnabled && value === LegalEntityTypes.ORGANIZATION && data.role?.length === 1 && data.role[0] === "settlor") changeSettlorExemptionReasons(["professionalServiceProvider"]);
handleChangeFor("entityType")(value);
};
return /* @__PURE__ */ jsxs("form", {
className: "adyen-kyc-trust__role-and-entity-type adyen-kyc-u-width-full",
children: [
/* @__PURE__ */ jsx(Header, { title: commonT(($) => $["roleAndEntityType"]) }),
/* @__PURE__ */ jsx(ErrorPanel, {
verificationErrors: formVerificationErrors,
validationErrors: fieldValidationErrors,
formUtils,
id: "ariaErrorField"
}),
/* @__PURE__ */ jsx(Field, {
el: "fieldset",
name: "role",
label: formUtils.getLabel("role", "selectTheApplicableRoles"),
errorMessage: formUtils.getErrorMessage("role", errors, fieldProblems),
isValid: valid.role,
disabled: availableRoles.length === 0,
showErrorIconBottom: true,
children: (childProps) => /* @__PURE__ */ jsx(MultiSelectList, {
...childProps,
options: Object.values(TrustMemberTypes),
selected: data.role ?? [],
onSelect: changeRoles,
mapToSelectItem: (role) => ({
...makeSelectItemForRole(role, commonT),
disabled: !availableRoles.includes(role)
})
})
}),
schema?.includes("entityType") && /* @__PURE__ */ jsx(Field, {
el: "fieldset",
name: "entityType",
errorMessage: formUtils.getErrorMessage("entityType", errors, fieldProblems),
label: formUtils.getLabel("entityType", "whatTypeOfYourMembersEntity"),
classNameModifiers: ["entityType"],
disabled: Boolean(existingTrustMember),
children: (childProps) => /* @__PURE__ */ jsx(TileGroup, {
...childProps,
name: "entityType",
tiles: trustMemberLegalEntityTypes.map((option) => ({
value: option,
label: trustT(($) => $[leTypeCardDetails[option].name]),
subTitle: trustT(($) => $[leTypeCardDetails[option].description])
})),
selected: data.entityType ?? "",
onChange: (value) => onEntityTypeChange(value),
isHorizontal: true,
"aria-required": true,
"aria-invalid": !valid.entityType
})
}),
schema?.includes("descriptionUndefinedBeneficiary") && /* @__PURE__ */ jsx(Field, {
name: "descriptionUndefinedBeneficiary",
label: formUtils.getLabel("description"),
isValid: valid.descriptionUndefinedBeneficiary,
errorMessage: formUtils.getErrorMessage("descriptionUndefinedBeneficiary", errors, fieldProblems),
children: (childProps) => /* @__PURE__ */ jsx(TextArea, {
...childProps,
name: "descriptionUndefinedBeneficiary",
value: data.descriptionUndefinedBeneficiary,
maxLength: CHARACTERS_LIMIT,
onInput: onInputDescription,
helper: trustT(($) => $["describeWhoIsABeneficiaryInYourTrust"]),
"aria-required": true,
"aria-invalid": !valid.descriptionUndefinedBeneficiary
})
}),
schema?.includes("settlorExemptionReason") && !isOrganizationAndSettlor(data) && /* @__PURE__ */ jsx(Field, {
el: "fieldset",
name: "settlorExemptionReason",
label: formUtils.getLabel("settlorExemptionReason", "whichOfTheseApplyToTheSettlor"),
isValid: valid.settlorExemptionReason,
errorMessage: formUtils.getErrorMessage("settlorExemptionReason", errors, fieldProblems),
showErrorIconBottom: true,
children: (childProps) => /* @__PURE__ */ jsx(MultiSelectList, {
...childProps,
options: settlorExemptionReasonWithNoneOfTheAbove,
selected: data.settlorExemptionReason ?? [],
onSelect: changeSettlorExemptionReasons,
mapToSelectItem: (reason) => ({
id: reason,
name: trustT(($) => $[reason])
})
})
}),
data.trustMemberType !== "rootTrustee" && (schema.includes("firstName") || schema.includes("lastName")) ? /* @__PURE__ */ jsx(Name, {
...nameProps,
data: {
firstName: defaultData.firstName,
lastName: defaultData.lastName
},
requiredFields: schema.filter((field) => nameFields.includes(field)),
labels: {
firstName: "firstNameOfSettlor",
lastName: "lastNameOfSettlor",
enterNameExactlyAsAppearInID: "enterSettlorsFirstNameExactlyAsItAppearsInID",
enterLastNameExactlyAsAppearInID: "enterSettlorsLastNameExactlyAsItAppearsInID"
},
errors,
fieldValidationErrors: fieldProblems,
handleFieldChange: handleChangeFor,
valid,
dataStoreId: id
}) : void 0,
isOrganizationSettlorWithExemptionEnabled && schema?.includes("country") && schema?.includes("legalCompanyName") ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(CountryField, {
data: formUtils.getFieldData(data, COUNTRY_FIELD),
valid: formUtils.getFieldValid(valid, COUNTRY_FIELD),
errors: formUtils.getFieldErrors(errors, fieldProblems, COUNTRY_FIELD),
labels: formUtils.getFieldLabels(COUNTRY_FIELD),
readonly: false,
allowedCountries: void 0,
handleChangeFor
}), /* @__PURE__ */ jsx(LegalCompanyNameField, {
data: formUtils.getFieldData(data, LEGAL_COMPANY_NAME_FIELD),
valid: formUtils.getFieldValid(valid, LEGAL_COMPANY_NAME_FIELD),
errors: formUtils.getFieldErrors(errors, fieldProblems, LEGAL_COMPANY_NAME_FIELD),
labels: formUtils.getFieldLabels(LEGAL_COMPANY_NAME_FIELD),
guidance: getLegalCompanyNameGuidanceText(trustT, { country: trustRoleAndEntityTypeCountry }),
readonly: false,
handleChangeFor
})] }) : void 0
]
});
};
//#endregion
//#region src/components/Trust/utils/addOrUpdateAssociatedTrustMember.ts
var mapTrustMemberToEntityAssociations = (trustMember) => {
if (trustMember.legalEntityId === isNewEntity) throw Error("Cannot map a new trust member, you must create it first");
if (trustMember.trustMemberType === "exemptSettlor") return [{
legalEntityId: trustMember.legalEntityId,
entityType: trustMember.legalEntityType,
type: TrustMemberTypes.SETTLOR,
settlorExemptionReason: trustMember.settlorExemptionReason,
name: trustMember.legalEntityType === LegalEntityTypes.INDIVIDUAL ? `${trustMember.exemptSettlorName?.firstName} ${trustMember.exemptSettlorName?.lastName}` : trustMember.name ?? ""
}];
return trustMember.roles.map((role) => ({
legalEntityId: trustMember.legalEntityId,
type: role
}));
};
var addOrUpdateAssociatedTrustMember = async ({ newOrUpdated, trust, updateLegalEntity }) => {
const otherAssociations = getOwnEntityAssociations(trust).filter((existingAssociation) => existingAssociation.legalEntityId !== newOrUpdated.legalEntityId);
const updatedAssociations = mapTrustMemberToEntityAssociations(newOrUpdated);
await updateLegalEntity({
id: trust.id,
entityAssociations: [...otherAssociations, ...updatedAssociations]
});
};
var updateRootTrusteeTrustMember = async ({ trustMember, trust, updateLegalEntity }) => {
const otherAssociations = getOwnEntityAssociations(trust).filter((existingAssociation) => existingAssociation.legalEntityId !== trustMember.legalEntityId);
const updatedAssociations = mapRootTrustMemberToEntityAssociations(trustMember);
await updateLegalEntity({
id: trust.id,
entityAssociations: [...otherAssociations, ...updatedAssociations]
});
};
var mapRootTrustMemberToEntityAssociations = (trustMember) => trustMember.roles.filter((r) => r !== "secondaryTrustee").map((role) => ({
legalEntityId: trustMember.legalEntityId,
type: role
}));
//#endregion
//#region src/components/Trust/utils/addOrUpdateUndefinedBeneficiary.ts
var addOrUpdateUndefinedBeneficiary = async ({ newOrUpdated, trust, updateLegalEntity }) => {
const otherUndefinedBeneficiaries = trust.trust?.undefinedBeneficiaryInfo?.filter((ub) => ub.reference !== newOrUpdated.reference) ?? [];
await updateLegalEntity({
id: trust.id,
trust: { undefinedBeneficiaryInfo: [...otherUndefinedBeneficiaries, newOrUpdated.reference === isNewEntity ? { description: newOrUpdated.description } : {
reference: newOrUpdated.reference,
description: newOrUpdated.description
}] }
});
};
//#endregion
//#region src/components/Trust/utils/createExemptSettlor.ts
var createExemptSettlor = async ({ exemptSettlor, trust, handleCreateLegalEntity }) => {
return handleCreateLegalEntity({
type: LegalEntityTypes.INDIVIDUAL,
individual: {
name: {
firstName: exemptSettlor.exemptSettlorName?.firstName ?? "",
lastName: exemptSettlor.exemptSettlorName?.lastName ?? ""
},
residentialAddress: { country: trust.trust.registeredAddress.country }
}
});
};
var createOrganizationExemptSettlor = async ({ exemptSettlor, handleCreateLegalEntity }) => {
return handleCreateLegalEntity({
type: LegalEntityTypes.ORGANIZATION,
organization: {
legalName: exemptSettlor.name ?? "",
registeredAddress: { country: exemptSettlor.country ?? "NL" }
}
});
};
//#endregion
//#region src/components/Trust/utils/updateExemptSettlorName.ts
var exemptSettlorNamesTheSame = (existingSettlor, newSettlor) => JSON.stringify(existingSettlor.exemptSettlorName) === JSON.stringify(newSettlor.exemptSettlorName);
var updateExemptSettlorName = async ({ exemptSettlor, updateLegalEntity }) => {
return updateLegalEntity({
id: exemptSettlor.legalEntityId,
individual: { name: {
firstName: exemptSettlor.exemptSettlorName?.firstName,
lastName: exemptSettlor.exemptSettlorName?.lastName
} }
});
};
var updateOrganizationExemptSettlorName = async ({ exemptSettlor, updateLegalEntity }) => {
return updateLegalEntity({
id: exemptSettlor.legalEntityId,
organization: {
legalName: exemptSettlor.name,
registeredAddress: { country: exemptSettlor.country }
}
});
};
var RoleAndTypeDropin_module_default = {
"settlor-exemption-reasons-list": "adyen-kyc-settlor-exemption-reasons-list",
settlorExemptionReasonsList: "adyen-kyc-settlor-exemption-reasons-list"
};
//#endregion
//#region src/components/Trust/tasks/RoleAndTypeDropin/formatRoleAndEntityTypeSummary.tsx
var formatRolesForSummary = (roles, commonT) => roles.map((role) => commonT(($) => $[getRoleName(role)])).join(", ");
var formatSettlorExemptionReasonsForSummary = (reasons, trustT) => /* @__PURE__ */ jsx("ul", {
className: RoleAndTypeDropin_module_default.settlorExemptionReasonsList,
children: reasons.map((reason) => /* @__PURE__ */ jsx("li", { children: trustT(($) => $[reason]) }, reason))
});
var formatRoleAndEntityTypeSummary = (data, commonT, trustT, isOrganizationSettlorWithExemptionEnabled) => {
const { trustMemberType, roles } = data;
const role = formatRolesForSummary(roles, commonT);
switch (trustMemberType) {
case "undefinedBeneficiary": return {
role,
descriptionUndefinedBeneficiary: data.description
};
case "exemptSettlor": return {
role,
entityType: trustT(($) => $[data.legalEntityType]),
firstName: data.exemptSettlorName?.firstName,
lastName: data.exemptSettlorName?.lastName,
country: isOrganizationSettlorWithExemptionEnabled ? data.country : void 0,
legalCompanyName: isOrganizationSettlorWithExemptionEnabled ? data.name : void 0,
settlorExemptionReason: summaryItem("otherInformation", formatSettlorExemptionReasonsForSummary(data.settlorExemptionReason ?? [], trustT))
};
case "company":
case "rootTrustee":
case "regular": return {};
}
};
//#endregion
//#region src/components/Trust/tasks/RoleAndTypeDropin/RoleAndTypeDropin.tsx
var summary = {
formId: "summary",
formName: "summary"
};
var regularForms = {
roleAndEntityType: {
formId: "roleAndEntityType",
formName: "roleAndEntityType",
fields: ["role", "entityType"]
},
memberDetails: {
formId: "memberDetails",
formName: "memberDetails"
},
summary
};
var undefinedBeneficiaryForms = {
roleAndEntityType: {
formId: "roleAndEntityType",
formName: "roleAndEntityType",
fields: [
"role",
"entityType",
"descriptionUndefinedBeneficiary"
]
},
summary
};
var exemptSettlorForms = {
roleAndEntityType: {
formId: "roleAndEntityType",
formName: "roleAndEntityType",
fields: [
"role",
"entityType",
"settlorExemptionReason"
]
},
summary
};
var decideForms = (trustMember) => {
if (trustMember === "incomplete") return regularForms;
switch (trustMember.trustMemberType) {
case "undefinedBeneficiary": return undefinedBeneficiaryForms;
case "exemptSettlor": return exemptSettlorForms;
case "rootTrustee": return exemptSettlorForms;
case "regular":
case "company": return regularForms;
}
};
var convertDataToTrustMember = (data, existingTrustMember, isOrganizationSettlorWithExemptionReasonEnabled = false) => {
const existingId = existingTrustMember ? existingTrustMember.trustMemberType === "undefinedBeneficiary" ? existingTrustMember.reference : existingTrustMember.legalEntityId : void 0;
if (data.trustMemberType === "rootTrustee") return {
trustMemberType: "rootTrustee",
roles: data.role ?? [],
legalEntityType: data.entityType ?? LegalEntityTypes.ORGANIZATION,
legalEntityId: "",
name: data.firstName ?? ""
};
if (data.role?.length) {
if (isExemptSettlor(data)) {
if (isOrganizationSettlorWithExemptionReasonEnabled && data.entityType === LegalEntityTypes.ORGANIZATION) return {
trustMemberType: "exemptSettlor",
roles: [TrustMemberTypes.SETTLOR],
legalEntityType: LegalEntityTypes.ORGANIZATION,
legalEntityId: existingId ?? isNewEntity,
name: data.legalCompanyName ?? "",
settlorExemptionReason: ["professionalServiceProvider"],
country: data.country
};
return {
trustMemberType: "exemptSettlor",
roles: [TrustMemberTypes.SETTLOR],
legalEntityType: LegalEntityTypes.INDIVIDUAL,
settlorExemptionReason: data.settlorExemptionReason.filter((reason) => reason !== "noneOfTheAbove"),
exemptSettlorName: {
firstName: data.firstName ?? "",
lastName: data.lastName ?? ""
},
legalEntityId: existingId ?? isNewEntity
};
}
if (data.role.includes("undefinedBeneficiary")) return {
trustMemberType: "undefinedBeneficiary",
roles: [TrustMemberTypes.UNDEFINED_BENEFICIARY],
description: data.descriptionUndefinedBeneficiary ?? "",
reference: existingId ?? isNewEntity
};
if (data.entityType === LegalEntityTypes.ORGANIZATION) return {
trustMemberType: "company",
roles: data.role,
legalEntityType: LegalEntityTypes.ORGANIZATION,
legalEntityId: existingId ?? isNewEntity,
name: data.legalCompanyName ?? "",
country: data.country
};
if (data.entityType === LegalEntityTypes.INDIVIDUAL) return {
trustMemberType: "regular",
roles: data.role,
legalEntityType: LegalEntityTypes.INDIVIDUAL,
legalEntityId: existingId ?? isNewEntity,
name: ""
};
}
return "incomplete";
};
var logger = createLogger();
function RoleAndTypeDropin({ trust, trustMemberLe, existingTrustMember, navigateToFullDropinFor, navigateBack, country }) {
const { t: commonT } = useTranslation("common");
const { t: trustT } = useTranslation("trust");
const { isFeatureEnabled } = useToggleContext();
const allowMoreRolesForMainRootTrustee = isFeatureEnabled("AllowMoreRolesForMainRootTrustee");
const [trustMember, setTrustMember] = useState(existingTrustMember ?? "incomplete");
const [shouldValidate, setShouldValidate] = useState(false);
const { showToast } = useToastContext();
const isOrganizationSettlorWithExemptionReasonEnabled = (country) => country === CountryCodes.Australia;
const isOrganizationSettlorWithExemptionEnabled = isOrganizationSettlorWithExemptionReasonEnabled(trust?.trust?.countryOfGoverningLaw);
const formList = decideForms(trustMember);
const forms = Object.values(formList);
const [formValidity, setFormValidity] = useState({ roleAndEntityType: false });
const [activeForm, setActiveForm] = useState(regularForms.roleAndEntityType);
const isSummaryStep = activeForm.formId === summaryStep.formId;
const { mutateAsync: createLegalEntity } = useCreateLegalEntity();
const { mutateAsync: updateLegalEntity } = useUpdateLegalEntity();
const addOrUpdateTrustMember = async (updated, existing) => {
if (existing?.trustMemberType === "undefinedBeneficiary" && updated.trustMemberType === "undefinedBeneficiary" && existing.description === updated.description) {
await updateLegalEntity(trustMemberLe);
navigateBack();
return;
}
if (trust === void 0) throw new Error("No associated trust");
try {
switch (updated.trustMemberType) {
case "undefinedBeneficiary":
await addOrUpdateUndefinedBeneficiary({
newOrUpdated: updated,
trust,
updateLegalEntity
});
break;
case "exemptSettlor":
if (!existing) updated.legalEntityId = (isOrganizationSettlorWithExemptionEnabled && updated.legalEntityType === "organization" ? await createOrganizationExemptSettlor({
exemptSettlor: updated,
handleCreateLegalEntity: createLegalEntity
}) : await createExemptSettlor({
exemptSettlor: updated,
trust,
handleCreateLegalEntity: createLegalEntity
})).id;
if (existing && !exemptSettlorNamesTheSame(existing, updated)) await updateExemptSettlorName({
exemptSettlor: updated,
updateLegalEntity
});
if (existing && isOrganizationSettlorWithExemptionEnabled && updated.legalEntityType === "organization") await updateOrganizationExemptSettlorName({
exemptSettlor: updated,
updateLegalEntity
});
await addOrUpdateAssociatedTrustMember({
newOrUpdated: updated,
trust,
updateLegalEntity
});
break;
case "regular":
case "company":
await addOrUpdateAssociatedTrustMember({
newOrUpdated: updated,
trust,
updateLegalEntity
});
break;
case "rootTrustee":
if (allowMoreRolesForMainRootTrustee && existing) {
existing.roles = updated.roles;
await updateRootTrusteeTrustMember({
trustMember: existing,
trust,
updateLegalEntity
});
}
break;
default: logger.warn(`Updating trust member type "${updated.trustMemberType}" is not implemented.`);
}
showToast({
label: commonT(($) => $["successfullyUpdatedDetails"]),
variant: "success"
});
navigateBack();
} catch (err) {
logger.error(err);
showToast({
label: commonT(($) => $["failedToUpdateDetails"]),
variant: "error"
});
}
};
const summaryData = trustMember === "incomplete" ? {} : { roleAndEntityType: formatRoleAndEntityTypeSummary(trustMember, commonT, trustT, isOrganizationSettlorWithExemptionEnabled) };
const onNavigateToNextStep = () => {
if (isSummaryStep && trustMember !== "incomplete") {
addOrUpdateTrustMember(trustMember, existingTrustMember);
return;
}
gotoFormByFormIndex(forms.findIndex((form) => form.formId === activeForm.formId) + 1);
};
const onTrustMemberChange = ({ data, isValid = false, dataStoreId = void 0 }) => {
if (dataStoreId) setFormValidity({
...formValidity,
[dataStoreId]: isValid
});
setTrustMember(convertDataToTrustMember(data, existingTrustMember, isOrganizationSettlorWithExemptionEnabled));
};
const saveRolesAndNavigate = async () => {
if (trustMember === "incomplete") return;
if (hasRolesChanged(trustMember.roles, existingTrustMember?.roles)) addOrUpdateTrustMember(trustMember, existingTrustMember);
navigateBack();
};
const hasRolesChanged = (newRoles = [], existingRoles = []) => newRoles.length !== existingRoles.length || !newRoles.every((newRole) => existingRoles.includes(newRole));
const formsWithValidity = forms.map((form) => ({
formId: form.formId,
formName: form.formName,
isValid: formValidity[form.formId]
}));
const gotoFormByFormIndex = (formIndex) => {
const targetForm = forms[formIndex];
if (!formValidity.roleAndEntityType || trustMember === "incomplete") {
setShouldValidate(true);
return;
}
if (trustMember.trustMemberType === "regular" || trustMember.trustMemberType === "company") {
if (targetForm.formId === regularForms.memberDetails.formId) {
navigateToFullDropinFor(trustMember);
return;
}
if (targetForm.formId === summaryStep.formId) return;
}
setActiveForm(targetForm);
};
return /* @__PURE__ */ jsx(DropinLayout, { content: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
className: "adyen-kyc-dropin__sidebar-wrapper",
children: /* @__PURE__ */ jsx(FormNavigation, {
forms: formsWithValidity,
activeForm: formsWithValidity.find((form) => form.formId === activeForm.formId),
taskName: "trustMembers",
gotoForm: gotoFormByFormIndex
})
}), /* @__PURE__ */ jsxs("div", {
className: "adyen-kyc-form-container",
children: [
/* @__PURE__ */ jsx("div", {
className: activeForm.formId !== "roleAndEntityType" ? "adyen-kyc-form-wrapper adyen-kyc-form-wrapper--hidden" : "adyen-kyc-form-wrapper",
children: /* @__PURE__ */ jsx(TrustRoleAndEntityType, {
id: "roleAndEntityType",
existingTrustMember,
onChange: onTrustMemberChange,
shouldValidate,
isOrganizationSettlorWithExemptionEnabled,
country
})
}),
isSummaryStep && /* @__PURE__ */ jsx("div", {
className: "adyen-kyc-form-wrapper",
children: /* @__PURE__ */ jsx(Summary, {
data: summaryData,
forms: [undefinedBeneficiaryForms.roleAndEntityType],
gotoForm: gotoFormByFormIndex
})
}),
/* @__PURE__ */ jsx(ActionBar, {
onNext: onNavigateToNextStep,
onHome: saveRolesAndNavigate,
nextButtonLabel: isSummaryStep ? commonT(($) => $["submit"]) : commonT(($) => $["continue"]),
homeButtonLabel: commonT(($) => $["saveAndGoToOverview"])
})
]
})] }) });
}
//#endregion
//#region src/components/Trust/pages/TrustMemberRoleAndTypePage.tsx
function TrustMemberRoleAndTypePage({ trustId, memberId: memberIdProp, navigateToFullDropinFor, navigateBack }) {
const routeParams = useParams();
const memberId = memberIdProp ?? routeParams.memberId;
const { i18n } = useTranslation();
const { data: memberLe } = useLegalEntity(memberId ?? skipToken);
const { data: trustLe } = useLegalEntity(trustId ?? skipToken);
const trustMembers = useTrustMembers();
addResourceBundles(i18n, [{
ns: "trust",
importFn: (lang) => _rolldown_dynamic_import_helper_default(/* @__PURE__ */ Object.assign({
"../language/bg-BG.json": () => import("./bg-BG-Doq5SqNZ.js"),
"../language/cs-CZ.json": () => import("./cs-CZ-CNCOzk0z.js"),
"../language/da-DK.json": () => import("./da-DK-Dq9DBbxy.js"),
"../language/de-DE.json": () => import("./de-DE-BnAkTJpS.js"),
"../language/el-GR.json": () => import("./el-GR-WE5RvoaZ.js"),
"../language/en-US.json": () => import("./en-US-Y8C6Dmuq.js"),
"../language/es-ES.json": () => import("./es-ES-DyrLbt2G.js"),
"../language/et-EE.json": () => import("./et-EE-CjKIw3AU.js"),
"../language/fi-FI.json": () => import("./fi-FI-YpLcMuZy.js"),
"../language/fr-FR.json": () => import("./fr-FR-CWBeJe7e.js"),
"../language/hr-HR.json": () => import("./hr-HR-B0eeXkQr.js"),
"../language/hu-HU.json": () => import("./hu-HU-DmlhDBmZ.js"),
"../language/it-IT.json": () => import("./it-IT-C3AVk1uR.js"),
"../language/ja-JP.json": () => import("./ja-JP-ogtt9tGy.js"),
"../language/lt-LT.json": () => import("./lt-LT-948HQZhZ.js"),
"../language/lv-LV.json": () => import("./lv-LV-CrfpEaoB.js"),
"../language/nl-NL.json": () => import("./nl-NL-CQYif340.js"),
"../language/no-NO.json": () => import("./no-NO-DKzoUIzk.js"),
"../language/pl-PL.json": () => import("./pl-PL-CWLfHfaM.js"),
"../language/pt-BR.json": () => import("./pt-BR-BWN_WzRl.js"),
"../language/pt-PT.json": () => import("./pt-PT-wBADnHVq.js"),
"../language/ro-RO.json": () => import("./ro-RO-C2tZmDar.js"),
"../language/sk-SK.json": () => import("./sk-SK-BsanrSCF.js"),
"../language/sl-SI.json": () => import("./sl-SI-BsiDU3hz.js"),
"../language/sv-SE.json": () => import("./sv-SE-DDCAUQsX.js")
}), `../language/${lang}.json`, 3)
}]);
if (!trustLe || memberId && !memberLe) return /* @__PURE__ */ jsx(Loader, {});
const country = getLegalEntityCountry(memberLe ?? trustLe);
return /* @__PURE__ */ jsx(RoleAndTypeDropin, {
trust: trustLe,
trustMemberLe: memberLe,
existingTrustMember: memberId ? trustMembers.find((tm) => tm.trustMemberType !== "undefinedBeneficiary" && tm.legalEntityId === memberId) : void 0,
country,
navigateToFullDropinFor,
navigateBack
});
}
//#endregion
export { TrustMemberRoleAndTypePage };