diff --git a/packages/mint-components/package.json b/packages/mint-components/package.json
index 4bdfc1be8..be9298585 100644
--- a/packages/mint-components/package.json
+++ b/packages/mint-components/package.json
@@ -1,7 +1,7 @@
{
"name": "@saasquatch/mint-components",
"title": "Mint Components",
- "version": "2.1.7",
+ "version": "2.1.8-1",
"description": "A minimal design library with components for referral and loyalty experiences. Built with Shoelace components by Saasquatch.",
"icon": "https://res.cloudinary.com/saasquatch/image/upload/v1652219900/squatch-assets/For_Mint.svg",
"raisins": "docs/raisins.json",
diff --git a/packages/mint-components/src/components.d.ts b/packages/mint-components/src/components.d.ts
index 0916004dd..b90fef99c 100644
--- a/packages/mint-components/src/components.d.ts
+++ b/packages/mint-components/src/components.d.ts
@@ -34,6 +34,7 @@ import { NavigationMenuViewProps } from "./components/sqm-navigation-menu/sqm-na
import { NavigationSidebarViewProps } from "./components/sqm-navigation-sidebar/sqm-navigation-sidebar-view";
import { NavigationSidebarItemViewProps } from "./components/sqm-navigation-sidebar-item/sqm-navigation-sidebar-item-view";
import { UsePagination } from "./components/sqm-pagination/usePagination";
+import { PartnerInfoModalViewProps } from "./components/sqm-partner-info-modal/sqm-partner-info-modal-view";
import { PasswordFieldViewDemoProps } from "./components/sqm-password-field/usePasswordField";
import { PayoutButtonScrollViewProps } from "./components/sqm-payout-button-scroll/sqm-payout-button-scroll-view";
import { PayoutStatusAlertViewProps } from "./components/tax-and-cash/sqm-payout-status-alert/sqm-payout-status-alert-view";
@@ -64,6 +65,12 @@ export namespace Components {
"renderLabel": (idx: any) => Promise;
}
interface SqmBankingInfoForm {
+ /**
+ * Error messages for the agency code field. Supports error codes: empty, alphanumeric, tooShort
+ * @uiName Agency code error
+ * @uiWidget textArea
+ */
+ "agencyCodeError": string;
/**
* @uiName Agency code field label
*/
@@ -73,18 +80,42 @@ export namespace Components {
* @uiName Back button label
*/
"backButton": string;
+ /**
+ * Error messages for the bank account number / IBAN field. Supports error codes: empty, invalidUk, invalid, ibanEmpty, ibanAlphanumeric, ibanInvalid, ibanCountryMismatch
+ * @uiName Bank account number / IBAN error
+ * @uiWidget textArea
+ */
+ "bankAccountNumberError": string;
/**
* @uiName Bank account number field label
*/
"bankAccountNumberLabel": string;
+ /**
+ * Error messages for the bank account type field. Supports error codes: empty
+ * @uiName Bank account type error
+ * @uiWidget textArea
+ */
+ "bankAccountTypeError": string;
/**
* @uiName Bank account type field label
*/
"bankAccountTypeLabel": string;
+ /**
+ * Error messages for the bank address field. Supports error codes: empty
+ * @uiName Bank address error
+ * @uiWidget textArea
+ */
+ "bankAddressError": string;
/**
* @uiName Bank address field label
*/
"bankAddressLabel": string;
+ /**
+ * Error messages for the bank city field. Supports error codes: empty
+ * @uiName Bank city error
+ * @uiWidget textArea
+ */
+ "bankCityError": string;
/**
* @uiName Bank city field label
*/
@@ -93,14 +124,32 @@ export namespace Components {
* @uiName Bank country field label
*/
"bankLocationLabel": string;
+ /**
+ * Error messages for the bank name field. Supports error codes: empty
+ * @uiName Bank name error
+ * @uiWidget textArea
+ */
+ "bankNameError": string;
/**
* @uiName Bank name field label
*/
"bankNameLabel": string;
+ /**
+ * Error messages for the bank postal code field. Supports error codes: empty
+ * @uiName Bank postal code error
+ * @uiWidget textArea
+ */
+ "bankPostalCodeError": string;
/**
* @uiName Bank postal code field label
*/
"bankPostalCodeLabel": string;
+ /**
+ * Error messages for the bank province/state field. Supports error codes: empty
+ * @uiName Bank province/state error
+ * @uiWidget textArea
+ */
+ "bankStateError": string;
/**
* @uiName Bank province/state field label
*/
@@ -109,14 +158,32 @@ export namespace Components {
* @uiName Beneficiary account field description
*/
"beneficiaryAccountNameDescription": string;
+ /**
+ * Error messages for the beneficiary / account holder name field. Supports error codes: empty, invalidCharacters, numeric, tooLong, nonEnglish, businessNameMismatch, nameMismatch, businessPayeeMismatch, payeeMismatch
+ * @uiName Beneficiary account name error
+ * @uiWidget textArea
+ */
+ "beneficiaryAccountNameError": string;
/**
* @uiName Beneficiary account field label
*/
"beneficiaryAccountNameLabel": string;
+ /**
+ * Error messages for the branch code field. Supports error codes: invalid
+ * @uiName Branch code error
+ * @uiWidget textArea
+ */
+ "branchCodeError": string;
/**
* @uiName Branch code field label
*/
"branchCodeLabel": string;
+ /**
+ * Error messages for the branch name field. Supports error codes: empty
+ * @uiName Branch name error
+ * @uiWidget textArea
+ */
+ "branchNameError": string;
/**
* One of three options listed for the classification field
* @uiName Business classification option
@@ -130,6 +197,12 @@ export namespace Components {
* @uiName Classification CPF field label
*/
"classificationCPFLabel": string;
+ /**
+ * Error messages for the classification code field. Supports error codes: empty, invalidKzt
+ * @uiName Classification code error
+ * @uiWidget textArea
+ */
+ "classificationCodeError": string;
/**
* @uiName Classification entity field label
*/
@@ -237,6 +310,12 @@ export namespace Components {
* @uiName Information modal title
*/
"modalTitle": string;
+ /**
+ * Error messages for the patronymic name field. Supports error codes: empty, alphanumeric
+ * @uiName Patronymic name error
+ * @uiWidget textArea
+ */
+ "patronymicNameError": string;
/**
* @uiName Patronymic name field label
*/
@@ -246,6 +325,12 @@ export namespace Components {
* @uiName PayPal email field label
*/
"payPalInputLabel": string;
+ /**
+ * Error messages for the payment day field. Supports error codes: empty, invalid
+ * @uiName Payment day error
+ * @uiWidget textArea
+ */
+ "paymentDayError": string;
/**
* Label text for the payment day select option for the fifteenth of the month
* @uiName Fifteenth of month payday option
@@ -281,11 +366,29 @@ export namespace Components {
* @uiName Fixed day payment schedule option
*/
"paymentScheduleFixedDay": string;
+ /**
+ * Error messages for the payment threshold field. Supports error codes: empty, invalid
+ * @uiName Payment threshold error
+ * @uiWidget textArea
+ */
+ "paymentThresholdError": string;
/**
* Participant use this field to select the balance at which they want to be paid
* @uiName Payment threshold field label
*/
"paymentThresholdSelectLabel": string;
+ /**
+ * Error messages for the PayPal email field. Supports error codes: empty, unsupportedCurrency, invalidEmail, verificationIncomplete
+ * @uiName PayPal email error
+ * @uiWidget textArea
+ */
+ "paypalEmailError": string;
+ /**
+ * Error messages for the routing code / sort code / BSB field. Supports error codes: invalidBsb, invalidSortCode, empty, invalid
+ * @uiName Routing code error
+ * @uiWidget textArea
+ */
+ "routingCodeError": string;
/**
* @uiName Routing code field label
*/
@@ -303,6 +406,12 @@ export namespace Components {
* @uiName Support link text
*/
"supportLink": string;
+ /**
+ * Error messages for the SWIFT / BIC code field. Supports error codes: empty, alphanumeric, invalid
+ * @uiName SWIFT code error
+ * @uiWidget textArea
+ */
+ "swiftCodeError": string;
/**
* @uiName SWIFT code field label
*/
@@ -316,6 +425,12 @@ export namespace Components {
* @uiName Page description
*/
"taxAndPayoutsDescription": string;
+ /**
+ * Error messages for the tax payer ID / classification entity field. Supports error codes: empty, emptyAr, emptyKr, alphanumeric, alphanumericAr, alphanumericKr, invalid, invalidAr, invalidKr, invalidKzt, cnpjTooShort, cpfTooShort
+ * @uiName Tax payer ID error
+ * @uiWidget textArea
+ */
+ "taxPayerIdError": string;
/**
* @uiName Taxpayer ID field label
*/
@@ -333,6 +448,12 @@ export namespace Components {
* @uiName Verify email header
*/
"verifyEmailHeaderText": string;
+ /**
+ * Error messages for the VO code field. Supports error codes: empty, alphanumeric
+ * @uiName VO code error
+ * @uiWidget textArea
+ */
+ "voCodeError": string;
/**
* @uiName VO code field label
*/
@@ -2190,6 +2311,82 @@ export namespace Components {
*/
"paginationText": string;
}
+ interface SqmPartnerInfoModal {
+ /**
+ * Brand name shown in the modal header
+ * @uiName Brand name
+ */
+ "brandName": string;
+ /**
+ * @uiName Confirm button label
+ */
+ "confirmButtonLabel": string;
+ /**
+ * @uiName Country label
+ */
+ "countryLabel": string;
+ /**
+ * @uiName Currency label
+ */
+ "currencyLabel": string;
+ /**
+ * @undocumented
+ * @uiType object
+ */
+ "demoData"?: DemoData;
+ /**
+ * Description for existing partner confirmation
+ * @uiName Existing partner description
+ * @uiWidget textArea
+ */
+ "descriptionExistingPartner": string;
+ /**
+ * Description for new partner setup
+ * @uiName New partner description
+ * @uiWidget textArea
+ */
+ "descriptionNewPartner": string;
+ /**
+ * @uiName Missing fields error text
+ * @uiWidget textArea
+ */
+ "missingFieldsErrorText": string;
+ /**
+ * Header text when user has no existing partner
+ * @uiName New partner header
+ * @uiWidget textArea
+ */
+ "modalHeader": string;
+ /**
+ * Header text when user has an existing partner
+ * @uiName Existing partner header
+ * @uiWidget textArea
+ */
+ "modalHeaderExistingPartner": string;
+ /**
+ * @uiName Network error text
+ * @uiWidget textArea
+ */
+ "networkErrorText": string;
+ /**
+ * @uiName Search country placeholder
+ */
+ "searchCountryPlaceholder": string;
+ /**
+ * @uiName Search currency placeholder
+ */
+ "searchCurrencyPlaceholder": string;
+ /**
+ * @uiName Submit button label
+ */
+ "submitButtonLabel": string;
+ /**
+ * Support description for existing partner confirmation
+ * @uiName Existing partner support description
+ * @uiWidget textArea
+ */
+ "supportDescriptionExistingPartner": string;
+ }
interface SqmPasswordField {
/**
* @undocumented
@@ -7377,6 +7574,12 @@ declare global {
prototype: HTMLSqmPaginationElement;
new (): HTMLSqmPaginationElement;
};
+ interface HTMLSqmPartnerInfoModalElement extends Components.SqmPartnerInfoModal, HTMLStencilElement {
+ }
+ var HTMLSqmPartnerInfoModalElement: {
+ prototype: HTMLSqmPartnerInfoModalElement;
+ new (): HTMLSqmPartnerInfoModalElement;
+ };
interface HTMLSqmPasswordFieldElement extends Components.SqmPasswordField, HTMLStencilElement {
}
var HTMLSqmPasswordFieldElement: {
@@ -7901,6 +8104,7 @@ declare global {
"sqm-navigation-sidebar": HTMLSqmNavigationSidebarElement;
"sqm-navigation-sidebar-item": HTMLSqmNavigationSidebarItemElement;
"sqm-pagination": HTMLSqmPaginationElement;
+ "sqm-partner-info-modal": HTMLSqmPartnerInfoModalElement;
"sqm-password-field": HTMLSqmPasswordFieldElement;
"sqm-payout-button-scroll": HTMLSqmPayoutButtonScrollElement;
"sqm-payout-details-card": HTMLSqmPayoutDetailsCardElement;
@@ -7986,6 +8190,12 @@ declare namespace LocalJSX {
interface RaisinsPlopTarget {
}
interface SqmBankingInfoForm {
+ /**
+ * Error messages for the agency code field. Supports error codes: empty, alphanumeric, tooShort
+ * @uiName Agency code error
+ * @uiWidget textArea
+ */
+ "agencyCodeError"?: string;
/**
* @uiName Agency code field label
*/
@@ -7995,18 +8205,42 @@ declare namespace LocalJSX {
* @uiName Back button label
*/
"backButton"?: string;
+ /**
+ * Error messages for the bank account number / IBAN field. Supports error codes: empty, invalidUk, invalid, ibanEmpty, ibanAlphanumeric, ibanInvalid, ibanCountryMismatch
+ * @uiName Bank account number / IBAN error
+ * @uiWidget textArea
+ */
+ "bankAccountNumberError"?: string;
/**
* @uiName Bank account number field label
*/
"bankAccountNumberLabel"?: string;
+ /**
+ * Error messages for the bank account type field. Supports error codes: empty
+ * @uiName Bank account type error
+ * @uiWidget textArea
+ */
+ "bankAccountTypeError"?: string;
/**
* @uiName Bank account type field label
*/
"bankAccountTypeLabel"?: string;
+ /**
+ * Error messages for the bank address field. Supports error codes: empty
+ * @uiName Bank address error
+ * @uiWidget textArea
+ */
+ "bankAddressError"?: string;
/**
* @uiName Bank address field label
*/
"bankAddressLabel"?: string;
+ /**
+ * Error messages for the bank city field. Supports error codes: empty
+ * @uiName Bank city error
+ * @uiWidget textArea
+ */
+ "bankCityError"?: string;
/**
* @uiName Bank city field label
*/
@@ -8015,14 +8249,32 @@ declare namespace LocalJSX {
* @uiName Bank country field label
*/
"bankLocationLabel"?: string;
+ /**
+ * Error messages for the bank name field. Supports error codes: empty
+ * @uiName Bank name error
+ * @uiWidget textArea
+ */
+ "bankNameError"?: string;
/**
* @uiName Bank name field label
*/
"bankNameLabel"?: string;
+ /**
+ * Error messages for the bank postal code field. Supports error codes: empty
+ * @uiName Bank postal code error
+ * @uiWidget textArea
+ */
+ "bankPostalCodeError"?: string;
/**
* @uiName Bank postal code field label
*/
"bankPostalCodeLabel"?: string;
+ /**
+ * Error messages for the bank province/state field. Supports error codes: empty
+ * @uiName Bank province/state error
+ * @uiWidget textArea
+ */
+ "bankStateError"?: string;
/**
* @uiName Bank province/state field label
*/
@@ -8031,14 +8283,32 @@ declare namespace LocalJSX {
* @uiName Beneficiary account field description
*/
"beneficiaryAccountNameDescription"?: string;
+ /**
+ * Error messages for the beneficiary / account holder name field. Supports error codes: empty, invalidCharacters, numeric, tooLong, nonEnglish, businessNameMismatch, nameMismatch, businessPayeeMismatch, payeeMismatch
+ * @uiName Beneficiary account name error
+ * @uiWidget textArea
+ */
+ "beneficiaryAccountNameError"?: string;
/**
* @uiName Beneficiary account field label
*/
"beneficiaryAccountNameLabel"?: string;
+ /**
+ * Error messages for the branch code field. Supports error codes: invalid
+ * @uiName Branch code error
+ * @uiWidget textArea
+ */
+ "branchCodeError"?: string;
/**
* @uiName Branch code field label
*/
"branchCodeLabel"?: string;
+ /**
+ * Error messages for the branch name field. Supports error codes: empty
+ * @uiName Branch name error
+ * @uiWidget textArea
+ */
+ "branchNameError"?: string;
/**
* One of three options listed for the classification field
* @uiName Business classification option
@@ -8052,6 +8322,12 @@ declare namespace LocalJSX {
* @uiName Classification CPF field label
*/
"classificationCPFLabel"?: string;
+ /**
+ * Error messages for the classification code field. Supports error codes: empty, invalidKzt
+ * @uiName Classification code error
+ * @uiWidget textArea
+ */
+ "classificationCodeError"?: string;
/**
* @uiName Classification entity field label
*/
@@ -8159,6 +8435,12 @@ declare namespace LocalJSX {
* @uiName Information modal title
*/
"modalTitle"?: string;
+ /**
+ * Error messages for the patronymic name field. Supports error codes: empty, alphanumeric
+ * @uiName Patronymic name error
+ * @uiWidget textArea
+ */
+ "patronymicNameError"?: string;
/**
* @uiName Patronymic name field label
*/
@@ -8168,6 +8450,12 @@ declare namespace LocalJSX {
* @uiName PayPal email field label
*/
"payPalInputLabel"?: string;
+ /**
+ * Error messages for the payment day field. Supports error codes: empty, invalid
+ * @uiName Payment day error
+ * @uiWidget textArea
+ */
+ "paymentDayError"?: string;
/**
* Label text for the payment day select option for the fifteenth of the month
* @uiName Fifteenth of month payday option
@@ -8203,11 +8491,29 @@ declare namespace LocalJSX {
* @uiName Fixed day payment schedule option
*/
"paymentScheduleFixedDay"?: string;
+ /**
+ * Error messages for the payment threshold field. Supports error codes: empty, invalid
+ * @uiName Payment threshold error
+ * @uiWidget textArea
+ */
+ "paymentThresholdError"?: string;
/**
* Participant use this field to select the balance at which they want to be paid
* @uiName Payment threshold field label
*/
"paymentThresholdSelectLabel"?: string;
+ /**
+ * Error messages for the PayPal email field. Supports error codes: empty, unsupportedCurrency, invalidEmail, verificationIncomplete
+ * @uiName PayPal email error
+ * @uiWidget textArea
+ */
+ "paypalEmailError"?: string;
+ /**
+ * Error messages for the routing code / sort code / BSB field. Supports error codes: invalidBsb, invalidSortCode, empty, invalid
+ * @uiName Routing code error
+ * @uiWidget textArea
+ */
+ "routingCodeError"?: string;
/**
* @uiName Routing code field label
*/
@@ -8225,6 +8531,12 @@ declare namespace LocalJSX {
* @uiName Support link text
*/
"supportLink"?: string;
+ /**
+ * Error messages for the SWIFT / BIC code field. Supports error codes: empty, alphanumeric, invalid
+ * @uiName SWIFT code error
+ * @uiWidget textArea
+ */
+ "swiftCodeError"?: string;
/**
* @uiName SWIFT code field label
*/
@@ -8238,6 +8550,12 @@ declare namespace LocalJSX {
* @uiName Page description
*/
"taxAndPayoutsDescription"?: string;
+ /**
+ * Error messages for the tax payer ID / classification entity field. Supports error codes: empty, emptyAr, emptyKr, alphanumeric, alphanumericAr, alphanumericKr, invalid, invalidAr, invalidKr, invalidKzt, cnpjTooShort, cpfTooShort
+ * @uiName Tax payer ID error
+ * @uiWidget textArea
+ */
+ "taxPayerIdError"?: string;
/**
* @uiName Taxpayer ID field label
*/
@@ -8255,6 +8573,12 @@ declare namespace LocalJSX {
* @uiName Verify email header
*/
"verifyEmailHeaderText"?: string;
+ /**
+ * Error messages for the VO code field. Supports error codes: empty, alphanumeric
+ * @uiName VO code error
+ * @uiWidget textArea
+ */
+ "voCodeError"?: string;
/**
* @uiName VO code field label
*/
@@ -10107,6 +10431,82 @@ declare namespace LocalJSX {
*/
"paginationText"?: string;
}
+ interface SqmPartnerInfoModal {
+ /**
+ * Brand name shown in the modal header
+ * @uiName Brand name
+ */
+ "brandName"?: string;
+ /**
+ * @uiName Confirm button label
+ */
+ "confirmButtonLabel"?: string;
+ /**
+ * @uiName Country label
+ */
+ "countryLabel"?: string;
+ /**
+ * @uiName Currency label
+ */
+ "currencyLabel"?: string;
+ /**
+ * @undocumented
+ * @uiType object
+ */
+ "demoData"?: DemoData;
+ /**
+ * Description for existing partner confirmation
+ * @uiName Existing partner description
+ * @uiWidget textArea
+ */
+ "descriptionExistingPartner"?: string;
+ /**
+ * Description for new partner setup
+ * @uiName New partner description
+ * @uiWidget textArea
+ */
+ "descriptionNewPartner"?: string;
+ /**
+ * @uiName Missing fields error text
+ * @uiWidget textArea
+ */
+ "missingFieldsErrorText"?: string;
+ /**
+ * Header text when user has no existing partner
+ * @uiName New partner header
+ * @uiWidget textArea
+ */
+ "modalHeader"?: string;
+ /**
+ * Header text when user has an existing partner
+ * @uiName Existing partner header
+ * @uiWidget textArea
+ */
+ "modalHeaderExistingPartner"?: string;
+ /**
+ * @uiName Network error text
+ * @uiWidget textArea
+ */
+ "networkErrorText"?: string;
+ /**
+ * @uiName Search country placeholder
+ */
+ "searchCountryPlaceholder"?: string;
+ /**
+ * @uiName Search currency placeholder
+ */
+ "searchCurrencyPlaceholder"?: string;
+ /**
+ * @uiName Submit button label
+ */
+ "submitButtonLabel"?: string;
+ /**
+ * Support description for existing partner confirmation
+ * @uiName Existing partner support description
+ * @uiWidget textArea
+ */
+ "supportDescriptionExistingPartner"?: string;
+ }
interface SqmPasswordField {
/**
* @undocumented
@@ -15023,6 +15423,7 @@ declare namespace LocalJSX {
"sqm-navigation-sidebar": SqmNavigationSidebar;
"sqm-navigation-sidebar-item": SqmNavigationSidebarItem;
"sqm-pagination": SqmPagination;
+ "sqm-partner-info-modal": SqmPartnerInfoModal;
"sqm-password-field": SqmPasswordField;
"sqm-payout-button-scroll": SqmPayoutButtonScroll;
"sqm-payout-details-card": SqmPayoutDetailsCard;
@@ -15157,6 +15558,7 @@ declare module "@stencil/core" {
"sqm-navigation-sidebar": LocalJSX.SqmNavigationSidebar & JSXBase.HTMLAttributes;
"sqm-navigation-sidebar-item": LocalJSX.SqmNavigationSidebarItem & JSXBase.HTMLAttributes;
"sqm-pagination": LocalJSX.SqmPagination & JSXBase.HTMLAttributes;
+ "sqm-partner-info-modal": LocalJSX.SqmPartnerInfoModal & JSXBase.HTMLAttributes;
"sqm-password-field": LocalJSX.SqmPasswordField & JSXBase.HTMLAttributes;
"sqm-payout-button-scroll": LocalJSX.SqmPayoutButtonScroll & JSXBase.HTMLAttributes;
"sqm-payout-details-card": LocalJSX.SqmPayoutDetailsCard & JSXBase.HTMLAttributes;
diff --git a/packages/mint-components/src/components/sqm-partner-info-modal/PartnerInfoModal.stories.tsx b/packages/mint-components/src/components/sqm-partner-info-modal/PartnerInfoModal.stories.tsx
new file mode 100644
index 000000000..214f077d2
--- /dev/null
+++ b/packages/mint-components/src/components/sqm-partner-info-modal/PartnerInfoModal.stories.tsx
@@ -0,0 +1,174 @@
+import { h } from "@stencil/core";
+import {
+ PartnerInfoModalView,
+ PartnerInfoModalViewProps,
+} from "./sqm-partner-info-modal-view";
+
+export default {
+ title: "Components/Partner Info Modal",
+};
+
+const demoCountries = [
+ { countryCode: "US", displayName: "United States" },
+ { countryCode: "CA", displayName: "Canada" },
+ { countryCode: "GB", displayName: "United Kingdom" },
+ { countryCode: "AU", displayName: "Australia" },
+ { countryCode: "DE", displayName: "Germany" },
+ { countryCode: "FR", displayName: "France" },
+ { countryCode: "JP", displayName: "Japan" },
+];
+
+const demoCurrencies = [
+ { currencyCode: "USD", displayName: "US Dollar" },
+ { currencyCode: "CAD", displayName: "Canadian Dollar" },
+ { currencyCode: "GBP", displayName: "British Pound" },
+ { currencyCode: "EUR", displayName: "Euro" },
+ { currencyCode: "AUD", displayName: "Australian Dollar" },
+];
+
+const noopCallbacks = {
+ onCountryChange: (e: any) => console.log("Country changed:", e),
+ onCurrencyChange: (e: any) => console.log("Currency changed:", e),
+ setCountrySearch: (v: string) => console.log("Country search:", v),
+ setCurrencySearch: (v: string) => console.log("Currency search:", v),
+ onSubmit: () => console.log("Submit"),
+ onClose: () => console.log("Close"),
+};
+
+const defaultText = {
+ modalHeader: "Let's get you ready for rewards",
+ modalHeaderExistingPartner: "We found an existing account",
+ descriptionNewPartner:
+ "Confirm your country and currency now to get your future rewards faster.",
+ descriptionExistingPartner:
+ "We noticed you are already an Impact.com partner, please confirm your information.",
+ supportDescriptionExistingPartner:
+ "If this is a mistake, please contact Support or sign up for this referral program with a different email.",
+ countryLabel: "Country",
+ currencyLabel: "Currency",
+ submitButtonLabel: "Submit",
+ confirmButtonLabel: "Confirm",
+ searchCountryPlaceholder: "Search for a country",
+ searchCurrencyPlaceholder: "Search for a currency",
+};
+
+const defaultProps: PartnerInfoModalViewProps = {
+ states: {
+ open: true,
+ loading: false,
+ submitting: false,
+ isExistingPartner: false,
+ countryCode: "",
+ currency: "",
+ error: "",
+ success: false,
+ brandName: "Test Brand",
+ filteredCountries: demoCountries,
+ filteredCurrencies: demoCurrencies,
+ },
+ callbacks: noopCallbacks,
+ text: defaultText,
+};
+
+export const NewPartnerEmpty = () => {
+ return ;
+};
+
+export const NewPartnerPrefilled = () => {
+ const props: PartnerInfoModalViewProps = {
+ ...defaultProps,
+ states: {
+ ...defaultProps.states,
+ countryCode: "US",
+ currency: "",
+ },
+ };
+ return ;
+};
+
+export const NewPartnerFullySelected = () => {
+ const props: PartnerInfoModalViewProps = {
+ ...defaultProps,
+ states: {
+ ...defaultProps.states,
+ countryCode: "US",
+ currency: "USD",
+ },
+ };
+ return ;
+};
+
+export const ExistingPartnerConfirm = () => {
+ const props: PartnerInfoModalViewProps = {
+ ...defaultProps,
+ states: {
+ ...defaultProps.states,
+ isExistingPartner: true,
+ countryCode: "CA",
+ currency: "CAD",
+ },
+ };
+ return ;
+};
+
+export const Submitting = () => {
+ const props: PartnerInfoModalViewProps = {
+ ...defaultProps,
+ states: {
+ ...defaultProps.states,
+ countryCode: "GB",
+ currency: "GBP",
+ submitting: true,
+ },
+ };
+ return ;
+};
+
+export const WithError = () => {
+ const props: PartnerInfoModalViewProps = {
+ ...defaultProps,
+ states: {
+ ...defaultProps.states,
+ countryCode: "US",
+ currency: "USD",
+ error:
+ "An error occurred while creating your partner account. Please try again.",
+ },
+ };
+ return ;
+};
+
+export const ValidationError = () => {
+ const props: PartnerInfoModalViewProps = {
+ ...defaultProps,
+ states: {
+ ...defaultProps.states,
+ countryCode: "",
+ currency: "",
+ error: "Please select both a country and currency.",
+ },
+ };
+ return ;
+};
+
+export const Closed = () => {
+ const props: PartnerInfoModalViewProps = {
+ ...defaultProps,
+ states: {
+ ...defaultProps.states,
+ open: false,
+ },
+ };
+ return ;
+};
+
+export const FullStackDemo = () => {
+ return (
+
+ );
+};
diff --git a/packages/mint-components/src/components/sqm-partner-info-modal/readme.md b/packages/mint-components/src/components/sqm-partner-info-modal/readme.md
new file mode 100644
index 000000000..5fd03ab9a
--- /dev/null
+++ b/packages/mint-components/src/components/sqm-partner-info-modal/readme.md
@@ -0,0 +1,42 @@
+# sqm-partner-info-modal
+
+
+
+
+
+
+## Properties
+
+| Property | Attribute | Description | Type | Default |
+| ---------------------------- | ------------------------------ | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
+| `brandName` | `brand-name` | Brand name shown in the modal header | `string` | `""` |
+| `confirmButtonLabel` | `confirm-button-label` | | `string` | `"Confirm"` |
+| `countryLabel` | `country-label` | | `string` | `"Country"` |
+| `currencyLabel` | `currency-label` | | `string` | `"Currency"` |
+| `demoData` | -- | | `{ states?: { open: boolean; loading: boolean; submitting: boolean; isExistingPartner: boolean; countryCode: string; currency: string; error: string; success: boolean; brandName: string; filteredCountries: { countryCode: string; displayName: string; }[]; filteredCurrencies: { currencyCode: string; displayName: string; }[]; }; }` | `undefined` |
+| `descriptionExistingPartner` | `description-existing-partner` | Description for existing partner confirmation | `string` | `"We noticed you are already an Impact.com partner, please confirm your information."` |
+| `descriptionNewPartner` | `description-new-partner` | Description for new partner setup | `string` | `"We just need a bit more information about you before you start earning cash!"` |
+| `missingFieldsErrorText` | `missing-fields-error-text` | | `string` | `"Please select both a country and currency."` |
+| `modalBrandHeader` | `modal-brand-header` | Header text when user has no existing partner | `string` | `"Welcome to {brandName} Program!"` |
+| `networkErrorText` | `network-error-text` | | `string` | `"An error occurred. Please try again."` |
+| `searchCountryPlaceholder` | `search-country-placeholder` | | `string` | `"Search for a country"` |
+| `searchCurrencyPlaceholder` | `search-currency-placeholder` | | `string` | `"Search for a currency"` |
+| `submitButtonLabel` | `submit-button-label` | | `string` | `"Submit"` |
+
+
+## Dependencies
+
+### Used by
+
+ - [sqm-stencilbook](../sqm-stencilbook)
+
+### Graph
+```mermaid
+graph TD;
+ sqm-stencilbook --> sqm-partner-info-modal
+ style sqm-partner-info-modal fill:#f9f,stroke:#333,stroke-width:4px
+```
+
+----------------------------------------------
+
+*Built with [StencilJS](https://stenciljs.com/)*
diff --git a/packages/mint-components/src/components/sqm-partner-info-modal/sqm-partner-info-modal-view.tsx b/packages/mint-components/src/components/sqm-partner-info-modal/sqm-partner-info-modal-view.tsx
new file mode 100644
index 000000000..fa1e4f5a5
--- /dev/null
+++ b/packages/mint-components/src/components/sqm-partner-info-modal/sqm-partner-info-modal-view.tsx
@@ -0,0 +1,208 @@
+import { h } from "@stencil/core";
+import { createStyleSheet } from "../../styling/JSS";
+import { intl } from "../../global/global";
+
+export interface PartnerInfoModalViewProps {
+ states: {
+ open: boolean;
+ loading: boolean;
+ submitting: boolean;
+ isExistingPartner: boolean;
+ countryCode: string;
+ currency: string;
+ error: string;
+ success: boolean;
+ brandName: string;
+ filteredCountries: { countryCode: string; displayName: string }[];
+ filteredCurrencies: { currencyCode: string; displayName: string }[];
+ };
+ callbacks: {
+ onCountryChange: (e: any) => void;
+ onCurrencyChange: (e: any) => void;
+ setCurrencySearch: (c: any) => void;
+ setCountrySearch: (c: any) => void;
+ onSubmit: () => void;
+ onClose: () => void;
+ };
+ text: {
+ modalHeader: string;
+ descriptionNewPartner: string;
+ descriptionExistingPartner: string;
+ countryLabel: string;
+ currencyLabel: string;
+ submitButtonLabel: string;
+ confirmButtonLabel: string;
+ searchCountryPlaceholder: string;
+ searchCurrencyPlaceholder: string;
+ supportDescriptionExistingPartner: string;
+ modalHeaderExistingPartner: string;
+ };
+}
+
+const style = {
+ Dialog: {
+ "&::part(panel)": {
+ maxWidth: "480px",
+ },
+ "&::part(title)": {
+ fontSize: "var(--sl-font-size-x-large)",
+ fontWeight: "600",
+ padding:
+ "var(--sl-spacing-x-large) var(--sl-spacing-x-large) 0 var(--sl-spacing-x-large)",
+ },
+ "&::part(body)": {
+ padding: "var(--sl-spacing-small) var(--sl-spacing-x-large)",
+ fontSize: "var(--sl-font-size-small)",
+ overflow: "visible",
+ },
+ "&::part(footer)": {
+ display: "flex",
+ flexDirection: "column",
+ gap: "var(--sl-spacing-small)",
+ padding:
+ "var(--sl-spacing-small) var(--sl-spacing-x-large) var(--sl-spacing-x-large)",
+ },
+ "&::part(overlay)": {
+ background: "rgba(0, 0, 0, 0.5)",
+ },
+ "&::part(close-button)": {
+ display: "none",
+ },
+ },
+ FormFields: {
+ display: "flex",
+ flexDirection: "column",
+ gap: "var(--sl-spacing-medium)",
+ marginTop: "var(--sl-spacing-medium)",
+
+ "& > *": {
+ flex: 1,
+ },
+ },
+ ErrorMessage: {
+ color: "var(--sqm-danger-color-text, #d32f2f)",
+ fontSize: "var(--sl-font-size-small)",
+ marginTop: "var(--sl-spacing-x-small)",
+ },
+ SearchInput: {
+ "&::part(base)": {
+ border: "none",
+ borderBottom: "1px solid var(--sl-color-neutral-300)",
+ borderRadius: "0",
+ },
+ },
+ DescriptionContainer: {
+ display: "flex",
+ flexDirection: "column",
+ gap: "var(--sl-spacing-medium)",
+ marginTop: "var(--sl-spacing-small)",
+ "& > p": {
+ margin: "0",
+ },
+ },
+};
+
+export function PartnerInfoModalView(props: PartnerInfoModalViewProps) {
+ const { states, callbacks, text } = props;
+ const sheet = createStyleSheet(style);
+ const styleString = sheet.toString();
+
+ console.log(states, "partner info modal states"); // TEMP
+
+ if (!states.open) return ;
+
+ const description = states.isExistingPartner ? (
+
+
{text.descriptionExistingPartner}
+
{text.supportDescriptionExistingPartner}
+
+ ) : (
+ {text.descriptionNewPartner}
+ );
+
+ const buttonLabel = states.isExistingPartner
+ ? text.confirmButtonLabel
+ : text.submitButtonLabel;
+
+ return (
+ {
+ e.preventDefault();
+ }}
+ onSl-hide={(e: any) => {
+ // Prevent closing when clicking outside the dialog but not dropdowns
+ if (e.target?.tagName === "SL-DIALOG") {
+ e.preventDefault();
+ }
+ }}
+ >
+
+ {description}
+
+
+ e.stopPropagation()}
+ onSl-input={(e: any) => {
+ callbacks.setCountrySearch(e.target?.value);
+ }}
+ />
+ {states.filteredCountries?.map((c) => (
+ {c.displayName}
+ ))}
+
+
+
+ e.stopPropagation()}
+ onSl-input={(e: any) =>
+ callbacks.setCurrencySearch(e.target?.value)
+ }
+ />
+ {states.filteredCurrencies?.map((c) => (
+ {c.currencyCode}
+ ))}
+
+
+ {states.error && {states.error}
}
+
+ {buttonLabel}
+
+
+ );
+}
diff --git a/packages/mint-components/src/components/sqm-partner-info-modal/sqm-partner-info-modal.tsx b/packages/mint-components/src/components/sqm-partner-info-modal/sqm-partner-info-modal.tsx
new file mode 100644
index 000000000..44e1b2eeb
--- /dev/null
+++ b/packages/mint-components/src/components/sqm-partner-info-modal/sqm-partner-info-modal.tsx
@@ -0,0 +1,218 @@
+import { isDemo } from "@saasquatch/component-boilerplate";
+import { useState, withHooks } from "@saasquatch/stencil-hooks";
+import { Component, Prop, h } from "@stencil/core";
+import deepmerge from "deepmerge";
+import { DemoData } from "../../global/demo";
+import { getProps } from "../../utils/utils";
+import {
+ PartnerInfoModalView,
+ PartnerInfoModalViewProps,
+} from "./sqm-partner-info-modal-view";
+import { usePartnerInfoModal } from "./usePartnerInfoModal";
+
+/**
+ * @uiName Partner Info Modal
+ * @exampleGroup Tax and Cash
+ * @validParents ["sqm-portal-container", "sqm-portal-frame", "div", "sqb-program-section", "sqb-conditional-section"]
+ * @example Partner Info Modal -
+ */
+@Component({
+ tag: "sqm-partner-info-modal",
+ shadow: true,
+})
+export class PartnerInfoModal {
+ /**
+ * Brand name shown in the modal header
+ *
+ * @uiName Brand name
+ */
+ @Prop()
+ brandName: string = "";
+
+ /**
+ * Header text when user has no existing partner
+ *
+ * @uiName New partner header
+ * @uiWidget textArea
+ */
+ @Prop()
+ modalHeader: string = "Let's get you ready for rewards";
+
+ /**
+ * Header text when user has an existing partner
+ *
+ * @uiName Existing partner header
+ * @uiWidget textArea
+ */
+ @Prop()
+ modalHeaderExistingPartner: string = "We found an existing account";
+
+ /**
+ * Description for new partner setup
+ *
+ * @uiName New partner description
+ * @uiWidget textArea
+ */
+ @Prop()
+ descriptionNewPartner: string =
+ "Confirm your country and currency now to get your future rewards faster.";
+
+ /**
+ * Description for existing partner confirmation
+ *
+ * @uiName Existing partner description
+ * @uiWidget textArea
+ */
+ @Prop()
+ descriptionExistingPartner: string =
+ "We found an account with this email on our referral program provider, impact.com. Please confirm your country and currency now to get your future rewards faster.";
+
+ /**
+ * Support description for existing partner confirmation
+ *
+ * @uiName Existing partner support description
+ * @uiWidget textArea
+ */
+ @Prop()
+ supportDescriptionExistingPartner: string =
+ "If this is a mistake, please contact Support or sign up for this referral program with a different email.";
+
+ /**
+ * @uiName Country label
+ */
+ @Prop()
+ countryLabel: string = "Country";
+
+ /**
+ * @uiName Currency label
+ */
+ @Prop()
+ currencyLabel: string = "Currency";
+
+ /**
+ * @uiName Submit button label
+ */
+ @Prop()
+ submitButtonLabel: string = "Submit";
+
+ /**
+ * @uiName Confirm button label
+ */
+ @Prop()
+ confirmButtonLabel: string = "Confirm";
+
+ /**
+ * @uiName Search country placeholder
+ */
+ @Prop()
+ searchCountryPlaceholder: string = "Search for a country";
+
+ /**
+ * @uiName Search currency placeholder
+ */
+ @Prop()
+ searchCurrencyPlaceholder: string = "Search for a currency";
+
+ /**
+ * @uiName Network error text
+ * @uiWidget textArea
+ */
+ @Prop()
+ networkErrorText: string = "An error occurred. Please try again.";
+
+ /**
+ * @uiName Missing fields error text
+ * @uiWidget textArea
+ */
+ @Prop()
+ missingFieldsErrorText: string = "Please select both a country and currency.";
+
+ /**
+ * @undocumented
+ * @uiType object
+ */
+ @Prop() demoData?: DemoData;
+
+ constructor() {
+ withHooks(this);
+ }
+ disconnectedCallback() {}
+
+ getTextProps() {
+ return getProps(this);
+ }
+
+ render() {
+ // AL: TODO add usePartnerInfoModal
+ const props = isDemo()
+ ? useDemoPartnerInfoModal(this)
+ : usePartnerInfoModal(this);
+
+ return ;
+ }
+}
+
+function useDemoPartnerInfoModal(
+ props: PartnerInfoModal,
+): PartnerInfoModalViewProps {
+ const [countryCode, setCountryCode] = useState("US");
+ const [currency, setCurrency] = useState("");
+ const [error, setError] = useState("");
+
+ return deepmerge(
+ {
+ states: {
+ brandName: "Test Brand",
+ open: true,
+ loading: false,
+ submitting: false,
+ isExistingPartner: false,
+ countryCode,
+ currency,
+ error,
+ success: false,
+ filteredCountries: [],
+ filteredCurrencies: [],
+ },
+ callbacks: {
+ onCountryChange: (e: any) => {
+ const value = e?.detail?.item?.__value;
+ if (value) {
+ setCountryCode(value);
+ setCurrency("");
+ }
+ },
+ onCurrencyChange: (e: any) => {
+ const value = e?.detail?.item?.__value;
+ if (value) setCurrency(value);
+ },
+ setCountrySearch: () => {},
+ setCurrencySearch: () => {},
+ onSubmit: () => {
+ if (!countryCode || !currency) {
+ setError(props.missingFieldsErrorText);
+ return;
+ }
+ setError("");
+ },
+ onClose: () => {},
+ },
+ text: {
+ modalHeader: props.modalHeader,
+ descriptionNewPartner: props.descriptionNewPartner,
+ descriptionExistingPartner: props.descriptionExistingPartner,
+ countryLabel: props.countryLabel,
+ currencyLabel: props.currencyLabel,
+ submitButtonLabel: props.submitButtonLabel,
+ confirmButtonLabel: props.confirmButtonLabel,
+ searchCountryPlaceholder: props.searchCountryPlaceholder,
+ searchCurrencyPlaceholder: props.searchCurrencyPlaceholder,
+ supportDescriptionExistingPartner:
+ props.supportDescriptionExistingPartner,
+ modalHeaderExistingPartner: props.modalHeaderExistingPartner,
+ },
+ },
+ props.demoData || {},
+ { arrayMerge: (_, a) => a },
+ );
+}
diff --git a/packages/mint-components/src/components/sqm-partner-info-modal/usePartnerInfoModal.tsx b/packages/mint-components/src/components/sqm-partner-info-modal/usePartnerInfoModal.tsx
new file mode 100644
index 000000000..9c3172659
--- /dev/null
+++ b/packages/mint-components/src/components/sqm-partner-info-modal/usePartnerInfoModal.tsx
@@ -0,0 +1,324 @@
+import {
+ useLocale,
+ useMutation,
+ useQuery,
+ useUserIdentity,
+} from "@saasquatch/component-boilerplate";
+import { useEffect, useState } from "@saasquatch/universal-hooks";
+import { gql } from "graphql-request";
+import { PartnerInfoModal } from "./sqm-partner-info-modal";
+import { PartnerInfoModalViewProps } from "./sqm-partner-info-modal-view";
+import { ConnectPartnerResult } from "../tax-and-cash/sqm-indirect-tax-form/useIndirectTaxForm";
+import { validTaxDocument } from "../tax-and-cash/utils";
+import { TAX_FORM_UPDATED_EVENT_KEY } from "../tax-and-cash/eventKeys";
+
+// new field under impactConnection:{ resolvedByEmail: boolean } - determines if connection came from managed identity
+export const GET_USER_PARTNER_INFO = gql`
+ query getUserPartnerInfo {
+ user: viewer {
+ ... on User {
+ id
+ accountId
+ firstName
+ lastName
+ email
+ countryCode
+ customFields
+ impactConnection {
+ connected
+ publisher {
+ phoneNumber
+ phoneNumberCountryCode
+ countryCode
+ currency
+ requiredTaxDocumentType
+ currentTaxDocument {
+ type
+ status
+ }
+ withdrawalSettings {
+ paymentMethod
+ }
+ }
+ }
+ }
+ }
+ }
+`;
+
+export const GET_COUNTRIES = gql`
+ query getCountries {
+ impactPayoutCountries(limit: 1000) {
+ data {
+ countryCode
+ displayName
+ }
+ }
+ }
+`;
+
+export const GET_CURRENCIES = gql`
+ query currencies($locale: RSLocale) {
+ currencies(limit: 300) {
+ data {
+ displayName(locale: $locale)
+ currencyCode
+ }
+ }
+ }
+`;
+
+export const CONNECT_PARTNER = gql`
+ mutation createImpactConnection($vars: ImpactConnectionInput!) {
+ createImpactConnection(impactConnectionInput: $vars) {
+ success
+ validationErrors {
+ field
+ message
+ }
+ user {
+ id
+ accountId
+ impactConnection {
+ connected
+ publisher {
+ brandedSignup
+ requiredTaxDocumentType
+ currentTaxDocument {
+ type
+ status
+ }
+ }
+ }
+ }
+ }
+ }
+`;
+
+const GET_BRAND_NAME = gql`
+ query getTenantSettings {
+ tenantSettings {
+ companyName
+ }
+ }
+`;
+
+export type TaxCountry = {
+ countryCode: string;
+ displayName: string;
+};
+
+export type CountriesQuery = {
+ impactPayoutCountries: {
+ data: TaxCountry[];
+ };
+};
+
+type TenantSettingsQuery = {
+ tenantSettings: {
+ companyName: string;
+ };
+};
+
+export function usePartnerInfoModal(
+ props: PartnerInfoModal,
+): PartnerInfoModalViewProps {
+ const locale = useLocale();
+
+ const {
+ data: userData,
+ loading: userLoading,
+ refetch,
+ } = useQuery(GET_USER_PARTNER_INFO, {});
+
+ const user = userData?.user;
+
+ const { data: currenciesData, loading: currenciesLoading } = useQuery(
+ GET_CURRENCIES,
+ { variables: { locale } },
+ );
+
+ const { data: countriesData, loading: countriesLoading } = useQuery(
+ GET_COUNTRIES,
+ {},
+ );
+
+ const { data: tenantSettingsData } = useQuery(
+ GET_BRAND_NAME,
+ {},
+ );
+
+ const [
+ connectImpactPartner,
+ { loading: connectLoading, errors: connectErrors },
+ ] = useMutation(CONNECT_PARTNER);
+
+ const [countryCode, setCountryCode] = useState(
+ user?.impactConnection?.publisher?.countryCode || "",
+ );
+ const [currency, setCurrency] = useState(
+ user?.impactConnection?.publisher?.currency || "",
+ );
+
+ console.log(countryCode, currency, "initial country and currency state"); // TEMP
+ const [countrySearch, setCountrySearch] = useState("");
+ const [currencySearch, setCurrencySearch] = useState("");
+ const [filteredCountries, setFilteredCountries] = useState(
+ countriesData?.impactPayoutCountries?.data || [],
+ );
+ const [filteredCurrencies, setFilteredCurrencies] = useState(
+ currenciesData?.currencies?.data || [],
+ );
+
+ const [error, setError] = useState("");
+ const [success, setSuccess] = useState(false);
+
+ const countries = countriesData?.impactPayoutCountries?.data || [];
+ const currencies = currenciesData?.currencies?.data || [];
+
+ console.log(user, "user data from partner info query"); // TEMP
+
+ useEffect(() => {
+ if (userData && user.impactConnection?.publisher) {
+ setCountryCode(user.impactConnection.publisher.countryCode);
+ setCurrency(user.impactConnection.publisher.currency);
+ }
+ }, [userData]);
+
+ useEffect(() => {
+ if (!countries?.length) return;
+ if (countrySearch.trim() === "") {
+ setFilteredCountries(countries || []);
+ } else {
+ setFilteredCountries(
+ countries.filter((c) =>
+ c.displayName.toLowerCase().includes(countrySearch.toLowerCase()),
+ ) || [],
+ );
+ }
+ }, [countrySearch, countries]);
+
+ useEffect(() => {
+ if (!currencies?.length) return;
+ if (currencySearch.trim() === "") {
+ setFilteredCurrencies(currencies || []);
+ } else {
+ setFilteredCurrencies(
+ currencies.filter((c) =>
+ c.currencyCode.toLowerCase().includes(currencySearch.toLowerCase()),
+ ) || [],
+ );
+ }
+ }, [currencySearch, currencies]);
+
+ const impactConnection = user?.impactConnection;
+
+ function onCountryChange(e: any) {
+ const value = e.detail?.item?.__value;
+ if (!value) return;
+ setCountryCode(value);
+ setCurrency("");
+ setError("");
+ }
+
+ function onCurrencyChange(e: any) {
+ const value = e.detail?.item?.__value;
+ if (!value) return;
+ setCurrency(value);
+ setError("");
+ }
+
+ async function onSubmit() {
+ if (!countryCode || !currency) {
+ setError(props.missingFieldsErrorText);
+ return;
+ }
+ setError("");
+
+ try {
+ const vars = {
+ user: {
+ id: user.id,
+ accountId: user.accountId,
+ },
+ firstName: user.firstName,
+ lastName: user.lastName,
+ // phoneNumber: null,
+ // phoneNumberCountryCode: null,
+ countryCode,
+ currency,
+ };
+
+ const result = await connectImpactPartner({ vars });
+
+ if (!result || (result as Error)?.message) {
+ setError(props.networkErrorText);
+ return;
+ }
+
+ const connectionResult = (result as ConnectPartnerResult)
+ .createImpactConnection;
+
+ console.log(
+ result,
+ connectionResult,
+ "result and connectionResult from creating partner from modal",
+ );
+
+ if (!connectionResult?.success) {
+ const validationMsg = connectionResult?.validationErrors
+ ?.map((e) => e.message)
+ .join(". ");
+ setError(validationMsg || props.networkErrorText);
+ console.error(
+ "Failed to create Impact connection:",
+ connectionResult?.validationErrors,
+ );
+ return;
+ }
+
+ window.dispatchEvent(new Event(TAX_FORM_UPDATED_EVENT_KEY));
+
+ await refetch();
+ setSuccess(true);
+ } catch (e) {
+ console.error("Partner creation error:", e);
+ setError(props.networkErrorText);
+ }
+ }
+
+ console.log(success, "success state in partner info modal");
+
+ const showModal =
+ !success &&
+ !userLoading &&
+ (!impactConnection?.connected || !impactConnection?.publisher);
+
+ console.log(showModal, "showModal condition in partner info modal"); // TEMP
+
+ return {
+ states: {
+ open: showModal,
+ loading: userLoading || countriesLoading || currenciesLoading,
+ submitting: connectLoading,
+ isExistingPartner:
+ impactConnection?.connected || impactConnection?.publisher,
+ countryCode,
+ currency,
+ error,
+ success,
+ brandName: tenantSettingsData?.tenantSettings?.companyName || "",
+ filteredCountries: filteredCountries || [],
+ filteredCurrencies: filteredCurrencies || [],
+ },
+ callbacks: {
+ onCountryChange,
+ onCurrencyChange,
+ setCurrencySearch,
+ setCountrySearch,
+ onSubmit,
+ onClose: () => setSuccess(true),
+ },
+ text: props.getTextProps(),
+ };
+}
diff --git a/packages/mint-components/src/components/sqm-stencilbook/readme.md b/packages/mint-components/src/components/sqm-stencilbook/readme.md
index ea883e901..d89396674 100644
--- a/packages/mint-components/src/components/sqm-stencilbook/readme.md
+++ b/packages/mint-components/src/components/sqm-stencilbook/readme.md
@@ -104,6 +104,7 @@
- [sqm-lead-input-field](../sqm-lead-form)
- [sqm-lead-dropdown-field](../sqm-lead-form)
- [sqm-lead-form](../sqm-lead-form)
+- [sqm-partner-info-modal](../sqm-partner-info-modal)
### Graph
```mermaid
@@ -205,6 +206,7 @@ graph TD;
sqm-stencilbook --> sqm-lead-input-field
sqm-stencilbook --> sqm-lead-dropdown-field
sqm-stencilbook --> sqm-lead-form
+ sqm-stencilbook --> sqm-partner-info-modal
sqm-form-message --> sqm-skeleton
sqm-portal-register --> sqm-form-message
sqm-portal-register --> sqm-password-field
diff --git a/packages/mint-components/src/components/sqm-stencilbook/sqm-stencilbook.tsx b/packages/mint-components/src/components/sqm-stencilbook/sqm-stencilbook.tsx
index b52a78359..ffe841f41 100644
--- a/packages/mint-components/src/components/sqm-stencilbook/sqm-stencilbook.tsx
+++ b/packages/mint-components/src/components/sqm-stencilbook/sqm-stencilbook.tsx
@@ -108,6 +108,7 @@ import * as LeadFormDropdownField from "../sqm-lead-form/LeadFormDropdownField.s
import * as LeadCheckboxField from "../sqm-lead-form/LeadCheckboxField.stories";
import * as Skeleton from "../sqm-skeleton/Skeleton.stories";
import * as UserInfoFormView from "../tax-and-cash/sqm-user-info-form/UserInfoFormView.stories";
+import * as PartnerInfoModal from "../sqm-partner-info-modal/PartnerInfoModal.stories";
import { ShadowViewAddon } from "../../ShadowViewAddon";
import { CucumberAddon } from "./CucumberAddon";
@@ -221,6 +222,7 @@ const stories = [
TaxAndCashRewardsTable,
TaxAndCashReferralTableRewardsCell,
TaxAndCashReferralTable,
+ PartnerInfoModal,
];
/**
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/formDefinitions.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/formDefinitions.tsx
index 1b1b7e740..def9c5cce 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/formDefinitions.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/formDefinitions.tsx
@@ -11,6 +11,8 @@ export function getFormMap({
getValidationErrorMessage: (props: {
type: "required" | "invalid";
label: string;
+ errorCode?: string;
+ fieldName?: string;
}) => string;
bankCountry?: string;
}) {
@@ -32,6 +34,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.beneficiaryAccountName?.type,
label: props.text.beneficiaryAccountNameLabel,
+ errorCode: errors?.inputErrors?.beneficiaryAccountName?.errorCode,
+ fieldName: "beneficiaryAccountName",
}),
})}
>
@@ -50,6 +54,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankAccountType?.type,
label: props.text.bankAccountTypeLabel,
+ errorCode: errors?.inputErrors?.bankAccountType?.errorCode,
+ fieldName: "bankAccountType",
}),
})}
>
@@ -77,6 +83,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankAccountNumber?.type,
label: props.text.bankAccountNumberLabel,
+ errorCode: errors?.inputErrors?.bankAccountNumber?.errorCode,
+ fieldName: "bankAccountNumber",
}),
})}
>
@@ -97,6 +105,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankAccountNumber?.type,
label: props.text.ibanLabel,
+ errorCode: errors?.inputErrors?.bankAccountNumber?.errorCode,
+ fieldName: "bankAccountNumber",
}),
})}
>
@@ -117,6 +127,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.swiftCode?.type,
label: props.text.swiftCodeLabel,
+ errorCode: errors?.inputErrors?.swiftCode?.errorCode,
+ fieldName: "swiftCode",
}),
})}
>
@@ -152,6 +164,8 @@ export function getFormMap({
bankCountry,
}
),
+ errorCode: errors?.inputErrors?.routingCode?.errorCode,
+ fieldName: "routingCode",
}),
})}
>
@@ -171,6 +185,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankName?.type,
label: props.text.bankNameLabel,
+ errorCode: errors?.inputErrors?.bankName?.errorCode,
+ fieldName: "bankName",
}),
})}
>
@@ -189,6 +205,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.beneficiaryClassification?.type,
label: props.text.classificationLabel,
+ errorCode: errors?.inputErrors?.beneficiaryClassification?.errorCode,
+ fieldName: "beneficiaryClassification",
}),
})}
>
@@ -222,6 +240,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.beneficiaryTaxPayerId?.type,
label: props.text.taxPayerIdLabel,
+ errorCode: errors?.inputErrors?.taxPayerId?.errorCode,
+ fieldName: "taxPayerId",
}),
})}
>,
@@ -240,6 +260,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.beneficiaryClassification?.type,
label: props.text.classificationCPFLabel,
+ errorCode: errors?.inputErrors?.beneficiaryClassification?.errorCode,
+ fieldName: "beneficiaryClassification",
}),
})}
>
@@ -262,6 +284,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.patronymicName?.type,
label: props.text.patronymicNameLabel,
+ errorCode: errors?.inputErrors?.patronymicName?.errorCode,
+ fieldName: "patronymicName",
}),
})}
>
@@ -280,6 +304,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.voCode?.type,
label: props.text.voCodeLabel,
+ errorCode: errors?.inputErrors?.voCode?.errorCode,
+ fieldName: "voCode",
}),
})}
>
@@ -299,6 +325,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.agencyCode?.type,
label: props.text.agencyCodeLabel,
+ errorCode: errors?.inputErrors?.agencyCode?.errorCode,
+ fieldName: "agencyCode",
}),
})}
>
@@ -318,6 +346,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankAddress?.type,
label: props.text.bankAddressLabel,
+ errorCode: errors?.inputErrors?.bankAddress?.errorCode,
+ fieldName: "bankAddress",
}),
})}
>,
@@ -333,6 +363,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankCity?.type,
label: props.text.bankCityLabel,
+ errorCode: errors?.inputErrors?.bankCity?.errorCode,
+ fieldName: "bankCity",
}),
})}
>,
@@ -348,6 +380,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankState?.type,
label: props.text.bankStateLabel,
+ errorCode: errors?.inputErrors?.bankState?.errorCode,
+ fieldName: "bankState",
}),
})}
>,
@@ -363,6 +397,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankPostalCode?.type,
label: props.text.bankPostalCodeLabel,
+ errorCode: errors?.inputErrors?.bankPostalCode?.errorCode,
+ fieldName: "bankPostalCode",
}),
})}
>,
@@ -382,6 +418,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.branchCode?.type,
label: props.text.branchCodeLabel,
+ errorCode: errors?.inputErrors?.branchCode?.errorCode,
+ fieldName: "branchCode",
}),
})}
>
@@ -400,6 +438,8 @@ export function getFormMap({
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.beneficiaryClassification?.type,
label: props.text.classificationLabel,
+ errorCode: errors?.inputErrors?.beneficiaryClassification?.errorCode,
+ fieldName: "beneficiaryClassification",
}),
})}
>
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/readme.md b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/readme.md
index 53516c5e1..55cc4173c 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/readme.md
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/readme.md
@@ -5,69 +5,89 @@
## Properties
-| Property | Attribute | Description | Type | Default |
-| ------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `agencyCodeLabel` | `agency-code-label` | | `string` | `"Agency code"` |
-| `backButton` | `back-button` | Text for the back button in the form | `string` | `"Back"` |
-| `bankAccountNumberLabel` | `bank-account-number-label` | | `string` | `"Bank account number"` |
-| `bankAccountTypeLabel` | `bank-account-type-label` | | `string` | `"Bank account type"` |
-| `bankAddressLabel` | `bank-address-label` | | `string` | `"Bank address"` |
-| `bankCityLabel` | `bank-city-label` | | `string` | `"Bank city"` |
-| `bankLocationLabel` | `bank-location-label` | | `string` | `"Bank country location"` |
-| `bankNameLabel` | `bank-name-label` | | `string` | `"Bank Name"` |
-| `bankPostalCodeLabel` | `bank-postal-code-label` | | `string` | `"Bank postal code"` |
-| `bankStateLabel` | `bank-state-label` | | `string` | `"Bank province/state"` |
-| `beneficiaryAccountNameDescription` | `beneficiary-account-name-description` | | `string` | `"The beneficiary name of your bank account. Ensure this matches the name on your tax form."` |
-| `beneficiaryAccountNameLabel` | `beneficiary-account-name-label` | | `string` | `"Account holder name"` |
-| `branchCodeLabel` | `branch-code-label` | | `string` | `"Branch code"` |
-| `businessSelectItemLabel` | `business-select-item-label` | One of three options listed for the classification field | `string` | `"Business"` |
-| `checkingSelectItemLabel` | `checking-select-item-label` | | `string` | `"Checking"` |
-| `classificationCPFLabel` | `classification-c-p-f-label` | | `string` | `"Classification CPF"` |
-| `classificationEntityLabel` | `classification-entity-label` | | `string` | `"Classification Entity"` |
-| `classificationLabel` | `classification-label` | Label text for the classification input field | `string` | `"Classification"` |
-| `continueButton` | `continue-button` | | `string` | `"Save"` |
-| `demoData` | -- | | `{ states?: { showVerification: boolean; step?: string; locale?: string; loading: boolean; saveLoading?: boolean; disabled: boolean; saveDisabled: boolean; hideSteps?: boolean; hasPayPal: boolean; hideBanking?: boolean; hidePayPal?: boolean; hideBalanceThreshold?: boolean; hideFixedDay?: boolean; hideBackButton: boolean; feeCap?: string; isPartner: boolean; paymentMethodFeeLabel?: string; loadingError: boolean; formState: BankingInfoFormData & { paymentMethodChecked?: "toBankAccount" \| "toPayPalAccount"; paymentScheduleChecked?: "BALANCE_THRESHOLD" \| "FIXED_DAY"; errors?: { general?: boolean; inputErrors?: { [field: string]: { type: "required" \| "invalid"; }; }; }; }; bitset?: number; currency?: string; thresholds: string[]; countries?: { countryCode: string; displayName: string; }[]; allCountries?: { countryCode: string; displayName: string; }[]; currentPaymentOption?: any; showInputs?: boolean; bankCountry?: string; countrySearch?: string; email?: string; showModal: boolean; }; slots?: { verificationDialogSlot?: VNode; formInputsSlot?: VNode[]; countryInputSlot?: VNode; paymentMethodSlot?: VNode; paymentThresholdSelectSlot?: VNode; paymentFixedDaySelectSlot?: VNode; paypalInputSlot?: VNode; }; refs?: { formRef: any; }; }` | `undefined` |
-| `directlyToBankAccount` | `directly-to-bank-account` | | `string` | `"Directly to my bank account"` |
-| `eftWithdrawalLabel` | `eft-withdrawal-label` | Default payment method to the participants’ bank account. | `string` | `"EFT withdrawal (free)"` |
-| `fieldInvalidError` | `field-invalid-error` | Displayed under a field when it has an invalid entry. | `string` | `"{fieldName} is invalid"` |
-| `fieldRequiredError` | `field-required-error` | Displayed under a field that is missing required information. | `string` | `"{fieldName} is required"` |
-| `foreignSelectItemLabel` | `foreign-select-item-label` | One of three options listed for the classification field | `string` | `"Foreign"` |
-| `formStep` | `form-step` | | `string` | `"Step {step} of {count}"` |
-| `fxWireProcessingFeeLabel` | `fx-wire-processing-fee-label` | | `string` | `"FX Wire (Processing Fee {currency}{defaultFxFee}.00)"` |
-| `generalErrorDescription` | `general-error-description` | Part of the alert displayed at the top of the page. | `string` | `"Please review your information and try again. If this problem continues, contact our {supportLink}."` |
-| `generalErrorTitle` | `general-error-title` | Part of the alert displayed at the top of the page. | `string` | `"There was a problem submitting your information"` |
-| `ibanLabel` | `iban-label` | | `string` | `"IBAN"` |
-| `individualSelectItemLabel` | `individual-select-item-label` | One of three options listed for the classification field | `string` | `"Individual"` |
-| `isPartnerAlertDescription` | `is-partner-alert-description` | Part of the alert displayed at the top of the page if the participant is already a registered partner on impact.com. | `string` | `"If you don’t recognize this referral program provider or believe this is a mistake, please contact our {supportLink} or sign up for this referral program with a different email."` |
-| `isPartnerAlertHeader` | `is-partner-alert-header` | Part of the alert displayed at the top of the page if the participant is already a registered partner on impact.com. | `string` | `"An account with this email already exists with our referral program provider, impact.com"` |
-| `loadingErrorAlertDescription` | `loading-error-alert-description` | Part of the alert displayed at the top of the page. | `string` | `"Please refresh the page and try again. If this problem continues, contact Support."` |
-| `loadingErrorAlertHeader` | `loading-error-alert-header` | Part of the alert displayed at the top of the page. | `string` | `"There was a problem loading your form"` |
-| `modalButtonText` | `modal-button-text` | | `string` | `"I understand, update my information"` |
-| `modalDescription` | `modal-description` | | `string` | `"Updating payment information places your account and payouts on hold for up to 48 hours while we verify your change. Payments scheduled during the hold period are skipped."` |
-| `modalTitle` | `modal-title` | | `string` | `"Important Note"` |
-| `patronymicNameLabel` | `patronymic-name-label` | | `string` | `"Patronymic name"` |
-| `payPalInputLabel` | `pay-pal-input-label` | Displayed to participants who choose PayPal as their payout method | `string` | `"PayPal email"` |
-| `paymentDayFifteenthOfMonthLabelText` | `payment-day-fifteenth-of-month-label-text` | Label text for the payment day select option for the fifteenth of the month | `string` | `"15th of the month"` |
-| `paymentDayFirstOfMonthLabelText` | `payment-day-first-of-month-label-text` | One of two payment day options | `string` | `"1st of the month"` |
-| `paymentDaySelectLabel` | `payment-day-select-label` | Let the participant choose what day of the month they’ll get paid | `string` | `"Payment Day"` |
-| `paymentMethod` | `payment-method` | | `string` | `"Payment method"` |
-| `paymentMethodSubtext` | `payment-method-subtext` | | `string` | `"Payouts will be sent from our referral program provider, impact.com."` |
-| `paymentSchedule` | `payment-schedule` | | `string` | `"Payment schedule"` |
-| `paymentScheduleBalanceThreshold` | `payment-schedule-balance-threshold` | | `string` | `"Pay me when my balance reaches a threshold"` |
-| `paymentScheduleFixedDay` | `payment-schedule-fixed-day` | | `string` | `"Pay me on a fixed day of the month"` |
-| `paymentThresholdSelectLabel` | `payment-threshold-select-label` | Participant use this field to select the balance at which they want to be paid | `string` | `"Payment Threshold"` |
-| `routingCodeLabel` | `routing-code-label` | | `string` | `"{bankCountry, select, AU {BSB number} CA {Routing number} CZ {Bank code} HK {Clearing code} SG {Clearing code} US {ABA routing number} NZ {BSB number} ZA {Bank/Branch number} IN {IFSC} CNY {CNAPS} other {Routing code} }"` |
-| `savingsSelectItemLabel` | `savings-select-item-label` | | `string` | `"Savings"` |
-| `searchForCountryText` | `search-for-country-text` | Placeholder text displayed in the country search dropdown | `string` | `"Search for country.."` |
-| `supportLink` | `support-link` | | `string` | `"support team"` |
-| `swiftCodeLabel` | `swift-code-label` | | `string` | `"SWIFT code"` |
-| `taxAndPayouts` | `tax-and-payouts` | | `string` | `"Payouts"` |
-| `taxAndPayoutsDescription` | `tax-and-payouts-description` | Displayed at the top of the page on all set up steps. | `string` | `"Submit your tax documents and add your banking information to receive your rewards."` |
-| `taxPayerIdLabel` | `tax-payer-id-label` | | `string` | `"{country, select, AR {CUIT/CUIL} KR {Classification ID} other { Beneficiary INN } }"` |
-| `toPayPalAccount` | `to-pay-pal-account` | | `string` | `"PayPal (2% processing fee capped to {feeCap})"` |
-| `verifyEmailDescriptionText` | `verify-email-description-text` | | `string` | `"Verify your email to update your payment settings. Enter the code sent to {email} from our referral provider, impact.com."` |
-| `verifyEmailHeaderText` | `verify-email-header-text` | Text for verify email dialog | `string` | `"Verify your email"` |
-| `voCodeLabel` | `vo-code-label` | | `string` | `"VO code"` |
+| Property | Attribute | Description | Type | Default |
+| ------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `agencyCodeError` | `agency-code-error` | Error messages for the agency code field. Supports error codes: empty, alphanumeric, tooShort | `string` | `"{errorCode, select, empty {Agency code is required} alphanumeric {Agency code must contain only letters and numbers} tooShort {Agency code must be at least 5 characters} other {{errorCode}}}"` |
+| `agencyCodeLabel` | `agency-code-label` | | `string` | `"Agency code"` |
+| `backButton` | `back-button` | Text for the back button in the form | `string` | `"Back"` |
+| `bankAccountNumberError` | `bank-account-number-error` | Error messages for the bank account number / IBAN field. Supports error codes: empty, invalidUk, invalid, ibanEmpty, ibanAlphanumeric, ibanInvalid, ibanCountryMismatch | `string` | `"{errorCode, select, empty {Account number is required} invalidUk {Please enter a valid UK account number} invalid {Account number is invalid} ibanEmpty {IBAN is required} ibanAlphanumeric {IBAN must contain only letters and numbers} ibanInvalid {IBAN is invalid} ibanCountryMismatch {UK accounts must use an IBAN starting with GB} other {{errorCode}}}"` |
+| `bankAccountNumberLabel` | `bank-account-number-label` | | `string` | `"Bank account number"` |
+| `bankAccountTypeError` | `bank-account-type-error` | Error messages for the bank account type field. Supports error codes: empty | `string` | `"{errorCode, select, empty {Bank account type is required} other {{errorCode}}}"` |
+| `bankAccountTypeLabel` | `bank-account-type-label` | | `string` | `"Bank account type"` |
+| `bankAddressError` | `bank-address-error` | Error messages for the bank address field. Supports error codes: empty | `string` | `"{errorCode, select, empty {Bank address is required} other {{errorCode}}}"` |
+| `bankAddressLabel` | `bank-address-label` | | `string` | `"Bank address"` |
+| `bankCityError` | `bank-city-error` | Error messages for the bank city field. Supports error codes: empty | `string` | `"{errorCode, select, empty {Bank city is required} other {{errorCode}}}"` |
+| `bankCityLabel` | `bank-city-label` | | `string` | `"Bank city"` |
+| `bankLocationLabel` | `bank-location-label` | | `string` | `"Bank country location"` |
+| `bankNameError` | `bank-name-error` | Error messages for the bank name field. Supports error codes: empty | `string` | `"{errorCode, select, empty {Bank name is required} other {{errorCode}}}"` |
+| `bankNameLabel` | `bank-name-label` | | `string` | `"Bank Name"` |
+| `bankPostalCodeError` | `bank-postal-code-error` | Error messages for the bank postal code field. Supports error codes: empty | `string` | `"{errorCode, select, empty {Bank postal code is required} other {{errorCode}}}"` |
+| `bankPostalCodeLabel` | `bank-postal-code-label` | | `string` | `"Bank postal code"` |
+| `bankStateError` | `bank-state-error` | Error messages for the bank province/state field. Supports error codes: empty | `string` | `"{errorCode, select, empty {Bank province/state is required} other {{errorCode}}}"` |
+| `bankStateLabel` | `bank-state-label` | | `string` | `"Bank province/state"` |
+| `beneficiaryAccountNameDescription` | `beneficiary-account-name-description` | | `string` | `"The beneficiary name of your bank account. Ensure this matches the name on your tax form."` |
+| `beneficiaryAccountNameError` | `beneficiary-account-name-error` | Error messages for the beneficiary / account holder name field. Supports error codes: empty, invalidCharacters, numeric, tooLong, nonEnglish, businessNameMismatch, nameMismatch, businessPayeeMismatch, payeeMismatch | `string` | `"{errorCode, select, empty {Account holder name is required} invalidCharacters {Account holder name contains invalid characters} numeric {Account holder name cannot be purely numeric} tooLong {Account holder name must be 70 characters or fewer} nonEnglish {Account holder name must contain only English characters for this currency} businessNameMismatch {Beneficiary name must match the name on your tax document} nameMismatch {Beneficiary name must match the name on your tax document} businessPayeeMismatch {Payee name must match the name on your tax document} payeeMismatch {Payee name must match the name on your tax document} other {{errorCode}}}"` |
+| `beneficiaryAccountNameLabel` | `beneficiary-account-name-label` | | `string` | `"Account holder name"` |
+| `branchCodeError` | `branch-code-error` | Error messages for the branch code field. Supports error codes: invalid | `string` | `"{errorCode, select, invalid {Branch code is invalid} other {{errorCode}}}"` |
+| `branchCodeLabel` | `branch-code-label` | | `string` | `"Branch code"` |
+| `branchNameError` | `branch-name-error` | Error messages for the branch name field. Supports error codes: empty | `string` | `"{errorCode, select, empty {Branch name is required} other {{errorCode}}}"` |
+| `businessSelectItemLabel` | `business-select-item-label` | One of three options listed for the classification field | `string` | `"Business"` |
+| `checkingSelectItemLabel` | `checking-select-item-label` | | `string` | `"Checking"` |
+| `classificationCPFLabel` | `classification-c-p-f-label` | | `string` | `"Classification CPF"` |
+| `classificationCodeError` | `classification-code-error` | Error messages for the classification code field. Supports error codes: empty, invalidKzt | `string` | `"{errorCode, select, empty {Classification code is required} invalidKzt {Classification code must be exactly 2 characters} other {{errorCode}}}"` |
+| `classificationEntityLabel` | `classification-entity-label` | | `string` | `"Classification Entity"` |
+| `classificationLabel` | `classification-label` | Label text for the classification input field | `string` | `"Classification"` |
+| `continueButton` | `continue-button` | | `string` | `"Save"` |
+| `demoData` | -- | | `{ states?: { showVerification: boolean; step?: string; locale?: string; loading: boolean; saveLoading?: boolean; disabled: boolean; saveDisabled: boolean; hideSteps?: boolean; hasPayPal: boolean; hideBanking?: boolean; hidePayPal?: boolean; hideBalanceThreshold?: boolean; hideFixedDay?: boolean; hideBackButton: boolean; feeCap?: string; isPartner: boolean; paymentMethodFeeLabel?: string; loadingError: boolean; formState: BankingInfoFormData & { paymentMethodChecked?: "toBankAccount" \| "toPayPalAccount"; paymentScheduleChecked?: "BALANCE_THRESHOLD" \| "FIXED_DAY"; errors?: { general?: boolean; inputErrors?: { [field: string]: { type: "required" \| "invalid"; errorCode?: string; }; }; }; }; bitset?: number; currency?: string; thresholds: string[]; countries?: { countryCode: string; displayName: string; }[]; allCountries?: { countryCode: string; displayName: string; }[]; currentPaymentOption?: any; showInputs?: boolean; bankCountry?: string; countrySearch?: string; email?: string; showModal: boolean; }; slots?: { verificationDialogSlot?: VNode; formInputsSlot?: VNode[]; countryInputSlot?: VNode; paymentMethodSlot?: VNode; paymentThresholdSelectSlot?: VNode; paymentFixedDaySelectSlot?: VNode; paypalInputSlot?: VNode; }; refs?: { formRef: any; }; }` | `undefined` |
+| `directlyToBankAccount` | `directly-to-bank-account` | | `string` | `"Directly to my bank account"` |
+| `eftWithdrawalLabel` | `eft-withdrawal-label` | Default payment method to the participants’ bank account. | `string` | `"EFT withdrawal (free)"` |
+| `fieldInvalidError` | `field-invalid-error` | Displayed under a field when it has an invalid entry. | `string` | `"{fieldName} is invalid"` |
+| `fieldRequiredError` | `field-required-error` | Displayed under a field that is missing required information. | `string` | `"{fieldName} is required"` |
+| `foreignSelectItemLabel` | `foreign-select-item-label` | One of three options listed for the classification field | `string` | `"Foreign"` |
+| `formStep` | `form-step` | | `string` | `"Step {step} of {count}"` |
+| `fxWireProcessingFeeLabel` | `fx-wire-processing-fee-label` | | `string` | `"FX Wire (Processing Fee {currency}{defaultFxFee}.00)"` |
+| `generalErrorDescription` | `general-error-description` | Part of the alert displayed at the top of the page. | `string` | `"Please review your information and try again. If this problem continues, contact our {supportLink}."` |
+| `generalErrorTitle` | `general-error-title` | Part of the alert displayed at the top of the page. | `string` | `"There was a problem submitting your information"` |
+| `ibanLabel` | `iban-label` | | `string` | `"IBAN"` |
+| `individualSelectItemLabel` | `individual-select-item-label` | One of three options listed for the classification field | `string` | `"Individual"` |
+| `isPartnerAlertDescription` | `is-partner-alert-description` | Part of the alert displayed at the top of the page if the participant is already a registered partner on impact.com. | `string` | `"If you don’t recognize this referral program provider or believe this is a mistake, please contact our {supportLink} or sign up for this referral program with a different email."` |
+| `isPartnerAlertHeader` | `is-partner-alert-header` | Part of the alert displayed at the top of the page if the participant is already a registered partner on impact.com. | `string` | `"An account with this email already exists with our referral program provider, impact.com"` |
+| `loadingErrorAlertDescription` | `loading-error-alert-description` | Part of the alert displayed at the top of the page. | `string` | `"Please refresh the page and try again. If this problem continues, contact Support."` |
+| `loadingErrorAlertHeader` | `loading-error-alert-header` | Part of the alert displayed at the top of the page. | `string` | `"There was a problem loading your form"` |
+| `modalButtonText` | `modal-button-text` | | `string` | `"I understand, update my information"` |
+| `modalDescription` | `modal-description` | | `string` | `"Updating payment information places your account and payouts on hold for up to 48 hours while we verify your change. Payments scheduled during the hold period are skipped."` |
+| `modalTitle` | `modal-title` | | `string` | `"Important Note"` |
+| `patronymicNameError` | `patronymic-name-error` | Error messages for the patronymic name field. Supports error codes: empty, alphanumeric | `string` | `"{errorCode, select, empty {Patronymic name is required} alphanumeric {Patronymic name must contain only letters and numbers} other {{errorCode}}}"` |
+| `patronymicNameLabel` | `patronymic-name-label` | | `string` | `"Patronymic name"` |
+| `payPalInputLabel` | `pay-pal-input-label` | Displayed to participants who choose PayPal as their payout method | `string` | `"PayPal email"` |
+| `paymentDayError` | `payment-day-error` | Error messages for the payment day field. Supports error codes: empty, invalid | `string` | `"{errorCode, select, empty {Payment day is required} invalid {Payment day must be the 1st or the 15th} other {{errorCode}}}"` |
+| `paymentDayFifteenthOfMonthLabelText` | `payment-day-fifteenth-of-month-label-text` | Label text for the payment day select option for the fifteenth of the month | `string` | `"15th of the month"` |
+| `paymentDayFirstOfMonthLabelText` | `payment-day-first-of-month-label-text` | One of two payment day options | `string` | `"1st of the month"` |
+| `paymentDaySelectLabel` | `payment-day-select-label` | Let the participant choose what day of the month they’ll get paid | `string` | `"Payment Day"` |
+| `paymentMethod` | `payment-method` | | `string` | `"Payment method"` |
+| `paymentMethodSubtext` | `payment-method-subtext` | | `string` | `"Payouts will be sent from our referral program provider, impact.com."` |
+| `paymentSchedule` | `payment-schedule` | | `string` | `"Payment schedule"` |
+| `paymentScheduleBalanceThreshold` | `payment-schedule-balance-threshold` | | `string` | `"Pay me when my balance reaches a threshold"` |
+| `paymentScheduleFixedDay` | `payment-schedule-fixed-day` | | `string` | `"Pay me on a fixed day of the month"` |
+| `paymentThresholdError` | `payment-threshold-error` | Error messages for the payment threshold field. Supports error codes: empty, invalid | `string` | `"{errorCode, select, empty {Payment threshold is required} invalid {Payment threshold is invalid} other {{errorCode}}}"` |
+| `paymentThresholdSelectLabel` | `payment-threshold-select-label` | Participant use this field to select the balance at which they want to be paid | `string` | `"Payment Threshold"` |
+| `paypalEmailError` | `paypal-email-error` | Error messages for the PayPal email field. Supports error codes: empty, unsupportedCurrency, invalidEmail, verificationIncomplete | `string` | `"{errorCode, select, empty {PayPal email is required} unsupportedCurrency {PayPal is not supported for this currency} invalidEmail {Please enter a valid email address} verificationIncomplete {PayPal verification is not complete} other {{errorCode}}}"` |
+| `routingCodeError` | `routing-code-error` | Error messages for the routing code / sort code / BSB field. Supports error codes: invalidBsb, invalidSortCode, empty, invalid | `string` | `"{errorCode, select, invalidBsb {Please enter a valid BSB number} invalidSortCode {Please enter a valid sort code} empty {Routing number is required} invalid {Routing number is invalid} other {{errorCode}}}"` |
+| `routingCodeLabel` | `routing-code-label` | | `string` | `"{bankCountry, select, AU {BSB number} CA {Routing number} CZ {Bank code} HK {Clearing code} SG {Clearing code} US {ABA routing number} NZ {BSB number} ZA {Bank/Branch number} IN {IFSC} CNY {CNAPS} other {Routing code} }"` |
+| `savingsSelectItemLabel` | `savings-select-item-label` | | `string` | `"Savings"` |
+| `searchForCountryText` | `search-for-country-text` | Placeholder text displayed in the country search dropdown | `string` | `"Search for country.."` |
+| `supportLink` | `support-link` | | `string` | `"support team"` |
+| `swiftCodeError` | `swift-code-error` | Error messages for the SWIFT / BIC code field. Supports error codes: empty, alphanumeric, invalid | `string` | `"{errorCode, select, empty {SWIFT/BIC code is required} alphanumeric {SWIFT/BIC code must contain only letters and numbers} invalid {SWIFT/BIC code is invalid} other {{errorCode}}}"` |
+| `swiftCodeLabel` | `swift-code-label` | | `string` | `"SWIFT code"` |
+| `taxAndPayouts` | `tax-and-payouts` | | `string` | `"Payouts"` |
+| `taxAndPayoutsDescription` | `tax-and-payouts-description` | Displayed at the top of the page on all set up steps. | `string` | `"Submit your tax documents and add your banking information to receive your rewards."` |
+| `taxPayerIdError` | `tax-payer-id-error` | Error messages for the tax payer ID / classification entity field. Supports error codes: empty, emptyAr, emptyKr, alphanumeric, alphanumericAr, alphanumericKr, invalid, invalidAr, invalidKr, invalidKzt, cnpjTooShort, cpfTooShort | `string` | `"{errorCode, select, empty {Tax payer ID is required} emptyAr {CUIT/CUIL is required} emptyKr {Classification ID is required} alphanumeric {Tax payer ID must contain only letters and numbers} alphanumericAr {CUIT/CUIL must contain only letters and numbers} alphanumericKr {Classification ID must contain only letters and numbers} invalid {Tax payer ID is invalid} invalidAr {CUIT/CUIL must be 11 characters} invalidKr {Classification ID length is invalid} invalidKzt {Tax payer ID must be 12 characters for KZT} cnpjTooShort {CNPJ must be at least 14 characters} cpfTooShort {CPF must be at least 11 characters} other {{errorCode}}}"` |
+| `taxPayerIdLabel` | `tax-payer-id-label` | | `string` | `"{country, select, AR {CUIT/CUIL} KR {Classification ID} other { Beneficiary INN } }"` |
+| `toPayPalAccount` | `to-pay-pal-account` | | `string` | `"PayPal (2% processing fee capped to {feeCap})"` |
+| `verifyEmailDescriptionText` | `verify-email-description-text` | | `string` | `"Verify your email to update your payment settings. Enter the code sent to {email} from our referral provider, impact.com."` |
+| `verifyEmailHeaderText` | `verify-email-header-text` | Text for verify email dialog | `string` | `"Verify your email"` |
+| `voCodeError` | `vo-code-error` | Error messages for the VO code field. Supports error codes: empty, alphanumeric | `string` | `"{errorCode, select, empty {VO code is required} alphanumeric {VO code must contain only letters and numbers} other {{errorCode}}}"` |
+| `voCodeLabel` | `vo-code-label` | | `string` | `"VO code"` |
## Dependencies
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/sqm-banking-info-form-view.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/sqm-banking-info-form-view.tsx
index 806eaf113..381988224 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/sqm-banking-info-form-view.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/sqm-banking-info-form-view.tsx
@@ -32,6 +32,7 @@ export interface BankingInfoFormViewProps {
inputErrors?: {
[field: string]: {
type: "required" | "invalid";
+ errorCode?: string;
};
};
};
@@ -105,6 +106,7 @@ export interface BankingInfoFormViewProps {
generalTitle: string;
generalDescription: string;
};
+ errorMessages?: { [field: string]: string };
};
refs: {
formRef: any;
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/sqm-banking-info-form.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/sqm-banking-info-form.tsx
index 2a674f973..8d005baa3 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/sqm-banking-info-form.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/sqm-banking-info-form.tsx
@@ -350,6 +350,197 @@ export class BankingInfoForm {
*/
@Prop() modalButtonText: string = "I understand, update my information";
+ // ──────────────────────────────────────────────────────────────────
+ // Per-field validation error messages
+ // Each prop uses ICU select on {errorCode} to pick the right message.
+ // Error codes are short frontend keys mapped from the API error codes.
+ // The `other` branch displays the raw API message directly via {errorCode},
+ // which is already human-readable English (e.g. "Invalid Routing Code").
+ // ──────────────────────────────────────────────────────────────────
+
+ /**
+ * Error messages for the beneficiary / account holder name field.
+ * Supports error codes: empty, invalidCharacters, numeric, tooLong,
+ * nonEnglish, businessNameMismatch, nameMismatch, businessPayeeMismatch, payeeMismatch
+ * @uiName Beneficiary account name error
+ * @uiWidget textArea
+ */
+ @Prop() beneficiaryAccountNameError: string =
+ "{errorCode, select, empty {Account holder name is required} invalidCharacters {Account holder name contains invalid characters} numeric {Account holder name cannot be purely numeric} tooLong {Account holder name must be 70 characters or fewer} nonEnglish {Account holder name must contain only English characters for this currency} businessNameMismatch {Beneficiary name must match the name on your tax document} nameMismatch {Beneficiary name must match the name on your tax document} businessPayeeMismatch {Payee name must match the name on your tax document} payeeMismatch {Payee name must match the name on your tax document} other {{errorCode}}}";
+
+ /**
+ * Error messages for the bank account number / IBAN field.
+ * Supports error codes: empty, invalidUk, invalid, ibanEmpty,
+ * ibanAlphanumeric, ibanInvalid, ibanCountryMismatch
+ * @uiName Bank account number / IBAN error
+ * @uiWidget textArea
+ */
+ @Prop() bankAccountNumberError: string =
+ "{errorCode, select, empty {Account number is required} invalidUk {Please enter a valid UK account number} invalid {Account number is invalid} ibanEmpty {IBAN is required} ibanAlphanumeric {IBAN must contain only letters and numbers} ibanInvalid {IBAN is invalid} ibanCountryMismatch {UK accounts must use an IBAN starting with GB} other {{errorCode}}}";
+
+ /**
+ * Error messages for the routing code / sort code / BSB field.
+ * Supports error codes: invalidBsb, invalidSortCode, empty, invalid
+ * @uiName Routing code error
+ * @uiWidget textArea
+ */
+ @Prop() routingCodeError: string =
+ "{errorCode, select, invalidBsb {Please enter a valid BSB number} invalidSortCode {Please enter a valid sort code} empty {Routing number is required} invalid {Routing number is invalid} other {{errorCode}}}";
+
+ /**
+ * Error messages for the SWIFT / BIC code field.
+ * Supports error codes: empty, alphanumeric, invalid
+ * @uiName SWIFT code error
+ * @uiWidget textArea
+ */
+ @Prop() swiftCodeError: string =
+ "{errorCode, select, empty {SWIFT/BIC code is required} alphanumeric {SWIFT/BIC code must contain only letters and numbers} invalid {SWIFT/BIC code is invalid} other {{errorCode}}}";
+
+ /**
+ * Error messages for the bank account type field.
+ * Supports error codes: empty
+ * @uiName Bank account type error
+ * @uiWidget textArea
+ */
+ @Prop() bankAccountTypeError: string =
+ "{errorCode, select, empty {Bank account type is required} other {{errorCode}}}";
+
+ /**
+ * Error messages for the bank name field.
+ * Supports error codes: empty
+ * @uiName Bank name error
+ * @uiWidget textArea
+ */
+ @Prop() bankNameError: string =
+ "{errorCode, select, empty {Bank name is required} other {{errorCode}}}";
+
+ /**
+ * Error messages for the tax payer ID / classification entity field.
+ * Supports error codes: empty, emptyAr, emptyKr, alphanumeric, alphanumericAr,
+ * alphanumericKr, invalid, invalidAr, invalidKr, invalidKzt, cnpjTooShort, cpfTooShort
+ * @uiName Tax payer ID error
+ * @uiWidget textArea
+ */
+ @Prop() taxPayerIdError: string =
+ "{errorCode, select, empty {Tax payer ID is required} emptyAr {CUIT/CUIL is required} emptyKr {Classification ID is required} alphanumeric {Tax payer ID must contain only letters and numbers} alphanumericAr {CUIT/CUIL must contain only letters and numbers} alphanumericKr {Classification ID must contain only letters and numbers} invalid {Tax payer ID is invalid} invalidAr {CUIT/CUIL must be 11 characters} invalidKr {Classification ID length is invalid} invalidKzt {Tax payer ID must be 12 characters for KZT} cnpjTooShort {CNPJ must be at least 14 characters} cpfTooShort {CPF must be at least 11 characters} other {{errorCode}}}";
+
+ /**
+ * Error messages for the patronymic name field.
+ * Supports error codes: empty, alphanumeric
+ * @uiName Patronymic name error
+ * @uiWidget textArea
+ */
+ @Prop() patronymicNameError: string =
+ "{errorCode, select, empty {Patronymic name is required} alphanumeric {Patronymic name must contain only letters and numbers} other {{errorCode}}}";
+
+ /**
+ * Error messages for the VO code field.
+ * Supports error codes: empty, alphanumeric
+ * @uiName VO code error
+ * @uiWidget textArea
+ */
+ @Prop() voCodeError: string =
+ "{errorCode, select, empty {VO code is required} alphanumeric {VO code must contain only letters and numbers} other {{errorCode}}}";
+
+ /**
+ * Error messages for the agency code field.
+ * Supports error codes: empty, alphanumeric, tooShort
+ * @uiName Agency code error
+ * @uiWidget textArea
+ */
+ @Prop() agencyCodeError: string =
+ "{errorCode, select, empty {Agency code is required} alphanumeric {Agency code must contain only letters and numbers} tooShort {Agency code must be at least 5 characters} other {{errorCode}}}";
+
+ /**
+ * Error messages for the bank address field.
+ * Supports error codes: empty
+ * @uiName Bank address error
+ * @uiWidget textArea
+ */
+ @Prop() bankAddressError: string =
+ "{errorCode, select, empty {Bank address is required} other {{errorCode}}}";
+
+ /**
+ * Error messages for the bank city field.
+ * Supports error codes: empty
+ * @uiName Bank city error
+ * @uiWidget textArea
+ */
+ @Prop() bankCityError: string =
+ "{errorCode, select, empty {Bank city is required} other {{errorCode}}}";
+
+ /**
+ * Error messages for the bank province/state field.
+ * Supports error codes: empty
+ * @uiName Bank province/state error
+ * @uiWidget textArea
+ */
+ @Prop() bankStateError: string =
+ "{errorCode, select, empty {Bank province/state is required} other {{errorCode}}}";
+
+ /**
+ * Error messages for the bank postal code field.
+ * Supports error codes: empty
+ * @uiName Bank postal code error
+ * @uiWidget textArea
+ */
+ @Prop() bankPostalCodeError: string =
+ "{errorCode, select, empty {Bank postal code is required} other {{errorCode}}}";
+
+ /**
+ * Error messages for the branch code field.
+ * Supports error codes: invalid
+ * @uiName Branch code error
+ * @uiWidget textArea
+ */
+ @Prop() branchCodeError: string =
+ "{errorCode, select, invalid {Branch code is invalid} other {{errorCode}}}";
+
+ /**
+ * Error messages for the branch name field.
+ * Supports error codes: empty
+ * @uiName Branch name error
+ * @uiWidget textArea
+ */
+ @Prop() branchNameError: string =
+ "{errorCode, select, empty {Branch name is required} other {{errorCode}}}";
+
+ /**
+ * Error messages for the classification code field.
+ * Supports error codes: empty, invalidKzt
+ * @uiName Classification code error
+ * @uiWidget textArea
+ */
+ @Prop() classificationCodeError: string =
+ "{errorCode, select, empty {Classification code is required} invalidKzt {Classification code must be exactly 2 characters} other {{errorCode}}}";
+
+ /**
+ * Error messages for the PayPal email field.
+ * Supports error codes: empty, unsupportedCurrency, invalidEmail, verificationIncomplete
+ * @uiName PayPal email error
+ * @uiWidget textArea
+ */
+ @Prop() paypalEmailError: string =
+ "{errorCode, select, empty {PayPal email is required} unsupportedCurrency {PayPal is not supported for this currency} invalidEmail {Please enter a valid email address} verificationIncomplete {PayPal verification is not complete} other {{errorCode}}}";
+
+ /**
+ * Error messages for the payment threshold field.
+ * Supports error codes: empty, invalid
+ * @uiName Payment threshold error
+ * @uiWidget textArea
+ */
+ @Prop() paymentThresholdError: string =
+ "{errorCode, select, empty {Payment threshold is required} invalid {Payment threshold is invalid} other {{errorCode}}}";
+
+ /**
+ * Error messages for the payment day field.
+ * Supports error codes: empty, invalid
+ * @uiName Payment day error
+ * @uiWidget textArea
+ */
+ @Prop() paymentDayError: string =
+ "{errorCode, select, empty {Payment day is required} invalid {Payment day must be the 1st or the 15th} other {{errorCode}}}";
+
/**
* @undocumented
* @uiType object
@@ -373,6 +564,28 @@ export class BankingInfoForm {
loadingErrorAlertDescription: props.loadingErrorAlertDescription,
loadingErrorAlertHeader: props.loadingErrorAlertHeader,
},
+ errorMessages: {
+ beneficiaryAccountName: props.beneficiaryAccountNameError,
+ bankAccountNumber: props.bankAccountNumberError,
+ routingCode: props.routingCodeError,
+ swiftCode: props.swiftCodeError,
+ bankAccountType: props.bankAccountTypeError,
+ bankName: props.bankNameError,
+ taxPayerId: props.taxPayerIdError,
+ patronymicName: props.patronymicNameError,
+ voCode: props.voCodeError,
+ agencyCode: props.agencyCodeError,
+ bankAddress: props.bankAddressError,
+ bankCity: props.bankCityError,
+ bankState: props.bankStateError,
+ bankPostalCode: props.bankPostalCodeError,
+ branchCode: props.branchCodeError,
+ branchName: props.branchNameError,
+ beneficiaryClassification: props.classificationCodeError,
+ paypalEmailAddress: props.paypalEmailError,
+ paymentThreshold: props.paymentThresholdError,
+ paymentDay: props.paymentDayError,
+ },
};
}
@@ -389,10 +602,32 @@ export class BankingInfoForm {
function getValidationErrorMessage({
type,
label,
+ errorCode,
+ fieldName,
}: {
type: "required" | "invalid";
label: string;
+ errorCode?: string;
+ fieldName?: string;
}) {
+ // If we have a specific error code from the API, try to use
+ // the per-field ICU error message template for a rich message
+ if (type === "invalid" && errorCode && fieldName) {
+ const errorTemplate = props.text.errorMessages?.[fieldName];
+ if (errorTemplate) {
+ return intl.formatMessage(
+ {
+ id: `fieldError-${fieldName}-${errorCode}`,
+ defaultMessage: errorTemplate,
+ },
+ {
+ errorCode,
+ fieldName: label,
+ }
+ );
+ }
+ }
+
if (type === "required") {
return intl.formatMessage(
{
@@ -525,6 +760,8 @@ export class BankingInfoForm {
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.bankCountry?.type,
label: props.text.bankLocationLabel,
+ errorCode: errors?.inputErrors?.bankCountry?.errorCode,
+ fieldName: "bankCountry",
}),
})}
>
@@ -578,6 +815,8 @@ export class BankingInfoForm {
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.paymentThreshold?.type,
label: props.text.paymentThresholdSelectLabel,
+ errorCode: errors?.inputErrors?.paymentThreshold?.errorCode,
+ fieldName: "paymentThreshold",
}),
})}
>
@@ -601,6 +840,8 @@ export class BankingInfoForm {
helpText: getValidationErrorMessage({
type: errors?.inputErrors?.paymentDay?.type,
label: props.text.paymentDaySelectLabel,
+ errorCode: errors?.inputErrors?.paymentDay?.errorCode,
+ fieldName: "paymentDay",
}),
})}
>
@@ -629,6 +870,10 @@ export class BankingInfoForm {
type: props.states.formState?.errors?.inputErrors
?.paypalEmailAddress?.type,
label: props.text.payPalInputLabel,
+ errorCode:
+ props.states.formState?.errors?.inputErrors
+ ?.paypalEmailAddress?.errorCode,
+ fieldName: "paypalEmailAddress",
}),
})}
>
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/useBankingInfoForm.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/useBankingInfoForm.tsx
index 09a1cb7bf..f8303c24a 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/useBankingInfoForm.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-banking-info-form/useBankingInfoForm.tsx
@@ -9,7 +9,7 @@ import {
} from "@saasquatch/component-boilerplate";
import { useEffect, useRef, useState } from "@saasquatch/universal-hooks";
import { gql } from "graphql-request";
-import JSONPointer, { set } from "jsonpointer";
+import JSONPointer from "jsonpointer";
import { intl } from "../../../global/global";
import { VERIFICATION_EVENT_KEY } from "../../sqm-widget-verification/keys";
import {
@@ -49,6 +49,115 @@ const ACH_PAYMENT_METHOD = 3;
const WIRE_PAYMENT_METHOD = 5;
const PAYPAL_PAYMENT_METHOD = 7;
+/**
+ * Maps GraphQL validation error field names to form field names.
+ */
+const API_FIELD_TO_FORM_FIELD: Record = {
+ // bankProvinceState → form uses bankState
+ bankProvinceState: "bankState",
+};
+
+/**
+ * Maps Impact API error code paths (from validationErrors[].errorPath) to short,
+ * readable frontend error codes used in the ICU select props.
+ */
+const API_ERROR_PATH_TO_FRONTEND: Record = {
+ // Beneficiary account name
+ "withdrawal.settings.error.empty_beneficiaryname": "empty",
+ "withdrawal.settings.error.invalid_character_beneficiaryname":
+ "invalidCharacters",
+ "withdrawal.settings.error.numeric_beneficiaryname": "numeric",
+ "withdrawal_settings.error.beneficiaryname.size": "tooLong",
+ "withdrawal.settings.error.non_english_beneficiaryname": "nonEnglish",
+ "withdrawal_settings.error.business_beneficiaryname_match":
+ "businessNameMismatch",
+ "withdrawal_settings.error.beneficiaryname_match": "nameMismatch",
+ "withdrawal_settings.error.business_checkpayeename_match":
+ "businessPayeeMismatch",
+ "withdrawal_settings.error.checkpayeename_match": "payeeMismatch",
+
+ // Bank account number
+ "withdrawal.settings.error.accountnumber.empty": "empty",
+ "withdrawal.settings.error.accountnumber.uk": "invalidUk",
+ "withdrawal.settings.error.bankaccount.invalid": "invalid",
+
+ // IBAN
+ "withdrawal.settings.error.iban": "ibanEmpty",
+ "withdrawal.settings.error.iban.alphanumeric": "ibanAlphanumeric",
+ "withdrawal.settings.error.iban.invalid": "ibanInvalid",
+ "withdrawal.settings.error.iban.uk.country.mismatch": "ibanCountryMismatch",
+
+ // Routing code
+ "withdrawal.settings.error.bsbNumber": "invalidBsb",
+ "withdrawal.settings.error.sortcode": "invalidSortCode",
+ "withdrawal.settings.error.routingNumber": "empty",
+ "withdrawal.settings.error.routingcode": "invalid",
+
+ // SWIFT / BIC
+ "withdrawal.settings.error.bic": "empty",
+ "withdrawal.settings.error.bic.alphanumeric": "alphanumeric",
+ "withdrawal.settings.error.bic.invalid": "invalid",
+
+ // Bank account type
+ "global.error.invalid.accounttype": "empty",
+
+ // Bank name
+ "withdrawal.settings.error.bankName": "empty",
+
+ // Tax payer ID
+ "withdrawal.settings.error.taxPayerId": "empty",
+ "withdrawal.settings.error.taxPayerId.ar": "emptyAr",
+ "withdrawal.settings.error.taxPayerId.kr": "emptyKr",
+ "withdrawal.settings.error.taxPayerId.alphanumeric": "alphanumeric",
+ "withdrawal.settings.error.taxPayerId.alphanumeric.ar": "alphanumericAr",
+ "withdrawal.settings.error.taxPayerId.alphanumeric.kr": "alphanumericKr",
+ "withdrawal.settings.error.taxPayerId.invalid": "invalid",
+ "withdrawal.settings.error.taxPayerId.invalid.ar": "invalidAr",
+ "withdrawal.settings.error.taxPayerId.invalid.kr": "invalidKr",
+ "withdrawal.settings.error.taxPayerId.invalid.kzt": "invalidKzt",
+ "withdrawal.settings.error.taxPayerId.cnpj": "cnpjTooShort",
+ "withdrawal.settings.error.taxPayerId.cpf": "cpfTooShort",
+
+ // Patronymic name
+ "withdrawal.settings.error.patronymicName": "empty",
+ "withdrawal.settings.error.patronymicName.alphanumeric": "alphanumeric",
+
+ // VO code
+ "withdrawal.settings.error.voCode": "empty",
+ "withdrawal.settings.error.voCode.alphanumeric": "alphanumeric",
+
+ // Agency code
+ "withdrawal.settings.error.agencyCode": "empty",
+ "withdrawal.settings.error.agencyCode.alphanumeric": "alphanumeric",
+ "withdrawal.settings.error.agencyCode.length": "tooShort",
+
+ // Bank address fields
+ "withdrawal.settings.error.bankAddress": "empty",
+ "withdrawal.settings.error.bankCity": "empty",
+ "withdrawal.settings.error.bankProvinceState": "empty",
+ "withdrawal.settings.error.bankPostalCode": "empty",
+
+ // Branch code / name
+ "withdrawal.settings.error.branchCode": "invalid",
+ "withdrawal.settings.error.branchName": "empty",
+
+ // Classification code
+ "withdrawal.settings.error.classificationCode.invalid": "empty",
+ "withdrawal.settings.error.classificationCode.invalid.kzt": "invalidKzt",
+
+ // PayPal
+ "payment.error.email": "empty",
+ "payment.error.paypal_not_supported": "unsupportedCurrency",
+ "payment.error.email.invalid": "invalidEmail",
+ "payment.error.paypal_verification_incomplete": "verificationIncomplete",
+
+ // Payment schedule
+ "payment.error.no_threshold": "empty",
+ "payment.error.invalid_threshold": "invalid",
+ "payment.error.no_dayOfMonth": "empty",
+ "payment.error.invalid_dayOfMonth": "invalid",
+};
+
export type BankingInfoFormData = {
// Fields that are auto-filled
bankCountry?: string;
@@ -101,7 +210,11 @@ export function getFormInputs({ bitset, formMap }) {
type SetImpactPublisherWithdrawalSettingsResult = {
setImpactPublisherWithdrawalSettings: {
success: boolean;
- validationErrors: { field: string; message: string }[];
+ validationErrors: {
+ field: string;
+ message: string;
+ errorPath: string;
+ }[];
};
};
type SetImpactPublisherWithdrawalSettingsInput = {
@@ -120,7 +233,11 @@ type UpdateImpactPublisherWithdrawalSettingsInput =
type UpdateImpactPublisherWithdrawalSettingsResult = {
updateImpactPublisherWithdrawalSettings: {
success: boolean;
- validationErrors: { field: string; message: string }[];
+ validationErrors: {
+ field: string;
+ message: string;
+ errorPath: string;
+ }[];
};
};
@@ -135,6 +252,7 @@ const SAVE_WITHDRAWAL_SETTINGS = gql`
validationErrors {
field
message
+ code
}
}
}
@@ -151,6 +269,7 @@ const UPDATE_WITHDRAWAL_SETTINGS = gql`
validationErrors {
field
message
+ code
}
}
}
@@ -176,7 +295,7 @@ function parseImpactThreshold(threshold: string) {
}
export function useBankingInfoForm(
- props: BankingInfoForm
+ props: BankingInfoForm,
): BankingInfoFormViewProps {
const host = useHost();
const locale = useLocale();
@@ -193,7 +312,7 @@ export function useBankingInfoForm(
loading: paymentOptionsLoading,
errors: paymentOptionsError,
} = useParentQueryValue(
- FINANCE_NETWORK_SETTINGS_NAMESPACE
+ FINANCE_NETWORK_SETTINGS_NAMESPACE,
);
const {
data: userData,
@@ -202,11 +321,11 @@ export function useBankingInfoForm(
} = useParentQueryValue(USER_QUERY_NAMESPACE);
const [saveWithdrawalSettings] =
useMutation(
- SAVE_WITHDRAWAL_SETTINGS
+ SAVE_WITHDRAWAL_SETTINGS,
);
const [updateWithdrawalSettings] =
useMutation(
- UPDATE_WITHDRAWAL_SETTINGS
+ UPDATE_WITHDRAWAL_SETTINGS,
);
const [showVerification, setShowVerification] = useState(false);
@@ -244,14 +363,14 @@ export function useBankingInfoForm(
{
currency: currency,
defaultFxFee: currentPaymentOption?.defaultFxFee || 0,
- }
+ },
),
};
const paymentMethodFeeLabel =
paymentMethodFeeMap[currentPaymentOption?.defaultFinancePaymentMethodId];
const hasPayPal = !!paymentOptions?.find(
- (option) => option.defaultFinancePaymentMethodId === PAYPAL_PAYMENT_METHOD
+ (option) => option.defaultFinancePaymentMethodId === PAYPAL_PAYMENT_METHOD,
);
const paymentMethodChecked = !hasPayPal
@@ -282,7 +401,7 @@ export function useBankingInfoForm(
paypalEmailAddress: withdrawalSettings.paypalEmailAddress,
paymentSchedulingType: withdrawalSettings.paymentSchedulingType,
paymentThreshold: parseImpactThreshold(
- withdrawalSettings.paymentThreshold
+ withdrawalSettings.paymentThreshold,
),
paymentDay: withdrawalSettings.paymentDay,
};
@@ -305,7 +424,7 @@ export function useBankingInfoForm(
setPaymentMethodChecked(
initialData.paymentMethod === "PAYPAL"
? "toPayPalAccount"
- : "toBankAccount"
+ : "toBankAccount",
);
setCurrentPaymentOption(currentPaymentOption);
setPaymentScheduleChecked(initialData.paymentSchedulingType);
@@ -319,8 +438,8 @@ export function useBankingInfoForm(
} else {
setFilteredCountries(
countries.filter((c) =>
- c.displayName.toLowerCase().includes(countrySearch.toLowerCase())
- ) || []
+ c.displayName.toLowerCase().includes(countrySearch.toLowerCase()),
+ ) || [],
);
}
}, [countrySearch, countries]);
@@ -390,15 +509,19 @@ export function useBankingInfoForm(
const mappedValidationErrors = validationErrors?.reduce(
(agg, error) => {
+ const formField =
+ API_FIELD_TO_FORM_FIELD[error.field] || error.field;
+ const errorCode =
+ API_ERROR_PATH_TO_FRONTEND[error.errorPath] || error.errorPath;
return {
...agg,
-
- [error.field]: {
+ [formField]: {
type: "invalid",
+ errorCode,
},
};
},
- {}
+ {},
);
setErrors({
@@ -469,12 +592,12 @@ export function useBankingInfoForm(
new CustomEvent(VERIFICATION_EVENT_KEY, {
detail: { token },
bubbles: false,
- })
+ }),
);
};
function setPaymentMethodChecked(
- paymentMethod: "toBankAccount" | "toPayPalAccount"
+ paymentMethod: "toBankAccount" | "toPayPalAccount",
) {
_setPaymentMethodChecked(paymentMethod);
@@ -486,7 +609,7 @@ export function useBankingInfoForm(
setCurrentPaymentOption(currentPaymentOption);
} else if (paymentMethod === "toBankAccount") {
const currentPaymentOption = paymentOptions?.find(
- (paymentOption) => paymentOption.countryCode === formState.bankCountry
+ (paymentOption) => paymentOption.countryCode === formState.bankCountry,
);
setCurrentPaymentOption(currentPaymentOption);
}
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash-dashboard/useTaxAndCashDashboard.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash-dashboard/useTaxAndCashDashboard.tsx
index cb43daf71..3557aa2ab 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash-dashboard/useTaxAndCashDashboard.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash-dashboard/useTaxAndCashDashboard.tsx
@@ -62,7 +62,7 @@ function getIndirectTaxType(taxInformation: ImpactPublisher["taxInformation"]) {
if (taxInformation?.indirectTaxRegion) {
const standardRegion = taxInformation.indirectTaxRegion.replace("_", "");
const taxType = regions.find(
- (r) => r.regionCode === standardRegion
+ (r) => r.regionCode === standardRegion,
)?.taxType;
if (taxType) return taxType;
@@ -78,7 +78,7 @@ function getIndirectTaxType(taxInformation: ImpactPublisher["taxInformation"]) {
}
export const useTaxAndCashDashboard = (
- props: TaxAndCashDashboard
+ props: TaxAndCashDashboard,
): Omit => {
const setStep = useSetParent(TAX_CONTEXT_NAMESPACE);
const setContext = useSetParent(TAX_FORM_CONTEXT_NAMESPACE);
@@ -91,7 +91,7 @@ export const useTaxAndCashDashboard = (
const { data: taxSettingRes } = useQuery(
GET_TAX_SETTING,
- {}
+ {},
);
const locale = useLocale();
@@ -147,7 +147,7 @@ export const useTaxAndCashDashboard = (
};
const provinceName = INDIRECT_TAX_PROVINCES.find(
- (p) => p.regionCode === publisher?.taxInformation?.indirectTaxRegion
+ (p) => p.regionCode === publisher?.taxInformation?.indirectTaxRegion,
)?.displayName;
const payoutStatus = data ? getStatus(data) : null;
@@ -179,7 +179,7 @@ export const useTaxAndCashDashboard = (
province: provinceName,
country: getCountryName(
publisher?.taxInformation?.indirectTaxCountryCode,
- locale
+ locale,
),
notRegistered: !publisher?.taxInformation?.indirectTaxId,
noFormNeeded: !documentType,
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/useTaxAndCash.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/useTaxAndCash.tsx
index 2d3cd65de..2a7df7ae1 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/useTaxAndCash.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/useTaxAndCash.tsx
@@ -44,7 +44,24 @@ function getCurrentStep(user: UserQuery["user"]) {
withdrawalSettings,
brandedSignup,
payoutsAccount,
+ billingAddress,
+ phoneNumber,
+ billingCity,
+ billingPostalCode,
+ billingState,
} = user.impactConnection.publisher;
+ console.log(phoneNumber, "phone number in getCurrentStep");
+
+ // Early partner creation does not collect these fields
+ if (
+ !billingAddress ||
+ !billingCity ||
+ !billingPostalCode ||
+ !billingState ||
+ !phoneNumber
+ ) {
+ return "/1";
+ }
// If they do have a required document, look at current document
if (requiredTaxDocumentType && !currentTaxDocument) {
@@ -97,7 +114,7 @@ export function useTaxAndCash() {
{
namespace: CURRENCIES_NAMESPACE,
initialValue: [],
- }
+ },
);
const [_countriesContext, _setCountriesContext] = useParentState<
@@ -158,7 +175,7 @@ export function useTaxAndCash() {
financeNetworkData?.impactFinanceNetworkSettings?.data?.reduce(
(agg, settings) => {
const currency = currenciesData?.currencies?.data?.find(
- (currency) => currency.currencyCode === settings.currency
+ (currency) => currency.currencyCode === settings.currency,
);
// Currency not in supported list
if (!currency) return agg;
@@ -176,7 +193,7 @@ export function useTaxAndCash() {
return [...agg, currency];
},
- []
+ [],
);
return allValidCurrencies;
}, [financeNetworkData, countryCode]);
@@ -194,9 +211,9 @@ export function useTaxAndCash() {
new Set(
paymentOptions
?.map((option) => option.countryCode)
- .filter((value) => value)
+ .filter((value) => value),
),
- [paymentOptions]
+ [paymentOptions],
);
const _topCountries = ["CA", "GB", "US"];
@@ -205,7 +222,7 @@ export function useTaxAndCash() {
() =>
Array.from(availableCountries)
.map((countryCode) =>
- getCountryObj({ countryCode, locale: intlLocale })
+ getCountryObj({ countryCode, locale: intlLocale }),
)
.sort(sortByName)
.reduce((prev, countryObj) => {
@@ -213,7 +230,7 @@ export function useTaxAndCash() {
return [countryObj, ...prev];
return [...prev, countryObj];
}, []),
- [availableCountries]
+ [availableCountries],
);
useEffect(() => {
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form-view.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form-view.tsx
index 07897c630..fb95a0cbe 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form-view.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form-view.tsx
@@ -413,7 +413,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
{text.termsAndConditionsLabel}
),
- }
+ },
);
let regionLabel = undefined;
@@ -431,7 +431,14 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
regionLabel = text.state;
}
+ // when creating an impact connection without sending phoneNumber data, the impactAPI defaults the value to "000000" and the phoneNumberCountryCode to "DZ"
function isDisabledPartnerInput(field: string) {
+ if (
+ data.partnerData.phoneNumber === "0000000" &&
+ (field === "phoneNumber" || field === "phoneNumberCountryCode")
+ ) {
+ return false;
+ }
return states.isPartner && !!data.partnerData?.[field];
}
@@ -469,7 +476,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
{text.supportLink}
),
- }
+ },
)}
@@ -489,7 +496,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
id: "formStep",
defaultMessage: text.formStep,
},
- { step: states.step, count: FORM_STEPS }
+ { step: states.step, count: FORM_STEPS },
)}
)}
@@ -518,7 +525,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
{text.supportLink}
),
- }
+ },
)}
@@ -542,7 +549,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
{text.supportLink}
),
- }
+ },
)}
@@ -561,7 +568,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.firstName,
- formState.errors.firstName
+ formState.errors.firstName,
),
}
: {})}
@@ -579,7 +586,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.lastName,
- formState.errors.lastName
+ formState.errors.lastName,
),
}
: {})}
@@ -611,7 +618,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.country,
- formState.errors.countryCode
+ formState.errors.countryCode,
),
}
: {})}
@@ -710,7 +717,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
validateBillingField(/[a-zA-Z]+/, value) &&
formatErrorMessage(
text.phoneNumber,
- text.error.fieldInvalidError
+ text.error.fieldInvalidError,
);
}}
disabled={
@@ -721,7 +728,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.phoneNumber,
- formState.errors.phoneNumber
+ formState.errors.phoneNumber,
),
}
: {})}
@@ -740,7 +747,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
!validateBillingField(/^[\x20-\xFF]+$/, value) &&
formatErrorMessage(
text.address,
- text.error.invalidCharacterError
+ text.error.invalidCharacterError,
)
}
disabled={
@@ -751,7 +758,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.address,
- formState.errors.address
+ formState.errors.address,
),
}
: {})}
@@ -768,7 +775,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
!validateBillingField(/^[\x20-\xFF]+$/, value) &&
formatErrorMessage(
text.city,
- text.error.invalidCharacterError
+ text.error.invalidCharacterError,
)
}
disabled={
@@ -779,7 +786,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.city,
- formState.errors.city
+ formState.errors.city,
),
}
: {})}
@@ -800,7 +807,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.state,
- formState.errors.state
+ formState.errors.state,
),
}
: {})}
@@ -825,7 +832,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.postalCode,
- formState.errors.postalCode
+ formState.errors.postalCode,
),
}
: {})}
@@ -845,7 +852,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
class: classes.ErrorInput,
helpText: formatErrorMessage(
text.currency,
- formState.errors.currency
+ formState.errors.currency,
),
}
: {})}
@@ -896,7 +903,7 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
{formatErrorMessage(
text.termsAndConditionsLabel,
- formState.errors.allowBankingCollection
+ formState.errors.allowBankingCollection,
)}
)}
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/useUserInfoForm.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/useUserInfoForm.tsx
index 35f398a02..cac86cdb8 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/useUserInfoForm.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/useUserInfoForm.tsx
@@ -149,9 +149,15 @@ export function useUserInfoForm(props: TaxForm) {
lastName: user.impactConnection.user.lastName,
countryCode: user.impactConnection.publisher.countryCode,
currency: user.impactConnection.publisher.currency,
+ // when creating an impact connection without sending phoneNumber data, the impactAPI defaults the value to "000000" and the phoneNumberCountryCode to "DZ"
phoneNumberCountryCode:
- user.impactConnection.publisher.phoneNumberCountryCode,
- phoneNumber: user.impactConnection.publisher.phoneNumber,
+ user.impactConnection.publisher.phoneNumber === "0000000"
+ ? null
+ : user.impactConnection.publisher.phoneNumberCountryCode,
+ phoneNumber:
+ user.impactConnection.publisher.phoneNumber === "0000000"
+ ? null
+ : user.impactConnection.publisher.phoneNumber,
address: user.impactConnection.publisher.billingAddress,
city: user.impactConnection.publisher.billingCity,
state: user.impactConnection.publisher.billingState,