);
}
From 30f702732f7bab450f97783907eb6ae1fa5a2fee Mon Sep 17 00:00:00 2001
From: Sam Beveridge
Date: Tue, 14 Apr 2026 11:26:36 -0700
Subject: [PATCH 12/64] added new banking form fields
---
packages/mint-components/package.json | 2 +-
packages/mint-components/src/components.d.ts | 36 ++
.../sqm-banking-info-form/formDefinitions.tsx | 38 ++
.../sqm-banking-info-form/readme.md | 2 +
.../sqm-banking-info-form.tsx | 10 +
.../useBankingInfoForm.tsx | 2 +
.../tax-and-cash/sqm-tax-and-cash/readme.md | 388 +++++++++---------
.../sqm-tax-and-cash/sqm-tax-and-cash.tsx | 12 +
.../src/templates/TaxAndCash.html | 2 +
9 files changed, 298 insertions(+), 194 deletions(-)
diff --git a/packages/mint-components/package.json b/packages/mint-components/package.json
index 04b3502f0e..f14925097b 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.8",
+ "version": "2.1.10-0",
"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 326011f4ad..432dc994c1 100644
--- a/packages/mint-components/src/components.d.ts
+++ b/packages/mint-components/src/components.d.ts
@@ -117,6 +117,10 @@ export namespace Components {
* @uiName Branch code field label
*/
"branchCodeLabel": string;
+ /**
+ * @uiName Branch name field label
+ */
+ "branchNameLabel": string;
/**
* One of three options listed for the classification field
* @uiName Business classification option
@@ -130,6 +134,10 @@ export namespace Components {
* @uiName Classification CPF field label
*/
"classificationCPFLabel": string;
+ /**
+ * @uiName Classification code field label
+ */
+ "classificationCodeLabel": string;
/**
* @uiName Classification entity field label
*/
@@ -6110,6 +6118,11 @@ export namespace Components {
* @uiGroup Step 4 Properties
*/
"step4_branchCodeLabel": string;
+ /**
+ * @uiName Branch name field label
+ * @uiGroup Step 4 Properties
+ */
+ "step4_branchNameLabel": string;
/**
* One of three options listed for the classification field
* @uiName Business classification option
@@ -6126,6 +6139,11 @@ export namespace Components {
* @uiGroup Step 4 Properties
*/
"step4_classificationCPFLabel": string;
+ /**
+ * @uiName Classification code field label
+ * @uiGroup Step 4 Properties
+ */
+ "step4_classificationCodeLabel": string;
/**
* @uiName Classification entity field label
* @uiGroup Step 4 Properties
@@ -8044,6 +8062,10 @@ declare namespace LocalJSX {
* @uiName Branch code field label
*/
"branchCodeLabel"?: string;
+ /**
+ * @uiName Branch name field label
+ */
+ "branchNameLabel"?: string;
/**
* One of three options listed for the classification field
* @uiName Business classification option
@@ -8057,6 +8079,10 @@ declare namespace LocalJSX {
* @uiName Classification CPF field label
*/
"classificationCPFLabel"?: string;
+ /**
+ * @uiName Classification code field label
+ */
+ "classificationCodeLabel"?: string;
/**
* @uiName Classification entity field label
*/
@@ -14008,6 +14034,11 @@ declare namespace LocalJSX {
* @uiGroup Step 4 Properties
*/
"step4_branchCodeLabel"?: string;
+ /**
+ * @uiName Branch name field label
+ * @uiGroup Step 4 Properties
+ */
+ "step4_branchNameLabel"?: string;
/**
* One of three options listed for the classification field
* @uiName Business classification option
@@ -14024,6 +14055,11 @@ declare namespace LocalJSX {
* @uiGroup Step 4 Properties
*/
"step4_classificationCPFLabel"?: string;
+ /**
+ * @uiName Classification code field label
+ * @uiGroup Step 4 Properties
+ */
+ "step4_classificationCodeLabel"?: string;
/**
* @uiName Classification entity field label
* @uiGroup Step 4 Properties
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 1b1b7e7406..f815e0d4d7 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
@@ -415,5 +415,43 @@ export function getFormMap({
),
},
+ 15: {
+ input: (
+
+ ),
+ },
+ 16: {
+ input: (
+
+ ),
+ },
};
}
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 53516c5e15..5f4e5582fc 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
@@ -20,9 +20,11 @@
| `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"` |
+| `branchNameLabel` | `branch-name-label` | | `string` | `"Branch name"` |
| `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"` |
+| `classificationCodeLabel` | `classification-code-label` | | `string` | `"KBE Code"` |
| `classificationEntityLabel` | `classification-entity-label` | | `string` | `"Classification Entity"` |
| `classificationLabel` | `classification-label` | Label text for the classification input field | `string` | `"Classification"` |
| `continueButton` | `continue-button` | | `string` | `"Save"` |
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 2a674f973d..c80eef88db 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
@@ -210,12 +210,22 @@ export class BankingInfoForm {
*/
@Prop() branchCodeLabel: string = "Branch code";
+ /**
+ * @uiName Branch name field label
+ */
+ @Prop() branchNameLabel: string = "Branch name";
+
/**
* Label text for the classification input field
* @uiName Classification field label
*/
@Prop() classificationLabel: string = "Classification";
+ /**
+ * @uiName Classification code field label
+ */
+ @Prop() classificationCodeLabel: string = "KBE code";
+
/**
* @uiName Taxpayer ID field label
*/
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 09a1cb7bfd..dd6f86e3fe 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
@@ -79,6 +79,8 @@ export type BankingInfoFormData = {
bankCity?: string;
bankState?: string;
branchCode?: string;
+ branchName?: string;
+ classificationCode?: string;
// TODO These fields aren't settable in the mutation
bankName?: string;
patronymicName?: string;
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/readme.md b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/readme.md
index 4a32ecdaff..b79a2682df 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/readme.md
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/readme.md
@@ -5,199 +5,201 @@
## Properties
-| Property | Attribute | Description | Type | Default |
-| --------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `backButton` | `back-button` | | `string` | `"Back"` |
-| `cancelButton` | `cancel-button` | | `string` | `"Cancel"` |
-| `continueButton` | `continue-button` | | `string` | `"Continue"` |
-| `dashboard_accountReviewDescription` | `dashboard_account-review-description` | | `string` | `"This process takes 48 hours, payouts are on hold until it's completed. You will receive an email from our referral provider, Impact.com, if any issues arise. It contains details on how to resolve this issue. If you need further assistance, please reach out to our {supportLink}."` |
-| `dashboard_accountReviewHeader` | `dashboard_account-review-header` | | `string` | `"Your account is under review"` |
-| `dashboard_accountText` | `dashboard_account-text` | Shown before the participant’s bank account information. | `string` | `"Account"` |
-| `dashboard_badgeTextAwaitingReview` | `dashboard_badge-text-awaiting-review` | Additional text displayed next to the tax form's status badge. | `string` | `"Awaiting review. Submitted on {dateSubmitted}."` |
-| `dashboard_badgeTextSubmittedOn` | `dashboard_badge-text-submitted-on` | Additional text displayed next to the tax form's status badge | `string` | `"Submitted on {dateSubmitted}."` |
-| `dashboard_badgeTextSubmittedOnW8` | `dashboard_badge-text-submitted-on-w-8` | Additional text displayed next to the tax form's status badge. | `string` | `"Submitted on {dateSubmitted}. Valid for three years after submission."` |
-| `dashboard_bankNameMismatchDescription` | `dashboard_bank-name-mismatch-description` | | `string` | `"The bank account (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
-| `dashboard_bankNameMismatchHeader` | `dashboard_bank-name-mismatch-header` | | `string` | `"Your payment information does not match your tax form"` |
-| `dashboard_bankingInformationSectionHeader` | `dashboard_banking-information-section-header` | | `string` | `"Payout Information"` |
-| `dashboard_beneficiaryNameInvalidDescription` | `dashboard_beneficiary-name-invalid-description` | | `string` | `"The account holder (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
-| `dashboard_beneficiaryNameInvalidHeader` | `dashboard_beneficiary-name-invalid-header` | | `string` | `"Your payment information does not match your tax form"` |
-| `dashboard_beneficiaryNameMismatchDescription` | `dashboard_beneficiary-name-mismatch-description` | | `string` | `"The account holder (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
-| `dashboard_beneficiaryNameMismatchHeader` | `dashboard_beneficiary-name-mismatch-header` | | `string` | `"Your payment information does not match your tax form"` |
-| `dashboard_dateColumnTitle` | `dashboard_date-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Date"` |
-| `dashboard_earningsAfterTaxColumnTitle` | `dashboard_earnings-after-tax-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Earnings after tax"` |
-| `dashboard_earningsColumnTitle` | `dashboard_earnings-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Earnings"` |
-| `dashboard_editPaymentInformationButton` | `dashboard_edit-payment-information-button` | | `string` | `"Edit payout information"` |
-| `dashboard_indirectTaxColumnTitle` | `dashboard_indirect-tax-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Indirect tax"` |
-| `dashboard_indirectTaxDetails` | `dashboard_indirect-tax-details` | Displayed to participants who have submitted their indirect tax information. | `string` | `"{indirectTaxType} number: {indirectTaxNumber}"` |
-| `dashboard_indirectTaxInfoCanada` | `dashboard_indirect-tax-info-canada` | If the participant is registered for indirect tax in Canada, display the province they’re registered in. | `string` | `"Registered in {province}, {country}"` |
-| `dashboard_indirectTaxInfoOtherCountry` | `dashboard_indirect-tax-info-other-country` | If the participant is registered for indirect tax, display the country they’re registered in. | `string` | `"Registered in {country}"` |
-| `dashboard_indirectTaxInfoSectionHeader` | `dashboard_indirect-tax-info-section-header` | | `string` | `"Indirect tax"` |
-| `dashboard_indirectTaxInfoSpain` | `dashboard_indirect-tax-info-spain` | If the participant is registered for indirect tax in Spain, display the region they’re registered in. | `string` | `"Registered in {country}, {subRegion}"` |
-| `dashboard_indirectTaxTooltipSupport` | `dashboard_indirect-tax-tooltip-support` | | `string` | `"To make changes to your indirect tax information, please contact our {supportLink}."` |
-| `dashboard_invalidForm` | `dashboard_invalid-form` | Additional text displayed next to the tax form's status badge. | `string` | `"Make sure your information is correct and submit new form."` |
-| `dashboard_invoiceColumnTitle` | `dashboard_invoice-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Invoice"` |
-| `dashboard_invoiceDescription` | `dashboard_invoice-description` | | `string` | `"View and download your invoices to report your earnings and stay tax compliant."` |
-| `dashboard_invoiceEmptyStateHeader` | `dashboard_invoice-empty-state-header` | | `string` | `"View your invoice details"` |
-| `dashboard_invoiceEmptyStateText` | `dashboard_invoice-empty-state-text` | | `string` | `"Refer a friend to view the status of your invoices and rewards earned"` |
-| `dashboard_invoiceHeader` | `dashboard_invoice-header` | | `string` | `"Invoices"` |
-| `dashboard_invoiceMoreLabel` | `dashboard_invoice-more-label` | | `string` | `"Next"` |
-| `dashboard_invoicePrevLabel` | `dashboard_invoice-prev-label` | | `string` | `"Prev"` |
-| `dashboard_newFormButton` | `dashboard_new-form-button` | | `string` | `"Submit new tax form"` |
-| `dashboard_noFormNeededSubtext` | `dashboard_no-form-needed-subtext` | No other statuses or badges will be displayed in the tax form section in this case. | `string` | `"Tax documents are only required if you are based in the US or joining the referral program of a US based brand."` |
-| `dashboard_notRegisteredForTax` | `dashboard_not-registered-for-tax` | | `string` | `"Not registered for indirect tax. If you’ve previously registered with your tax authority, contact our {supportLink} to add your information to stay tax compliant."` |
-| `dashboard_paymentOnHoldDescription` | `dashboard_payment-on-hold-description` | | `string` | `"Your payout is temporarily on hold while we review your new payment information, this process is usually resolved within 48 hours."` |
-| `dashboard_paymentOnHoldHeader` | `dashboard_payment-on-hold-header` | | `string` | `"We are reviewing your new payout settings"` |
-| `dashboard_paymentReturnedDescription` | `dashboard_payment-returned-description` | | `string` | `"Our recent payment attempt for your earnings was unsuccessful. Please review your payment information and make sure it is correct."` |
-| `dashboard_paymentReturnedHeader` | `dashboard_payment-returned-header` | | `string` | `"Payout unsuccessful"` |
-| `dashboard_payoutFromImpact` | `dashboard_payout-from-impact` | Displayed under the payout details card. | `string` | `"Your balance may take up to 24 hours to update. Payouts will be sent from our referral program provider, impact.com."` |
-| `dashboard_payoutHoldAlertDescription` | `dashboard_payout-hold-alert-description` | Part of the alert displayed at the top of the page when there’s been an issue preventing payouts. | `string` | `"Please contact our {supportLink} or check your inbox for an email from our referral program provider, impact.com."` |
-| `dashboard_payoutHoldAlertHeader` | `dashboard_payout-hold-alert-header` | Part of the alert displayed at the top of the page when there’s been an issue preventing payouts. | `string` | `"Your payout is on hold"` |
-| `dashboard_payoutMissingInformationText` | `dashboard_payout-missing-information-text` | Text displayed for existing publishers that do not have saved banking information. | `string` | `"Missing banking information, go to Impact.com to resolve."` |
-| `dashboard_qstNumber` | `dashboard_qst-number` | Displayed to participants registered in Quebec, Canada. | `string` | `"QST number: {qstNumber}"` |
-| `dashboard_replaceTaxFormModalBodyText` | `dashboard_replace-tax-form-modal-body-text` | | `string` | `"Submitting a new tax form will remove your existing form. Make sure to sign and complete your new tax form to prevent any issues with your next payout."` |
-| `dashboard_replaceTaxFormModalHeader` | `dashboard_replace-tax-form-modal-header` | | `string` | `"Replace existing tax form"` |
-| `dashboard_requiredTaxForm` | `dashboard_required-tax-form` | Additional text displayed next to the tax form's status badge | `string` | `"Your payouts are on hold until you submit a {taxFormType} tax form."` |
-| `dashboard_statusBadgeText` | `dashboard_status-badge-text` | | `string` | `"{badgeText, select, payoutToday {Payout Today} nextPayout {Next Payout} other {Failed} }"` |
-| `dashboard_statusTextActive` | `dashboard_status-text-active` | | `string` | `"Active"` |
-| `dashboard_statusTextNotActive` | `dashboard_status-text-not-active` | | `string` | `"Invalid Tax Form"` |
-| `dashboard_statusTextNotVerified` | `dashboard_status-text-not-verified` | Displayed when the participant submitted their form but it is awaiting review. | `string` | `"Not Verified"` |
-| `dashboard_statusTextRequired` | `dashboard_status-text-required` | Displayed when the participant has not submitted their required tax form. | `string` | `"Required"` |
-| `dashboard_subRegionTaxNumber` | `dashboard_sub-region-tax-number` | | `string` | `"Income tax number: {subRegionTaxNumber}"` |
-| `dashboard_taxAlertHeaderNotActiveW8` | `dashboard_tax-alert-header-not-active-w-8` | Part of the alert displayed at the top of the page. | `string` | `"{documentType} tax form is invalid"` |
-| `dashboard_taxAlertHeaderNotActiveW9` | `dashboard_tax-alert-header-not-active-w-9` | Part of the alert displayed at the top of the page. | `string` | `"Your W-9 tax form has personal information that doesn’t match your profile"` |
-| `dashboard_taxAlertNotActiveMessageW8` | `dashboard_tax-alert-not-active-message-w-8` | Part of the alert displayed at the top of the page. | `string` | `"Your tax form may have expired or has personal information that doesn’t match your profile. Please submit a new {documentType} form."` |
-| `dashboard_taxAlertNotActiveMessageW9` | `dashboard_tax-alert-not-active-message-w-9` | Part of the alert displayed at the top of the page. | `string` | `"Please resubmit a new {documentType} form."` |
-| `dashboard_taxDocumentSectionHeader` | `dashboard_tax-document-section-header` | | `string` | `"Tax documents"` |
-| `dashboard_taxDocumentSectionSubHeader` | `dashboard_tax-document-section-sub-header` | Displayed under the tax document section header. | `string` | `"{documentType} tax form"` |
-| `dashboard_termsAndConditions` | `dashboard_terms-and-conditions` | | `string` | `"Terms and Conditions"` |
-| `dashboard_thresholdPayoutText` | `dashboard_threshold-payout-text` | Display participants' payout preference on the payout information card, indicating the balance at which they want to get paid. | `string` | `"Next payout occurs when balance is {thresholdBalance}"` |
-| `dashboard_verificationFailedInternalDescription` | `dashboard_verification-failed-internal-description` | | `string` | `"Identity verification has failed. Our team is reviewing the report and will contact you with further information. If you don't hear from us contact our {supportLink}."` |
-| `dashboard_verificationFailedInternalHeader` | `dashboard_verification-failed-internal-header` | | `string` | `"Identity verification usuccessful"` |
-| `dashboard_verificationRequiredButtonText` | `dashboard_verification-required-button-text` | Part of the alert displayed at the top of the page when the user needs to verify their identity. | `string` | `"Start Verification"` |
-| `dashboard_verificationRequiredDescription` | `dashboard_verification-required-description` | Part of the alert displayed at the top of the page when the user needs to verify their identity | `string` | `"Complete your verification to start receiving your cash rewards. It should only take a few minutes verify. If you run in to an issue verifying your identity contact our {supportLink}."` |
-| `dashboard_verificationRequiredHeader` | `dashboard_verification-required-header` | Part of the alert displayed at the top of the page when the user needs to verify their identity. | `string` | `"Verify your identity"` |
-| `dashboard_verificationRequiredInternalDescription` | `dashboard_verification-required-internal-description` | | `string` | `"Identity verification submission has been received. Our system is currently performing additional checks and analyzing the results. You will be updated shortly. If you don't hear from us contact our {supportLink}."` |
-| `dashboard_verificationRequiredInternalHeader` | `dashboard_verification-required-internal-header` | | `string` | `"Identity verification in progress"` |
-| `dashboard_verificationReviewInternalDescription` | `dashboard_verification-review-internal-description` | | `string` | `"Identity verification requires further review due to a potential error. Our team is reviewing the information and will update you shortly. If you don't hear from us contact our {supportLink}."` |
-| `dashboard_verificationReviewInternalHeader` | `dashboard_verification-review-internal-header` | | `string` | `"Identity verification under review"` |
-| `dashboard_w9RequiredButtonText` | `dashboard_w-9-required-button-text` | | `string` | `"Submit W-9"` |
-| `dashboard_w9RequiredDescription` | `dashboard_w-9-required-description` | | `string` | `"You have surpassed the $600 threshold requiring a W-9 form or have multiple accounts with impact.com. To remove the hold, please submit your W-9 form."` |
-| `dashboard_w9RequiredHeader` | `dashboard_w-9-required-header` | | `string` | `"Your next payout is on hold"` |
-| `dashboard_withdrawalSettingsInvalidDescription` | `dashboard_withdrawal-settings-invalid-description` | | `string` | `"There are missing fields or invalid characters in your payment information. Please review your information and make sure it is correct. Your payouts are on hold until this is resolved."` |
-| `dashboard_withdrawalSettingsInvalidHeader` | `dashboard_withdrawal-settings-invalid-header` | | `string` | `"Your payment information is incomplete or includes invalid characters"` |
-| `demoData` | -- | | `{ step1_firstName?: string; step1_lastName?: string; step1_email?: string; step1_country?: string; step1_phoneNumber?: string; step1_address?: string; step1_city?: string; step1_state?: string; step1_province?: string; step1_region?: string; step1_postalCode?: string; step1_currency?: string; step1_currencyHelpText?: string; step1_allowBankingCollection?: string; step1_personalInformation?: string; step1_termsAndConditionsLabel?: string; step1_termsAndConditionsLink?: string; step1_searchForCurrencyText?: string; step2_indirectTax?: string; step2_indirectTaxDescription?: string; step2_indirectTaxDetails?: string; step2_otherRegion?: string; step2_otherRegionSubtext?: string; step2_notRegistered?: string; step2_notRegisteredSubtext?: string; step2_selectedRegion?: string; step2_indirectTaxNumber?: string; step2_province?: string; step2_indirectTaxNumberError?: string; step2_qstNumber?: string; step2_isRegisteredQST?: string; step2_isRegisteredSubRegionIncomeTax?: string; step2_subRegion?: string; step2_subRegionTaxNumberLabel?: string; step2_cannotChangeInfoAlert?: string; step3_taxForm?: string; step3_taxFormLabel?: string; step3_participantType?: string; step3_businessEntity?: string; step3_individualParticipant?: string; step3_taxFormDescription?: string; step3_taxFormDescriptionIndividualParticipant?: string; step3_taxFormDescriptionBusinessEntity?: string; step3_docusignExpired?: string; step3_docusignSessionWarning?: string; step3_docusignError?: string; step3_refreshButton?: string; step3_exitButton?: string; step3_modalTitle?: string; step3_modalDescription?: string; step3_modalButtonText?: string; step4_taxAndPayouts?: string; step4_directlyToBankAccount?: string; step4_toPayPalAccount?: string; step4_paymentScheduleBalanceThreshold?: string; step4_paymentScheduleFixedDay?: string; step4_paymentDaySelectLabel?: string; step4_paymentThresholdSelectLabel?: string; step4_paymentDayFirstOfMonthLabelText?: string; step4_paymentDayFifteenthOfMonthLabelText?: string; step4_paymentMethod?: string; step4_paymentSchedule?: string; step4_paymentMethodSubtext?: string; step4_payPalInputLabel?: string; step4_bankLocationLabel?: string; step4_beneficiaryAccountNameLabel?: string; step4_beneficiaryAccountNameDescription?: string; step4_bankAccountTypeLabel?: string; step4_checkingSelectItemLabel?: string; step4_savingsSelectItemLabel?: string; step4_bankAccountNumberLabel?: string; step4_ibanLabel?: string; step4_swiftCodeLabel?: string; step4_routingCodeLabel?: string; step4_bankNameLabel?: string; step4_classificationEntityLabel?: string; step4_businessSelectItemLabel?: string; step4_individualSelectItemLabel?: string; step4_foreignSelectItemLabel?: string; step4_classificationCPFLabel?: string; step4_patronymicNameLabel?: string; step4_voCodeLabel?: string; step4_agencyCodeLabel?: string; step4_branchCodeLabel?: string; step4_classificationLabel?: string; step4_taxPayerIdLabel?: string; step4_bankAddressLabel?: string; step4_bankCityLabel?: string; step4_bankStateLabel?: string; step4_bankPostalCodeLabel?: string; step4_eftWithdrawalLabel?: string; step4_fxWireProcessingFeeLabel?: string; step4_verifyEmailHeaderText?: string; step4_verifyEmailDescriptionText?: string; step4_modalTitle?: string; step4_modalDescription?: string; step4_modalButtonText?: string; dashboard_statusTextActive?: string; dashboard_statusTextNotActive?: string; dashboard_statusTextNotVerified?: string; dashboard_statusTextRequired?: string; dashboard_requiredTaxForm?: string; dashboard_badgeTextSubmittedOn?: string; dashboard_badgeTextSubmittedOnW8?: string; dashboard_badgeTextAwaitingReview?: string; dashboard_taxAlertHeaderNotActiveW9?: string; dashboard_taxAlertHeaderNotActiveW8?: string; dashboard_taxAlertNotActiveMessageW9?: string; dashboard_taxAlertNotActiveMessageW8?: string; dashboard_invalidForm?: string; dashboard_bankingInformationSectionHeader?: string; dashboard_taxDocumentSectionHeader?: string; dashboard_taxDocumentSectionSubHeader?: string; dashboard_noFormNeededSubtext?: string; dashboard_indirectTaxInfoSectionHeader?: string; dashboard_indirectTaxInfoCanada?: string; dashboard_indirectTaxInfoOtherCountry?: string; dashboard_indirectTaxInfoSpain?: string; dashboard_indirectTaxTooltipSupport?: string; dashboard_indirectTaxDetails?: string; dashboard_newFormButton?: string; dashboard_editPaymentInformationButton?: string; dashboard_notRegisteredForTax?: string; dashboard_qstNumber?: string; dashboard_subRegionTaxNumber?: string; dashboard_statusBadgeText?: string; dashboard_thresholdPayoutText?: string; dashboard_accountText?: string; dashboard_invoiceColumnTitle?: string; dashboard_dateColumnTitle?: string; dashboard_earningsColumnTitle?: string; dashboard_indirectTaxColumnTitle?: string; dashboard_payoutFromImpact?: string; dashboard_earningsAfterTaxColumnTitle?: string; dashboard_payoutHoldAlertHeader?: string; dashboard_payoutHoldAlertDescription?: string; dashboard_payoutMissingInformationText?: string; dashboard_invoiceDescription?: string; dashboard_invoicePrevLabel?: string; dashboard_invoiceMoreLabel?: string; dashboard_invoiceHeader?: string; dashboard_invoiceEmptyStateHeader?: string; dashboard_invoiceEmptyStateText?: string; dashboard_replaceTaxFormModalHeader?: string; dashboard_replaceTaxFormModalBodyText?: string; dashboard_verificationRequiredHeader?: string; dashboard_verificationRequiredDescription?: string; dashboard_verificationRequiredInternalHeader?: string; dashboard_verificationRequiredInternalDescription?: string; dashboard_verificationReviewInternalHeader?: string; dashboard_verificationReviewInternalDescription?: string; dashboard_verificationFailedInternalHeader?: string; dashboard_verificationFailedInternalDescription?: string; dashboard_verificationRequiredButtonText?: string; dashboard_w9RequiredHeader?: string; dashboard_w9RequiredDescription?: string; dashboard_accountReviewHeader?: string; dashboard_accountReviewDescription?: string; dashboard_paymentOnHoldHeader?: string; dashboard_paymentOnHoldDescription?: string; dashboard_beneficiaryNameInvalidHeader?: string; dashboard_beneficiaryNameInvalidDescription?: string; dashboard_beneficiaryNameMismatchHeader?: string; dashboard_beneficiaryNameMismatchDescription?: string; dashboard_bankNameMismatchHeader?: string; dashboard_bankNameMismatchDescription?: string; dashboard_withdrawalSettingsInvalidHeader?: string; dashboard_withdrawalSettingsInvalidDescription?: string; dashboard_paymentReturnedHeader?: string; dashboard_paymentReturnedDescription?: string; dashboard_termsAndConditions?: string; dashboard_w9RequiredButtonText?: string; formStep?: string; generalErrorTitle?: string; generalErrorDescription?: string; fieldRequiredError?: string; invalidCharacterError?: string; fieldInvalidError?: string; continueButton?: string; backButton?: string; cancelButton?: string; isPartnerAlertHeader?: string; isPartnerAlertDescription?: string; searchForCountryText?: string; loadingErrorAlertHeader?: string; loadingErrorAlertDescription?: string; taxAndPayoutsDescription?: string; supportLink?: string; termsAndConditions?: string; stateController?: string; demoData?: Partial>; disconnectedCallback?: () => void; getGeneralStepTextProps?: (prefix: string) => PickPrefix & { generalErrorTitle: string; generalErrorDescription: string; fieldRequiredError: string; invalidCharacterError: string; fieldInvalidError: string; continueButton: string; backButton: string; cancelButton: string; isPartnerAlertHeader: string; isPartnerAlertDescription: string; loadingErrorAlertHeader: string; loadingErrorAlertDescription: string; taxAndPayoutsDescription: string; searchForCountryText: string; formStep: string; supportLink: string; }; render?: () => any; }` | `undefined` |
-| `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"` |
-| `formStep` | `form-step` | | `string` | `"Step {step} of {count}"` |
-| `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"` |
-| `invalidCharacterError` | `invalid-character-error` | Displayed under a field that includes invalid characters (non-ASCII). | `string` | `"{fieldName} includes characters that aren't supported."` |
-| `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 our {supportLink}."` |
-| `loadingErrorAlertHeader` | `loading-error-alert-header` | Part of the alert displayed at the top of the page. | `string` | `"There was a problem loading your form"` |
-| `searchForCountryText` | `search-for-country-text` | Placeholder text displayed in the country search dropdown | `string` | `"Search for country.."` |
-| `stateController` | `state-controller` | | `string` | `"{}"` |
-| `step1_address` | `step-1_address` | | `string` | `"Address"` |
-| `step1_allowBankingCollection` | `step-1_allow-banking-collection` | Edit the property called terms and conditions text to change what's displayed for {termsAndConditionsLink}. | `string` | `"I have read the {termsAndConditionsLink} and allow impact.com to collect my tax and banking information"` |
-| `step1_city` | `step-1_city` | | `string` | `"City"` |
-| `step1_country` | `step-1_country` | | `string` | `"Country"` |
-| `step1_currency` | `step-1_currency` | | `string` | `"Currency"` |
-| `step1_currencyHelpText` | `step-1_currency-help-text` | | `string` | `"Choose your preferred payout currency"` |
-| `step1_email` | `step-1_email` | | `string` | `"Email"` |
-| `step1_firstName` | `step-1_first-name` | | `string` | `"First name"` |
-| `step1_lastName` | `step-1_last-name` | | `string` | `"Last name"` |
-| `step1_personalInformation` | `step-1_personal-information` | | `string` | `"Personal Information"` |
-| `step1_phoneNumber` | `step-1_phone-number` | | `string` | `"Phone number"` |
-| `step1_postalCode` | `step-1_postal-code` | | `string` | `"Postal code"` |
-| `step1_province` | `step-1_province` | | `string` | `"Province"` |
-| `step1_region` | `step-1_region` | | `string` | `"Region"` |
-| `step1_searchForCurrencyText` | `step-1_search-for-currency-text` | Placeholder text displayed in the currency search dropdown | `string` | `"Search for currency.."` |
-| `step1_state` | `step-1_state` | | `string` | `"State"` |
-| `step1_termsAndConditionsLabel` | `step-1_terms-and-conditions-label` | The link text that appears in the terms and conditions checkbox | `string` | `"terms and conditions"` |
-| `step1_termsAndConditionsLink` | `step-1_terms-and-conditions-link` | The link that appears in the terms and conditions checkbox | `string` | `"https://terms.advocate.impact.com/PayoutTermsAndConditions.html"` |
-| `step2_cannotChangeInfoAlert` | `step-2_cannot-change-info-alert` | Communicate that after this step, only Support can change personal and indirect tax information. | `string` | `"Changes to your personal and indirect tax information can only be made through our {supportLink} after you complete this step. Make sure these are correct before continuing."` |
-| `step2_indirectTax` | `step-2_indirect-tax` | | `string` | `"Indirect Tax"` |
-| `step2_indirectTaxDescription` | `step-2_indirect-tax-description` | Displayed under the title of this step. | `string` | `"Indirect taxes (e.g. VAT, HST, GST) are transaction based taxes often applied to goods and services. Service providers are typically required to register with their tax authority and collect these taxes on behalf governments."` |
-| `step2_indirectTaxDetails` | `step-2_indirect-tax-details` | Displayed with indirect tax registration options. | `string` | `"Indirect tax details"` |
-| `step2_indirectTaxNumber` | `step-2_indirect-tax-number` | | `string` | `"{taxType, select, GST {GST number} HST {HST number} VAT {VAT number} CT {CT number} SST {SST number} GENERAL {Indirect tax number} other {Tax number}}"` |
-| `step2_indirectTaxNumberError` | `step-2_indirect-tax-number-error` | | `string` | `"{taxType, select, GST {GST number} HST {HST number} VAT {VAT number} CT {CT number} SST {SST number} GENERAL {Indirect tax number} other {Tax number}} is required"` |
-| `step2_isRegisteredQST` | `step-2_is-registered-q-s-t` | Displayed to participants registered for indirect tax in Quebec, Canada. | `string` | `"I am registered for QST Tax"` |
-| `step2_isRegisteredSubRegionIncomeTax` | `step-2_is-registered-sub-region-income-tax` | Displayed to participants registered for indirect tax in Spain. | `string` | `"I am an individual registered for Income Tax purposes in Spain, and withholding tax will apply to any payments made to me."` |
-| `step2_notRegistered` | `step-2_not-registered` | | `string` | `"Not registered for indirect tax"` |
-| `step2_notRegisteredSubtext` | `step-2_not-registered-subtext` | Participants based in the US are considered not registered. | `string` | `"If you’ve never set up indirect tax with your tax authority, then you’re likely not considered registered."` |
-| `step2_otherRegion` | `step-2_other-region` | | `string` | `"Registered for indirect tax"` |
-| `step2_otherRegionSubtext` | `step-2_other-region-subtext` | Selecting this option will display fields to enter indirect tax details. | `string` | `"If you’ve registered with your tax authority, add your information to stay tax compliant."` |
-| `step2_province` | `step-2_province` | | `string` | `"Province"` |
-| `step2_qstNumber` | `step-2_qst-number` | Displayed to participants registered for QST. | `string` | `"QST number"` |
-| `step2_selectedRegion` | `step-2_selected-region` | | `string` | `"Country / region of indirect tax"` |
-| `step2_subRegion` | `step-2_sub-region` | Displayed to participants registered in Spain. | `string` | `"Sub-region"` |
-| `step2_subRegionTaxNumberLabel` | `step-2_sub-region-tax-number-label` | | `string` | `"Income Tax Number"` |
-| `step3_businessEntity` | `step-3_business-entity` | An option for the participant type field. Used to determine which W-8 form is required. | `string` | `"I represent a business"` |
-| `step3_docusignError` | `step-3_docusign-error` | This appears inside the Docusign frame. | `string` | `"There was a problem displaying this form. Please refresh the page. If this problem continues, contact our {supportLink}."` |
-| `step3_docusignExpired` | `step-3_docusign-expired` | This appears inside the Docusign frame. | `string` | `"For your security and privacy, we automatically end your session after 20 minutes of inactivity. Please refresh and re-enter your tax information to continue."` |
-| `step3_docusignSessionWarning` | `step-3_docusign-session-warning` | Remind participants their session will time out after 20 minutes of inactivity. | `string` | `"For your security, we automatically end your session when you have not interacted with the form after 20 minutes."` |
-| `step3_exitButton` | `step-3_exit-button` | | `string` | `"Exit"` |
-| `step3_individualParticipant` | `step-3_individual-participant` | An option for the participant type field. Used to determine which W-8 form is required. | `string` | `"I am an individual participant"` |
-| `step3_modalButtonText` | `step-3_modal-button-text` | | `string` | `"I understand"` |
-| `step3_modalDescription` | `step-3_modal-description` | | `string` | `"Remember the name you enter in your tax form. It must exactly match the bank account holder name configured in the next step. {br}{br}Otherwise you will have to resubmit your form again and there will be delays receiving your payout."` |
-| `step3_modalTitle` | `step-3_modal-title` | | `string` | `"Important Note"` |
-| `step3_participantType` | `step-3_participant-type` | | `string` | `"Participant type"` |
-| `step3_refreshButton` | `step-3_refresh-button` | | `string` | `"Refresh Page"` |
-| `step3_taxForm` | `step-3_tax-form` | | `string` | `"Tax form"` |
-| `step3_taxFormDescription` | `step-3_tax-form-description` | Displayed at the top of the page to participants based in the US. | `string` | `"Participants based in the US need to submit a {documentType} form."` |
-| `step3_taxFormDescriptionBusinessEntity` | `step-3_tax-form-description-business-entity` | Displayed at the top of the page to participants representing a business. | `string` | `"Participants residing outside of the US working with a US Brand need to submit a {documentType} form."` |
-| `step3_taxFormDescriptionIndividualParticipant` | `step-3_tax-form-description-individual-participant` | Displayed at the top of the page to individuals joining a US program who reside outside the country. | `string` | `"Participants residing outside of the US, joining the referral program of a US-based company, need to submit a {documentType} form."` |
-| `step3_taxFormLabel` | `step-3_tax-form-label` | Display the type of tax form that the participant must submit. | `string` | `"{documentType} Tax Form"` |
-| `step4_agencyCodeLabel` | `step-4_agency-code-label` | | `string` | `"Agency code"` |
-| `step4_bankAccountNumberLabel` | `step-4_bank-account-number-label` | | `string` | `"Bank account number"` |
-| `step4_bankAccountTypeLabel` | `step-4_bank-account-type-label` | | `string` | `"Bank account type"` |
-| `step4_bankAddressLabel` | `step-4_bank-address-label` | | `string` | `"Bank address"` |
-| `step4_bankCityLabel` | `step-4_bank-city-label` | | `string` | `"Bank city"` |
-| `step4_bankLocationLabel` | `step-4_bank-location-label` | | `string` | `"Bank country location"` |
-| `step4_bankNameLabel` | `step-4_bank-name-label` | | `string` | `"Bank name"` |
-| `step4_bankPostalCodeLabel` | `step-4_bank-postal-code-label` | | `string` | `"Bank postal code"` |
-| `step4_bankStateLabel` | `step-4_bank-state-label` | | `string` | `"Bank Province / State"` |
-| `step4_beneficiaryAccountNameDescription` | `step-4_beneficiary-account-name-description` | | `string` | `"The beneficiary name of your bank account. Ensure this matches the name on your tax form."` |
-| `step4_beneficiaryAccountNameLabel` | `step-4_beneficiary-account-name-label` | | `string` | `"Account holder name"` |
-| `step4_branchCodeLabel` | `step-4_branch-code-label` | | `string` | `"Branch code"` |
-| `step4_businessSelectItemLabel` | `step-4_business-select-item-label` | One of three options listed for the classification field | `string` | `"Business"` |
-| `step4_checkingSelectItemLabel` | `step-4_checking-select-item-label` | | `string` | `"Checking"` |
-| `step4_classificationCPFLabel` | `step-4_classification-c-p-f-label` | | `string` | `"Classification CPF"` |
-| `step4_classificationEntityLabel` | `step-4_classification-entity-label` | | `string` | `"Classification entity"` |
-| `step4_classificationLabel` | `step-4_classification-label` | Label text for the classification input field | `string` | `"Classification"` |
-| `step4_directlyToBankAccount` | `step-4_directly-to-bank-account` | | `string` | `"Directly to my bank account"` |
-| `step4_eftWithdrawalLabel` | `step-4_eft-withdrawal-label` | Default payment method to the participants’ bank account. | `string` | `"EFT Withdrawal (free)"` |
-| `step4_foreignSelectItemLabel` | `step-4_foreign-select-item-label` | One of three options listed for the classification field | `string` | `"Foreign"` |
-| `step4_fxWireProcessingFeeLabel` | `step-4_fx-wire-processing-fee-label` | | `string` | `"FX Wire (Processing Fee {currency}{defaultFxFee}.00)"` |
-| `step4_ibanLabel` | `step-4_iban-label` | | `string` | `"IBAN"` |
-| `step4_individualSelectItemLabel` | `step-4_individual-select-item-label` | One of three options listed for the classification field | `string` | `"Individual"` |
-| `step4_modalButtonText` | `step-4_modal-button-text` | | `string` | `"I understand, update my information"` |
-| `step4_modalDescription` | `step-4_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."` |
-| `step4_modalTitle` | `step-4_modal-title` | | `string` | `"Important Note"` |
-| `step4_patronymicNameLabel` | `step-4_patronymic-name-label` | | `string` | `"Patronymic name"` |
-| `step4_payPalInputLabel` | `step-4_pay-pal-input-label` | Displayed to participants who choose PayPal as their payout method | `string` | `"PayPal email"` |
-| `step4_paymentDayFifteenthOfMonthLabelText` | `step-4_payment-day-fifteenth-of-month-label-text` | One of two payment day options | `string` | `"15th of the month"` |
-| `step4_paymentDayFirstOfMonthLabelText` | `step-4_payment-day-first-of-month-label-text` | One of two payment day options | `string` | `"1st of the month"` |
-| `step4_paymentDaySelectLabel` | `step-4_payment-day-select-label` | Let the participant choose what day of the month they’ll get paid | `string` | `"Payment Day"` |
-| `step4_paymentMethod` | `step-4_payment-method` | | `string` | `"Payment method"` |
-| `step4_paymentMethodSubtext` | `step-4_payment-method-subtext` | | `string` | `"Payouts will be sent from our referral program provider, impact.com."` |
-| `step4_paymentSchedule` | `step-4_payment-schedule` | | `string` | `"Payment schedule"` |
-| `step4_paymentScheduleBalanceThreshold` | `step-4_payment-schedule-balance-threshold` | | `string` | `"Pay me when my balance reaches a threshold"` |
-| `step4_paymentScheduleFixedDay` | `step-4_payment-schedule-fixed-day` | | `string` | `"Pay me on a fixed day of the month"` |
-| `step4_paymentThresholdSelectLabel` | `step-4_payment-threshold-select-label` | Participant use this field to select the balance at which they want to be paid | `string` | `"Payment threshold"` |
-| `step4_routingCodeLabel` | `step-4_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} }"` |
-| `step4_savingsSelectItemLabel` | `step-4_savings-select-item-label` | Label text for the savings account type select item | `string` | `"Savings"` |
-| `step4_swiftCodeLabel` | `step-4_swift-code-label` | | `string` | `"SWIFT code"` |
-| `step4_taxAndPayouts` | `step-4_tax-and-payouts` | | `string` | `"Payouts"` |
-| `step4_taxPayerIdLabel` | `step-4_tax-payer-id-label` | | `string` | `"Beneficiary INN"` |
-| `step4_toPayPalAccount` | `step-4_to-pay-pal-account` | | `string` | `"PayPal (2% processing fee capped to {feeCap})"` |
-| `step4_verifyEmailDescriptionText` | `step-4_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."` |
-| `step4_verifyEmailHeaderText` | `step-4_verify-email-header-text` | | `string` | `"Verify your email"` |
-| `step4_voCodeLabel` | `step-4_vo-code-label` | | `string` | `"VO code"` |
-| `supportLink` | `support-link` | Link text for contacting support team | `string` | `"support team"` |
-| `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."` |
-| `termsAndConditions` | `terms-and-conditions` | Link text for Terms and Conditions | `string` | `"Terms and Conditions"` |
+| Property | Attribute | Description | Type | Default |
+| --------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `backButton` | `back-button` | | `string` | `"Back"` |
+| `cancelButton` | `cancel-button` | | `string` | `"Cancel"` |
+| `continueButton` | `continue-button` | | `string` | `"Continue"` |
+| `dashboard_accountReviewDescription` | `dashboard_account-review-description` | | `string` | `"This process takes 48 hours, payouts are on hold until it's completed. You will receive an email from our referral provider, Impact.com, if any issues arise. It contains details on how to resolve this issue. If you need further assistance, please reach out to our {supportLink}."` |
+| `dashboard_accountReviewHeader` | `dashboard_account-review-header` | | `string` | `"Your account is under review"` |
+| `dashboard_accountText` | `dashboard_account-text` | Shown before the participant’s bank account information. | `string` | `"Account"` |
+| `dashboard_badgeTextAwaitingReview` | `dashboard_badge-text-awaiting-review` | Additional text displayed next to the tax form's status badge. | `string` | `"Awaiting review. Submitted on {dateSubmitted}."` |
+| `dashboard_badgeTextSubmittedOn` | `dashboard_badge-text-submitted-on` | Additional text displayed next to the tax form's status badge | `string` | `"Submitted on {dateSubmitted}."` |
+| `dashboard_badgeTextSubmittedOnW8` | `dashboard_badge-text-submitted-on-w-8` | Additional text displayed next to the tax form's status badge. | `string` | `"Submitted on {dateSubmitted}. Valid for three years after submission."` |
+| `dashboard_bankNameMismatchDescription` | `dashboard_bank-name-mismatch-description` | | `string` | `"The bank account (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
+| `dashboard_bankNameMismatchHeader` | `dashboard_bank-name-mismatch-header` | | `string` | `"Your payment information does not match your tax form"` |
+| `dashboard_bankingInformationSectionHeader` | `dashboard_banking-information-section-header` | | `string` | `"Payout Information"` |
+| `dashboard_beneficiaryNameInvalidDescription` | `dashboard_beneficiary-name-invalid-description` | | `string` | `"The account holder (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
+| `dashboard_beneficiaryNameInvalidHeader` | `dashboard_beneficiary-name-invalid-header` | | `string` | `"Your payment information does not match your tax form"` |
+| `dashboard_beneficiaryNameMismatchDescription` | `dashboard_beneficiary-name-mismatch-description` | | `string` | `"The account holder (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
+| `dashboard_beneficiaryNameMismatchHeader` | `dashboard_beneficiary-name-mismatch-header` | | `string` | `"Your payment information does not match your tax form"` |
+| `dashboard_dateColumnTitle` | `dashboard_date-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Date"` |
+| `dashboard_earningsAfterTaxColumnTitle` | `dashboard_earnings-after-tax-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Earnings after tax"` |
+| `dashboard_earningsColumnTitle` | `dashboard_earnings-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Earnings"` |
+| `dashboard_editPaymentInformationButton` | `dashboard_edit-payment-information-button` | | `string` | `"Edit payout information"` |
+| `dashboard_indirectTaxColumnTitle` | `dashboard_indirect-tax-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Indirect tax"` |
+| `dashboard_indirectTaxDetails` | `dashboard_indirect-tax-details` | Displayed to participants who have submitted their indirect tax information. | `string` | `"{indirectTaxType} number: {indirectTaxNumber}"` |
+| `dashboard_indirectTaxInfoCanada` | `dashboard_indirect-tax-info-canada` | If the participant is registered for indirect tax in Canada, display the province they’re registered in. | `string` | `"Registered in {province}, {country}"` |
+| `dashboard_indirectTaxInfoOtherCountry` | `dashboard_indirect-tax-info-other-country` | If the participant is registered for indirect tax, display the country they’re registered in. | `string` | `"Registered in {country}"` |
+| `dashboard_indirectTaxInfoSectionHeader` | `dashboard_indirect-tax-info-section-header` | | `string` | `"Indirect tax"` |
+| `dashboard_indirectTaxInfoSpain` | `dashboard_indirect-tax-info-spain` | If the participant is registered for indirect tax in Spain, display the region they’re registered in. | `string` | `"Registered in {country}, {subRegion}"` |
+| `dashboard_indirectTaxTooltipSupport` | `dashboard_indirect-tax-tooltip-support` | | `string` | `"To make changes to your indirect tax information, please contact our {supportLink}."` |
+| `dashboard_invalidForm` | `dashboard_invalid-form` | Additional text displayed next to the tax form's status badge. | `string` | `"Make sure your information is correct and submit new form."` |
+| `dashboard_invoiceColumnTitle` | `dashboard_invoice-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Invoice"` |
+| `dashboard_invoiceDescription` | `dashboard_invoice-description` | | `string` | `"View and download your invoices to report your earnings and stay tax compliant."` |
+| `dashboard_invoiceEmptyStateHeader` | `dashboard_invoice-empty-state-header` | | `string` | `"View your invoice details"` |
+| `dashboard_invoiceEmptyStateText` | `dashboard_invoice-empty-state-text` | | `string` | `"Refer a friend to view the status of your invoices and rewards earned"` |
+| `dashboard_invoiceHeader` | `dashboard_invoice-header` | | `string` | `"Invoices"` |
+| `dashboard_invoiceMoreLabel` | `dashboard_invoice-more-label` | | `string` | `"Next"` |
+| `dashboard_invoicePrevLabel` | `dashboard_invoice-prev-label` | | `string` | `"Prev"` |
+| `dashboard_newFormButton` | `dashboard_new-form-button` | | `string` | `"Submit new tax form"` |
+| `dashboard_noFormNeededSubtext` | `dashboard_no-form-needed-subtext` | No other statuses or badges will be displayed in the tax form section in this case. | `string` | `"Tax documents are only required if you are based in the US or joining the referral program of a US based brand."` |
+| `dashboard_notRegisteredForTax` | `dashboard_not-registered-for-tax` | | `string` | `"Not registered for indirect tax. If you’ve previously registered with your tax authority, contact our {supportLink} to add your information to stay tax compliant."` |
+| `dashboard_paymentOnHoldDescription` | `dashboard_payment-on-hold-description` | | `string` | `"Your payout is temporarily on hold while we review your new payment information, this process is usually resolved within 48 hours."` |
+| `dashboard_paymentOnHoldHeader` | `dashboard_payment-on-hold-header` | | `string` | `"We are reviewing your new payout settings"` |
+| `dashboard_paymentReturnedDescription` | `dashboard_payment-returned-description` | | `string` | `"Our recent payment attempt for your earnings was unsuccessful. Please review your payment information and make sure it is correct."` |
+| `dashboard_paymentReturnedHeader` | `dashboard_payment-returned-header` | | `string` | `"Payout unsuccessful"` |
+| `dashboard_payoutFromImpact` | `dashboard_payout-from-impact` | Displayed under the payout details card. | `string` | `"Your balance may take up to 24 hours to update. Payouts will be sent from our referral program provider, impact.com."` |
+| `dashboard_payoutHoldAlertDescription` | `dashboard_payout-hold-alert-description` | Part of the alert displayed at the top of the page when there’s been an issue preventing payouts. | `string` | `"Please contact our {supportLink} or check your inbox for an email from our referral program provider, impact.com."` |
+| `dashboard_payoutHoldAlertHeader` | `dashboard_payout-hold-alert-header` | Part of the alert displayed at the top of the page when there’s been an issue preventing payouts. | `string` | `"Your payout is on hold"` |
+| `dashboard_payoutMissingInformationText` | `dashboard_payout-missing-information-text` | Text displayed for existing publishers that do not have saved banking information. | `string` | `"Missing banking information, go to Impact.com to resolve."` |
+| `dashboard_qstNumber` | `dashboard_qst-number` | Displayed to participants registered in Quebec, Canada. | `string` | `"QST number: {qstNumber}"` |
+| `dashboard_replaceTaxFormModalBodyText` | `dashboard_replace-tax-form-modal-body-text` | | `string` | `"Submitting a new tax form will remove your existing form. Make sure to sign and complete your new tax form to prevent any issues with your next payout."` |
+| `dashboard_replaceTaxFormModalHeader` | `dashboard_replace-tax-form-modal-header` | | `string` | `"Replace existing tax form"` |
+| `dashboard_requiredTaxForm` | `dashboard_required-tax-form` | Additional text displayed next to the tax form's status badge | `string` | `"Your payouts are on hold until you submit a {taxFormType} tax form."` |
+| `dashboard_statusBadgeText` | `dashboard_status-badge-text` | | `string` | `"{badgeText, select, payoutToday {Payout Today} nextPayout {Next Payout} other {Failed} }"` |
+| `dashboard_statusTextActive` | `dashboard_status-text-active` | | `string` | `"Active"` |
+| `dashboard_statusTextNotActive` | `dashboard_status-text-not-active` | | `string` | `"Invalid Tax Form"` |
+| `dashboard_statusTextNotVerified` | `dashboard_status-text-not-verified` | Displayed when the participant submitted their form but it is awaiting review. | `string` | `"Not Verified"` |
+| `dashboard_statusTextRequired` | `dashboard_status-text-required` | Displayed when the participant has not submitted their required tax form. | `string` | `"Required"` |
+| `dashboard_subRegionTaxNumber` | `dashboard_sub-region-tax-number` | | `string` | `"Income tax number: {subRegionTaxNumber}"` |
+| `dashboard_taxAlertHeaderNotActiveW8` | `dashboard_tax-alert-header-not-active-w-8` | Part of the alert displayed at the top of the page. | `string` | `"{documentType} tax form is invalid"` |
+| `dashboard_taxAlertHeaderNotActiveW9` | `dashboard_tax-alert-header-not-active-w-9` | Part of the alert displayed at the top of the page. | `string` | `"Your W-9 tax form has personal information that doesn’t match your profile"` |
+| `dashboard_taxAlertNotActiveMessageW8` | `dashboard_tax-alert-not-active-message-w-8` | Part of the alert displayed at the top of the page. | `string` | `"Your tax form may have expired or has personal information that doesn’t match your profile. Please submit a new {documentType} form."` |
+| `dashboard_taxAlertNotActiveMessageW9` | `dashboard_tax-alert-not-active-message-w-9` | Part of the alert displayed at the top of the page. | `string` | `"Please resubmit a new {documentType} form."` |
+| `dashboard_taxDocumentSectionHeader` | `dashboard_tax-document-section-header` | | `string` | `"Tax documents"` |
+| `dashboard_taxDocumentSectionSubHeader` | `dashboard_tax-document-section-sub-header` | Displayed under the tax document section header. | `string` | `"{documentType} tax form"` |
+| `dashboard_termsAndConditions` | `dashboard_terms-and-conditions` | | `string` | `"Terms and Conditions"` |
+| `dashboard_thresholdPayoutText` | `dashboard_threshold-payout-text` | Display participants' payout preference on the payout information card, indicating the balance at which they want to get paid. | `string` | `"Next payout occurs when balance is {thresholdBalance}"` |
+| `dashboard_verificationFailedInternalDescription` | `dashboard_verification-failed-internal-description` | | `string` | `"Identity verification has failed. Our team is reviewing the report and will contact you with further information. If you don't hear from us contact our {supportLink}."` |
+| `dashboard_verificationFailedInternalHeader` | `dashboard_verification-failed-internal-header` | | `string` | `"Identity verification usuccessful"` |
+| `dashboard_verificationRequiredButtonText` | `dashboard_verification-required-button-text` | Part of the alert displayed at the top of the page when the user needs to verify their identity. | `string` | `"Start Verification"` |
+| `dashboard_verificationRequiredDescription` | `dashboard_verification-required-description` | Part of the alert displayed at the top of the page when the user needs to verify their identity | `string` | `"Complete your verification to start receiving your cash rewards. It should only take a few minutes verify. If you run in to an issue verifying your identity contact our {supportLink}."` |
+| `dashboard_verificationRequiredHeader` | `dashboard_verification-required-header` | Part of the alert displayed at the top of the page when the user needs to verify their identity. | `string` | `"Verify your identity"` |
+| `dashboard_verificationRequiredInternalDescription` | `dashboard_verification-required-internal-description` | | `string` | `"Identity verification submission has been received. Our system is currently performing additional checks and analyzing the results. You will be updated shortly. If you don't hear from us contact our {supportLink}."` |
+| `dashboard_verificationRequiredInternalHeader` | `dashboard_verification-required-internal-header` | | `string` | `"Identity verification in progress"` |
+| `dashboard_verificationReviewInternalDescription` | `dashboard_verification-review-internal-description` | | `string` | `"Identity verification requires further review due to a potential error. Our team is reviewing the information and will update you shortly. If you don't hear from us contact our {supportLink}."` |
+| `dashboard_verificationReviewInternalHeader` | `dashboard_verification-review-internal-header` | | `string` | `"Identity verification under review"` |
+| `dashboard_w9RequiredButtonText` | `dashboard_w-9-required-button-text` | | `string` | `"Submit W-9"` |
+| `dashboard_w9RequiredDescription` | `dashboard_w-9-required-description` | | `string` | `"You have surpassed the $600 threshold requiring a W-9 form or have multiple accounts with impact.com. To remove the hold, please submit your W-9 form."` |
+| `dashboard_w9RequiredHeader` | `dashboard_w-9-required-header` | | `string` | `"Your next payout is on hold"` |
+| `dashboard_withdrawalSettingsInvalidDescription` | `dashboard_withdrawal-settings-invalid-description` | | `string` | `"There are missing fields or invalid characters in your payment information. Please review your information and make sure it is correct. Your payouts are on hold until this is resolved."` |
+| `dashboard_withdrawalSettingsInvalidHeader` | `dashboard_withdrawal-settings-invalid-header` | | `string` | `"Your payment information is incomplete or includes invalid characters"` |
+| `demoData` | -- | | `{ step1_firstName?: string; step1_lastName?: string; step1_email?: string; step1_country?: string; step1_phoneNumber?: string; step1_address?: string; step1_city?: string; step1_state?: string; step1_province?: string; step1_region?: string; step1_postalCode?: string; step1_currency?: string; step1_currencyHelpText?: string; step1_allowBankingCollection?: string; step1_personalInformation?: string; step1_termsAndConditionsLabel?: string; step1_termsAndConditionsLink?: string; step1_searchForCurrencyText?: string; step2_indirectTax?: string; step2_indirectTaxDescription?: string; step2_indirectTaxDetails?: string; step2_otherRegion?: string; step2_otherRegionSubtext?: string; step2_notRegistered?: string; step2_notRegisteredSubtext?: string; step2_selectedRegion?: string; step2_indirectTaxNumber?: string; step2_province?: string; step2_indirectTaxNumberError?: string; step2_qstNumber?: string; step2_isRegisteredQST?: string; step2_isRegisteredSubRegionIncomeTax?: string; step2_subRegion?: string; step2_subRegionTaxNumberLabel?: string; step2_cannotChangeInfoAlert?: string; step3_taxForm?: string; step3_taxFormLabel?: string; step3_participantType?: string; step3_businessEntity?: string; step3_individualParticipant?: string; step3_taxFormDescription?: string; step3_taxFormDescriptionIndividualParticipant?: string; step3_taxFormDescriptionBusinessEntity?: string; step3_docusignExpired?: string; step3_docusignSessionWarning?: string; step3_docusignError?: string; step3_refreshButton?: string; step3_exitButton?: string; step3_modalTitle?: string; step3_modalDescription?: string; step3_modalButtonText?: string; step4_taxAndPayouts?: string; step4_directlyToBankAccount?: string; step4_toPayPalAccount?: string; step4_paymentScheduleBalanceThreshold?: string; step4_paymentScheduleFixedDay?: string; step4_paymentDaySelectLabel?: string; step4_paymentThresholdSelectLabel?: string; step4_paymentDayFirstOfMonthLabelText?: string; step4_paymentDayFifteenthOfMonthLabelText?: string; step4_paymentMethod?: string; step4_paymentSchedule?: string; step4_paymentMethodSubtext?: string; step4_payPalInputLabel?: string; step4_bankLocationLabel?: string; step4_beneficiaryAccountNameLabel?: string; step4_beneficiaryAccountNameDescription?: string; step4_bankAccountTypeLabel?: string; step4_checkingSelectItemLabel?: string; step4_savingsSelectItemLabel?: string; step4_bankAccountNumberLabel?: string; step4_ibanLabel?: string; step4_swiftCodeLabel?: string; step4_routingCodeLabel?: string; step4_bankNameLabel?: string; step4_classificationEntityLabel?: string; step4_businessSelectItemLabel?: string; step4_individualSelectItemLabel?: string; step4_foreignSelectItemLabel?: string; step4_classificationCPFLabel?: string; step4_patronymicNameLabel?: string; step4_voCodeLabel?: string; step4_agencyCodeLabel?: string; step4_branchCodeLabel?: string; step4_branchNameLabel?: string; step4_classificationLabel?: string; step4_classificationCodeLabel?: string; step4_taxPayerIdLabel?: string; step4_bankAddressLabel?: string; step4_bankCityLabel?: string; step4_bankStateLabel?: string; step4_bankPostalCodeLabel?: string; step4_eftWithdrawalLabel?: string; step4_fxWireProcessingFeeLabel?: string; step4_verifyEmailHeaderText?: string; step4_verifyEmailDescriptionText?: string; step4_modalTitle?: string; step4_modalDescription?: string; step4_modalButtonText?: string; dashboard_statusTextActive?: string; dashboard_statusTextNotActive?: string; dashboard_statusTextNotVerified?: string; dashboard_statusTextRequired?: string; dashboard_requiredTaxForm?: string; dashboard_badgeTextSubmittedOn?: string; dashboard_badgeTextSubmittedOnW8?: string; dashboard_badgeTextAwaitingReview?: string; dashboard_taxAlertHeaderNotActiveW9?: string; dashboard_taxAlertHeaderNotActiveW8?: string; dashboard_taxAlertNotActiveMessageW9?: string; dashboard_taxAlertNotActiveMessageW8?: string; dashboard_invalidForm?: string; dashboard_bankingInformationSectionHeader?: string; dashboard_taxDocumentSectionHeader?: string; dashboard_taxDocumentSectionSubHeader?: string; dashboard_noFormNeededSubtext?: string; dashboard_indirectTaxInfoSectionHeader?: string; dashboard_indirectTaxInfoCanada?: string; dashboard_indirectTaxInfoOtherCountry?: string; dashboard_indirectTaxInfoSpain?: string; dashboard_indirectTaxTooltipSupport?: string; dashboard_indirectTaxDetails?: string; dashboard_newFormButton?: string; dashboard_editPaymentInformationButton?: string; dashboard_notRegisteredForTax?: string; dashboard_qstNumber?: string; dashboard_subRegionTaxNumber?: string; dashboard_statusBadgeText?: string; dashboard_thresholdPayoutText?: string; dashboard_accountText?: string; dashboard_invoiceColumnTitle?: string; dashboard_dateColumnTitle?: string; dashboard_earningsColumnTitle?: string; dashboard_indirectTaxColumnTitle?: string; dashboard_payoutFromImpact?: string; dashboard_earningsAfterTaxColumnTitle?: string; dashboard_payoutHoldAlertHeader?: string; dashboard_payoutHoldAlertDescription?: string; dashboard_payoutMissingInformationText?: string; dashboard_invoiceDescription?: string; dashboard_invoicePrevLabel?: string; dashboard_invoiceMoreLabel?: string; dashboard_invoiceHeader?: string; dashboard_invoiceEmptyStateHeader?: string; dashboard_invoiceEmptyStateText?: string; dashboard_replaceTaxFormModalHeader?: string; dashboard_replaceTaxFormModalBodyText?: string; dashboard_verificationRequiredHeader?: string; dashboard_verificationRequiredDescription?: string; dashboard_verificationRequiredInternalHeader?: string; dashboard_verificationRequiredInternalDescription?: string; dashboard_verificationReviewInternalHeader?: string; dashboard_verificationReviewInternalDescription?: string; dashboard_verificationFailedInternalHeader?: string; dashboard_verificationFailedInternalDescription?: string; dashboard_verificationRequiredButtonText?: string; dashboard_w9RequiredHeader?: string; dashboard_w9RequiredDescription?: string; dashboard_accountReviewHeader?: string; dashboard_accountReviewDescription?: string; dashboard_paymentOnHoldHeader?: string; dashboard_paymentOnHoldDescription?: string; dashboard_beneficiaryNameInvalidHeader?: string; dashboard_beneficiaryNameInvalidDescription?: string; dashboard_beneficiaryNameMismatchHeader?: string; dashboard_beneficiaryNameMismatchDescription?: string; dashboard_bankNameMismatchHeader?: string; dashboard_bankNameMismatchDescription?: string; dashboard_withdrawalSettingsInvalidHeader?: string; dashboard_withdrawalSettingsInvalidDescription?: string; dashboard_paymentReturnedHeader?: string; dashboard_paymentReturnedDescription?: string; dashboard_termsAndConditions?: string; dashboard_w9RequiredButtonText?: string; formStep?: string; generalErrorTitle?: string; generalErrorDescription?: string; fieldRequiredError?: string; invalidCharacterError?: string; fieldInvalidError?: string; continueButton?: string; backButton?: string; cancelButton?: string; isPartnerAlertHeader?: string; isPartnerAlertDescription?: string; searchForCountryText?: string; loadingErrorAlertHeader?: string; loadingErrorAlertDescription?: string; taxAndPayoutsDescription?: string; supportLink?: string; termsAndConditions?: string; stateController?: string; demoData?: Partial>; disconnectedCallback?: () => void; getGeneralStepTextProps?: (prefix: string) => PickPrefix & { generalErrorTitle: string; generalErrorDescription: string; fieldRequiredError: string; invalidCharacterError: string; fieldInvalidError: string; continueButton: string; backButton: string; cancelButton: string; isPartnerAlertHeader: string; isPartnerAlertDescription: string; loadingErrorAlertHeader: string; loadingErrorAlertDescription: string; taxAndPayoutsDescription: string; searchForCountryText: string; formStep: string; supportLink: string; }; render?: () => any; }` | `undefined` |
+| `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"` |
+| `formStep` | `form-step` | | `string` | `"Step {step} of {count}"` |
+| `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"` |
+| `invalidCharacterError` | `invalid-character-error` | Displayed under a field that includes invalid characters (non-ASCII). | `string` | `"{fieldName} includes characters that aren't supported."` |
+| `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 our {supportLink}."` |
+| `loadingErrorAlertHeader` | `loading-error-alert-header` | Part of the alert displayed at the top of the page. | `string` | `"There was a problem loading your form"` |
+| `searchForCountryText` | `search-for-country-text` | Placeholder text displayed in the country search dropdown | `string` | `"Search for country.."` |
+| `stateController` | `state-controller` | | `string` | `"{}"` |
+| `step1_address` | `step-1_address` | | `string` | `"Address"` |
+| `step1_allowBankingCollection` | `step-1_allow-banking-collection` | Edit the property called terms and conditions text to change what's displayed for {termsAndConditionsLink}. | `string` | `"I have read the {termsAndConditionsLink} and allow impact.com to collect my tax and banking information"` |
+| `step1_city` | `step-1_city` | | `string` | `"City"` |
+| `step1_country` | `step-1_country` | | `string` | `"Country"` |
+| `step1_currency` | `step-1_currency` | | `string` | `"Currency"` |
+| `step1_currencyHelpText` | `step-1_currency-help-text` | | `string` | `"Choose your preferred payout currency"` |
+| `step1_email` | `step-1_email` | | `string` | `"Email"` |
+| `step1_firstName` | `step-1_first-name` | | `string` | `"First name"` |
+| `step1_lastName` | `step-1_last-name` | | `string` | `"Last name"` |
+| `step1_personalInformation` | `step-1_personal-information` | | `string` | `"Personal Information"` |
+| `step1_phoneNumber` | `step-1_phone-number` | | `string` | `"Phone number"` |
+| `step1_postalCode` | `step-1_postal-code` | | `string` | `"Postal code"` |
+| `step1_province` | `step-1_province` | | `string` | `"Province"` |
+| `step1_region` | `step-1_region` | | `string` | `"Region"` |
+| `step1_searchForCurrencyText` | `step-1_search-for-currency-text` | Placeholder text displayed in the currency search dropdown | `string` | `"Search for currency.."` |
+| `step1_state` | `step-1_state` | | `string` | `"State"` |
+| `step1_termsAndConditionsLabel` | `step-1_terms-and-conditions-label` | The link text that appears in the terms and conditions checkbox | `string` | `"terms and conditions"` |
+| `step1_termsAndConditionsLink` | `step-1_terms-and-conditions-link` | The link that appears in the terms and conditions checkbox | `string` | `"https://terms.advocate.impact.com/PayoutTermsAndConditions.html"` |
+| `step2_cannotChangeInfoAlert` | `step-2_cannot-change-info-alert` | Communicate that after this step, only Support can change personal and indirect tax information. | `string` | `"Changes to your personal and indirect tax information can only be made through our {supportLink} after you complete this step. Make sure these are correct before continuing."` |
+| `step2_indirectTax` | `step-2_indirect-tax` | | `string` | `"Indirect Tax"` |
+| `step2_indirectTaxDescription` | `step-2_indirect-tax-description` | Displayed under the title of this step. | `string` | `"Indirect taxes (e.g. VAT, HST, GST) are transaction based taxes often applied to goods and services. Service providers are typically required to register with their tax authority and collect these taxes on behalf governments."` |
+| `step2_indirectTaxDetails` | `step-2_indirect-tax-details` | Displayed with indirect tax registration options. | `string` | `"Indirect tax details"` |
+| `step2_indirectTaxNumber` | `step-2_indirect-tax-number` | | `string` | `"{taxType, select, GST {GST number} HST {HST number} VAT {VAT number} CT {CT number} SST {SST number} GENERAL {Indirect tax number} other {Tax number}}"` |
+| `step2_indirectTaxNumberError` | `step-2_indirect-tax-number-error` | | `string` | `"{taxType, select, GST {GST number} HST {HST number} VAT {VAT number} CT {CT number} SST {SST number} GENERAL {Indirect tax number} other {Tax number}} is required"` |
+| `step2_isRegisteredQST` | `step-2_is-registered-q-s-t` | Displayed to participants registered for indirect tax in Quebec, Canada. | `string` | `"I am registered for QST Tax"` |
+| `step2_isRegisteredSubRegionIncomeTax` | `step-2_is-registered-sub-region-income-tax` | Displayed to participants registered for indirect tax in Spain. | `string` | `"I am an individual registered for Income Tax purposes in Spain, and withholding tax will apply to any payments made to me."` |
+| `step2_notRegistered` | `step-2_not-registered` | | `string` | `"Not registered for indirect tax"` |
+| `step2_notRegisteredSubtext` | `step-2_not-registered-subtext` | Participants based in the US are considered not registered. | `string` | `"If you’ve never set up indirect tax with your tax authority, then you’re likely not considered registered."` |
+| `step2_otherRegion` | `step-2_other-region` | | `string` | `"Registered for indirect tax"` |
+| `step2_otherRegionSubtext` | `step-2_other-region-subtext` | Selecting this option will display fields to enter indirect tax details. | `string` | `"If you’ve registered with your tax authority, add your information to stay tax compliant."` |
+| `step2_province` | `step-2_province` | | `string` | `"Province"` |
+| `step2_qstNumber` | `step-2_qst-number` | Displayed to participants registered for QST. | `string` | `"QST number"` |
+| `step2_selectedRegion` | `step-2_selected-region` | | `string` | `"Country / region of indirect tax"` |
+| `step2_subRegion` | `step-2_sub-region` | Displayed to participants registered in Spain. | `string` | `"Sub-region"` |
+| `step2_subRegionTaxNumberLabel` | `step-2_sub-region-tax-number-label` | | `string` | `"Income Tax Number"` |
+| `step3_businessEntity` | `step-3_business-entity` | An option for the participant type field. Used to determine which W-8 form is required. | `string` | `"I represent a business"` |
+| `step3_docusignError` | `step-3_docusign-error` | This appears inside the Docusign frame. | `string` | `"There was a problem displaying this form. Please refresh the page. If this problem continues, contact our {supportLink}."` |
+| `step3_docusignExpired` | `step-3_docusign-expired` | This appears inside the Docusign frame. | `string` | `"For your security and privacy, we automatically end your session after 20 minutes of inactivity. Please refresh and re-enter your tax information to continue."` |
+| `step3_docusignSessionWarning` | `step-3_docusign-session-warning` | Remind participants their session will time out after 20 minutes of inactivity. | `string` | `"For your security, we automatically end your session when you have not interacted with the form after 20 minutes."` |
+| `step3_exitButton` | `step-3_exit-button` | | `string` | `"Exit"` |
+| `step3_individualParticipant` | `step-3_individual-participant` | An option for the participant type field. Used to determine which W-8 form is required. | `string` | `"I am an individual participant"` |
+| `step3_modalButtonText` | `step-3_modal-button-text` | | `string` | `"I understand"` |
+| `step3_modalDescription` | `step-3_modal-description` | | `string` | `"Remember the name you enter in your tax form. It must exactly match the bank account holder name configured in the next step. {br}{br}Otherwise you will have to resubmit your form again and there will be delays receiving your payout."` |
+| `step3_modalTitle` | `step-3_modal-title` | | `string` | `"Important Note"` |
+| `step3_participantType` | `step-3_participant-type` | | `string` | `"Participant type"` |
+| `step3_refreshButton` | `step-3_refresh-button` | | `string` | `"Refresh Page"` |
+| `step3_taxForm` | `step-3_tax-form` | | `string` | `"Tax form"` |
+| `step3_taxFormDescription` | `step-3_tax-form-description` | Displayed at the top of the page to participants based in the US. | `string` | `"Participants based in the US need to submit a {documentType} form."` |
+| `step3_taxFormDescriptionBusinessEntity` | `step-3_tax-form-description-business-entity` | Displayed at the top of the page to participants representing a business. | `string` | `"Participants residing outside of the US working with a US Brand need to submit a {documentType} form."` |
+| `step3_taxFormDescriptionIndividualParticipant` | `step-3_tax-form-description-individual-participant` | Displayed at the top of the page to individuals joining a US program who reside outside the country. | `string` | `"Participants residing outside of the US, joining the referral program of a US-based company, need to submit a {documentType} form."` |
+| `step3_taxFormLabel` | `step-3_tax-form-label` | Display the type of tax form that the participant must submit. | `string` | `"{documentType} Tax Form"` |
+| `step4_agencyCodeLabel` | `step-4_agency-code-label` | | `string` | `"Agency code"` |
+| `step4_bankAccountNumberLabel` | `step-4_bank-account-number-label` | | `string` | `"Bank account number"` |
+| `step4_bankAccountTypeLabel` | `step-4_bank-account-type-label` | | `string` | `"Bank account type"` |
+| `step4_bankAddressLabel` | `step-4_bank-address-label` | | `string` | `"Bank address"` |
+| `step4_bankCityLabel` | `step-4_bank-city-label` | | `string` | `"Bank city"` |
+| `step4_bankLocationLabel` | `step-4_bank-location-label` | | `string` | `"Bank country location"` |
+| `step4_bankNameLabel` | `step-4_bank-name-label` | | `string` | `"Bank name"` |
+| `step4_bankPostalCodeLabel` | `step-4_bank-postal-code-label` | | `string` | `"Bank postal code"` |
+| `step4_bankStateLabel` | `step-4_bank-state-label` | | `string` | `"Bank Province / State"` |
+| `step4_beneficiaryAccountNameDescription` | `step-4_beneficiary-account-name-description` | | `string` | `"The beneficiary name of your bank account. Ensure this matches the name on your tax form."` |
+| `step4_beneficiaryAccountNameLabel` | `step-4_beneficiary-account-name-label` | | `string` | `"Account holder name"` |
+| `step4_branchCodeLabel` | `step-4_branch-code-label` | | `string` | `"Branch code"` |
+| `step4_branchNameLabel` | `step-4_branch-name-label` | | `string` | `"Branch name"` |
+| `step4_businessSelectItemLabel` | `step-4_business-select-item-label` | One of three options listed for the classification field | `string` | `"Business"` |
+| `step4_checkingSelectItemLabel` | `step-4_checking-select-item-label` | | `string` | `"Checking"` |
+| `step4_classificationCPFLabel` | `step-4_classification-c-p-f-label` | | `string` | `"Classification CPF"` |
+| `step4_classificationCodeLabel` | `step-4_classification-code-label` | | `string` | `"KBE Code"` |
+| `step4_classificationEntityLabel` | `step-4_classification-entity-label` | | `string` | `"Classification entity"` |
+| `step4_classificationLabel` | `step-4_classification-label` | Label text for the classification input field | `string` | `"Classification"` |
+| `step4_directlyToBankAccount` | `step-4_directly-to-bank-account` | | `string` | `"Directly to my bank account"` |
+| `step4_eftWithdrawalLabel` | `step-4_eft-withdrawal-label` | Default payment method to the participants’ bank account. | `string` | `"EFT Withdrawal (free)"` |
+| `step4_foreignSelectItemLabel` | `step-4_foreign-select-item-label` | One of three options listed for the classification field | `string` | `"Foreign"` |
+| `step4_fxWireProcessingFeeLabel` | `step-4_fx-wire-processing-fee-label` | | `string` | `"FX Wire (Processing Fee {currency}{defaultFxFee}.00)"` |
+| `step4_ibanLabel` | `step-4_iban-label` | | `string` | `"IBAN"` |
+| `step4_individualSelectItemLabel` | `step-4_individual-select-item-label` | One of three options listed for the classification field | `string` | `"Individual"` |
+| `step4_modalButtonText` | `step-4_modal-button-text` | | `string` | `"I understand, update my information"` |
+| `step4_modalDescription` | `step-4_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."` |
+| `step4_modalTitle` | `step-4_modal-title` | | `string` | `"Important Note"` |
+| `step4_patronymicNameLabel` | `step-4_patronymic-name-label` | | `string` | `"Patronymic name"` |
+| `step4_payPalInputLabel` | `step-4_pay-pal-input-label` | Displayed to participants who choose PayPal as their payout method | `string` | `"PayPal email"` |
+| `step4_paymentDayFifteenthOfMonthLabelText` | `step-4_payment-day-fifteenth-of-month-label-text` | One of two payment day options | `string` | `"15th of the month"` |
+| `step4_paymentDayFirstOfMonthLabelText` | `step-4_payment-day-first-of-month-label-text` | One of two payment day options | `string` | `"1st of the month"` |
+| `step4_paymentDaySelectLabel` | `step-4_payment-day-select-label` | Let the participant choose what day of the month they’ll get paid | `string` | `"Payment Day"` |
+| `step4_paymentMethod` | `step-4_payment-method` | | `string` | `"Payment method"` |
+| `step4_paymentMethodSubtext` | `step-4_payment-method-subtext` | | `string` | `"Payouts will be sent from our referral program provider, impact.com."` |
+| `step4_paymentSchedule` | `step-4_payment-schedule` | | `string` | `"Payment schedule"` |
+| `step4_paymentScheduleBalanceThreshold` | `step-4_payment-schedule-balance-threshold` | | `string` | `"Pay me when my balance reaches a threshold"` |
+| `step4_paymentScheduleFixedDay` | `step-4_payment-schedule-fixed-day` | | `string` | `"Pay me on a fixed day of the month"` |
+| `step4_paymentThresholdSelectLabel` | `step-4_payment-threshold-select-label` | Participant use this field to select the balance at which they want to be paid | `string` | `"Payment threshold"` |
+| `step4_routingCodeLabel` | `step-4_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} }"` |
+| `step4_savingsSelectItemLabel` | `step-4_savings-select-item-label` | Label text for the savings account type select item | `string` | `"Savings"` |
+| `step4_swiftCodeLabel` | `step-4_swift-code-label` | | `string` | `"SWIFT code"` |
+| `step4_taxAndPayouts` | `step-4_tax-and-payouts` | | `string` | `"Payouts"` |
+| `step4_taxPayerIdLabel` | `step-4_tax-payer-id-label` | | `string` | `"Beneficiary INN"` |
+| `step4_toPayPalAccount` | `step-4_to-pay-pal-account` | | `string` | `"PayPal (2% processing fee capped to {feeCap})"` |
+| `step4_verifyEmailDescriptionText` | `step-4_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."` |
+| `step4_verifyEmailHeaderText` | `step-4_verify-email-header-text` | | `string` | `"Verify your email"` |
+| `step4_voCodeLabel` | `step-4_vo-code-label` | | `string` | `"VO code"` |
+| `supportLink` | `support-link` | Link text for contacting support team | `string` | `"support team"` |
+| `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."` |
+| `termsAndConditions` | `terms-and-conditions` | Link text for Terms and Conditions | `string` | `"Terms and Conditions"` |
## Dependencies
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/sqm-tax-and-cash.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/sqm-tax-and-cash.tsx
index 4ac362a10a..88af3c1ccf 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/sqm-tax-and-cash.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/sqm-tax-and-cash.tsx
@@ -557,6 +557,12 @@ export class TaxAndCashMonolith {
*/
@Prop() step4_branchCodeLabel: string = "Branch code";
+ /**
+ * @uiName Branch name field label
+ * @uiGroup Step 4 Properties
+ */
+ @Prop() step4_branchNameLabel: string = "Branch name";
+
/**
* Label text for the classification input field
* @uiName Classification field label
@@ -564,6 +570,12 @@ export class TaxAndCashMonolith {
*/
@Prop() step4_classificationLabel: string = "Classification";
+ /**
+ * @uiName Classification code field label
+ * @uiGroup Step 4 Properties
+ */
+ @Prop() step4_classificationCodeLabel: string = "KBE code";
+
/**
* @uiName Taxpayer ID field label
* @uiGroup Step 4 Properties
diff --git a/packages/mint-components/src/templates/TaxAndCash.html b/packages/mint-components/src/templates/TaxAndCash.html
index e90c98da6a..fc628eee15 100644
--- a/packages/mint-components/src/templates/TaxAndCash.html
+++ b/packages/mint-components/src/templates/TaxAndCash.html
@@ -266,7 +266,9 @@
diff --git a/packages/mint-components/src/components/sqm-rewards-table/TaxAndCashRewardsTableCell.stories.tsx b/packages/mint-components/src/components/sqm-rewards-table/TaxAndCashRewardsTableCell.stories.tsx
index 4c16fb9c61..8dedec2ec5 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/TaxAndCashRewardsTableCell.stories.tsx
+++ b/packages/mint-components/src/components/sqm-rewards-table/TaxAndCashRewardsTableCell.stories.tsx
@@ -305,3 +305,103 @@ export const StatusCellPayoutCancelled = () => {
>
);
};
+
+export const StatusCellCancelled = () => {
+ return (
+
+ );
+};
+
+export const StatusCellPFTNoWithdrawalSettings = () => {
+ return (
+
+ );
+};
+
+export const StatusCellNotConnectedExistingTaxForm = () => {
+ return (
+
+ );
+};
+
+export const StatusCellExistingPartnerTaxFormNoWithdrawalSettings = () => {
+ return (
+
+ );
+};
diff --git a/packages/mint-components/src/components/sqm-rewards-table/cells/sqm-rewards-table-status-cell.tsx b/packages/mint-components/src/components/sqm-rewards-table/cells/sqm-rewards-table-status-cell.tsx
index 7f2c42ca67..521ed38bbb 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/cells/sqm-rewards-table-status-cell.tsx
+++ b/packages/mint-components/src/components/sqm-rewards-table/cells/sqm-rewards-table-status-cell.tsx
@@ -101,16 +101,25 @@ export class RewardTableStatusCell {
const integrationOrFueltankReward =
reward.type === "INTEGRATION" || reward.type === "FUELTANK";
+ // AL: TODO Scott said we should change this to use pendingReasons instead of fraudStatus
const fraudStatus = reward.referral?.fraudData?.moderationStatus;
if (fraudStatus === "DENIED") return "DENIED";
if (fraudStatus === "PENDING") return "PENDING_REVIEW";
const partnerTransferStatus = reward.partnerFundsTransfer?.status;
-
+ console.log(this.reward, "reward in status cell");
if (reward.partnerFundsTransfer) {
if (partnerTransferStatus === "REVERSED") return "PAYOUT_CANCELLED";
if (partnerTransferStatus === "OVERDUE") return "PAYOUT_FAILED";
+ }
+
+ // pft can now be created before withdrawal settings exist
+ const needsPayoutSetup =
+ this.taxConnection?.connected &&
+ !this.taxConnection?.publisher?.withdrawalSettings;
+ if (needsPayoutSetup) return "PENDING";
+ if (reward.partnerFundsTransfer) {
if (
reward.partnerFundsTransfer.dateScheduled &&
reward.partnerFundsTransfer.dateScheduled > Date.now()
@@ -171,13 +180,24 @@ export class RewardTableStatusCell {
if (status === "INACTIVE") return this.pendingNewTaxForm;
if (status === "NOT_VERIFIED") return this.pendingTaxReview;
}
- if (!taxConnection?.publisher?.withdrawalSettings)
+ if (!taxConnection?.publisher?.withdrawalSettings) {
return this.pendingPartnerCreation;
+ }
}
if (reward?.pendingReasons?.includes("MISSING_PAYOUT_CONFIGURATION")) {
return this.pendingPartnerCreation;
}
+ // Fallback: when rewardStatus() forced PENDING because the user is
+ // connected but hasn't set up withdrawal settings (no pendingReasons
+ // were returned by the API, e.g. for credit rewards with a PFT).
+ if (
+ taxConnection?.connected &&
+ !taxConnection?.publisher?.withdrawalSettings
+ ) {
+ return this.pendingPartnerCreation;
+ }
+
return "";
}
diff --git a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
new file mode 100644
index 0000000000..bc528d5c24
--- /dev/null
+++ b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
@@ -0,0 +1,234 @@
+@author:derek @owner:derek
+Feature: Reward Table Status Column
+ Shows the status of each reward as a coloured pill plus a description
+ line. The status is derived from the reward's fraud state, the user's
+ Impact tax/payout connection, the reward's PartnerFundsTransfer (PFT),
+ the reward's lifecycle dates, and the reward's `statuses` /
+ `pendingReasons` arrays.
+
+ Background:
+ Given the status column is included in the reward table
+ # ============================================================
+ # 1. COLUMN CONFIGURATION
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: The title of the status column is configurable
+ Given the "column-title" prop is set to
+ Then the status column is shown with
+
+ Examples:
+ | value | columnTitle |
+ | Status | |
+ | My column title | My column title |
+
+ @minutia @ui
+ Scenario Outline: Expiry status date text can be configured
+ Given the "expiry-text" prop has
+ And a user with an available reward with an expiry date
+ When they view the reward table
+ Then they see under the Available Status pill
+
+ Examples:
+ | value | text |
+ | Expires | Expires |
+ | Redeem before | Redeem before |
+ # ============================================================
+ # 2. STATUS PRECEDENCE
+ # rewardStatus() walks the rules below from top to bottom and the first
+ # matching rule wins.
+ # ============================================================
+
+ @motivating
+ Scenario: Status precedence ladder
+ Given a reward, its referral fraud state, the user's Impact tax connection
+ Then the displayed status is determined in the following order:
+ | order | rule | resulting status | resulting description |
+ | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Detected self-referral |
+ | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Awaiting review |
+ | 3 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | If you think this is a mistake, contact our Support team. |
+ | 4 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout failed due to a fulfillment issue and is currently being retried. |
+ | 5 | impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING | Complete your tax and cash payout setup to receive your rewards. |
+ | 6 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" AND publisher.withdrawalSettings is missing | PENDING | Complete your tax and cash payout setup to receive your rewards. |
+ | 7 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 8 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout approved and scheduled for payment based on your settings. |
+ | 9 | reward.dateCancelled is set | CANCELLED | Jan 1, 2026 |
+ | 10 | reward.statuses includes "EXPIRED" | EXPIRED | Jan 1, 2026 |
+ | 11 | reward.statuses includes "PENDING" | PENDING | Until Jan 1, 2026 |
+ | 12 | reward.type is "CREDIT" AND statuses includes "REDEEMED" | REDEEMED | Jan 1, 2026 |
+ | 13 | reward.type is "CREDIT" | AVAILABLE | Expires Jan 1, 2026 |
+ | 14 | reward.type is "PCT_DISCOUNT" AND statuses includes "AVAILABLE" | AVAILABLE | Expires Jan 1, 2026 |
+ | 15 | reward.type is "INTEGRATION" / "FUELTANK" AND statuses includes "PENDING" | PENDING | Until Jan 1, 2026 |
+ | 16 | reward.type is "INTEGRATION" / "FUELTANK" AND statuses includes "CANCELLED" | CANCELLED | Jan 1, 2026 |
+ | 17 | reward.type is "INTEGRATION" / "FUELTANK" AND statuses includes "AVAILABLE" | AVAILABLE | Expires Jan 1, 2026 |
+ | 18 | none of the above | "" (no badge text) | (no description) |
+ # ============================================================
+ # 3. STATUS → BADGE COLOUR MAPPING
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: Each status maps to a badge colour and default text
+ Given a reward whose computed status is
+ When the cell is rendered
+ Then the badge is shown in a pill with
+
+ Examples:
+ | status | text | pillColour |
+ | AVAILABLE | Available | success |
+ | REDEEMED | Redeemed | primary |
+ | PAYOUT_APPROVED | Payout Approved | primary |
+ | PENDING | Pending | warning |
+ | PENDING_REVIEW | Pending | warning |
+ | PROCESSING | Processing | warning |
+ | CANCELLED | Cancelled | danger |
+ | EXPIRED | Expired | danger |
+ | DENIED | Denied | danger |
+ | PAYOUT_FAILED | Payout Failed | danger |
+ | PAYOUT_CANCELLED | Payout Cancelled | danger |
+ # ============================================================
+ # 4. DESCRIPTION LINE PRECEDENCE
+ # The description under the badge is selected in this order:
+ # 1. Fraud descriptions (PENDING_REVIEW / DENIED)
+ # 2. Pending-reason descriptions (only when status is PENDING)
+ # 3. Payout descriptions (PAYOUT_APPROVED / PAYOUT_FAILED /
+ # PAYOUT_CANCELLED / PROCESSING)
+ # 4. Reward date (dateCancelled / dateExpires / dateRedeemed),
+ # prefixed with the configured expiry-text when status is AVAILABLE
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: Fraud descriptions are shown for fraud-derived statuses
+ Given a reward whose computed status is
+ When the cell is rendered
+ Then the description line shows
+
+ Examples:
+ | status | description |
+ | DENIED | Detected self-referral |
+ | PENDING_REVIEW | Awaiting review |
+
+ @motivating @ui
+ Scenario Outline: Date-based descriptions for terminal lifecycle states
+ Given a reward whose computed status is
+ And the reward has populated
+ When the cell is rendered
+ Then the description line shows
+
+ Examples:
+ | status | date | text |
+ | AVAILABLE | dateExpires | Expires |
+ | EXPIRED | dateExpires | |
+ | CANCELLED | dateCancelled | |
+ | REDEEMED | dateRedeemed | |
+
+ @motivating @ui
+ Scenario Outline: Payout descriptions for PFT-derived statuses
+ Given a reward whose computed status is
+ When the cell is rendered
+ Then the description line shows
+
+ Examples:
+ | status | description |
+ | PAYOUT_APPROVED | Payout approved and scheduled for payment based on your settings. |
+ | PAYOUT_FAILED | Payout failed due to a fulfillment issue and is currently being retried. |
+ | PAYOUT_CANCELLED | If you think this is a mistake, contact our Support team. |
+ | PROCESSING | Processing until . Payout is then scheduled based on your settings. |
+ # ============================================================
+ # 5. PENDING DESCRIPTION RESOLUTION (getTaxPendingReasons)
+ # When the computed status is PENDING the description is the first
+ # non-empty value of:
+ # a) tax/payout reason (getTaxPendingReasons)
+ # b) reward.pendingReasons mapped through pendingCodeMap, joined by ", "
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: US_TAX pending reason resolves based on the tax connection state
+ Given the user has a PENDING reward whose pendingReasons include "US_TAX"
+ And the user's impactConnection.taxHandlingEnabled is
+ And the user's impactConnection.connected is
+ And the user's publisher.requiredTaxDocumentType is
+ And the user's publisher.currentTaxDocument is
+ And the user's publisher.currentTaxDocument.status is
+ And the user's publisher.withdrawalSettings is
+ Then the description line shows
+
+ Examples:
+ | taxHandlingEnabled | connected | requiredTaxDocumentType | currentTaxDocument | currentTaxDocumentStatus | withdrawalSettings | description |
+ | false | true | W9 | present | ACTIVE | present | W-9 required |
+ | true | false | - | - | - | - | Complete your tax and cash payout setup to receive your rewards. |
+ | true | true | W9 | missing | - | present | Submit your tax documents to receive your rewards. |
+ | true | true | W9 | present | INACTIVE | present | Invalid tax form. Submit a new form to receive your rewards. |
+ | true | true | W9 | present | NOT_VERIFIED | present | Awaiting tax form review. |
+ | true | true | W9 | present | ACTIVE | missing | Complete your tax and cash payout setup to receive your rewards. |
+
+ @motivating @ui
+ Scenario: MISSING_PAYOUT_CONFIGURATION pending reason shows the partner-creation prompt
+ Given the user has a PENDING reward whose pendingReasons include "MISSING_PAYOUT_CONFIGURATION"
+ And the user is connected with publisher.withdrawalSettings missing
+ Then the description line shows "Complete your tax and cash payout setup to receive your rewards."
+
+ @motivating @ui
+ Scenario: Connected user without withdrawal settings shows the partner-creation prompt as a fallback
+ Given the user has a PENDING reward whose pendingReasons array is empty
+ And the user is connected with publisher.withdrawalSettings missing
+ Then the description line shows "Complete your tax and cash payout setup to receive your rewards."
+
+ @motivating @ui
+ Scenario Outline: Generic pendingReasons codes are mapped via pendingCodeMap
+ Given the user has a PENDING reward
+ And the reward has no tax/payout pending reason
+ And the reward.pendingReasons include
+ When the cell is rendered
+ Then the description line shows
+
+ Examples:
+ | pendingReason | text |
+ | SCHEDULED | Until |
+ | UNHANDLED_ERROR | Fulfillment error |
+ | SUSPECTED_FRAUD | Awaiting review |
+
+ @minutia
+ Scenario: Multiple pending reasons are joined with commas
+ Given the user has a PENDING reward
+ And the reward has no tax/payout pending reason
+ And the reward.pendingReasons include both "UNHANDLED_ERROR" and "SCHEDULED"
+ Then the description line shows the mapped strings joined by ", "
+
+ @minutia
+ Scenario: Unknown pending reason codes pass through verbatim
+ Given the user has a PENDING reward
+ And the reward.pendingReasons include a code not present in the pendingCodeMap
+ Then the raw code is shown in the description line
+ # ============================================================
+ # 6. STATUS TEXT CUSTOMIZATION (status-text prop)
+ # ============================================================
+
+ @motivating
+ Scenario Outline: Statuses can be customized via ICU format
+ Given the "status-text" prop is "{status, select, AVAILABLE {Redeem me!} CANCELLED {Unavailable} PENDING {Coming soon!} EXPIRED {Past due} REDEEMED {Spent} PENDING_REVIEW {Pending Review!} PAYOUT_APPROVED {Payout Sent!} PAYOUT_FAILED {Payout Failed!} PAYOUT_CANCELLED {Payout Cancelled!} PROCESSING {Processing!} DENIED {Unlucky!}}"
+ And a reward whose computed status is
+ When the cell is rendered
+ Then the badge is rendered in a pill with text
+
+ Examples:
+ | status | text | pillColour |
+ | AVAILABLE | Redeem me! | success |
+ | CANCELLED | Unavailable | danger |
+ | PENDING | Coming soon! | warning |
+ | EXPIRED | Past due | danger |
+ | REDEEMED | Spent | primary |
+ | PENDING_REVIEW | Pending Review! | warning |
+ | PAYOUT_APPROVED | Payout Sent! | primary |
+ | PAYOUT_FAILED | Payout Failed! | danger |
+ | PAYOUT_CANCELLED | Payout Cancelled! | danger |
+ | PROCESSING | Processing! | warning |
+ | DENIED | Unlucky! | danger |
+ # ============================================================
+ # 7. LOCALIZATION
+ # ============================================================
+
+ @minutia
+ Scenario: Dates are formatted in the user's locale
+ Given the "locale" prop is set to a supported locale
+ Then every placeholder above is formatted with that locale
+ And the configurable text props (expiryText, payoutProcessing, etc.) flow through `intl.formatMessage`
diff --git a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column.feature b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column.feature
index af4cbd3b08..8509e4bae9 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column.feature
+++ b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column.feature
@@ -58,21 +58,21 @@ Feature: Reward Table Status Column
| expired reward | |
| cancelled reward | |
| pending reward with a scheduled date | Until |
-
+
Examples: Tax & Payout Rewards
- | reward | text |
- | pending reward due to W9 | W-9 required |
- | pending reward due to fulfillment error | Fulfillment error |
- | reward pending review of referral | Awaiting review |
- | pending reward due to no connected Impact partner | Complete your tax and cash payout setup to receive your rewards. |
- | pending reward due to an invalid tax document | Invalid tax form. Submit a new form to receive your rewards. |
- | pending reward due to user required to submit a tax document | Submit your tax documents to receive your rewards. |
- | pending reward due to tax document being in review | Awaiting tax form review. |
- | reward whose payout is processing | Processing until . Payout is then scheduled based on your settings. |
- | reward whose payout failed | Payout failed due to a fulfillment issue and is currently being retried. |
- | reward whose payout was approved | Payout approved and scheduled for payment based on your settings. |
- | reward whose payout was cancelled | If you think this is a mistake, contact our Support team. |
- | cancelled reward from denied referral | Detected self-referral |
+ | reward | text |
+ | pending reward due to W9 | W-9 required |
+ | pending reward due to fulfillment error | Fulfillment error |
+ | reward pending review of referral | Awaiting review |
+ | pending reward due to no connected Impact partner | Complete your tax and cash payout setup to receive your rewards. |
+ | pending reward due to an invalid tax document | Invalid tax form. Submit a new form to receive your rewards. |
+ | pending reward due to user required to submit a tax document | Submit your tax documents to receive your rewards. |
+ | pending reward due to tax document being in review | Awaiting tax form review. |
+ | reward whose payout is processing | Processing until . Payout is then scheduled based on your settings. |
+ | reward whose payout failed | Payout failed due to a fulfillment issue and is currently being retried. |
+ | reward whose payout was approved | Payout approved and scheduled for payment based on your settings. |
+ | reward whose payout was cancelled | If you think this is a mistake, contact our Support team. |
+ | cancelled reward from denied referral | Detected self-referral |
@minutia
Scenario Outline: Tax-related reward statuses are based on the user's Impact tax connection
@@ -128,9 +128,9 @@ Feature: Reward Table Status Column
And under the pill is
Examples:
- | pftState | status | text | pillColour | description |
- | transfer date is in the future | PROCESSING | Processing | warning | Processing until . Payout is then scheduled based on your settings. |
- | successfully transferred to payment provider | PAYOUT_TRANSFERRED | Payout Approved | primary | Payout approved and scheduled for payment based on your settings. |
- | approved but payout scheduled date not yet arrived | PAYOUT_NOT_YET_DUE | Payout Approved | primary | Payout approved and scheduled for payment based on your settings. |
- | failed due to fulfillment issue and retrying | PAYOUT_OVERDUE | Payout Failed | danger | Payout failed due to a fulfillment issue and is currently being retried. |
- | reversed or cancelled after being processed | PAYOUT_REVERSED | Payout Cancelled | danger | If you think this is a mistake, contact our Support team. |
\ No newline at end of file
+ | pftState | status | text | pillColour | description |
+ | transfer date is in the future | PROCESSING | Processing | warning | Processing until . Payout is then scheduled based on your settings. |
+ | successfully transferred to payment provider | PAYOUT_TRANSFERRED | Payout Approved | primary | Payout approved and scheduled for payment based on your settings. |
+ | approved but payout scheduled date not yet arrived | PAYOUT_NOT_YET_DUE | Payout Approved | primary | Payout approved and scheduled for payment based on your settings. |
+ | failed due to fulfillment issue and retrying | PAYOUT_OVERDUE | Payout Failed | danger | Payout failed due to a fulfillment issue and is currently being retried. |
+ | reversed or cancelled after being processed | PAYOUT_REVERSED | Payout Cancelled | danger | If you think this is a mistake, contact our Support team. |
diff --git a/packages/mint-components/src/components/sqm-stencilbook/readme.md b/packages/mint-components/src/components/sqm-stencilbook/readme.md
index d1068c7ba1..f28bfb36e6 100644
--- a/packages/mint-components/src/components/sqm-stencilbook/readme.md
+++ b/packages/mint-components/src/components/sqm-stencilbook/readme.md
@@ -288,6 +288,7 @@ graph TD;
sqm-widget-verification --> sqm-partner-info-modal
sqm-widget-verification --> sqm-code-verification
sqm-widget-verification --> sqm-email-verification
+ sqm-partner-info-modal --> sqm-form-message
style sqm-stencilbook fill:#f9f,stroke:#333,stroke-width:4px
```
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/readme.md b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/readme.md
index 68f4733144..f3fd7c6281 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/readme.md
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/readme.md
@@ -5,199 +5,198 @@
## Properties
-| Property | Attribute | Description | Type | Default |
-| --------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `backButton` | `back-button` | | `string` | `"Back"` |
-| `cancelButton` | `cancel-button` | | `string` | `"Cancel"` |
-| `continueButton` | `continue-button` | | `string` | `"Continue"` |
-| `dashboard_accountReviewDescription` | `dashboard_account-review-description` | | `string` | `"This process takes 48 hours, payouts are on hold until it's completed. You will receive an email from our referral provider, Impact.com, if any issues arise. It contains details on how to resolve this issue. If you need further assistance, please reach out to our {supportLink}."` |
-| `dashboard_accountReviewHeader` | `dashboard_account-review-header` | | `string` | `"Your account is under review"` |
-| `dashboard_accountText` | `dashboard_account-text` | Shown before the participant’s bank account information. | `string` | `"Account"` |
-| `dashboard_badgeTextAwaitingReview` | `dashboard_badge-text-awaiting-review` | Additional text displayed next to the tax form's status badge. | `string` | `"Awaiting review. Submitted on {dateSubmitted}."` |
-| `dashboard_badgeTextSubmittedOn` | `dashboard_badge-text-submitted-on` | Additional text displayed next to the tax form's status badge | `string` | `"Submitted on {dateSubmitted}."` |
-| `dashboard_badgeTextSubmittedOnW8` | `dashboard_badge-text-submitted-on-w-8` | Additional text displayed next to the tax form's status badge. | `string` | `"Submitted on {dateSubmitted}. Valid for three years after submission."` |
-| `dashboard_bankNameMismatchDescription` | `dashboard_bank-name-mismatch-description` | | `string` | `"The bank account (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
-| `dashboard_bankNameMismatchHeader` | `dashboard_bank-name-mismatch-header` | | `string` | `"Your payment information does not match your tax form"` |
-| `dashboard_bankingInformationSectionHeader` | `dashboard_banking-information-section-header` | | `string` | `"Payout Information"` |
-| `dashboard_beneficiaryNameInvalidDescription` | `dashboard_beneficiary-name-invalid-description` | | `string` | `"The account holder (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
-| `dashboard_beneficiaryNameInvalidHeader` | `dashboard_beneficiary-name-invalid-header` | | `string` | `"Your payment information does not match your tax form"` |
-| `dashboard_beneficiaryNameMismatchDescription` | `dashboard_beneficiary-name-mismatch-description` | | `string` | `"The account holder (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
-| `dashboard_beneficiaryNameMismatchHeader` | `dashboard_beneficiary-name-mismatch-header` | | `string` | `"Your payment information does not match your tax form"` |
-| `dashboard_dateColumnTitle` | `dashboard_date-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Date"` |
-| `dashboard_earningsAfterTaxColumnTitle` | `dashboard_earnings-after-tax-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Earnings after tax"` |
-| `dashboard_earningsColumnTitle` | `dashboard_earnings-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Earnings"` |
-| `dashboard_editPaymentInformationButton` | `dashboard_edit-payment-information-button` | | `string` | `"Edit payout information"` |
-| `dashboard_indirectTaxColumnTitle` | `dashboard_indirect-tax-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Indirect tax"` |
-| `dashboard_indirectTaxDetails` | `dashboard_indirect-tax-details` | Displayed to participants who have submitted their indirect tax information. | `string` | `"{indirectTaxType} number: {indirectTaxNumber}"` |
-| `dashboard_indirectTaxInfoCanada` | `dashboard_indirect-tax-info-canada` | If the participant is registered for indirect tax in Canada, display the province they’re registered in. | `string` | `"Registered in {province}, {country}"` |
-| `dashboard_indirectTaxInfoOtherCountry` | `dashboard_indirect-tax-info-other-country` | If the participant is registered for indirect tax, display the country they’re registered in. | `string` | `"Registered in {country}"` |
-| `dashboard_indirectTaxInfoSectionHeader` | `dashboard_indirect-tax-info-section-header` | | `string` | `"Indirect tax"` |
-| `dashboard_indirectTaxInfoSpain` | `dashboard_indirect-tax-info-spain` | If the participant is registered for indirect tax in Spain, display the region they’re registered in. | `string` | `"Registered in {country}, {subRegion}"` |
-| `dashboard_indirectTaxTooltipSupport` | `dashboard_indirect-tax-tooltip-support` | | `string` | `"To make changes to your indirect tax information, please contact our {supportLink}."` |
-| `dashboard_invalidForm` | `dashboard_invalid-form` | Additional text displayed next to the tax form's status badge. | `string` | `"Make sure your information is correct and submit new form."` |
-| `dashboard_invoiceColumnTitle` | `dashboard_invoice-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Invoice"` |
-| `dashboard_invoiceDescription` | `dashboard_invoice-description` | | `string` | `"View and download your invoices to report your earnings and stay tax compliant."` |
-| `dashboard_invoiceEmptyStateHeader` | `dashboard_invoice-empty-state-header` | | `string` | `"View your invoice details"` |
-| `dashboard_invoiceEmptyStateText` | `dashboard_invoice-empty-state-text` | | `string` | `"Refer a friend to view the status of your invoices and rewards earned"` |
-| `dashboard_invoiceHeader` | `dashboard_invoice-header` | | `string` | `"Invoices"` |
-| `dashboard_invoiceMoreLabel` | `dashboard_invoice-more-label` | | `string` | `"Next"` |
-| `dashboard_invoicePrevLabel` | `dashboard_invoice-prev-label` | | `string` | `"Prev"` |
-| `dashboard_newFormButton` | `dashboard_new-form-button` | | `string` | `"Submit new tax form"` |
-| `dashboard_noFormNeededSubtext` | `dashboard_no-form-needed-subtext` | No other statuses or badges will be displayed in the tax form section in this case. | `string` | `"Tax documents are only required if you are based in the US or joining the referral program of a US based brand."` |
-| `dashboard_notRegisteredForTax` | `dashboard_not-registered-for-tax` | | `string` | `"Not registered for indirect tax. If you’ve previously registered with your tax authority, contact our {supportLink} to add your information to stay tax compliant."` |
-| `dashboard_paymentOnHoldDescription` | `dashboard_payment-on-hold-description` | | `string` | `"Your payout is temporarily on hold while we review your new payment information, this process is usually resolved within 48 hours."` |
-| `dashboard_paymentOnHoldHeader` | `dashboard_payment-on-hold-header` | | `string` | `"We are reviewing your new payout settings"` |
-| `dashboard_paymentReturnedDescription` | `dashboard_payment-returned-description` | | `string` | `"Our recent payment attempt for your earnings was unsuccessful. Please review your payment information and make sure it is correct."` |
-| `dashboard_paymentReturnedHeader` | `dashboard_payment-returned-header` | | `string` | `"Payout unsuccessful"` |
-| `dashboard_payoutFromImpact` | `dashboard_payout-from-impact` | Displayed under the payout details card. | `string` | `"Your balance may take up to 24 hours to update. Payouts will be sent from our referral program provider, impact.com."` |
-| `dashboard_payoutHoldAlertDescription` | `dashboard_payout-hold-alert-description` | Part of the alert displayed at the top of the page when there’s been an issue preventing payouts. | `string` | `"Please contact our {supportLink} or check your inbox for an email from our referral program provider, impact.com."` |
-| `dashboard_payoutHoldAlertHeader` | `dashboard_payout-hold-alert-header` | Part of the alert displayed at the top of the page when there’s been an issue preventing payouts. | `string` | `"Your payout is on hold"` |
-| `dashboard_payoutMissingInformationText` | `dashboard_payout-missing-information-text` | Text displayed for existing publishers that do not have saved banking information. | `string` | `"Missing banking information, go to Impact.com to resolve."` |
-| `dashboard_qstNumber` | `dashboard_qst-number` | Displayed to participants registered in Quebec, Canada. | `string` | `"QST number: {qstNumber}"` |
-| `dashboard_replaceTaxFormModalBodyText` | `dashboard_replace-tax-form-modal-body-text` | | `string` | `"Submitting a new tax form will remove your existing form. Make sure to sign and complete your new tax form to prevent any issues with your next payout."` |
-| `dashboard_replaceTaxFormModalHeader` | `dashboard_replace-tax-form-modal-header` | | `string` | `"Replace existing tax form"` |
-| `dashboard_requiredTaxForm` | `dashboard_required-tax-form` | Additional text displayed next to the tax form's status badge | `string` | `"Your payouts are on hold until you submit a {taxFormType} tax form."` |
-| `dashboard_statusBadgeText` | `dashboard_status-badge-text` | | `string` | `"{badgeText, select, payoutToday {Payout Today} nextPayout {Next Payout} }"` |
-| `dashboard_statusTextActive` | `dashboard_status-text-active` | | `string` | `"Active"` |
-| `dashboard_statusTextNotActive` | `dashboard_status-text-not-active` | | `string` | `"Invalid Tax Form"` |
-| `dashboard_statusTextNotVerified` | `dashboard_status-text-not-verified` | Displayed when the participant submitted their form but it is awaiting review. | `string` | `"Not Verified"` |
-| `dashboard_statusTextRequired` | `dashboard_status-text-required` | Displayed when the participant has not submitted their required tax form. | `string` | `"Required"` |
-| `dashboard_subRegionTaxNumber` | `dashboard_sub-region-tax-number` | | `string` | `"Income tax number: {subRegionTaxNumber}"` |
-| `dashboard_taxAlertHeaderNotActiveW8` | `dashboard_tax-alert-header-not-active-w-8` | Part of the alert displayed at the top of the page. | `string` | `"{documentType} tax form is invalid"` |
-| `dashboard_taxAlertHeaderNotActiveW9` | `dashboard_tax-alert-header-not-active-w-9` | Part of the alert displayed at the top of the page. | `string` | `"Your W-9 tax form has personal information that doesn’t match your profile"` |
-| `dashboard_taxAlertNotActiveMessageW8` | `dashboard_tax-alert-not-active-message-w-8` | Part of the alert displayed at the top of the page. | `string` | `"Your tax form may have expired or has personal information that doesn’t match your profile. Please submit a new {documentType} form."` |
-| `dashboard_taxAlertNotActiveMessageW9` | `dashboard_tax-alert-not-active-message-w-9` | Part of the alert displayed at the top of the page. | `string` | `"Please resubmit a new {documentType} form."` |
-| `dashboard_taxDocumentSectionHeader` | `dashboard_tax-document-section-header` | | `string` | `"Tax documents"` |
-| `dashboard_taxDocumentSectionSubHeader` | `dashboard_tax-document-section-sub-header` | Displayed under the tax document section header. | `string` | `"{documentType} tax form"` |
-| `dashboard_termsAndConditions` | `dashboard_terms-and-conditions` | | `string` | `"Terms and Conditions"` |
-| `dashboard_thresholdPayoutText` | `dashboard_threshold-payout-text` | Display participants' payout preference on the payout information card, indicating the balance at which they want to get paid. | `string` | `"Next payout occurs when balance is {thresholdBalance}"` |
-| `dashboard_verificationFailedInternalDescription` | `dashboard_verification-failed-internal-description` | | `string` | `"Identity verification has failed. Our team is reviewing the report and will contact you with further information. If you don't hear from us contact our {supportLink}."` |
-| `dashboard_verificationFailedInternalHeader` | `dashboard_verification-failed-internal-header` | | `string` | `"Identity verification usuccessful"` |
-| `dashboard_verificationRequiredButtonText` | `dashboard_verification-required-button-text` | Part of the alert displayed at the top of the page when the user needs to verify their identity. | `string` | `"Start Verification"` |
-| `dashboard_verificationRequiredDescription` | `dashboard_verification-required-description` | Part of the alert displayed at the top of the page when the user needs to verify their identity | `string` | `"Complete your verification to start receiving your cash rewards. It should only take a few minutes verify. If you run in to an issue verifying your identity contact our {supportLink}."` |
-| `dashboard_verificationRequiredHeader` | `dashboard_verification-required-header` | Part of the alert displayed at the top of the page when the user needs to verify their identity. | `string` | `"Verify your identity"` |
-| `dashboard_verificationRequiredInternalDescription` | `dashboard_verification-required-internal-description` | | `string` | `"Identity verification submission has been received. Our system is currently performing additional checks and analyzing the results. You will be updated shortly. If you don't hear from us contact our {supportLink}."` |
-| `dashboard_verificationRequiredInternalHeader` | `dashboard_verification-required-internal-header` | | `string` | `"Identity verification in progress"` |
-| `dashboard_verificationReviewInternalDescription` | `dashboard_verification-review-internal-description` | | `string` | `"Identity verification requires further review due to a potential error. Our team is reviewing the information and will update you shortly. If you don't hear from us contact our {supportLink}."` |
-| `dashboard_verificationReviewInternalHeader` | `dashboard_verification-review-internal-header` | | `string` | `"Identity verification under review"` |
-| `dashboard_w9RequiredButtonText` | `dashboard_w-9-required-button-text` | | `string` | `"Submit W-9"` |
-| `dashboard_w9RequiredDescription` | `dashboard_w-9-required-description` | | `string` | `"You have surpassed the $600 threshold requiring a W-9 form or have multiple accounts with impact.com. To remove the hold, please submit your W-9 form."` |
-| `dashboard_w9RequiredHeader` | `dashboard_w-9-required-header` | | `string` | `"Your next payout is on hold"` |
-| `dashboard_withdrawalSettingsInvalidDescription` | `dashboard_withdrawal-settings-invalid-description` | | `string` | `"There are missing fields or invalid characters in your payment information. Please review your information and make sure it is correct. Your payouts are on hold until this is resolved."` |
-| `dashboard_withdrawalSettingsInvalidHeader` | `dashboard_withdrawal-settings-invalid-header` | | `string` | `"Your payment information is incomplete or includes invalid characters"` |
-| `demoData` | -- | | `{ step1_firstName?: string; step1_lastName?: string; step1_email?: string; step1_country?: string; step1_phoneNumber?: string; step1_address?: string; step1_city?: string; step1_state?: string; step1_province?: string; step1_region?: string; step1_postalCode?: string; step1_currency?: string; step1_currencyHelpText?: string; step1_allowBankingCollection?: string; step1_personalInformation?: string; step1_termsAndConditionsLabel?: string; step1_termsAndConditionsLink?: string; step1_searchForCurrencyText?: string; step2_indirectTax?: string; step2_indirectTaxDescription?: string; step2_indirectTaxDetails?: string; step2_otherRegion?: string; step2_otherRegionSubtext?: string; step2_notRegistered?: string; step2_notRegisteredSubtext?: string; step2_selectedRegion?: string; step2_indirectTaxNumber?: string; step2_province?: string; step2_indirectTaxNumberError?: string; step2_qstNumber?: string; step2_isRegisteredQST?: string; step2_isRegisteredSubRegionIncomeTax?: string; step2_subRegion?: string; step2_subRegionTaxNumberLabel?: string; step2_cannotChangeInfoAlert?: string; step3_taxForm?: string; step3_taxFormLabel?: string; step3_participantType?: string; step3_businessEntity?: string; step3_individualParticipant?: string; step3_taxFormDescription?: string; step3_taxFormDescriptionIndividualParticipant?: string; step3_taxFormDescriptionBusinessEntity?: string; step3_docusignExpired?: string; step3_docusignSessionWarning?: string; step3_docusignError?: string; step3_refreshButton?: string; step3_exitButton?: string; step3_modalTitle?: string; step3_modalDescription?: string; step3_modalButtonText?: string; step4_taxAndPayouts?: string; step4_directlyToBankAccount?: string; step4_toPayPalAccount?: string; step4_paymentScheduleBalanceThreshold?: string; step4_paymentScheduleFixedDay?: string; step4_paymentDaySelectLabel?: string; step4_paymentThresholdSelectLabel?: string; step4_paymentDayFirstOfMonthLabelText?: string; step4_paymentDayFifteenthOfMonthLabelText?: string; step4_paymentMethod?: string; step4_paymentSchedule?: string; step4_paymentMethodSubtext?: string; step4_payPalInputLabel?: string; step4_bankLocationLabel?: string; step4_beneficiaryAccountNameLabel?: string; step4_beneficiaryAccountNameDescription?: string; step4_bankAccountTypeLabel?: string; step4_checkingSelectItemLabel?: string; step4_savingsSelectItemLabel?: string; step4_bankAccountNumberLabel?: string; step4_ibanLabel?: string; step4_swiftCodeLabel?: string; step4_routingCodeLabel?: string; step4_bankNameLabel?: string; step4_classificationEntityLabel?: string; step4_businessSelectItemLabel?: string; step4_individualSelectItemLabel?: string; step4_foreignSelectItemLabel?: string; step4_classificationCPFLabel?: string; step4_patronymicNameLabel?: string; step4_voCodeLabel?: string; step4_agencyCodeLabel?: string; step4_branchCodeLabel?: string; step4_classificationLabel?: string; step4_taxPayerIdLabel?: string; step4_bankAddressLabel?: string; step4_bankCityLabel?: string; step4_bankStateLabel?: string; step4_bankPostalCodeLabel?: string; step4_eftWithdrawalLabel?: string; step4_fxWireProcessingFeeLabel?: string; step4_verifyEmailHeaderText?: string; step4_verifyEmailDescriptionText?: string; step4_modalTitle?: string; step4_modalDescription?: string; step4_modalButtonText?: string; dashboard_statusTextActive?: string; dashboard_statusTextNotActive?: string; dashboard_statusTextNotVerified?: string; dashboard_statusTextRequired?: string; dashboard_requiredTaxForm?: string; dashboard_badgeTextSubmittedOn?: string; dashboard_badgeTextSubmittedOnW8?: string; dashboard_badgeTextAwaitingReview?: string; dashboard_taxAlertHeaderNotActiveW9?: string; dashboard_taxAlertHeaderNotActiveW8?: string; dashboard_taxAlertNotActiveMessageW9?: string; dashboard_taxAlertNotActiveMessageW8?: string; dashboard_invalidForm?: string; dashboard_bankingInformationSectionHeader?: string; dashboard_taxDocumentSectionHeader?: string; dashboard_taxDocumentSectionSubHeader?: string; dashboard_noFormNeededSubtext?: string; dashboard_indirectTaxInfoSectionHeader?: string; dashboard_indirectTaxInfoCanada?: string; dashboard_indirectTaxInfoOtherCountry?: string; dashboard_indirectTaxInfoSpain?: string; dashboard_indirectTaxTooltipSupport?: string; dashboard_indirectTaxDetails?: string; dashboard_newFormButton?: string; dashboard_editPaymentInformationButton?: string; dashboard_notRegisteredForTax?: string; dashboard_qstNumber?: string; dashboard_subRegionTaxNumber?: string; dashboard_statusBadgeText?: string; dashboard_thresholdPayoutText?: string; dashboard_accountText?: string; dashboard_invoiceColumnTitle?: string; dashboard_dateColumnTitle?: string; dashboard_earningsColumnTitle?: string; dashboard_indirectTaxColumnTitle?: string; dashboard_payoutFromImpact?: string; dashboard_earningsAfterTaxColumnTitle?: string; dashboard_payoutHoldAlertHeader?: string; dashboard_payoutHoldAlertDescription?: string; dashboard_payoutMissingInformationText?: string; dashboard_invoiceDescription?: string; dashboard_invoicePrevLabel?: string; dashboard_invoiceMoreLabel?: string; dashboard_invoiceHeader?: string; dashboard_invoiceEmptyStateHeader?: string; dashboard_invoiceEmptyStateText?: string; dashboard_replaceTaxFormModalHeader?: string; dashboard_replaceTaxFormModalBodyText?: string; dashboard_verificationRequiredHeader?: string; dashboard_verificationRequiredDescription?: string; dashboard_verificationRequiredInternalHeader?: string; dashboard_verificationRequiredInternalDescription?: string; dashboard_verificationReviewInternalHeader?: string; dashboard_verificationReviewInternalDescription?: string; dashboard_verificationFailedInternalHeader?: string; dashboard_verificationFailedInternalDescription?: string; dashboard_verificationRequiredButtonText?: string; dashboard_w9RequiredHeader?: string; dashboard_w9RequiredDescription?: string; dashboard_accountReviewHeader?: string; dashboard_accountReviewDescription?: string; dashboard_paymentOnHoldHeader?: string; dashboard_paymentOnHoldDescription?: string; dashboard_beneficiaryNameInvalidHeader?: string; dashboard_beneficiaryNameInvalidDescription?: string; dashboard_beneficiaryNameMismatchHeader?: string; dashboard_beneficiaryNameMismatchDescription?: string; dashboard_bankNameMismatchHeader?: string; dashboard_bankNameMismatchDescription?: string; dashboard_withdrawalSettingsInvalidHeader?: string; dashboard_withdrawalSettingsInvalidDescription?: string; dashboard_paymentReturnedHeader?: string; dashboard_paymentReturnedDescription?: string; dashboard_termsAndConditions?: string; dashboard_w9RequiredButtonText?: string; formStep?: string; generalErrorTitle?: string; generalErrorDescription?: string; fieldRequiredError?: string; invalidCharacterError?: string; fieldInvalidError?: string; continueButton?: string; backButton?: string; cancelButton?: string; isPartnerAlertHeader?: string; isPartnerAlertDescription?: string; searchForCountryText?: string; loadingErrorAlertHeader?: string; loadingErrorAlertDescription?: string; taxAndPayoutsDescription?: string; supportLink?: string; termsAndConditions?: string; stateController?: string; demoData?: Partial>; disconnectedCallback?: () => void; getGeneralStepTextProps?: (prefix: string) => PickPrefix & { generalErrorTitle: string; generalErrorDescription: string; fieldRequiredError: string; invalidCharacterError: string; fieldInvalidError: string; continueButton: string; backButton: string; cancelButton: string; isPartnerAlertHeader: string; isPartnerAlertDescription: string; loadingErrorAlertHeader: string; loadingErrorAlertDescription: string; taxAndPayoutsDescription: string; searchForCountryText: string; formStep: string; supportLink: string; }; render?: () => any; }` | `undefined` |
-| `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"` |
-| `formStep` | `form-step` | | `string` | `"Step {step} of {count}"` |
-| `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"` |
-| `invalidCharacterError` | `invalid-character-error` | Displayed under a field that includes invalid characters (non-ASCII). | `string` | `"{fieldName} includes characters that aren't supported."` |
-| `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 our {supportLink}."` |
-| `loadingErrorAlertHeader` | `loading-error-alert-header` | Part of the alert displayed at the top of the page. | `string` | `"There was a problem loading your form"` |
-| `searchForCountryText` | `search-for-country-text` | Placeholder text displayed in the country search dropdown | `string` | `"Search for country.."` |
-| `stateController` | `state-controller` | | `string` | `"{}"` |
-| `step1_address` | `step-1_address` | | `string` | `"Address"` |
-| `step1_allowBankingCollection` | `step-1_allow-banking-collection` | Edit the property called terms and conditions text to change what's displayed for {termsAndConditionsLink}. | `string` | `"I have read the {termsAndConditionsLink} and allow impact.com to collect my tax and banking information"` |
-| `step1_city` | `step-1_city` | | `string` | `"City"` |
-| `step1_country` | `step-1_country` | | `string` | `"Country"` |
-| `step1_currency` | `step-1_currency` | | `string` | `"Currency"` |
-| `step1_currencyHelpText` | `step-1_currency-help-text` | | `string` | `"Choose your preferred payout currency"` |
-| `step1_email` | `step-1_email` | | `string` | `"Email"` |
-| `step1_firstName` | `step-1_first-name` | | `string` | `"First name"` |
-| `step1_lastName` | `step-1_last-name` | | `string` | `"Last name"` |
-| `step1_personalInformation` | `step-1_personal-information` | | `string` | `"Personal Information"` |
-| `step1_phoneNumber` | `step-1_phone-number` | | `string` | `"Phone number"` |
-| `step1_postalCode` | `step-1_postal-code` | | `string` | `"Postal code"` |
-| `step1_province` | `step-1_province` | | `string` | `"Province"` |
-| `step1_region` | `step-1_region` | | `string` | `"Region"` |
-| `step1_searchForCurrencyText` | `step-1_search-for-currency-text` | Placeholder text displayed in the currency search dropdown | `string` | `"Search for currency.."` |
-| `step1_state` | `step-1_state` | | `string` | `"State"` |
-| `step1_termsAndConditionsLabel` | `step-1_terms-and-conditions-label` | The link text that appears in the terms and conditions checkbox | `string` | `"terms and conditions"` |
-| `step1_termsAndConditionsLink` | `step-1_terms-and-conditions-link` | The link that appears in the terms and conditions checkbox | `string` | `"https://terms.advocate.impact.com/PayoutTermsAndConditions.html"` |
-| `step2_cannotChangeInfoAlert` | `step-2_cannot-change-info-alert` | Communicate that after this step, only Support can change personal and indirect tax information. | `string` | `"Changes to your personal and indirect tax information can only be made through our {supportLink} after you complete this step. Make sure these are correct before continuing."` |
-| `step2_indirectTax` | `step-2_indirect-tax` | | `string` | `"Indirect Tax"` |
-| `step2_indirectTaxDescription` | `step-2_indirect-tax-description` | Displayed under the title of this step. | `string` | `"Indirect taxes (e.g. VAT, HST, GST) are transaction based taxes often applied to goods and services. Service providers are typically required to register with their tax authority and collect these taxes on behalf governments."` |
-| `step2_indirectTaxDetails` | `step-2_indirect-tax-details` | Displayed with indirect tax registration options. | `string` | `"Indirect tax details"` |
-| `step2_indirectTaxNumber` | `step-2_indirect-tax-number` | | `string` | `"{taxType, select, GST {GST number} HST {HST number} VAT {VAT number} CT {CT number} SST {SST number} GENERAL {Indirect tax number}}"` |
-| `step2_indirectTaxNumberError` | `step-2_indirect-tax-number-error` | | `string` | `"{taxType, select, GST {GST number} HST {HST number} VAT {VAT number} CT {CT number} SST {SST number} GENERAL {Indirect tax number}} is required"` |
-| `step2_isRegisteredQST` | `step-2_is-registered-q-s-t` | Displayed to participants registered for indirect tax in Quebec, Canada. | `string` | `"I am registered for QST Tax"` |
-| `step2_isRegisteredSubRegionIncomeTax` | `step-2_is-registered-sub-region-income-tax` | Displayed to participants registered for indirect tax in Spain. | `string` | `"I am an individual registered for Income Tax purposes in Spain, and withholding tax will apply to any payments made to me."` |
-| `step2_notRegistered` | `step-2_not-registered` | | `string` | `"Not registered for indirect tax"` |
-| `step2_notRegisteredSubtext` | `step-2_not-registered-subtext` | Participants based in the US are considered not registered. | `string` | `"If you’ve never set up indirect tax with your tax authority, then you’re likely not considered registered."` |
-| `step2_otherRegion` | `step-2_other-region` | | `string` | `"Registered for indirect tax"` |
-| `step2_otherRegionSubtext` | `step-2_other-region-subtext` | Selecting this option will display fields to enter indirect tax details. | `string` | `"If you’ve registered with your tax authority, add your information to stay tax compliant."` |
-| `step2_province` | `step-2_province` | | `string` | `"Province"` |
-| `step2_qstNumber` | `step-2_qst-number` | Displayed to participants registered for QST. | `string` | `"QST number"` |
-| `step2_selectedRegion` | `step-2_selected-region` | | `string` | `"Country / region of indirect tax"` |
-| `step2_subRegion` | `step-2_sub-region` | Displayed to participants registered in Spain. | `string` | `"Sub-region"` |
-| `step2_subRegionTaxNumberLabel` | `step-2_sub-region-tax-number-label` | | `string` | `"Income Tax Number"` |
-| `step3_businessEntity` | `step-3_business-entity` | An option for the participant type field. Used to determine which W-8 form is required. | `string` | `"I represent a business"` |
-| `step3_docusignError` | `step-3_docusign-error` | This appears inside the Docusign frame. | `string` | `"There was a problem displaying this form. Please refresh the page. If this problem continues, contact our {supportLink}."` |
-| `step3_docusignExpired` | `step-3_docusign-expired` | This appears inside the Docusign frame. | `string` | `"For your security and privacy, we automatically end your session after 20 minutes of inactivity. Please refresh and re-enter your tax information to continue."` |
-| `step3_docusignSessionWarning` | `step-3_docusign-session-warning` | Remind participants their session will time out after 20 minutes of inactivity. | `string` | `"For your security, we automatically end your session when you have not interacted with the form after 20 minutes."` |
-| `step3_exitButton` | `step-3_exit-button` | | `string` | `"Exit"` |
-| `step3_individualParticipant` | `step-3_individual-participant` | An option for the participant type field. Used to determine which W-8 form is required. | `string` | `"I am an individual participant"` |
-| `step3_modalButtonText` | `step-3_modal-button-text` | | `string` | `"I understand"` |
-| `step3_modalDescription` | `step-3_modal-description` | | `string` | `"Remember the name you enter in your tax form. It must exactly match the bank account holder name configured in the next step. {br}{br}Otherwise you will have to resubmit your form again and there will be delays receiving your payout."` |
-| `step3_modalTitle` | `step-3_modal-title` | | `string` | `"Important Note"` |
-| `step3_participantType` | `step-3_participant-type` | | `string` | `"Participant type"` |
-| `step3_refreshButton` | `step-3_refresh-button` | | `string` | `"Refresh Page"` |
-| `step3_taxForm` | `step-3_tax-form` | | `string` | `"Tax form"` |
-| `step3_taxFormDescription` | `step-3_tax-form-description` | Displayed at the top of the page to participants based in the US. | `string` | `"Participants based in the US need to submit a {documentType} form."` |
-| `step3_taxFormDescriptionBusinessEntity` | `step-3_tax-form-description-business-entity` | Displayed at the top of the page to participants representing a business. | `string` | `"Participants residing outside of the US working with a US Brand need to submit a {documentType} form."` |
-| `step3_taxFormDescriptionIndividualParticipant` | `step-3_tax-form-description-individual-participant` | Displayed at the top of the page to individuals joining a US program who reside outside the country. | `string` | `"Participants residing outside of the US, joining the referral program of a US-based company, need to submit a {documentType} form."` |
-| `step3_taxFormLabel` | `step-3_tax-form-label` | Display the type of tax form that the participant must submit. | `string` | `"{documentType} Tax Form"` |
-| `step4_agencyCodeLabel` | `step-4_agency-code-label` | | `string` | `"Agency code"` |
-| `step4_bankAccountNumberLabel` | `step-4_bank-account-number-label` | | `string` | `"Bank account number"` |
-| `step4_bankAccountTypeLabel` | `step-4_bank-account-type-label` | | `string` | `"Bank account type"` |
-| `step4_bankAddressLabel` | `step-4_bank-address-label` | | `string` | `"Bank address"` |
-| `step4_bankCityLabel` | `step-4_bank-city-label` | | `string` | `"Bank city"` |
-| `step4_bankLocationLabel` | `step-4_bank-location-label` | | `string` | `"Bank country location"` |
-| `step4_bankNameLabel` | `step-4_bank-name-label` | | `string` | `"Bank name"` |
-| `step4_bankPostalCodeLabel` | `step-4_bank-postal-code-label` | | `string` | `"Bank postal code"` |
-| `step4_bankStateLabel` | `step-4_bank-state-label` | | `string` | `"Bank Province / State"` |
-| `step4_beneficiaryAccountNameDescription` | `step-4_beneficiary-account-name-description` | | `string` | `"The beneficiary name of your bank account. Ensure this matches the name on your tax form."` |
-| `step4_beneficiaryAccountNameLabel` | `step-4_beneficiary-account-name-label` | | `string` | `"Account holder name"` |
-| `step4_branchCodeLabel` | `step-4_branch-code-label` | | `string` | `"Branch code"` |
-| `step4_businessSelectItemLabel` | `step-4_business-select-item-label` | One of three options listed for the classification field | `string` | `"Business"` |
-| `step4_checkingSelectItemLabel` | `step-4_checking-select-item-label` | | `string` | `"Checking"` |
-| `step4_classificationCPFLabel` | `step-4_classification-c-p-f-label` | | `string` | `"Classification CPF"` |
-| `step4_classificationEntityLabel` | `step-4_classification-entity-label` | | `string` | `"Classification entity"` |
-| `step4_classificationLabel` | `step-4_classification-label` | Label text for the classification input field | `string` | `"Classification"` |
-| `step4_directlyToBankAccount` | `step-4_directly-to-bank-account` | | `string` | `"Directly to my bank account"` |
-| `step4_eftWithdrawalLabel` | `step-4_eft-withdrawal-label` | Default payment method to the participants’ bank account. | `string` | `"EFT Withdrawal (free)"` |
-| `step4_foreignSelectItemLabel` | `step-4_foreign-select-item-label` | One of three options listed for the classification field | `string` | `"Foreign"` |
-| `step4_fxWireProcessingFeeLabel` | `step-4_fx-wire-processing-fee-label` | | `string` | `"FX Wire (Processing Fee {currency}{defaultFxFee}.00)"` |
-| `step4_ibanLabel` | `step-4_iban-label` | | `string` | `"IBAN"` |
-| `step4_individualSelectItemLabel` | `step-4_individual-select-item-label` | One of three options listed for the classification field | `string` | `"Individual"` |
-| `step4_modalButtonText` | `step-4_modal-button-text` | | `string` | `"I understand, update my information"` |
-| `step4_modalDescription` | `step-4_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."` |
-| `step4_modalTitle` | `step-4_modal-title` | | `string` | `"Important Note"` |
-| `step4_patronymicNameLabel` | `step-4_patronymic-name-label` | | `string` | `"Patronymic name"` |
-| `step4_payPalInputLabel` | `step-4_pay-pal-input-label` | Displayed to participants who choose PayPal as their payout method | `string` | `"PayPal email"` |
-| `step4_paymentDayFifteenthOfMonthLabelText` | `step-4_payment-day-fifteenth-of-month-label-text` | One of two payment day options | `string` | `"15th of the month"` |
-| `step4_paymentDayFirstOfMonthLabelText` | `step-4_payment-day-first-of-month-label-text` | One of two payment day options | `string` | `"1st of the month"` |
-| `step4_paymentDaySelectLabel` | `step-4_payment-day-select-label` | Let the participant choose what day of the month they’ll get paid | `string` | `"Payment Day"` |
-| `step4_paymentMethod` | `step-4_payment-method` | | `string` | `"Payment method"` |
-| `step4_paymentMethodSubtext` | `step-4_payment-method-subtext` | | `string` | `"Payouts will be sent from our referral program provider, impact.com."` |
-| `step4_paymentSchedule` | `step-4_payment-schedule` | | `string` | `"Payment schedule"` |
-| `step4_paymentScheduleBalanceThreshold` | `step-4_payment-schedule-balance-threshold` | | `string` | `"Pay me when my balance reaches a threshold"` |
-| `step4_paymentScheduleFixedDay` | `step-4_payment-schedule-fixed-day` | | `string` | `"Pay me on a fixed day of the month"` |
-| `step4_paymentThresholdSelectLabel` | `step-4_payment-threshold-select-label` | Participant use this field to select the balance at which they want to be paid | `string` | `"Payment threshold"` |
-| `step4_routingCodeLabel` | `step-4_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} }"` |
-| `step4_savingsSelectItemLabel` | `step-4_savings-select-item-label` | Label text for the savings account type select item | `string` | `"Savings"` |
-| `step4_swiftCodeLabel` | `step-4_swift-code-label` | | `string` | `"SWIFT code"` |
-| `step4_taxAndPayouts` | `step-4_tax-and-payouts` | | `string` | `"Payouts"` |
-| `step4_taxPayerIdLabel` | `step-4_tax-payer-id-label` | | `string` | `"Beneficiary INN"` |
-| `step4_toPayPalAccount` | `step-4_to-pay-pal-account` | | `string` | `"PayPal (2% processing fee capped to {feeCap})"` |
-| `step4_verifyEmailDescriptionText` | `step-4_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."` |
-| `step4_verifyEmailHeaderText` | `step-4_verify-email-header-text` | | `string` | `"Verify your email"` |
-| `step4_voCodeLabel` | `step-4_vo-code-label` | | `string` | `"VO code"` |
-| `supportLink` | `support-link` | Link text for contacting support team | `string` | `"support team"` |
-| `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."` |
-| `termsAndConditions` | `terms-and-conditions` | Link text for Terms and Conditions | `string` | `"Terms and Conditions"` |
+| Property | Attribute | Description | Type | Default |
+| --------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `backButton` | `back-button` | | `string` | `"Back"` |
+| `cancelButton` | `cancel-button` | | `string` | `"Cancel"` |
+| `continueButton` | `continue-button` | | `string` | `"Continue"` |
+| `dashboard_accountReviewDescription` | `dashboard_account-review-description` | | `string` | `"This process takes 48 hours, payouts are on hold until it's completed. You will receive an email from our referral provider, Impact.com, if any issues arise. It contains details on how to resolve this issue. If you need further assistance, please reach out to our {supportLink}."` |
+| `dashboard_accountReviewHeader` | `dashboard_account-review-header` | | `string` | `"Your account is under review"` |
+| `dashboard_accountText` | `dashboard_account-text` | Shown before the participant’s bank account information. | `string` | `"Account"` |
+| `dashboard_badgeTextAwaitingReview` | `dashboard_badge-text-awaiting-review` | Additional text displayed next to the tax form's status badge. | `string` | `"Awaiting review. Submitted on {dateSubmitted}."` |
+| `dashboard_badgeTextSubmittedOn` | `dashboard_badge-text-submitted-on` | Additional text displayed next to the tax form's status badge | `string` | `"Submitted on {dateSubmitted}."` |
+| `dashboard_badgeTextSubmittedOnW8` | `dashboard_badge-text-submitted-on-w-8` | Additional text displayed next to the tax form's status badge. | `string` | `"Submitted on {dateSubmitted}. Valid for three years after submission."` |
+| `dashboard_bankNameMismatchDescription` | `dashboard_bank-name-mismatch-description` | | `string` | `"The bank account (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
+| `dashboard_bankNameMismatchHeader` | `dashboard_bank-name-mismatch-header` | | `string` | `"Your payment information does not match your tax form"` |
+| `dashboard_bankingInformationSectionHeader` | `dashboard_banking-information-section-header` | | `string` | `"Payout Information"` |
+| `dashboard_beneficiaryNameInvalidDescription` | `dashboard_beneficiary-name-invalid-description` | | `string` | `"The account holder (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
+| `dashboard_beneficiaryNameInvalidHeader` | `dashboard_beneficiary-name-invalid-header` | | `string` | `"Your payment information does not match your tax form"` |
+| `dashboard_beneficiaryNameMismatchDescription` | `dashboard_beneficiary-name-mismatch-description` | | `string` | `"The account holder (beneficiary) name in your payment information does not match what was submitted in your tax form. Please review and update your payment information or tax form so that they match exactly and do not include any invalid characters. Your payouts are on hold until this is resolved."` |
+| `dashboard_beneficiaryNameMismatchHeader` | `dashboard_beneficiary-name-mismatch-header` | | `string` | `"Your payment information does not match your tax form"` |
+| `dashboard_dateColumnTitle` | `dashboard_date-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Date"` |
+| `dashboard_earningsAfterTaxColumnTitle` | `dashboard_earnings-after-tax-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Earnings after tax"` |
+| `dashboard_earningsColumnTitle` | `dashboard_earnings-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Earnings"` |
+| `dashboard_editPaymentInformationButton` | `dashboard_edit-payment-information-button` | | `string` | `"Edit payout information"` |
+| `dashboard_indirectTaxColumnTitle` | `dashboard_indirect-tax-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Indirect tax"` |
+| `dashboard_indirectTaxDetails` | `dashboard_indirect-tax-details` | Displayed to participants who have submitted their indirect tax information. | `string` | `"{indirectTaxType} number: {indirectTaxNumber}"` |
+| `dashboard_indirectTaxInfoCanada` | `dashboard_indirect-tax-info-canada` | If the participant is registered for indirect tax in Canada, display the province they’re registered in. | `string` | `"Registered in {province}, {country}"` |
+| `dashboard_indirectTaxInfoOtherCountry` | `dashboard_indirect-tax-info-other-country` | If the participant is registered for indirect tax, display the country they’re registered in. | `string` | `"Registered in {country}"` |
+| `dashboard_indirectTaxInfoSectionHeader` | `dashboard_indirect-tax-info-section-header` | | `string` | `"Indirect tax"` |
+| `dashboard_indirectTaxInfoSpain` | `dashboard_indirect-tax-info-spain` | If the participant is registered for indirect tax in Spain, display the region they’re registered in. | `string` | `"Registered in {country}, {subRegion}"` |
+| `dashboard_indirectTaxTooltipSupport` | `dashboard_indirect-tax-tooltip-support` | | `string` | `"To make changes to your indirect tax information, please contact our {supportLink}."` |
+| `dashboard_invalidForm` | `dashboard_invalid-form` | Additional text displayed next to the tax form's status badge. | `string` | `"Make sure your information is correct and submit new form."` |
+| `dashboard_invoiceColumnTitle` | `dashboard_invoice-column-title` | Part of the Invoice table displayed at the bottom of the page. | `string` | `"Invoice"` |
+| `dashboard_invoiceDescription` | `dashboard_invoice-description` | | `string` | `"View and download your invoices to report your earnings and stay tax compliant."` |
+| `dashboard_invoiceEmptyStateHeader` | `dashboard_invoice-empty-state-header` | | `string` | `"View your invoice details"` |
+| `dashboard_invoiceEmptyStateText` | `dashboard_invoice-empty-state-text` | | `string` | `"Refer a friend to view the status of your invoices and rewards earned"` |
+| `dashboard_invoiceHeader` | `dashboard_invoice-header` | | `string` | `"Invoices"` |
+| `dashboard_invoiceMoreLabel` | `dashboard_invoice-more-label` | | `string` | `"Next"` |
+| `dashboard_invoicePrevLabel` | `dashboard_invoice-prev-label` | | `string` | `"Prev"` |
+| `dashboard_newFormButton` | `dashboard_new-form-button` | | `string` | `"Submit new tax form"` |
+| `dashboard_noFormNeededSubtext` | `dashboard_no-form-needed-subtext` | No other statuses or badges will be displayed in the tax form section in this case. | `string` | `"Tax documents are only required if you are based in the US or joining the referral program of a US based brand."` |
+| `dashboard_notRegisteredForTax` | `dashboard_not-registered-for-tax` | | `string` | `"Not registered for indirect tax. If you’ve previously registered with your tax authority, contact our {supportLink} to add your information to stay tax compliant."` |
+| `dashboard_paymentOnHoldDescription` | `dashboard_payment-on-hold-description` | | `string` | `"Your payout is temporarily on hold while we review your new payment information, this process is usually resolved within 48 hours."` |
+| `dashboard_paymentOnHoldHeader` | `dashboard_payment-on-hold-header` | | `string` | `"We are reviewing your new payout settings"` |
+| `dashboard_paymentReturnedDescription` | `dashboard_payment-returned-description` | | `string` | `"Our recent payment attempt for your earnings was unsuccessful. Please review your payment information and make sure it is correct."` |
+| `dashboard_paymentReturnedHeader` | `dashboard_payment-returned-header` | | `string` | `"Payout unsuccessful"` |
+| `dashboard_payoutFromImpact` | `dashboard_payout-from-impact` | Displayed under the payout details card. | `string` | `"Your balance may take up to 24 hours to update. Payouts will be sent from our referral program provider, impact.com."` |
+| `dashboard_payoutHoldAlertDescription` | `dashboard_payout-hold-alert-description` | Part of the alert displayed at the top of the page when there’s been an issue preventing payouts. | `string` | `"Please contact our {supportLink} or check your inbox for an email from our referral program provider, impact.com."` |
+| `dashboard_payoutHoldAlertHeader` | `dashboard_payout-hold-alert-header` | Part of the alert displayed at the top of the page when there’s been an issue preventing payouts. | `string` | `"Your payout is on hold"` |
+| `dashboard_payoutMissingInformationText` | `dashboard_payout-missing-information-text` | Text displayed for existing publishers that do not have saved banking information. | `string` | `"Missing banking information, go to Impact.com to resolve."` |
+| `dashboard_qstNumber` | `dashboard_qst-number` | Displayed to participants registered in Quebec, Canada. | `string` | `"QST number: {qstNumber}"` |
+| `dashboard_replaceTaxFormModalBodyText` | `dashboard_replace-tax-form-modal-body-text` | | `string` | `"Submitting a new tax form will remove your existing form. Make sure to sign and complete your new tax form to prevent any issues with your next payout."` |
+| `dashboard_replaceTaxFormModalHeader` | `dashboard_replace-tax-form-modal-header` | | `string` | `"Replace existing tax form"` |
+| `dashboard_requiredTaxForm` | `dashboard_required-tax-form` | Additional text displayed next to the tax form's status badge | `string` | `"Your payouts are on hold until you submit a {taxFormType} tax form."` |
+| `dashboard_statusBadgeText` | `dashboard_status-badge-text` | | `string` | `"{badgeText, select, payoutToday {Payout Today} nextPayout {Next Payout} }"` |
+| `dashboard_statusTextActive` | `dashboard_status-text-active` | | `string` | `"Active"` |
+| `dashboard_statusTextNotActive` | `dashboard_status-text-not-active` | | `string` | `"Invalid Tax Form"` |
+| `dashboard_statusTextNotVerified` | `dashboard_status-text-not-verified` | Displayed when the participant submitted their form but it is awaiting review. | `string` | `"Not Verified"` |
+| `dashboard_statusTextRequired` | `dashboard_status-text-required` | Displayed when the participant has not submitted their required tax form. | `string` | `"Required"` |
+| `dashboard_subRegionTaxNumber` | `dashboard_sub-region-tax-number` | | `string` | `"Income tax number: {subRegionTaxNumber}"` |
+| `dashboard_taxAlertHeaderNotActiveW8` | `dashboard_tax-alert-header-not-active-w-8` | Part of the alert displayed at the top of the page. | `string` | `"{documentType} tax form is invalid"` |
+| `dashboard_taxAlertHeaderNotActiveW9` | `dashboard_tax-alert-header-not-active-w-9` | Part of the alert displayed at the top of the page. | `string` | `"Your W-9 tax form has personal information that doesn’t match your profile"` |
+| `dashboard_taxAlertNotActiveMessageW8` | `dashboard_tax-alert-not-active-message-w-8` | Part of the alert displayed at the top of the page. | `string` | `"Your tax form may have expired or has personal information that doesn’t match your profile. Please submit a new {documentType} form."` |
+| `dashboard_taxAlertNotActiveMessageW9` | `dashboard_tax-alert-not-active-message-w-9` | Part of the alert displayed at the top of the page. | `string` | `"Please resubmit a new {documentType} form."` |
+| `dashboard_taxDocumentSectionHeader` | `dashboard_tax-document-section-header` | | `string` | `"Tax documents"` |
+| `dashboard_taxDocumentSectionSubHeader` | `dashboard_tax-document-section-sub-header` | Displayed under the tax document section header. | `string` | `"{documentType} tax form"` |
+| `dashboard_termsAndConditions` | `dashboard_terms-and-conditions` | | `string` | `"Terms and Conditions"` |
+| `dashboard_thresholdPayoutText` | `dashboard_threshold-payout-text` | Display participants' payout preference on the payout information card, indicating the balance at which they want to get paid. | `string` | `"Next payout occurs when balance is {thresholdBalance}"` |
+| `dashboard_verificationFailedInternalDescription` | `dashboard_verification-failed-internal-description` | | `string` | `"Identity verification has failed. Our team is reviewing the report and will contact you with further information. If you don't hear from us contact our {supportLink}."` |
+| `dashboard_verificationFailedInternalHeader` | `dashboard_verification-failed-internal-header` | | `string` | `"Identity verification usuccessful"` |
+| `dashboard_verificationRequiredButtonText` | `dashboard_verification-required-button-text` | Part of the alert displayed at the top of the page when the user needs to verify their identity. | `string` | `"Start Verification"` |
+| `dashboard_verificationRequiredDescription` | `dashboard_verification-required-description` | Part of the alert displayed at the top of the page when the user needs to verify their identity | `string` | `"Complete your verification to start receiving your cash rewards. It should only take a few minutes verify. If you run in to an issue verifying your identity contact our {supportLink}."` |
+| `dashboard_verificationRequiredHeader` | `dashboard_verification-required-header` | Part of the alert displayed at the top of the page when the user needs to verify their identity. | `string` | `"Verify your identity"` |
+| `dashboard_verificationRequiredInternalDescription` | `dashboard_verification-required-internal-description` | | `string` | `"Identity verification submission has been received. Our system is currently performing additional checks and analyzing the results. You will be updated shortly. If you don't hear from us contact our {supportLink}."` |
+| `dashboard_verificationRequiredInternalHeader` | `dashboard_verification-required-internal-header` | | `string` | `"Identity verification in progress"` |
+| `dashboard_verificationReviewInternalDescription` | `dashboard_verification-review-internal-description` | | `string` | `"Identity verification requires further review due to a potential error. Our team is reviewing the information and will update you shortly. If you don't hear from us contact our {supportLink}."` |
+| `dashboard_verificationReviewInternalHeader` | `dashboard_verification-review-internal-header` | | `string` | `"Identity verification under review"` |
+| `dashboard_w9RequiredButtonText` | `dashboard_w-9-required-button-text` | | `string` | `"Submit W-9"` |
+| `dashboard_w9RequiredDescription` | `dashboard_w-9-required-description` | | `string` | `"You have surpassed the $600 threshold requiring a W-9 form or have multiple accounts with impact.com. To remove the hold, please submit your W-9 form."` |
+| `dashboard_w9RequiredHeader` | `dashboard_w-9-required-header` | | `string` | `"Your next payout is on hold"` |
+| `dashboard_withdrawalSettingsInvalidDescription` | `dashboard_withdrawal-settings-invalid-description` | | `string` | `"There are missing fields or invalid characters in your payment information. Please review your information and make sure it is correct. Your payouts are on hold until this is resolved."` |
+| `dashboard_withdrawalSettingsInvalidHeader` | `dashboard_withdrawal-settings-invalid-header` | | `string` | `"Your payment information is incomplete or includes invalid characters"` |
+| `demoData` | -- | | `{ step1_firstName?: string; step1_lastName?: string; step1_email?: string; step1_country?: string; step1_phoneNumber?: string; step1_address?: string; step1_city?: string; step1_state?: string; step1_province?: string; step1_region?: string; step1_postalCode?: string; step1_currency?: string; step1_allowBankingCollection?: string; step1_personalInformation?: string; step1_termsAndConditionsLabel?: string; step1_termsAndConditionsLink?: string; step1_searchForCurrencyText?: string; step2_indirectTax?: string; step2_indirectTaxDescription?: string; step2_indirectTaxDetails?: string; step2_otherRegion?: string; step2_otherRegionSubtext?: string; step2_notRegistered?: string; step2_notRegisteredSubtext?: string; step2_selectedRegion?: string; step2_indirectTaxNumber?: string; step2_province?: string; step2_indirectTaxNumberError?: string; step2_qstNumber?: string; step2_isRegisteredQST?: string; step2_isRegisteredSubRegionIncomeTax?: string; step2_subRegion?: string; step2_subRegionTaxNumberLabel?: string; step2_cannotChangeInfoAlert?: string; step3_taxForm?: string; step3_taxFormLabel?: string; step3_participantType?: string; step3_businessEntity?: string; step3_individualParticipant?: string; step3_taxFormDescription?: string; step3_taxFormDescriptionIndividualParticipant?: string; step3_taxFormDescriptionBusinessEntity?: string; step3_docusignExpired?: string; step3_docusignSessionWarning?: string; step3_docusignError?: string; step3_refreshButton?: string; step3_exitButton?: string; step3_modalTitle?: string; step3_modalDescription?: string; step3_modalButtonText?: string; step4_taxAndPayouts?: string; step4_directlyToBankAccount?: string; step4_toPayPalAccount?: string; step4_paymentScheduleBalanceThreshold?: string; step4_paymentScheduleFixedDay?: string; step4_paymentDaySelectLabel?: string; step4_paymentThresholdSelectLabel?: string; step4_paymentDayFirstOfMonthLabelText?: string; step4_paymentDayFifteenthOfMonthLabelText?: string; step4_paymentMethod?: string; step4_paymentSchedule?: string; step4_paymentMethodSubtext?: string; step4_payPalInputLabel?: string; step4_bankLocationLabel?: string; step4_beneficiaryAccountNameLabel?: string; step4_beneficiaryAccountNameDescription?: string; step4_bankAccountTypeLabel?: string; step4_checkingSelectItemLabel?: string; step4_savingsSelectItemLabel?: string; step4_bankAccountNumberLabel?: string; step4_ibanLabel?: string; step4_swiftCodeLabel?: string; step4_routingCodeLabel?: string; step4_bankNameLabel?: string; step4_classificationEntityLabel?: string; step4_businessSelectItemLabel?: string; step4_individualSelectItemLabel?: string; step4_foreignSelectItemLabel?: string; step4_classificationCPFLabel?: string; step4_patronymicNameLabel?: string; step4_voCodeLabel?: string; step4_agencyCodeLabel?: string; step4_branchCodeLabel?: string; step4_classificationLabel?: string; step4_taxPayerIdLabel?: string; step4_bankAddressLabel?: string; step4_bankCityLabel?: string; step4_bankStateLabel?: string; step4_bankPostalCodeLabel?: string; step4_eftWithdrawalLabel?: string; step4_fxWireProcessingFeeLabel?: string; step4_verifyEmailHeaderText?: string; step4_verifyEmailDescriptionText?: string; step4_modalTitle?: string; step4_modalDescription?: string; step4_modalButtonText?: string; dashboard_statusTextActive?: string; dashboard_statusTextNotActive?: string; dashboard_statusTextNotVerified?: string; dashboard_statusTextRequired?: string; dashboard_requiredTaxForm?: string; dashboard_badgeTextSubmittedOn?: string; dashboard_badgeTextSubmittedOnW8?: string; dashboard_badgeTextAwaitingReview?: string; dashboard_taxAlertHeaderNotActiveW9?: string; dashboard_taxAlertHeaderNotActiveW8?: string; dashboard_taxAlertNotActiveMessageW9?: string; dashboard_taxAlertNotActiveMessageW8?: string; dashboard_invalidForm?: string; dashboard_bankingInformationSectionHeader?: string; dashboard_taxDocumentSectionHeader?: string; dashboard_taxDocumentSectionSubHeader?: string; dashboard_noFormNeededSubtext?: string; dashboard_indirectTaxInfoSectionHeader?: string; dashboard_indirectTaxInfoCanada?: string; dashboard_indirectTaxInfoOtherCountry?: string; dashboard_indirectTaxInfoSpain?: string; dashboard_indirectTaxTooltipSupport?: string; dashboard_indirectTaxDetails?: string; dashboard_newFormButton?: string; dashboard_editPaymentInformationButton?: string; dashboard_notRegisteredForTax?: string; dashboard_qstNumber?: string; dashboard_subRegionTaxNumber?: string; dashboard_statusBadgeText?: string; dashboard_thresholdPayoutText?: string; dashboard_accountText?: string; dashboard_invoiceColumnTitle?: string; dashboard_dateColumnTitle?: string; dashboard_earningsColumnTitle?: string; dashboard_indirectTaxColumnTitle?: string; dashboard_payoutFromImpact?: string; dashboard_earningsAfterTaxColumnTitle?: string; dashboard_payoutHoldAlertHeader?: string; dashboard_payoutHoldAlertDescription?: string; dashboard_payoutMissingInformationText?: string; dashboard_invoiceDescription?: string; dashboard_invoicePrevLabel?: string; dashboard_invoiceMoreLabel?: string; dashboard_invoiceHeader?: string; dashboard_invoiceEmptyStateHeader?: string; dashboard_invoiceEmptyStateText?: string; dashboard_replaceTaxFormModalHeader?: string; dashboard_replaceTaxFormModalBodyText?: string; dashboard_verificationRequiredHeader?: string; dashboard_verificationRequiredDescription?: string; dashboard_verificationRequiredInternalHeader?: string; dashboard_verificationRequiredInternalDescription?: string; dashboard_verificationReviewInternalHeader?: string; dashboard_verificationReviewInternalDescription?: string; dashboard_verificationFailedInternalHeader?: string; dashboard_verificationFailedInternalDescription?: string; dashboard_verificationRequiredButtonText?: string; dashboard_w9RequiredHeader?: string; dashboard_w9RequiredDescription?: string; dashboard_accountReviewHeader?: string; dashboard_accountReviewDescription?: string; dashboard_paymentOnHoldHeader?: string; dashboard_paymentOnHoldDescription?: string; dashboard_beneficiaryNameInvalidHeader?: string; dashboard_beneficiaryNameInvalidDescription?: string; dashboard_beneficiaryNameMismatchHeader?: string; dashboard_beneficiaryNameMismatchDescription?: string; dashboard_bankNameMismatchHeader?: string; dashboard_bankNameMismatchDescription?: string; dashboard_withdrawalSettingsInvalidHeader?: string; dashboard_withdrawalSettingsInvalidDescription?: string; dashboard_paymentReturnedHeader?: string; dashboard_paymentReturnedDescription?: string; dashboard_termsAndConditions?: string; dashboard_w9RequiredButtonText?: string; formStep?: string; generalErrorTitle?: string; generalErrorDescription?: string; fieldRequiredError?: string; invalidCharacterError?: string; fieldInvalidError?: string; continueButton?: string; backButton?: string; cancelButton?: string; isPartnerAlertHeader?: string; isPartnerAlertDescription?: string; searchForCountryText?: string; loadingErrorAlertHeader?: string; loadingErrorAlertDescription?: string; taxAndPayoutsDescription?: string; supportLink?: string; termsAndConditions?: string; stateController?: string; demoData?: Partial>; disconnectedCallback?: () => void; getGeneralStepTextProps?: (prefix: string) => PickPrefix & { generalErrorTitle: string; generalErrorDescription: string; fieldRequiredError: string; invalidCharacterError: string; fieldInvalidError: string; continueButton: string; backButton: string; cancelButton: string; isPartnerAlertHeader: string; isPartnerAlertDescription: string; loadingErrorAlertHeader: string; loadingErrorAlertDescription: string; taxAndPayoutsDescription: string; searchForCountryText: string; formStep: string; supportLink: string; }; render?: () => any; }` | `undefined` |
+| `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"` |
+| `formStep` | `form-step` | | `string` | `"Step {step} of {count}"` |
+| `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"` |
+| `invalidCharacterError` | `invalid-character-error` | Displayed under a field that includes invalid characters (non-ASCII). | `string` | `"{fieldName} includes characters that aren't supported."` |
+| `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 our {supportLink}."` |
+| `loadingErrorAlertHeader` | `loading-error-alert-header` | Part of the alert displayed at the top of the page. | `string` | `"There was a problem loading your form"` |
+| `searchForCountryText` | `search-for-country-text` | Placeholder text displayed in the country search dropdown | `string` | `"Search for country.."` |
+| `stateController` | `state-controller` | | `string` | `"{}"` |
+| `step1_address` | `step-1_address` | | `string` | `"Address"` |
+| `step1_allowBankingCollection` | `step-1_allow-banking-collection` | Edit the property called terms and conditions text to change what's displayed for {termsAndConditionsLink}. | `string` | `"I have read the {termsAndConditionsLink} and allow impact.com to collect my tax and banking information"` |
+| `step1_city` | `step-1_city` | | `string` | `"City"` |
+| `step1_country` | `step-1_country` | | `string` | `"Country"` |
+| `step1_currency` | `step-1_currency` | | `string` | `"Currency"` |
+| `step1_email` | `step-1_email` | | `string` | `"Email"` |
+| `step1_firstName` | `step-1_first-name` | | `string` | `"First name"` |
+| `step1_lastName` | `step-1_last-name` | | `string` | `"Last name"` |
+| `step1_personalInformation` | `step-1_personal-information` | | `string` | `"Personal Information"` |
+| `step1_phoneNumber` | `step-1_phone-number` | | `string` | `"Phone number"` |
+| `step1_postalCode` | `step-1_postal-code` | | `string` | `"Postal code"` |
+| `step1_province` | `step-1_province` | | `string` | `"Province"` |
+| `step1_region` | `step-1_region` | | `string` | `"Region"` |
+| `step1_searchForCurrencyText` | `step-1_search-for-currency-text` | Placeholder text displayed in the currency search dropdown | `string` | `"Search for currency.."` |
+| `step1_state` | `step-1_state` | | `string` | `"State"` |
+| `step1_termsAndConditionsLabel` | `step-1_terms-and-conditions-label` | The link text that appears in the terms and conditions checkbox | `string` | `"terms and conditions"` |
+| `step1_termsAndConditionsLink` | `step-1_terms-and-conditions-link` | The link that appears in the terms and conditions checkbox | `string` | `"https://terms.advocate.impact.com/PayoutTermsAndConditions.html"` |
+| `step2_cannotChangeInfoAlert` | `step-2_cannot-change-info-alert` | Communicate that after this step, only Support can change personal and indirect tax information. | `string` | `"Changes to your personal and indirect tax information can only be made through our {supportLink} after you complete this step. Make sure these are correct before continuing."` |
+| `step2_indirectTax` | `step-2_indirect-tax` | | `string` | `"Indirect Tax"` |
+| `step2_indirectTaxDescription` | `step-2_indirect-tax-description` | Displayed under the title of this step. | `string` | `"Indirect taxes (e.g. VAT, HST, GST) are transaction based taxes often applied to goods and services. Service providers are typically required to register with their tax authority and collect these taxes on behalf governments."` |
+| `step2_indirectTaxDetails` | `step-2_indirect-tax-details` | Displayed with indirect tax registration options. | `string` | `"Indirect tax details"` |
+| `step2_indirectTaxNumber` | `step-2_indirect-tax-number` | | `string` | `"{taxType, select, GST {GST number} HST {HST number} VAT {VAT number} CT {CT number} SST {SST number} GENERAL {Indirect tax number}}"` |
+| `step2_indirectTaxNumberError` | `step-2_indirect-tax-number-error` | | `string` | `"{taxType, select, GST {GST number} HST {HST number} VAT {VAT number} CT {CT number} SST {SST number} GENERAL {Indirect tax number}} is required"` |
+| `step2_isRegisteredQST` | `step-2_is-registered-q-s-t` | Displayed to participants registered for indirect tax in Quebec, Canada. | `string` | `"I am registered for QST Tax"` |
+| `step2_isRegisteredSubRegionIncomeTax` | `step-2_is-registered-sub-region-income-tax` | Displayed to participants registered for indirect tax in Spain. | `string` | `"I am an individual registered for Income Tax purposes in Spain, and withholding tax will apply to any payments made to me."` |
+| `step2_notRegistered` | `step-2_not-registered` | | `string` | `"Not registered for indirect tax"` |
+| `step2_notRegisteredSubtext` | `step-2_not-registered-subtext` | Participants based in the US are considered not registered. | `string` | `"If you’ve never set up indirect tax with your tax authority, then you’re likely not considered registered."` |
+| `step2_otherRegion` | `step-2_other-region` | | `string` | `"Registered for indirect tax"` |
+| `step2_otherRegionSubtext` | `step-2_other-region-subtext` | Selecting this option will display fields to enter indirect tax details. | `string` | `"If you’ve registered with your tax authority, add your information to stay tax compliant."` |
+| `step2_province` | `step-2_province` | | `string` | `"Province"` |
+| `step2_qstNumber` | `step-2_qst-number` | Displayed to participants registered for QST. | `string` | `"QST number"` |
+| `step2_selectedRegion` | `step-2_selected-region` | | `string` | `"Country / region of indirect tax"` |
+| `step2_subRegion` | `step-2_sub-region` | Displayed to participants registered in Spain. | `string` | `"Sub-region"` |
+| `step2_subRegionTaxNumberLabel` | `step-2_sub-region-tax-number-label` | | `string` | `"Income Tax Number"` |
+| `step3_businessEntity` | `step-3_business-entity` | An option for the participant type field. Used to determine which W-8 form is required. | `string` | `"I represent a business"` |
+| `step3_docusignError` | `step-3_docusign-error` | This appears inside the Docusign frame. | `string` | `"There was a problem displaying this form. Please refresh the page. If this problem continues, contact our {supportLink}."` |
+| `step3_docusignExpired` | `step-3_docusign-expired` | This appears inside the Docusign frame. | `string` | `"For your security and privacy, we automatically end your session after 20 minutes of inactivity. Please refresh and re-enter your tax information to continue."` |
+| `step3_docusignSessionWarning` | `step-3_docusign-session-warning` | Remind participants their session will time out after 20 minutes of inactivity. | `string` | `"For your security, we automatically end your session when you have not interacted with the form after 20 minutes."` |
+| `step3_exitButton` | `step-3_exit-button` | | `string` | `"Exit"` |
+| `step3_individualParticipant` | `step-3_individual-participant` | An option for the participant type field. Used to determine which W-8 form is required. | `string` | `"I am an individual participant"` |
+| `step3_modalButtonText` | `step-3_modal-button-text` | | `string` | `"I understand"` |
+| `step3_modalDescription` | `step-3_modal-description` | | `string` | `"Remember the name you enter in your tax form. It must exactly match the bank account holder name configured in the next step. {br}{br}Otherwise you will have to resubmit your form again and there will be delays receiving your payout."` |
+| `step3_modalTitle` | `step-3_modal-title` | | `string` | `"Important Note"` |
+| `step3_participantType` | `step-3_participant-type` | | `string` | `"Participant type"` |
+| `step3_refreshButton` | `step-3_refresh-button` | | `string` | `"Refresh Page"` |
+| `step3_taxForm` | `step-3_tax-form` | | `string` | `"Tax form"` |
+| `step3_taxFormDescription` | `step-3_tax-form-description` | Displayed at the top of the page to participants based in the US. | `string` | `"Participants based in the US need to submit a {documentType} form."` |
+| `step3_taxFormDescriptionBusinessEntity` | `step-3_tax-form-description-business-entity` | Displayed at the top of the page to participants representing a business. | `string` | `"Participants residing outside of the US working with a US Brand need to submit a {documentType} form."` |
+| `step3_taxFormDescriptionIndividualParticipant` | `step-3_tax-form-description-individual-participant` | Displayed at the top of the page to individuals joining a US program who reside outside the country. | `string` | `"Participants residing outside of the US, joining the referral program of a US-based company, need to submit a {documentType} form."` |
+| `step3_taxFormLabel` | `step-3_tax-form-label` | Display the type of tax form that the participant must submit. | `string` | `"{documentType} Tax Form"` |
+| `step4_agencyCodeLabel` | `step-4_agency-code-label` | | `string` | `"Agency code"` |
+| `step4_bankAccountNumberLabel` | `step-4_bank-account-number-label` | | `string` | `"Bank account number"` |
+| `step4_bankAccountTypeLabel` | `step-4_bank-account-type-label` | | `string` | `"Bank account type"` |
+| `step4_bankAddressLabel` | `step-4_bank-address-label` | | `string` | `"Bank address"` |
+| `step4_bankCityLabel` | `step-4_bank-city-label` | | `string` | `"Bank city"` |
+| `step4_bankLocationLabel` | `step-4_bank-location-label` | | `string` | `"Bank country location"` |
+| `step4_bankNameLabel` | `step-4_bank-name-label` | | `string` | `"Bank name"` |
+| `step4_bankPostalCodeLabel` | `step-4_bank-postal-code-label` | | `string` | `"Bank postal code"` |
+| `step4_bankStateLabel` | `step-4_bank-state-label` | | `string` | `"Bank Province / State"` |
+| `step4_beneficiaryAccountNameDescription` | `step-4_beneficiary-account-name-description` | | `string` | `"The beneficiary name of your bank account. Ensure this matches the name on your tax form."` |
+| `step4_beneficiaryAccountNameLabel` | `step-4_beneficiary-account-name-label` | | `string` | `"Account holder name"` |
+| `step4_branchCodeLabel` | `step-4_branch-code-label` | | `string` | `"Branch code"` |
+| `step4_businessSelectItemLabel` | `step-4_business-select-item-label` | One of three options listed for the classification field | `string` | `"Business"` |
+| `step4_checkingSelectItemLabel` | `step-4_checking-select-item-label` | | `string` | `"Checking"` |
+| `step4_classificationCPFLabel` | `step-4_classification-c-p-f-label` | | `string` | `"Classification CPF"` |
+| `step4_classificationEntityLabel` | `step-4_classification-entity-label` | | `string` | `"Classification entity"` |
+| `step4_classificationLabel` | `step-4_classification-label` | Label text for the classification input field | `string` | `"Classification"` |
+| `step4_directlyToBankAccount` | `step-4_directly-to-bank-account` | | `string` | `"Directly to my bank account"` |
+| `step4_eftWithdrawalLabel` | `step-4_eft-withdrawal-label` | Default payment method to the participants’ bank account. | `string` | `"EFT Withdrawal (free)"` |
+| `step4_foreignSelectItemLabel` | `step-4_foreign-select-item-label` | One of three options listed for the classification field | `string` | `"Foreign"` |
+| `step4_fxWireProcessingFeeLabel` | `step-4_fx-wire-processing-fee-label` | | `string` | `"FX Wire (Processing Fee {currency}{defaultFxFee}.00)"` |
+| `step4_ibanLabel` | `step-4_iban-label` | | `string` | `"IBAN"` |
+| `step4_individualSelectItemLabel` | `step-4_individual-select-item-label` | One of three options listed for the classification field | `string` | `"Individual"` |
+| `step4_modalButtonText` | `step-4_modal-button-text` | | `string` | `"I understand, update my information"` |
+| `step4_modalDescription` | `step-4_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."` |
+| `step4_modalTitle` | `step-4_modal-title` | | `string` | `"Important Note"` |
+| `step4_patronymicNameLabel` | `step-4_patronymic-name-label` | | `string` | `"Patronymic name"` |
+| `step4_payPalInputLabel` | `step-4_pay-pal-input-label` | Displayed to participants who choose PayPal as their payout method | `string` | `"PayPal email"` |
+| `step4_paymentDayFifteenthOfMonthLabelText` | `step-4_payment-day-fifteenth-of-month-label-text` | One of two payment day options | `string` | `"15th of the month"` |
+| `step4_paymentDayFirstOfMonthLabelText` | `step-4_payment-day-first-of-month-label-text` | One of two payment day options | `string` | `"1st of the month"` |
+| `step4_paymentDaySelectLabel` | `step-4_payment-day-select-label` | Let the participant choose what day of the month they’ll get paid | `string` | `"Payment Day"` |
+| `step4_paymentMethod` | `step-4_payment-method` | | `string` | `"Payment method"` |
+| `step4_paymentMethodSubtext` | `step-4_payment-method-subtext` | | `string` | `"Payouts will be sent from our referral program provider, impact.com."` |
+| `step4_paymentSchedule` | `step-4_payment-schedule` | | `string` | `"Payment schedule"` |
+| `step4_paymentScheduleBalanceThreshold` | `step-4_payment-schedule-balance-threshold` | | `string` | `"Pay me when my balance reaches a threshold"` |
+| `step4_paymentScheduleFixedDay` | `step-4_payment-schedule-fixed-day` | | `string` | `"Pay me on a fixed day of the month"` |
+| `step4_paymentThresholdSelectLabel` | `step-4_payment-threshold-select-label` | Participant use this field to select the balance at which they want to be paid | `string` | `"Payment threshold"` |
+| `step4_routingCodeLabel` | `step-4_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} }"` |
+| `step4_savingsSelectItemLabel` | `step-4_savings-select-item-label` | Label text for the savings account type select item | `string` | `"Savings"` |
+| `step4_swiftCodeLabel` | `step-4_swift-code-label` | | `string` | `"SWIFT code"` |
+| `step4_taxAndPayouts` | `step-4_tax-and-payouts` | | `string` | `"Payouts"` |
+| `step4_taxPayerIdLabel` | `step-4_tax-payer-id-label` | | `string` | `"Beneficiary INN"` |
+| `step4_toPayPalAccount` | `step-4_to-pay-pal-account` | | `string` | `"PayPal (2% processing fee capped to {feeCap})"` |
+| `step4_verifyEmailDescriptionText` | `step-4_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."` |
+| `step4_verifyEmailHeaderText` | `step-4_verify-email-header-text` | | `string` | `"Verify your email"` |
+| `step4_voCodeLabel` | `step-4_vo-code-label` | | `string` | `"VO code"` |
+| `supportLink` | `support-link` | Link text for contacting support team | `string` | `"support team"` |
+| `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."` |
+| `termsAndConditions` | `terms-and-conditions` | Link text for Terms and Conditions | `string` | `"Terms and Conditions"` |
## Dependencies
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/sqm-tax-and-cash.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/sqm-tax-and-cash.tsx
index 785612c682..4d4c3cdb84 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/sqm-tax-and-cash.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-tax-and-cash/sqm-tax-and-cash.tsx
@@ -91,12 +91,6 @@ export class TaxAndCashMonolith {
* @uiGroup Step 1 Properties
*/
@Prop() step1_currency: string = "Currency";
- /**
- * @uiName Currency field help text
- * @uiGroup Step 1 Properties
- */
- @Prop() step1_currencyHelpText: string =
- "Choose your preferred payout currency";
/**
* Edit the property called terms and conditions text to change what's displayed for {termsAndConditionsLink}.
* @uiName Terms and conditions checkbox
@@ -1385,7 +1379,7 @@ export class TaxAndCashMonolith {
{this.supportLink}
),
- }
+ },
) as string
}
/>
@@ -1408,7 +1402,7 @@ function useDemoTaxAndCash(props: TaxAndCashMonolith) {
key === "sqm-tax-and-cash"
? { ...prev, ...states[key] }
: { ...prev, [`${key}_stateController`]: states[key] },
- {}
+ {},
);
return deepmerge(
@@ -1417,6 +1411,6 @@ function useDemoTaxAndCash(props: TaxAndCashMonolith) {
setStep,
},
props.demoData || formatted || {},
- { arrayMerge: (_, a) => a }
+ { arrayMerge: (_, a) => a },
);
}
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/UserInfoFormView.stories.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/UserInfoFormView.stories.tsx
index 67fcb15ea2..467e7bb825 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/UserInfoFormView.stories.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/UserInfoFormView.stories.tsx
@@ -79,7 +79,6 @@ const defaultText = {
region: "Region",
postalCode: "Postal Code",
currency: "Currency",
- currencyHelpText: "Select your preferred currency for payouts",
allowBankingCollection: "I agree to the {termsAndConditionsLink}",
personalInformation: "Personal Information",
continueButton: "Continue",
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/readme.md b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/readme.md
index c9c8b69af4..48e355e998 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/readme.md
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/readme.md
@@ -15,7 +15,6 @@
| `continueButton` | `continue-button` | | `string` | `"Continue"` |
| `country` | `country` | | `string` | `"Country"` |
| `currency` | `currency` | | `string` | `"Currency"` |
-| `currencyHelpText` | `currency-help-text` | | `string` | `"Choose your preferred payout currency"` |
| `demoData` | -- | | `{ states?: { step: string; hideState: boolean; hideSteps: boolean; disabled: boolean; loadingError: boolean; loading: boolean; isPartner: boolean; isUser: boolean; formState: { errors: {}; firstName: string; lastName: string; email: string; phoneNumberCountryCode: string; phoneNumber: string; countryCode: string; currency: string; address: string; city: string; state: string; postalCode: string; }; }; refs?: { formRef: Ref; currencyRef: Ref; phoneCountryRef: Ref; }; data?: { currencies: { displayName: string; currencyCode: string; }[]; countries: TaxCountry[]; phoneCountries: TaxCountry[]; allCurrencies: { displayName: string; currencyCode: string; }[]; allCountries: TaxCountry[]; regionLabelEnum: "STATE" \| "PROVINCE" \| "REGION"; regions: { label: string; value: string; }[]; partnerData: ImpactPublisher; userData: ImpactUser; }; setStep?: (value: string) => void; onSubmit?: (event: any) => Promise; }` | `undefined` |
| `email` | `email` | | `string` | `"Email"` |
| `fieldInvalidError` | `field-invalid-error` | Displayed under a field when it has an invalid entry. | `string` | `"{fieldName} is invalid"` |
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 7bd16b48f5..a5618bff0a 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
@@ -93,7 +93,6 @@ export interface UserInfoFormViewProps {
region: string;
postalCode: string;
currency: string;
- currencyHelpText: string;
allowBankingCollection: string;
personalInformation: string;
continueButton: string;
@@ -822,7 +821,6 @@ export const UserInfoFormView = (props: UserInfoFormViewProps) => {
menu
value={formState.currency}
disabled={states.disabled || isDisabledPartnerInput("currency")}
- helpText={text.currencyHelpText}
{...(formState.errors?.currency
? {
class: classes.ErrorInput,
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form.tsx b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form.tsx
index feed781945..b7136c3561 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form.tsx
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form.tsx
@@ -66,11 +66,6 @@ export class TaxForm {
* @uiName Currency field label
*/
@Prop() currency: string = "Currency";
-
- /**
- * @uiName Currency field help text
- */
- @Prop() currencyHelpText: string = "Choose your preferred payout currency";
/**
* @uiName Setup progress
*/
@@ -275,6 +270,6 @@ function useDemoUserInfoForm(props: TaxForm): UseUserInfoFormResult {
},
},
props.demoData || {},
- { arrayMerge: (_, a) => a }
+ { arrayMerge: (_, a) => a },
);
}
From 7a9aa6b405af88c754abfa1f8e8e9a3f03cde398 Mon Sep 17 00:00:00 2001
From: Andy
Date: Fri, 8 May 2026 08:38:50 -0700
Subject: [PATCH 28/64] Add new gql field for rewards rewardedCash. Update
reward state logic in sqm-rewards-table-status-cell and
sqm-referral-table-rewards-column. Added new spec sheets to cover logic of
functions
---
.../ReferralTable.stories.tsx | 1 +
.../ReferralTableRewardsCell.stories.tsx | 1 +
...ndCashReferralTableRewardsCell.stories.tsx | 543 +++++++-----
.../cells/sqm-referral-table-rewards-cell.tsx | 32 +-
.../referral-table-rewards-column-new.feature | 780 ++++++++++++++++++
.../RewardsTableCell.stories.tsx | 1 +
.../TaxAndCashRewardsTableCell.stories.tsx | 660 ++++++++-------
.../sqm-rewards-table/cells/readme.md | 2 +-
.../cells/sqm-rewards-table-status-cell.tsx | 39 +-
...qm-rewards-table-status-column-new.feature | 166 ++--
.../sqm-rewards-table/useRewardsTable.tsx | 1 +
packages/mint-components/src/saasquatch.d.ts | 1 +
12 files changed, 1595 insertions(+), 632 deletions(-)
create mode 100644 packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
diff --git a/packages/mint-components/src/components/sqm-referral-table/ReferralTable.stories.tsx b/packages/mint-components/src/components/sqm-referral-table/ReferralTable.stories.tsx
index 7acb343e81..40f822f22f 100644
--- a/packages/mint-components/src/components/sqm-referral-table/ReferralTable.stories.tsx
+++ b/packages/mint-components/src/components/sqm-referral-table/ReferralTable.stories.tsx
@@ -103,6 +103,7 @@ const baseReward: Reward = {
},
],
},
+ rewardedCash: false,
};
// Reward Status Cases
diff --git a/packages/mint-components/src/components/sqm-referral-table/ReferralTableRewardsCell.stories.tsx b/packages/mint-components/src/components/sqm-referral-table/ReferralTableRewardsCell.stories.tsx
index a8d99a611d..e2e312df87 100644
--- a/packages/mint-components/src/components/sqm-referral-table/ReferralTableRewardsCell.stories.tsx
+++ b/packages/mint-components/src/components/sqm-referral-table/ReferralTableRewardsCell.stories.tsx
@@ -88,6 +88,7 @@ const cashPayoutSentReward: Reward = {
statuses: ["AVAILABLE"],
globalRewardKey: "Key",
rewardRedemptionTransactions: null,
+ rewardedCash: true,
};
const nullExpiresIn = {
diff --git a/packages/mint-components/src/components/sqm-referral-table/TaxAndCashReferralTableRewardsCell.stories.tsx b/packages/mint-components/src/components/sqm-referral-table/TaxAndCashReferralTableRewardsCell.stories.tsx
index 1482d36a80..f7b9da8979 100644
--- a/packages/mint-components/src/components/sqm-referral-table/TaxAndCashReferralTableRewardsCell.stories.tsx
+++ b/packages/mint-components/src/components/sqm-referral-table/TaxAndCashReferralTableRewardsCell.stories.tsx
@@ -1,18 +1,13 @@
import { h } from "@stencil/core";
-import { DateTime } from "luxon";
import { Reward, ImpactConnection } from "../../saasquatch";
export default {
title: "Components/Tax And Cash Referral Table Rewards Cell",
};
-function getDays() {
- return DateTime.now().toMillis() + 600000000;
-}
-
-function getMonths() {
- return DateTime.now().toMillis() + 10000000000;
-}
+// Reusable timestamps (current date is May 2026)
+const PAST = 1640995200000; // Jan 1, 2022
+const FUTURE = 2779257600000; // ~2058
const cashReward: Reward = {
id: "1234",
@@ -20,270 +15,366 @@ const cashReward: Reward = {
value: 50,
unit: "USD",
name: "test",
- dateScheduledFor: getDays(),
- dateExpires: getMonths(),
- dateCancelled: 134400,
- dateRedeemed: 0,
+ dateScheduledFor: null,
+ dateExpires: null,
+ dateCancelled: null,
+ dateRedeemed: null,
fuelTankCode: null,
fuelTankType: null,
currency: "USD",
prettyValue: "$50.00",
- statuses: ["AVAILABLE"],
+ statuses: [],
globalRewardKey: "Key",
rewardRedemptionTransactions: null,
partnerFundsTransfer: null,
+ rewardedCash: true,
};
-const taxConnection: ImpactConnection = {
+// ============================================================
+// Reusable tax connections
+// ============================================================
+
+const fullySetupTaxConnection: ImpactConnection = {
connected: true,
taxHandlingEnabled: true,
publisher: {
requiredTaxDocumentType: "W9",
+ currentTaxDocument: {
+ status: "ACTIVE",
+ type: "W9",
+ dateCreated: PAST,
+ },
withdrawalSettings: { paymentMethod: "BANK_TRANSFER" },
payoutsAccount: null,
+ },
+};
+
+const connectedNoWithdrawalSettings: ImpactConnection = {
+ connected: true,
+ taxHandlingEnabled: true,
+ publisher: {
+ requiredTaxDocumentType: "W9",
currentTaxDocument: {
status: "ACTIVE",
type: "W9",
- dateCreated: 1627427794891,
+ dateCreated: PAST,
},
+ withdrawalSettings: null,
+ payoutsAccount: null,
},
};
-const defaultPFT: Reward["partnerFundsTransfer"] = {
- id: "ID1234",
- status: null,
- dateCreated: null,
- dateScheduled: null,
- dateTransferred: null,
+const notConnectedTaxConnection: ImpactConnection = {
+ connected: false,
+ taxHandlingEnabled: true,
+ publisher: null,
};
-const defaultTaxDocument: ImpactConnection["publisher"]["currentTaxDocument"] =
- {
- status: "NOT_VERIFIED",
- type: "W9",
- dateCreated: DateTime.now().toMillis() - 1000000,
- };
-
const defaultProps = {
statusText:
"{status, select, AVAILABLE {Available} CANCELLED {Cancelled} PENDING {Pending} PENDING_REVIEW {Pending} PAYOUT_APPROVED {Payout Approved} PROCESSING {Payment Processing} PAYOUT_FAILED {Payout Failed} PAYOUT_CANCELLED {Payout Cancelled} PENDING_TAX_REVIEW {Pending} PENDING_NEW_TAX_FORM {Pending} PENDING_TAX_SUBMISSION {Pending} PENDING_PARTNER_CREATION {Pending} DENIED {Denied} EXPIRED {Expired} REDEEMED {Redeemed} other {Not available} }",
statusLongText:
- "{status, select, AVAILABLE {Reward expiring on} CANCELLED {Reward cancelled on} PENDING {Available on} PENDING_REVIEW {Pending since} PAYOUT_APPROVED {Processing until {scheduledPayoutDate}. Payout is then scheduled based on your settings.} PAYOUT_FAILED {Payout failed due to a fulfillment issue and is currently being retried.} PAYOUT_CANCELLED {If you think this is a mistake, contact our Support team.} PENDING_TAX_REVIEW {Awaiting tax form review} PENDING_NEW_TAX_FORM {Invalid tax form. Submit a new form to receive your rewards.} PROCESSING {Processing until {scheduledPayoutDate}. Payout is then scheduled based on your settings.} PENDING_TAX_SUBMISSION {Submit your tax documents to receive your rewards} PENDING_PARTNER_CREATION {Complete your tax and cash payout setup to receive your rewards} DENIED {Denied on} EXPIRED {Reward expired on} other {Not available} }",
+ "{status, select, AVAILABLE {Reward expiring on} CANCELLED {Reward cancelled on} PENDING {Available on} PENDING_REVIEW {Pending since} PAYOUT_APPROVED {Processing until {scheduledPayoutDate}. Payout is then scheduled based on your settings.} PAYOUT_FAILED {Payout failed due to a fulfillment issue and is currently being retried.} PAYOUT_CANCELLED {If you think this is a mistake, contact our Support team.} PENDING_TAX_REVIEW {Awaiting tax form review} PENDING_NEW_TAX_FORM {Invalid tax form. Submit a new form to receive your rewards.} PROCESSING {Processing until {scheduledPayoutDate}. Payout is then scheduled based on your settings.} PENDING_TAX_SUBMISSION {Submit your tax documents to receive your rewards} PENDING_PARTNER_CREATION {Complete cash payout setup to receive your rewards} DENIED {Denied on} EXPIRED {Reward expired on} other {Not available} }",
rewardReceivedText: "Reward received on",
hideDetails: false,
};
-export const CashReward = () => {
- return (
-
- );
-};
+// ============================================================
+// STATE PRECEDENCE LADDER — one story per rule
+// (See referral-table-rewards-column-new.feature § 2)
+// ============================================================
-export const PayoutApproved = () => {
- return (
-
- );
-};
+// 1. Fraud check denied the referral → state is DENIED
+export const RewardsCellFraudDenied = () => (
+
+);
-export const PayoutProcessing = () => {
- return (
-
- );
-};
+// 2. Fraud check is still pending review → state is PENDING_REVIEW
+export const RewardsCellFraudPendingReview = () => (
+
+);
-export const PayoutFailed = () => {
- return (
-
- );
-};
+// 3a. Cash reward but the user has not connected an Impact partner → shows the partner-setup prompt
+export const RewardsCellPartnerNotCreatedSetupNotStarted = () => (
+
+);
-export const PayoutCancelled = () => {
- return (
- (
+
- );
-};
+ },
+ ]}
+ taxConnection={connectedNoWithdrawalSettings}
+ {...defaultProps}
+ >
+);
-export const PendingTaxReview = () => {
- return (
- (
+
- );
-};
+ },
+ ]}
+ taxConnection={fullySetupTaxConnection}
+ {...defaultProps}
+ >
+);
-export const PendingNewTaxForm = () => {
- return (
- (
+
- );
-};
+ },
+ ]}
+ taxConnection={fullySetupTaxConnection}
+ {...defaultProps}
+ >
+);
-export const PendingTaxSubmission = () => {
- return (
- (
+
- );
-};
+ },
+ ]}
+ taxConnection={fullySetupTaxConnection}
+ {...defaultProps}
+ >
+);
-export const PartnerNotCreatedSetupNotStarted = () => {
- return (
- (
+
- );
-};
+ },
+ ]}
+ taxConnection={fullySetupTaxConnection}
+ {...defaultProps}
+ >
+);
-export const PartnerCreatedSetupStartedButIncomplete = () => {
- return (
- (
+
+);
+
+// 9. Reward is pending US_TAX and the partner is not connected → shows the partner-setup prompt
+export const RewardsCellUsTaxPartnerNotConnected = () => (
+
+);
+
+// 10. Partner is connected but has not submitted any tax documents → shows the submit-tax-docs prompt
+export const RewardsCellPendingTaxSubmission = () => (
+
+);
+
+// 11. Partner's tax document is inactive (rejected) → shows the submit-a-new-form prompt
+export const RewardsCellPendingNewTaxForm = () => (
+
- );
-};
+ },
+ }}
+ {...defaultProps}
+ >
+);
-export const PendingW9 = () => {
- return (
- (
+
- );
-};
+ },
+ }}
+ {...defaultProps}
+ >
+);
+
+// 13. Partner has an active tax form but has not configured withdrawal settings → shows the partner-setup prompt
+export const RewardsCellExistingTaxFormNoWithdrawalSettings = () => (
+
+);
+
+// 14. Reward has MISSING_PAYOUT_CONFIGURATION pending reason → shows the partner-setup prompt
+export const RewardsCellMissingPayoutConfiguration = () => (
+
+);
+
+// 18. Reward does not match any precedence rule → state is undefined (Not available)
+export const RewardsCellNoMatchingRule = () => (
+
+);
+
+// ============================================================
+// Aliases kept for backwards compatibility with existing references
+// ============================================================
+
+export const CashReward = RewardsCellPayoutApproved;
+export const PayoutApproved = RewardsCellPayoutApproved;
+export const PayoutProcessing = RewardsCellPayoutProcessing;
+export const PayoutFailed = RewardsCellPayoutFailed;
+export const PayoutCancelled = RewardsCellPayoutCancelled;
+export const PendingTaxReview = RewardsCellPendingTaxReview;
+export const PendingNewTaxForm = RewardsCellPendingNewTaxForm;
+export const PendingTaxSubmission = RewardsCellPendingTaxSubmission;
+export const PartnerNotCreatedSetupNotStarted =
+ RewardsCellPartnerNotCreatedSetupNotStarted;
+export const PartnerCreatedSetupStartedButIncomplete =
+ RewardsCellPartnerCreatedSetupStartedButIncomplete;
+export const PendingW9 = RewardsCellPendingW9Required;
diff --git a/packages/mint-components/src/components/sqm-referral-table/cells/sqm-referral-table-rewards-cell.tsx b/packages/mint-components/src/components/sqm-referral-table/cells/sqm-referral-table-rewards-cell.tsx
index a0b3783272..a02ea60a24 100644
--- a/packages/mint-components/src/components/sqm-referral-table/cells/sqm-referral-table-rewards-cell.tsx
+++ b/packages/mint-components/src/components/sqm-referral-table/cells/sqm-referral-table-rewards-cell.tsx
@@ -17,7 +17,7 @@ export class ReferralTableRewardsCell {
@Prop() statusText: string =
"{status, select, AVAILABLE {Available} CANCELLED {Cancelled} PENDING {Pending} PENDING_REVIEW {Pending} PAYOUT_APPROVED {Payout Approved} PROCESSING {Payment Processing} PAYOUT_FAILED {Payout Failed} PAYOUT_CANCELLED {Payout Cancelled} PENDING_TAX_REVIEW {Pending} PENDING_NEW_TAX_FORM {Pending} PENDING_TAX_SUBMISSION {Pending} PENDING_PARTNER_CREATION {Pending} DENIED {Denied} EXPIRED {Expired} REDEEMED {Redeemed} other {Not available} }";
@Prop() statusLongText: string =
- "{status, select, AVAILABLE {Reward expiring on} CANCELLED {Reward cancelled on} PENDING {Available on} PENDING_REVIEW {Pending since} PAYOUT_APPROVED {Processing until {scheduledPayoutDate}. Payout is then scheduled based on your settings.} PAYOUT_FAILED {Payout failed due to a fulfillment issue and is currently being retried.} PAYOUT_CANCELLED {If you think this is a mistake, contact our Support team.} PENDING_TAX_REVIEW {Awaiting tax form review} PENDING_NEW_TAX_FORM {Invalid tax form. Submit a new form to receive your rewards.} PROCESSING {Processing until {scheduledPayoutDate}. Payout is then scheduled based on your settings.} PENDING_TAX_SUBMISSION {Submit your tax documents to receive your rewards} PENDING_PARTNER_CREATION {Complete your tax and cash payout setup to receive your rewards} DENIED {Denied on} EXPIRED {Reward expired on} other {Not available} }";
+ "{status, select, AVAILABLE {Reward expiring on} CANCELLED {Reward cancelled on} PENDING {Available on} PENDING_REVIEW {Pending since} PAYOUT_APPROVED {Processing until {scheduledPayoutDate}. Payout is then scheduled based on your settings.} PAYOUT_FAILED {Payout failed due to a fulfillment issue and is currently being retried.} PAYOUT_CANCELLED {If you think this is a mistake, contact our Support team.} PENDING_TAX_REVIEW {Awaiting tax form review} PENDING_NEW_TAX_FORM {Invalid tax form. Submit a new form to receive your rewards.} PROCESSING {Processing until {scheduledPayoutDate}. Payout is then scheduled based on your settings.} PENDING_TAX_SUBMISSION {Submit your tax documents to receive your rewards} PENDING_PARTNER_CREATION {Complete your cash payout setup to receive your rewards} DENIED {Denied on} EXPIRED {Reward expired on} other {Not available} }";
@Prop() fuelTankText: string;
@Prop() rewardReceivedText: string;
@Prop() expiringText: string;
@@ -171,12 +171,24 @@ export class ReferralTableRewardsCell {
return "DENIED";
}
+ const isCashReward = reward.rewardedCash;
+ if (isCashReward) {
+ if (
+ !this.taxConnection?.connected ||
+ (this.taxConnection?.connected &&
+ !this.taxConnection?.publisher?.withdrawalSettings)
+ )
+ return "PENDING_PARTNER_CREATION";
+ }
+
const partnerFundsStatus = reward.partnerFundsTransfer?.status;
if (reward.partnerFundsTransfer) {
if (partnerFundsStatus === "REVERSED") return "PAYOUT_CANCELLED";
if (partnerFundsStatus === "OVERDUE") return "PAYOUT_FAILED";
+ }
+ if (reward.partnerFundsTransfer) {
if (
reward.partnerFundsTransfer.dateScheduled &&
reward.partnerFundsTransfer.dateScheduled > Date.now()
@@ -213,6 +225,19 @@ export class ReferralTableRewardsCell {
if (!taxConnection?.publisher?.withdrawalSettings)
return "PENDING_PARTNER_CREATION";
}
+
+ // Fallback: when rewardStatus() forced PENDING because the user is
+ // connected but hasn't set up withdrawal settings (no pendingReasons
+ // were returned by the API, e.g. for credit rewards with a PFT).
+ if (reward.rewardedCash) {
+ if (
+ !taxConnection?.connected ||
+ (taxConnection?.connected &&
+ !taxConnection?.publisher?.withdrawalSettings)
+ )
+ return "PENDING_PARTNER_CREATION";
+ }
+
if (reward?.pendingReasons?.includes("MISSING_PAYOUT_CONFIGURATION")) {
return "PENDING_PARTNER_CREATION";
}
@@ -357,6 +382,11 @@ export class ReferralTableRewardsCell {
{statusText}
)}
+ {state === "PAYOUT_APPROVED" && (
+
+ {statusText}
+
+ )}
{state === "PAYOUT_FAILED" && (
{statusText}
diff --git a/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature b/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
new file mode 100644
index 0000000000..8505ece74f
--- /dev/null
+++ b/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
@@ -0,0 +1,780 @@
+@author:derek @owner:derek
+Feature: Referral Table Rewards Cell
+ Renders the rewards earned for each referral as an `` block.
+ Each reward shows:
+ - the reward value (e.g. "$50.00") in the summary
+ - a coloured badge "pill" with status text
+ - optionally a second "info" pill (only for AVAILABLE rewards with an expiry)
+ - a description body that is a STACK of zero or more conditional lines:
+ 1. a state-specific status line (only for some states)
+ 2. a "reward received" line (only when reward.dateGiven is set)
+ 3. a fuel-tank code line (only when reward.fuelTankCode is set)
+ The state shown is computed by `getState()` from:
+ 1. the referral's fraud moderation status,
+ 2. the user's Impact tax/payout connection (taxConnection prop),
+ 3. the reward's PartnerFundsTransfer (PFT),
+ 4. the reward's `pendingReasons` (US_TAX, MISSING_PAYOUT_CONFIGURATION),
+ 5. the reward's `statuses` array (fallback).
+
+ Background:
+ Given the user is viewing the referral table
+ And each row may show one or more rewards via sqm-referral-table-rewards-cell
+ And the reward value is always shown in the summary as the bold prettyValue (e.g. "$50.00")
+ # ============================================================
+ # 1. CELL CONFIGURATION (every prop in isolation)
+ # ============================================================
+
+ @motivating @ui
+ Scenario: hideDetails=true hides the disclosure caret and disables expansion
+ Given the "hide-details" prop is true
+ When the cell is rendered
+ Then the sl-details summary-icon is set to display:none
+ And the sl-details element is rendered with the disabled attribute
+ And the summary cursor style is "default"
+
+ @motivating @ui
+ Scenario: hideDetails=false (default) shows the disclosure caret and allows expansion
+ Given the "hide-details" prop is false
+ When the cell is rendered
+ Then the sl-details summary-icon is set to display:flex
+ And the summary cursor style is "pointer"
+
+ @minutia @ui
+ Scenario Outline: rewardReceivedText prop drives the reward-received line
+ Given a reward with dateGiven Jan 1, 2026
+ And the "reward-received-text" prop is ""
+ When the cell is rendered
+ Then the description body contains " Jan 1, 2026" with "Jan 1, 2026" rendered in bold
+
+ Examples:
+ | value |
+ | Reward given |
+ | You earned on |
+ | (empty string) |
+
+ @minutia @ui
+ Scenario Outline: expiringText prop drives the AVAILABLE info pill
+ Given an AVAILABLE reward with dateExpires Aug 31, 2026
+ And the current date is May 7, 2026
+ And the "expiring-text" prop is ""
+ When the cell is rendered
+ Then the second info pill text is exactly ""
+
+ Examples:
+ | value | rendered |
+ | Expiring | Expiring 3 months |
+ | Expires | Expires 3 months |
+ | (unset) | undefined 3 months |
+
+ @minutia @ui
+ Scenario Outline: pendingForText prop drives the badge text for PENDING+dateScheduledFor
+ Given a PENDING reward with dateScheduledFor Aug 31, 2026
+ And the current date is May 7, 2026
+ And the "pending-for-text" prop is ""
+ When the cell is rendered
+ Then the primary badge text is exactly ""
+
+ Examples:
+ | value | rendered |
+ | {status} for {date} | Pending for 3 months |
+ | Available {date} | Available 3 months |
+
+ @motivating @ui
+ Scenario: deniedHelpText prop is appended to the DENIED description with a leading space
+ Given a DENIED reward with referral.dateModerated Jan 1, 2026
+ And the "denied-help-text" prop is "Contact support if you believe this is an error."
+ When the cell is rendered
+ Then the description body contains "Denied on Jan 1, 2026. Contact support if you believe this is an error."
+
+ @motivating @ui
+ Scenario: deniedHelpText prop omitted leaves the DENIED description with only the trailing period
+ Given a DENIED reward with referral.dateModerated Jan 1, 2026
+ And the "denied-help-text" prop is unset
+ When the cell is rendered
+ Then the description body contains "Denied on Jan 1, 2026."
+ And the description body does NOT contain any text after that period
+
+ @motivating @ui
+ Scenario: fuelTankText prop drives the fuel-tank line
+ Given a reward with fuelTankCode "ABC-123"
+ And the "fuel-tank-text" prop is "Your code:"
+ When the cell is rendered
+ Then the description body contains "Your code: ABC-123" with "ABC-123" rendered in bold
+
+ @minutia @ui
+ Scenario: locale prop changes the date formatter and relative time formatter
+ Given the "locale" prop is set to a supported locale
+ Then every Luxon date is formatted using `luxonLocale(locale)` with `DateTime.DATE_MED`
+ And every relative time uses `DateTime.toRelative()` with the same locale, with the leading "in " stripped
+ And every prop-driven message string is run through `intl.formatMessage`
+ # ============================================================
+ # 2. STATE PRECEDENCE LADDER
+ # `getState()` walks the rules below from top to bottom and returns
+ # at the FIRST matching rule. Note: rules 3a and 3b (cash-reward payout-
+ # setup gate) fire BEFORE any PFT branch, so they suppress PFT-derived
+ # PROCESSING / PAYOUT_APPROVED states whenever the user has a cash
+ # reward but has not finished tax/payout setup (either not connected at
+ # all, or connected without withdrawalSettings). For cash rewards,
+ # PAYOUT_CANCELLED (REVERSED) and PAYOUT_FAILED (OVERDUE) are
+ # unreachable past rules 3a/3b when those gates fire.
+ # ============================================================
+
+ @motivating
+ Scenario: State precedence ladder
+ Given a reward, its referral's fraud state, and the user's tax connection
+ And dummy data is used where applicable: dateModerated/dateExpires/dateCancelled/dateScheduledFor/partnerFundsTransfer.dateScheduled = Jan 1, 2026; deniedHelpText = "Contact support."
+ Then the displayed state is determined in the following order, returning at the first match:
+ | order | rule | resulting state | resulting badge text | resulting description body |
+ | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Denied on Jan 1, 2026. Contact support. |
+ | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Pending since Jan 1, 2026 |
+ | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
+ | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
+ | 7 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 8 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 9 | reward.pendingReasons includes "US_TAX" AND impactConnection.taxHandlingEnabled is false | PENDING | Pending | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
+ | 10 | reward.pendingReasons includes "US_TAX" AND impactConnection.connected is false | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 11 | reward.pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument is missing | PENDING_TAX_SUBMISSION | Pending | Submit your tax documents to receive your rewards |
+ | 12 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "INACTIVE" / "INVALID_W9_ELECTRONIC_DOCUMENT" / "INVALID_W9_ELECTRONIC_DOCUMENT_CHECK_INTERNAL" | PENDING_NEW_TAX_FORM | Pending | Invalid tax form. Submit a new form to receive your rewards. |
+ | 13 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING_TAX_REVIEW | Pending | Awaiting tax form review |
+ | 14 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "ACTIVE" AND publisher.withdrawalSettings missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 15 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 19 | none of the above | undefined | Not available | (no state-specific body line) |
+ But for rewards where reward.rewardedCash is false (non-cash rewards, e.g. CREDIT/POINTS, PCT_DISCOUNT, INTEGRATION, FUELTANK — these skip rules 3a/3b entirely and never carry a partnerFundsTransfer or US_TAX/MISSING_PAYOUT_CONFIGURATION pendingReason, so they always fall through to the reward.statuses fallback), the following non-cash-only rules are inserted between rule 14 and rule 18, in this order:
+ | order | rule | resulting state | resulting badge text | resulting description body |
+ | 15 | statuses includes "REDEEMED" | REDEEMED | Redeemed | (no state-specific body line) |
+ | 16 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Reward cancelled on Jan 1, 2026 |
+ | 17 | statuses includes "EXPIRED" | EXPIRED | Expired | Reward expired on Jan 1, 2026 |
+ | 17a | statuses includes "PENDING" | PENDING | Pending (or "Pending for {date}" overlay if dateScheduledFor set) | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
+ | 17b | statuses includes "AVAILABLE" | AVAILABLE | Available (plus info pill "{expiringText} {relative}" if dateExpires set) | Reward expiring on Jan 1, 2026 |
+
+ @motivating
+ Scenario: Cash reward with connected partner but no withdrawal settings overrides any PFT-derived state
+ Given a cash reward (reward.rewardedCash is true) with partnerFundsTransfer status "TRANSFERRED" and dateScheduled in the past
+ And taxConnection.connected is true
+ And taxConnection.publisher.withdrawalSettings is missing
+ When the cell is rendered
+ Then the resulting state is PENDING_PARTNER_CREATION
+
+ @motivating
+ Scenario: Cash reward with no impact connection overrides any PFT-derived state
+ Given a cash reward (reward.rewardedCash is true) with partnerFundsTransfer status "TRANSFERRED" and dateScheduled in the past
+ And taxConnection.connected is false
+ When the cell is rendered
+ Then the resulting state is PENDING_PARTNER_CREATION
+
+ @motivating
+ Scenario: Non-cash reward skips the payout-setup gate
+ Given a non-cash reward (reward.rewardedCash is false) with reward.statuses ["AVAILABLE"]
+ And taxConnection.connected is false
+ When the cell is rendered
+ Then the resulting state is AVAILABLE
+
+ @minutia
+ Scenario: Connected partner with no withdrawal settings does NOT override fraud states
+ Given a reward whose referral.fraudData.moderationStatus is "DENIED"
+ And taxConnection.connected is true
+ And taxConnection.publisher.withdrawalSettings is missing
+ When the cell is rendered
+ Then the resulting state is DENIED
+ # ============================================================
+ # 3. STATE → BADGE COLOUR (`getSLBadgeType`)
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: Each state maps to a Shoelace badge type
+ Given a reward whose computed state is ""
+ When the cell is rendered
+ Then the primary pill is rendered with type ""
+ And the primary pill is rendered with the "" CSS class
+ # CSS class applied: primary→RedeemBadge, danger→DangerBadge,
+ # warning→WarningBadge, success→SuccessBadge, info→WarningBadge.
+ # Note: getSLBadgeType returns undefined for any state outside the cases
+ # below; the resulting CSS class then defaults to WarningBadge.
+
+ Examples:
+ | state | slBadgeType | cssClass |
+ | REDEEMED | primary | RedeemBadge |
+ | PAYOUT_APPROVED | primary | RedeemBadge |
+ | DENIED | danger | DangerBadge |
+ | EXPIRED | danger | DangerBadge |
+ | CANCELLED | danger | DangerBadge |
+ | PAYOUT_FAILED | danger | DangerBadge |
+ | PAYOUT_CANCELLED | danger | DangerBadge |
+ | PENDING | warning | WarningBadge |
+ | PENDING_REVIEW | warning | WarningBadge |
+ | PENDING_TAX_REVIEW | warning | WarningBadge |
+ | PENDING_NEW_TAX_FORM | warning | WarningBadge |
+ | PENDING_TAX_SUBMISSION | warning | WarningBadge |
+ | PENDING_PARTNER_CREATION | warning | WarningBadge |
+ | PROCESSING | warning | WarningBadge |
+ | AVAILABLE | success | SuccessBadge |
+ | (empty string "") | undefined | WarningBadge |
+ | (any unknown string) | undefined | WarningBadge |
+ # ============================================================
+ # 4. PRIMARY BADGE TEXT
+ # The primary badge ALWAYS renders. Its text comes from one of two paths:
+ # - "pendingFor" overlay: state==="PENDING" AND reward.dateScheduledFor truthy
+ # - default: intl.formatMessage(statusText, {status: state})
+ # The default `statusText` ICU message maps every state below.
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: Default primary badge text per state (no PENDING+dateScheduledFor overlay)
+ Given a reward whose computed state is ""
+ And NOT (state is PENDING and reward.dateScheduledFor is set)
+ And the "status-text" prop is the default
+ When the cell is rendered
+ Then the primary badge text is exactly ""
+
+ Examples:
+ | state | text |
+ | AVAILABLE | Available |
+ | CANCELLED | Cancelled |
+ | PENDING | Pending |
+ | PENDING_REVIEW | Pending |
+ | PAYOUT_APPROVED | Payout Approved |
+ | PROCESSING | Payment Processing |
+ | PAYOUT_FAILED | Payout Failed |
+ | PAYOUT_CANCELLED | Payout Cancelled |
+ | PENDING_TAX_REVIEW | Pending |
+ | PENDING_NEW_TAX_FORM | Pending |
+ | PENDING_TAX_SUBMISSION | Pending |
+ | PENDING_PARTNER_CREATION | Pending |
+ | DENIED | Denied |
+ | EXPIRED | Expired |
+ | REDEEMED | Redeemed |
+ | (empty string "") | Not available |
+ | (any unknown string) | Not available |
+
+ @motivating @ui
+ Scenario: PENDING + dateScheduledFor uses the pendingForText overlay (default ICU)
+ Given a PENDING reward with dateScheduledFor Aug 31, 2026
+ And the current date is May 7, 2026
+ And the "status-text" prop is the default
+ And the "pending-for-text" prop is the default "{status} for {date}"
+ When the cell is rendered
+ Then the primary badge text is exactly "Pending for 3 months"
+
+ @motivating @ui
+ Scenario: PENDING WITHOUT dateScheduledFor falls back to the default badge text
+ Given a PENDING reward whose dateScheduledFor is unset
+ When the cell is rendered
+ Then the primary badge text is exactly "Pending"
+
+ @minutia @ui
+ Scenario: pendingForText overlay is suppressed for non-PENDING states even with dateScheduledFor
+ Given an AVAILABLE reward whose dateScheduledFor is set Aug 31, 2026
+ When the cell is rendered
+ Then the primary badge text is exactly "Available"
+ And the pendingForText template is NOT applied
+ # ============================================================
+ # 5. SECONDARY ("INFO") PILL
+ # The second pill renders ONLY when state==="AVAILABLE" AND reward.dateExpires is truthy.
+ # Its text is `${expiringText} ${getTimeDiff(dateExpires)}` — note the leading space
+ # always present and the prop value is rendered as-is (undefined → literal "undefined ...").
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: Secondary info pill renders only for AVAILABLE+dateExpires
+ Given a reward whose computed state is ""
+ And reward.dateExpires is
+ When the cell is rendered
+ Then the secondary info pill is rendered:
+
+ Examples:
+ | state | dateExpires | rendered |
+ | AVAILABLE | Aug 31, 2026 (set) | yes |
+ | AVAILABLE | unset | no |
+ | EXPIRED | Aug 31, 2026 (set) | no |
+ | REDEEMED | Aug 31, 2026 (set) | no |
+ | PENDING | Aug 31, 2026 (set) | no |
+ | CANCELLED | Aug 31, 2026 (set) | no |
+ | PENDING_REVIEW | Aug 31, 2026 (set) | no |
+ | DENIED | Aug 31, 2026 (set) | no |
+ | PAYOUT_APPROVED | Aug 31, 2026 (set) | no |
+ | PROCESSING | Aug 31, 2026 (set) | no |
+
+ @motivating @ui
+ Scenario Outline: Secondary info pill text composition
+ Given an AVAILABLE reward with dateExpires Aug 31, 2026
+ And the current date is May 7, 2026
+ And the "expiring-text" prop is
+ When the cell is rendered
+ Then the secondary info pill is rendered with type "info"
+ And the secondary info pill is rendered with the WarningBadge CSS class
+ And the secondary info pill text is exactly ""
+
+ Examples:
+ | expiringText | text |
+ | "Expiring" | Expiring 3 months |
+ | "" | 3 months |
+ | unset | undefined 3 months |
+ # ============================================================
+ # 6. DESCRIPTION BODY — PER-STATE STATUS LINE
+ # The body is a stack of conditional render blocks, evaluated in source order:
+ # PENDING_REVIEW → "" → PROCESSING → PAYOUT_FAILED → PAYOUT_CANCELLED →
+ # PENDING_TAX_REVIEW → PENDING_NEW_TAX_FORM → PENDING_TAX_SUBMISSION →
+ # PENDING_PARTNER_CREATION → DENIED → dateGiven → EXPIRED → CANCELLED →
+ # PENDING → AVAILABLE → fuelTankCode.
+ # All other states (REDEEMED, etc.) render NO state-specific
+ # status line — only the dateGiven/fuelTankCode lines below if applicable.
+ # ============================================================
+
+ @motivating @ui
+ Scenario: PENDING_REVIEW with dateModerated renders the "Pending since" line
+ Given a reward whose computed state is PENDING_REVIEW
+ And reward.referral.dateModerated is Jan 1, 2026
+ When the cell is rendered
+ Then the description body contains "Pending since Jan 1, 2026" with "Jan 1, 2026" in bold
+
+ @motivating @ui
+ Scenario: PENDING_REVIEW WITHOUT dateModerated renders no "Pending since" line
+ Given a reward whose computed state is PENDING_REVIEW
+ And reward.referral.dateModerated is unset
+ When the cell is rendered
+ Then the description body does NOT contain a "Pending since" line
+
+ @motivating @ui
+ Scenario: state === "" renders the bare "Not available" statusText line
+ Given a reward whose computed state is the empty string ""
+ When the cell is rendered
+ Then the description body contains exactly the text "Not available"
+
+ @minutia @ui
+ Scenario: state === undefined does NOT render the "Not available" line in the body
+ Given a reward whose computed state is undefined
+ When the cell is rendered
+ Then the description body does NOT contain "Not available"
+ And only the dateGiven and fuelTankCode lines (if any) are rendered
+
+ @motivating @ui
+ Scenario: PROCESSING renders the "Processing until {date}." line
+ Given a reward whose computed state is PROCESSING
+ And reward.partnerFundsTransfer.dateScheduled is Jan 1, 2026
+ When the cell is rendered
+ Then the description body contains "Processing until Jan 1, 2026. Payout is then scheduled based on your settings."
+
+ @motivating @ui
+ Scenario: PAYOUT_APPROVED renders the "Processing until {date}." line
+ Given a reward whose computed state is PAYOUT_APPROVED
+ And reward.partnerFundsTransfer.dateScheduled is Jan 1, 2026
+ When the cell is rendered
+ Then the description body contains "Processing until Jan 1, 2026. Payout is then scheduled based on your settings."
+
+ @motivating @ui
+ Scenario: PAYOUT_FAILED renders the failed-fulfillment line
+ Given a reward whose computed state is PAYOUT_FAILED
+ When the cell is rendered
+ Then the description body contains "Payout failed due to a fulfillment issue and is currently being retried."
+
+ @motivating @ui
+ Scenario: PAYOUT_CANCELLED renders the contact-support line
+ Given a reward whose computed state is PAYOUT_CANCELLED
+ When the cell is rendered
+ Then the description body contains "If you think this is a mistake, contact our Support team."
+
+ @motivating @ui
+ Scenario: PENDING_TAX_REVIEW renders the tax-review line
+ Given a reward whose computed state is PENDING_TAX_REVIEW
+ When the cell is rendered
+ Then the description body contains "Awaiting tax form review"
+
+ @motivating @ui
+ Scenario: PENDING_NEW_TAX_FORM renders the invalid-tax-form line
+ Given a reward whose computed state is PENDING_NEW_TAX_FORM
+ When the cell is rendered
+ Then the description body contains "Invalid tax form. Submit a new form to receive your rewards."
+
+ @motivating @ui
+ Scenario: PENDING_TAX_SUBMISSION renders the submit-tax-documents line
+ Given a reward whose computed state is PENDING_TAX_SUBMISSION
+ When the cell is rendered
+ Then the description body contains "Submit your tax documents to receive your rewards"
+
+ @motivating @ui
+ Scenario: PENDING_PARTNER_CREATION renders the complete-payout-setup line
+ Given a reward whose computed state is PENDING_PARTNER_CREATION
+ When the cell is rendered
+ Then the description body contains "Complete your tax and cash payout setup to receive your rewards"
+
+ @motivating @ui
+ Scenario: DENIED with dateModerated renders "Denied on {date}." with trailing period
+ Given a reward whose computed state is DENIED
+ And reward.referral.dateModerated is Jan 1, 2026
+ And the "denied-help-text" prop is unset
+ When the cell is rendered
+ Then the description body contains "Denied on Jan 1, 2026." with "Jan 1, 2026" in bold
+
+ @motivating @ui
+ Scenario: DENIED with dateModerated AND deniedHelpText appends help text after the period
+ Given a reward whose computed state is DENIED
+ And reward.referral.dateModerated is Jan 1, 2026
+ And the "denied-help-text" prop is "Contact our support team."
+ When the cell is rendered
+ Then the description body contains "Denied on Jan 1, 2026. Contact our support team."
+
+ @motivating @ui
+ Scenario: DENIED WITHOUT dateModerated renders no "Denied on" line
+ Given a reward whose computed state is DENIED
+ And reward.referral.dateModerated is unset
+ When the cell is rendered
+ Then the description body does NOT contain a "Denied on" line
+ And the deniedHelpText is NOT rendered (it lives inside the dateModerated block)
+
+ @motivating @ui
+ Scenario: EXPIRED with dateExpires renders the "Reward expired on {date}" line
+ Given a reward whose computed state is EXPIRED
+ And reward.dateExpires is Jan 1, 2026
+ When the cell is rendered
+ Then the description body contains "Reward expired on Jan 1, 2026" with "Jan 1, 2026" in bold
+
+ @motivating @ui
+ Scenario: EXPIRED WITHOUT dateExpires renders no expired line
+ Given a reward whose computed state is EXPIRED
+ And reward.dateExpires is unset
+ When the cell is rendered
+ Then the description body does NOT contain "Reward expired on"
+
+ @motivating @ui
+ Scenario: CANCELLED with dateCancelled renders the "Reward cancelled on {date}" line
+ Given a reward whose computed state is CANCELLED
+ And reward.dateCancelled is Jan 1, 2026
+ When the cell is rendered
+ Then the description body contains "Reward cancelled on Jan 1, 2026" with "Jan 1, 2026" in bold
+
+ @motivating @ui
+ Scenario: CANCELLED WITHOUT dateCancelled renders no cancelled line
+ Given a reward whose computed state is CANCELLED
+ And reward.dateCancelled is unset
+ When the cell is rendered
+ Then the description body does NOT contain "Reward cancelled on"
+
+ @motivating @ui
+ Scenario: PENDING with dateScheduledFor renders the "Available on {date}" line
+ Given a reward whose computed state is PENDING
+ And reward.dateScheduledFor is Jan 1, 2026
+ When the cell is rendered
+ Then the description body contains "Available on Jan 1, 2026" with "Jan 1, 2026" in bold
+
+ @motivating @ui
+ Scenario: PENDING WITHOUT dateScheduledFor renders no "Available on" line
+ Given a reward whose computed state is PENDING
+ And reward.dateScheduledFor is unset
+ When the cell is rendered
+ Then the description body does NOT contain "Available on"
+ And the badge falls back to plain "Pending"
+
+ @motivating @ui
+ Scenario: AVAILABLE with dateExpires renders the "Reward expiring on {date}" body line
+ Given a reward whose computed state is AVAILABLE
+ And reward.dateExpires is Aug 31, 2026
+ When the cell is rendered
+ Then the description body contains "Reward expiring on Aug 31, 2026" with "Aug 31, 2026" in bold
+
+ @motivating @ui
+ Scenario: AVAILABLE WITHOUT dateExpires renders no body line and no info pill
+ Given a reward whose computed state is AVAILABLE
+ And reward.dateExpires is unset
+ When the cell is rendered
+ Then the description body does NOT contain "Reward expiring on"
+ And the secondary info pill is NOT rendered
+
+ @motivating @ui
+ Scenario: REDEEMED renders no state-specific body line
+ Given a reward whose computed state is REDEEMED
+ When the cell is rendered
+ Then the description body has NO state-specific status line
+ And only the dateGiven and fuelTankCode lines (if any) are rendered
+ # ============================================================
+ # 7. ALWAYS-ON BODY LINES (dateGiven + fuelTankCode)
+ # These render REGARDLESS of state, layered on top of (or instead of)
+ # the per-state status line.
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: dateGiven line renders for every state when reward.dateGiven is truthy
+ Given a reward with dateGiven Jan 1, 2026
+ And the "reward-received-text" prop is "Reward given"
+ And the reward's computed state is ""
+ When the cell is rendered
+ Then the description body contains "Reward given Jan 1, 2026" with "Jan 1, 2026" in bold
+
+ Examples:
+ | state |
+ | AVAILABLE |
+ | REDEEMED |
+ | PENDING |
+ | PENDING_REVIEW |
+ | EXPIRED |
+ | CANCELLED |
+ | DENIED |
+ | PAYOUT_APPROVED |
+ | PAYOUT_CANCELLED |
+ | PAYOUT_FAILED |
+ | PROCESSING |
+ | PENDING_TAX_REVIEW |
+ | PENDING_NEW_TAX_FORM |
+ | PENDING_TAX_SUBMISSION |
+ | PENDING_PARTNER_CREATION |
+
+ @motivating @ui
+ Scenario: dateGiven line is suppressed when reward.dateGiven is unset
+ Given a reward whose dateGiven is unset
+ When the cell is rendered
+ Then the description body does NOT contain a reward-received line
+
+ @motivating @ui
+ Scenario Outline: fuelTankCode line renders for every state when reward.fuelTankCode is truthy
+ Given a reward with fuelTankCode "ABC-123"
+ And the "fuel-tank-text" prop is "Code:"
+ And the reward's computed state is ""
+ When the cell is rendered
+ Then the description body contains "Code: ABC-123" with "ABC-123" in bold
+
+ Examples:
+ | state |
+ | AVAILABLE |
+ | REDEEMED |
+ | PENDING |
+ | PENDING_REVIEW |
+ | EXPIRED |
+ | CANCELLED |
+ | DENIED |
+ | PAYOUT_APPROVED |
+ | PAYOUT_CANCELLED |
+ | PAYOUT_FAILED |
+ | PROCESSING |
+ | PENDING_TAX_REVIEW |
+ | PENDING_NEW_TAX_FORM |
+ | PENDING_TAX_SUBMISSION |
+ | PENDING_PARTNER_CREATION |
+
+ @motivating @ui
+ Scenario: fuelTankCode line is suppressed when reward.fuelTankCode is unset
+ Given a reward whose fuelTankCode is unset
+ When the cell is rendered
+ Then the description body does NOT contain a fuel-tank line
+
+ @minutia @ui
+ Scenario: Stacking order in the description body
+ Given an AVAILABLE reward with dateExpires Aug 31, 2026, dateGiven Jan 1, 2026, fuelTankCode "ABC-123"
+ When the cell is rendered
+ Then the description body lines appear in this order:
+ | order | line |
+ | 1 | Reward given Jan 1, 2026 (dateGiven block) |
+ | 2 | Reward expiring on Aug 31, 2026 (AVAILABLE block) |
+ | 3 | ABC-123 (fuelTankCode block) |
+ # ============================================================
+ # 8. PARTNER FUNDS TRANSFER (PFT) MATRIX
+ # Every PFT permutation, with the cash-reward "needsPayoutSetup" gate
+ # (rules 3a/3b above) toggled on/off. The gate fires BEFORE PFT branches
+ # for cash rewards, but rules 4–5 (REVERSED, OVERDUE) are unreachable
+ # when the gate fires because the gate already returned
+ # PENDING_PARTNER_CREATION.
+ # ============================================================
+
+ @motivating
+ Scenario Outline: PFT permutations when withdrawalSettings ARE present (gate does not fire)
+ Given taxConnection.connected is true
+ And taxConnection.publisher.withdrawalSettings is present
+ And the reward has a partnerFundsTransfer with status and dateScheduled
+ When the cell is rendered
+ Then the resulting state is ""
+
+ Examples:
+ | pftStatus | pftDateScheduled | state |
+ | REVERSED | (any) | PAYOUT_CANCELLED |
+ | OVERDUE | (any) | PAYOUT_FAILED |
+ | TRANSFERRED | future | PROCESSING |
+ | TRANSFERRED | past | PAYOUT_APPROVED |
+ | TRANSFERRED | unset | PAYOUT_APPROVED |
+ | NOT_YET_DUE | future | PROCESSING |
+ | NOT_YET_DUE | past | PAYOUT_APPROVED |
+ | NOT_YET_DUE | unset | PAYOUT_APPROVED |
+ | (null) | future | PROCESSING |
+ | (null) | past | PAYOUT_APPROVED |
+
+ @motivating
+ Scenario Outline: PFT permutations when withdrawalSettings are MISSING (gate fires first)
+ Given taxConnection.connected is true
+ And taxConnection.publisher.withdrawalSettings is missing
+ And the reward has a partnerFundsTransfer with status and dateScheduled
+ When the cell is rendered
+ Then the resulting state is ""
+
+ Examples:
+ | pftStatus | pftDateScheduled | state |
+ | REVERSED | (any) | PENDING_PARTNER_CREATION |
+ | OVERDUE | (any) | PENDING_PARTNER_CREATION |
+ | TRANSFERRED | future | PENDING_PARTNER_CREATION |
+ | TRANSFERRED | past | PENDING_PARTNER_CREATION |
+ | NOT_YET_DUE | future | PENDING_PARTNER_CREATION |
+ | NOT_YET_DUE | past | PENDING_PARTNER_CREATION |
+ | (null) | future | PENDING_PARTNER_CREATION |
+ | (null) | past | PENDING_PARTNER_CREATION |
+
+ @motivating
+ Scenario: PFT branch is skipped entirely when reward.partnerFundsTransfer is missing
+ Given the reward has no partnerFundsTransfer
+ And the reward has no fraud / pendingReasons / statuses overrides
+ When the cell is rendered
+ Then PFT rules 4–9 are skipped
+ And the resulting state is determined by the next applicable rule
+ # ============================================================
+ # 9. US_TAX PENDING-REASON MATRIX
+ # Every permutation of taxConnection state when reward.pendingReasons
+ # includes "US_TAX". Once US_TAX matches a sub-rule, no later rule fires.
+ # ============================================================
+
+ @motivating @ui
+ Scenario Outline: US_TAX pending matrix
+ Given a reward whose pendingReasons include "US_TAX"
+ And taxConnection.taxHandlingEnabled is
+ And taxConnection.connected is
+ And taxConnection.publisher.requiredTaxDocumentType is
+ And taxConnection.publisher.currentTaxDocument is
+ And taxConnection.publisher.currentTaxDocument.status is
+ And taxConnection.publisher.withdrawalSettings is
+ When the cell is rendered
+ Then the resulting state is ""
+
+ Examples:
+ | taxHandlingEnabled | connected | requiredTaxDocumentType | currentTaxDocument | currentTaxDocumentStatus | withdrawalSettings | state |
+ | false | (any) | (any) | (any) | (any) | (any) | PENDING |
+ | true | false | (any) | (any) | (any) | (any) | PENDING_PARTNER_CREATION |
+ | true | true | unset | (any) | (any) | present | (falls through) |
+ | true | true | unset | (any) | (any) | missing | (falls through) |
+ | true | true | W9 | missing | - | (any) | PENDING_TAX_SUBMISSION |
+ | true | true | W9 | present | INACTIVE | (any) | PENDING_NEW_TAX_FORM |
+ | true | true | W9 | present | INVALID_W9_ELECTRONIC_DOCUMENT | (any) | PENDING_NEW_TAX_FORM |
+ | true | true | W9 | present | INVALID_W9_ELECTRONIC_DOCUMENT_CHECK_INTERNAL | (any) | PENDING_NEW_TAX_FORM |
+ | true | true | W9 | present | NOT_VERIFIED | (any) | PENDING_TAX_REVIEW |
+ | true | true | W9 | present | ACTIVE | missing | PENDING_PARTNER_CREATION |
+ | true | true | W9 | present | ACTIVE | present | (falls through) |
+
+ @motivating @ui
+ Scenario: MISSING_PAYOUT_CONFIGURATION pendingReason resolves to PENDING_PARTNER_CREATION
+ Given a reward whose pendingReasons include "MISSING_PAYOUT_CONFIGURATION"
+ And no earlier rule matches
+ When the cell is rendered
+ Then the resulting state is PENDING_PARTNER_CREATION
+ # ============================================================
+ # 10. STATUSES-ARRAY FALLBACK (rules 19–34)
+ # ============================================================
+
+ @motivating
+ Scenario Outline: Single-entry statuses array returns that single value (rule 19)
+ Given a reward whose pendingReasons array is empty
+ And reward.partnerFundsTransfer is missing
+ And reward.statuses is
+ When the cell is rendered
+ Then the resulting state is ""
+
+ Examples:
+ | statuses | state |
+ | ["AVAILABLE"] | AVAILABLE |
+ | ["REDEEMED"] | REDEEMED |
+ | ["EXPIRED"] | EXPIRED |
+ | ["CANCELLED"] | CANCELLED |
+ | ["PENDING"] | PENDING |
+ | ["DENIED"] | DENIED |
+ | ["UNKNOWN_STATUS"] | UNKNOWN_STATUS |
+
+ @motivating
+ Scenario Outline: Multi-entry statuses array returns the first matching possibleState (rules 20–34)
+ Given a reward whose pendingReasons array is empty
+ And reward.partnerFundsTransfer is missing
+ And reward.statuses is
+ When the cell is rendered
+ Then the resulting state is ""
+ # possibleStates priority order:
+ # REDEEMED > CANCELLED > EXPIRED > PENDING > AVAILABLE > PENDING_REVIEW
+ # > DENIED > PAYOUT_APPROVED > PAYOUT_CANCELLED > PAYOUT_FAILED
+ # > PENDING_TAX_REVIEW > PENDING_NEW_TAX_FORM > PENDING_TAX_SUBMISSION
+ # > PENDING_PARTNER_CREATION > PROCESSING
+
+ Examples:
+ | statuses | state |
+ | ["AVAILABLE", "PENDING"] | PENDING |
+ | ["AVAILABLE", "REDEEMED"] | REDEEMED |
+ | ["EXPIRED", "PENDING"] | EXPIRED |
+ | ["PENDING", "AVAILABLE"] | PENDING |
+ | ["AVAILABLE", "DENIED"] | AVAILABLE |
+ | ["CANCELLED", "AVAILABLE"] | CANCELLED |
+ | ["EXPIRED", "CANCELLED", "REDEEMED"] | REDEEMED |
+ | ["PENDING_REVIEW", "DENIED", "AVAILABLE"] | AVAILABLE |
+ | ["PROCESSING", "PENDING_PARTNER_CREATION"] | PENDING_PARTNER_CREATION |
+
+ @minutia
+ Scenario: Multi-entry statuses with no matching possibleState returns undefined
+ Given a reward whose pendingReasons array is empty
+ And reward.partnerFundsTransfer is missing
+ And reward.statuses is ["UNKNOWN_A", "UNKNOWN_B"]
+ When the cell is rendered
+ Then the resulting state is undefined
+ And the primary badge text is "Not available"
+ And the description body has no state-specific status line
+
+ @minutia
+ Scenario: Empty statuses array with no other matches returns undefined
+ Given a reward whose pendingReasons array is empty
+ And reward.partnerFundsTransfer is missing
+ And reward.statuses is []
+ When the cell is rendered
+ Then the resulting state is undefined
+ And the primary badge text is "Not available"
+ # ============================================================
+ # 11. ICU CUSTOMIZATION (statusText, statusLongText)
+ # ============================================================
+
+ @motivating
+ Scenario Outline: statusText prop overrides the primary badge text per state
+ Given the "status-text" prop overrides "" to ""
+ And a reward whose computed state is ""
+ And NOT (state is PENDING and reward.dateScheduledFor is set)
+ When the cell is rendered
+ Then the primary badge text is exactly ""
+
+ Examples:
+ | state | customLabel |
+ | AVAILABLE | Redeem me! |
+ | PENDING | Coming soon! |
+ | PAYOUT_APPROVED | Payout Sent! |
+ | DENIED | Unlucky! |
+ | PENDING_TAX_REVIEW | Tax review in progress |
+ | PENDING_PARTNER_CREATION | Finish setup |
+
+ @motivating
+ Scenario Outline: statusLongText prop overrides the description body per state
+ Given the "status-long-text" prop overrides "" to ""
+ And a reward whose computed state is ""
+ And the conditional render block for "" fires
+ When the cell is rendered
+ Then the description body contains ""
+
+ Examples:
+ | state | customLabel |
+ | DENIED | Sorry, this referral was denied |
+ | PAYOUT_FAILED | We were unable to send your money |
+ | PENDING_TAX_SUBMISSION | Please upload your W-9 form |
+ | PENDING_PARTNER_CREATION | Finish onboarding |
+
+ @minutia
+ Scenario: statusLongText for a state without a render block has no effect on the body
+ Given the "status-long-text" prop overrides "REDEEMED" to "You redeemed!"
+ And a reward whose computed state is REDEEMED
+ When the cell is rendered
+ Then the description body does NOT contain "You redeemed!"
+ And only the dateGiven and fuelTankCode lines (if any) are rendered
+ # ============================================================
+ # 12. LOCALIZATION
+ # ============================================================
+
+ @minutia
+ Scenario: All dates and ICU strings flow through the configured locale
+ Given the "locale" prop is set to a supported locale
+ Then dateGiven, dateExpires, dateCancelled, dateModerated, dateScheduledFor,
+ And relative time expressions use `DateTime.toRelative()` with the same locale, with the leading "in " stripped
+ And every prop-driven message string is run through `intl.formatMessage`
diff --git a/packages/mint-components/src/components/sqm-rewards-table/RewardsTableCell.stories.tsx b/packages/mint-components/src/components/sqm-rewards-table/RewardsTableCell.stories.tsx
index a8d3655d1d..40a46962af 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/RewardsTableCell.stories.tsx
+++ b/packages/mint-components/src/components/sqm-rewards-table/RewardsTableCell.stories.tsx
@@ -138,6 +138,7 @@ const cashReward = {
},
exchangedRewardRedemptionTransaction: null,
pendingReasons: [],
+ rewardedCash: true,
};
const taxConnection: ImpactConnection = {
diff --git a/packages/mint-components/src/components/sqm-rewards-table/TaxAndCashRewardsTableCell.stories.tsx b/packages/mint-components/src/components/sqm-rewards-table/TaxAndCashRewardsTableCell.stories.tsx
index 8dedec2ec5..4e6ae0ed0b 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/TaxAndCashRewardsTableCell.stories.tsx
+++ b/packages/mint-components/src/components/sqm-rewards-table/TaxAndCashRewardsTableCell.stories.tsx
@@ -5,6 +5,10 @@ export default {
title: "Components/Tax And Cash Rewards Table Cell",
};
+// Reusable timestamps (current date is May 2026)
+const PAST = 1640995200000; // Jan 1, 2022
+const FUTURE = 2779257600000; // ~2058
+
const cashReward = {
id: "68c34fd98a6cb4f5f8394084",
type: "CREDIT",
@@ -24,13 +28,13 @@ const cashReward = {
name: "Cash",
},
name: null,
- dateCreated: 1757630425085,
- dateScheduledFor: 1757631025115,
- dateGiven: 1757630737115,
+ dateCreated: PAST,
+ dateScheduledFor: null,
+ dateGiven: PAST,
dateExpires: null,
dateCancelled: null,
- dateRedeemed: 1757630737115,
- dateModified: 1757630737115,
+ dateRedeemed: null,
+ dateModified: PAST,
rewardSource: "MANUAL" as const,
fuelTankCode: null,
fuelTankType: null,
@@ -65,343 +69,385 @@ const cashReward = {
},
referral: null,
description: null,
- statuses: ["REDEEMED"],
+ statuses: [],
rewardRedemptionTransactions: {
data: null,
},
exchangedRewardRedemptionTransaction: null,
pendingReasons: [],
+ rewardedCash: true,
};
-const pending = {
- statuses: ["PENDING"],
-};
+// ============================================================
+// Reusable tax connections
+// ============================================================
-const payoutSent = {
- statuses: ["PAYOUT_APPROVED"],
-};
-const payoutFailed = {
- statuses: ["PAYOUT_FAILED"],
-};
-const payoutCancelled = {
- statuses: ["PAYOUT_CANCELLED"],
- dateCancelled: 1355612521321,
-};
-
-const processingPFT = {
- partnerFundsTransfer: {
- id: "123",
- status: null,
- dateCreated: 1355612521321,
- dateScheduled: 2779257600000,
- dateTransferred: null,
+const fullySetupTaxConnection: ImpactConnection = {
+ connected: true,
+ taxHandlingEnabled: true,
+ connectionStatus: "COMPLETED",
+ publisher: {
+ requiredTaxDocumentType: "W9",
+ currentTaxDocument: {
+ status: "ACTIVE",
+ type: "W9",
+ dateCreated: PAST,
+ },
+ withdrawalSettings: { paymentMethod: "BANK_TRANSFER" },
+ payoutsAccount: null,
},
};
-const taxConnection: ImpactConnection = {
+const connectedNoWithdrawalSettings: ImpactConnection = {
connected: true,
taxHandlingEnabled: true,
- connectionStatus: "NOT_STARTED",
+ connectionStatus: "COMPLETED",
publisher: {
- requiredTaxDocumentType: "W8BEN",
+ requiredTaxDocumentType: "W9",
currentTaxDocument: {
- status: "NOT_VERIFIED",
- type: "W8BEN",
- dateCreated: 321321487,
- },
- withdrawalSettings: {
- paymentMethod: "BANK_TRANSFER",
+ status: "ACTIVE",
+ type: "W9",
+ dateCreated: PAST,
},
+ withdrawalSettings: null,
payoutsAccount: null,
},
};
-export const CashReward = () => {
- return (
-
- );
+const notConnectedTaxConnection: ImpactConnection = {
+ connected: false,
+ taxHandlingEnabled: true,
+ connectionStatus: "NOT_STARTED",
+ publisher: null,
};
-export const StatusCellPendingTaxReview = () => {
- return (
-
- );
-};
+// ============================================================
+// Reward Cell (kept from original)
+// ============================================================
-export const StatusCellPendingNewTaxForm = () => {
- return (
-
- );
-};
+export const CashReward = () => (
+
+);
-export const StatusCellPendingTaxSubmission = () => {
- return (
-
- );
-};
+// ============================================================
+// STATUS PRECEDENCE LADDER — one story per rule
+// (See sqm-rewards-table-status-column-new.feature § 2)
+// ============================================================
-export const StatusCellPartnerCreatedSetupStartedButIncomplete = () => {
- return (
-
- );
-};
+// 1. Fraud check denied the referral → status is Denied
+export const StatusCellFraudDenied = () => (
+
+);
-export const StatusCellPartnerNotCreatedSetupNotStarted = () => {
- return (
-
- );
-};
+// 2. Fraud check is still pending review → status is Pending Review
+export const StatusCellFraudPendingReview = () => (
+
+);
-export const StatusCellPendingW9 = () => {
- return (
-
- );
-};
+// 3. Partner funds transfer was reversed → status is Payout Cancelled
+export const StatusCellPayoutCancelled = () => (
+
+);
-export const StatusCellPayoutSent = () => {
- return (
-
- );
-};
+// 4. Partner funds transfer is overdue → status is Payout Failed
+export const StatusCellPayoutFailed = () => (
+
+);
-export const StatusCellPayoutFailed = () => {
- return (
-
- );
-};
+// 5. Connected partner has not finished withdrawal settings setup → status is Pending
+export const StatusCellPartnerCreatedSetupStartedButIncomplete = () => (
+
+);
-export const StatusCellPayoutProcessing = () => {
- return (
-
- );
-};
+// Reward is pending US_TAX and the partner has not been created yet → shows the partner-setup prompt
+export const StatusCellPartnerNotCreatedSetupNotStarted = () => (
+
+);
-export const StatusCellPayoutCancelled = () => {
- return (
-
- );
-};
+// 6. Reward has MISSING_PAYOUT_CONFIGURATION pending reason and no withdrawal settings → status is Pending
+export const StatusCellMissingPayoutConfiguration = () => (
+
+);
-export const StatusCellCancelled = () => {
- return (
-
- );
-};
+// 7. Partner funds transfer is scheduled for a future date → status is Processing
+export const StatusCellPayoutProcessing = () => (
+
+);
-export const StatusCellPFTNoWithdrawalSettings = () => {
- return (
-
- );
-};
+// 8. Partner funds transfer has been transferred → status is Payout Approved
+export const StatusCellPayoutApproved = () => (
+
+);
+
+// 9. Reward has a cancellation date set → status is Cancelled
+export const StatusCellRewardCancelled = () => (
+
+);
+
+// 10. Reward statuses include EXPIRED → status is Expired
+export const StatusCellRewardExpired = () => (
+
+);
-export const StatusCellNotConnectedExistingTaxForm = () => {
- return (
- (
+
+);
+
+// 12. Reward does not match any precedence rule → no badge text, no description
+export const StatusCellNoMatchingRule = () => (
+
+);
+
+// ============================================================
+// US_TAX getTaxPendingReasons branches (Pending Description Resolution § 5)
+// ============================================================
+
+// Reward is pending US_TAX but tax handling is disabled → shows "W-9 required"
+export const StatusCellPendingW9Required = () => (
+
+);
+
+// Partner is connected but has not submitted any tax documents → shows the submit-tax-docs prompt
+export const StatusCellPendingTaxSubmission = () => (
+
+);
+
+// Partner's tax document is inactive (rejected) → shows the submit-a-new-form prompt
+export const StatusCellPendingNewTaxForm = () => (
+
- );
-};
+ },
+ }}
+ >
+);
-export const StatusCellExistingPartnerTaxFormNoWithdrawalSettings = () => {
- return (
- (
+
- );
-};
+ },
+ }}
+ >
+);
+
+// Partner has an active tax form but has not configured withdrawal settings → shows the partner-setup prompt
+export const StatusCellExistingTaxFormNoWithdrawalSettings = () => (
+
+);
+
+// Partner is connected, no tax form is required, but withdrawal settings are not submitted → shows the partner-setup prompt
+export const StatusCellConnectedNoTaxRequiredNoWithdrawalSettings = () => (
+
+);
+
+// Aliases kept for the table-level stories file
+export const StatusCellPayoutSent = StatusCellPayoutApproved;
+export const StatusCellPendingW9 = StatusCellPendingW9Required;
diff --git a/packages/mint-components/src/components/sqm-rewards-table/cells/readme.md b/packages/mint-components/src/components/sqm-rewards-table/cells/readme.md
index 7a516afdd9..e771957ab7 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/cells/readme.md
+++ b/packages/mint-components/src/components/sqm-rewards-table/cells/readme.md
@@ -17,7 +17,7 @@
| `payoutFailed` | `payout-failed` | | `string` | `"Payout failed due to a fulfillment issue and is currently being retried."` |
| `payoutProcessing` | `payout-processing` | | `string` | `"Processing until {date}. Payout is then scheduled based on your settings."` |
| `pendingNewTaxForm` | `pending-new-tax-form` | | `string` | `"Invalid tax form. Submit a new form to receive your rewards."` |
-| `pendingPartnerCreation` | `pending-partner-creation` | | `string` | `"Complete your tax and cash payout setup to receive your rewards."` |
+| `pendingPartnerCreation` | `pending-partner-creation` | | `string` | `"Complete your cash payout setup to receive your rewards."` |
| `pendingReviewText` | `pending-review-text` | | `string` | `"Awaiting review"` |
| `pendingScheduled` | `pending-scheduled` | | `string` | `"Until"` |
| `pendingTaxReview` | `pending-tax-review` | | `string` | `"Awaiting tax form review."` |
diff --git a/packages/mint-components/src/components/sqm-rewards-table/cells/sqm-rewards-table-status-cell.tsx b/packages/mint-components/src/components/sqm-rewards-table/cells/sqm-rewards-table-status-cell.tsx
index 521ed38bbb..ecc050a9d4 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/cells/sqm-rewards-table-status-cell.tsx
+++ b/packages/mint-components/src/components/sqm-rewards-table/cells/sqm-rewards-table-status-cell.tsx
@@ -81,7 +81,7 @@ export class RewardTableStatusCell {
@Prop() pendingTaxSubmission: string =
"Submit your tax documents to receive your rewards.";
@Prop() pendingPartnerCreation: string =
- "Complete your tax and cash payout setup to receive your rewards.";
+ "Complete your cash payout setup to receive your rewards.";
@Prop() pendingScheduled: string = "Until";
@Prop() pendingUnhandled: string = "Fulfillment error";
@Prop() pendingReviewText: string = "Awaiting review";
@@ -101,25 +101,30 @@ export class RewardTableStatusCell {
const integrationOrFueltankReward =
reward.type === "INTEGRATION" || reward.type === "FUELTANK";
- // AL: TODO Scott said we should change this to use pendingReasons instead of fraudStatus
+ // AL: TODO Scott said we should change this to use pendingReasons instead of fraudStatus - probably dont want to change this for backwards compatibility
const fraudStatus = reward.referral?.fraudData?.moderationStatus;
if (fraudStatus === "DENIED") return "DENIED";
if (fraudStatus === "PENDING") return "PENDING_REVIEW";
- const partnerTransferStatus = reward.partnerFundsTransfer?.status;
+ const isCashReward = reward.rewardedCash;
+
console.log(this.reward, "reward in status cell");
- if (reward.partnerFundsTransfer) {
- if (partnerTransferStatus === "REVERSED") return "PAYOUT_CANCELLED";
- if (partnerTransferStatus === "OVERDUE") return "PAYOUT_FAILED";
- }
// pft can now be created before withdrawal settings exist
- const needsPayoutSetup =
- this.taxConnection?.connected &&
- !this.taxConnection?.publisher?.withdrawalSettings;
- if (needsPayoutSetup) return "PENDING";
+ if (isCashReward) {
+ if (
+ !this.taxConnection?.connected ||
+ (this.taxConnection?.connected &&
+ !this.taxConnection?.publisher?.withdrawalSettings)
+ )
+ return "PENDING";
+ }
+
+ const partnerTransferStatus = reward.partnerFundsTransfer?.status;
if (reward.partnerFundsTransfer) {
+ if (partnerTransferStatus === "REVERSED") return "PAYOUT_CANCELLED";
+ if (partnerTransferStatus === "OVERDUE") return "PAYOUT_FAILED";
if (
reward.partnerFundsTransfer.dateScheduled &&
reward.partnerFundsTransfer.dateScheduled > Date.now()
@@ -191,11 +196,13 @@ export class RewardTableStatusCell {
// Fallback: when rewardStatus() forced PENDING because the user is
// connected but hasn't set up withdrawal settings (no pendingReasons
// were returned by the API, e.g. for credit rewards with a PFT).
- if (
- taxConnection?.connected &&
- !taxConnection?.publisher?.withdrawalSettings
- ) {
- return this.pendingPartnerCreation;
+ if (reward.rewardedCash) {
+ if (
+ !taxConnection?.connected ||
+ (taxConnection?.connected &&
+ !taxConnection?.publisher?.withdrawalSettings)
+ )
+ return this.pendingPartnerCreation;
}
return "";
diff --git a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
index bc528d5c24..1df30a794f 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
+++ b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
@@ -43,25 +43,72 @@ Feature: Reward Table Status Column
Scenario: Status precedence ladder
Given a reward, its referral fraud state, the user's Impact tax connection
Then the displayed status is determined in the following order:
- | order | rule | resulting status | resulting description |
- | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Detected self-referral |
- | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Awaiting review |
- | 3 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | If you think this is a mistake, contact our Support team. |
- | 4 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout failed due to a fulfillment issue and is currently being retried. |
- | 5 | impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING | Complete your tax and cash payout setup to receive your rewards. |
- | 6 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" AND publisher.withdrawalSettings is missing | PENDING | Complete your tax and cash payout setup to receive your rewards. |
- | 7 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
- | 8 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout approved and scheduled for payment based on your settings. |
- | 9 | reward.dateCancelled is set | CANCELLED | Jan 1, 2026 |
- | 10 | reward.statuses includes "EXPIRED" | EXPIRED | Jan 1, 2026 |
- | 11 | reward.statuses includes "PENDING" | PENDING | Until Jan 1, 2026 |
- | 12 | reward.type is "CREDIT" AND statuses includes "REDEEMED" | REDEEMED | Jan 1, 2026 |
- | 13 | reward.type is "CREDIT" | AVAILABLE | Expires Jan 1, 2026 |
- | 14 | reward.type is "PCT_DISCOUNT" AND statuses includes "AVAILABLE" | AVAILABLE | Expires Jan 1, 2026 |
- | 15 | reward.type is "INTEGRATION" / "FUELTANK" AND statuses includes "PENDING" | PENDING | Until Jan 1, 2026 |
- | 16 | reward.type is "INTEGRATION" / "FUELTANK" AND statuses includes "CANCELLED" | CANCELLED | Jan 1, 2026 |
- | 17 | reward.type is "INTEGRATION" / "FUELTANK" AND statuses includes "AVAILABLE" | AVAILABLE | Expires Jan 1, 2026 |
- | 18 | none of the above | "" (no badge text) | (no description) |
+ | order | rule | resulting status | resulting badge text | resulting description |
+ | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Detected self-referral |
+ | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Awaiting review |
+ | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
+ | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
+ | 7 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 8 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 9 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Payout approved and scheduled for payment based on your settings. |
+ | 10 | reward.dateCancelled is set | CANCELLED | Cancelled | Jan 1, 2026 |
+ | 11 | reward.statuses includes "EXPIRED" | EXPIRED | Expired | Jan 1, 2026 |
+ | 12 | reward.statuses includes "PENDING" | PENDING | Pending | Until Jan 1, 2026 |
+ | 16 | none of the above | "" (no badge text) | (no badge text) | (no description) |
+ But for rewards where reward.rewardedCash is false (non-cash rewards, e.g. CREDIT/POINTS, PCT_DISCOUNT, INTEGRATION, FUELTANK), the following non-cash-only rules are inserted between rule 12 and rule 13, in this order:
+ | order | rule | resulting status | resulting badge text | resulting description |
+ | 13 | statuses includes "REDEEMED" | REDEEMED | Redeemed | Jan 1, 2026 |
+ | 14 | statuses includes "AVAILABLE" | AVAILABLE | Available | Expires Jan 1, 2026 |
+ | 15 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Jan 1, 2026 |
+
+ @motivating
+ Scenario: PENDING description precedence ladder
+ Given a PENDING reward, its pendingReasons, and the user's Impact tax connection
+ Then the description shown under the Pending pill is determined in the following order:
+ | order | rule | resulting status | resulting badge text | resulting description |
+ | 1 | pendingReasons includes "US_TAX" AND impactConnection.taxHandlingEnabled is false | PENDING | Pending | W-9 required |
+ | 2 | pendingReasons includes "US_TAX" AND impactConnection is NOT connected | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+ | 3 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument is missing | PENDING | Pending | Submit your tax documents to receive your rewards. |
+ | 4 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument.status is "INACTIVE" | PENDING | Pending | Invalid tax form. Submit a new form to receive your rewards. |
+ | 5 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING | Pending | Awaiting tax form review. |
+ | 6 | pendingReasons includes "US_TAX" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+ | 7 | pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+
+ @motivating @ui
+ Scenario Outline: Payout descriptions for PFT-derived statuses
+ Given a reward whose computed status is
+ When the cell is rendered
+ Then the description line shows
+
+ Examples:
+ | status | description |
+ | PAYOUT_APPROVED | Payout approved and scheduled for payment based on your settings. |
+ | PAYOUT_FAILED | Payout failed due to a fulfillment issue and is currently being retried. |
+ | PAYOUT_CANCELLED | If you think this is a mistake, contact our Support team. |
+ | PROCESSING | Processing until . Payout is then scheduled based on your settings. |
+
+ @motivating @ui
+ Scenario Outline: US_TAX pending reason resolves based on the tax connection state
+ Given the user has a PENDING reward whose pendingReasons include "US_TAX"
+ And the user's impactConnection.taxHandlingEnabled is
+ And the user's impactConnection.connected is
+ And the user's publisher.requiredTaxDocumentType is
+ And the user's publisher.currentTaxDocument is
+ And the user's publisher.currentTaxDocument.status is
+ And the user's publisher.withdrawalSettings is
+ Then the badge is shown in a pill with text
+ And the description line shows
+
+ Examples:
+ | taxHandlingEnabled | connected | requiredTaxDocumentType | currentTaxDocument | currentTaxDocumentStatus | withdrawalSettings | badgeText | pillColour | description |
+ | false | true | W9 | present | ACTIVE | present | Pending | warning | W-9 required |
+ | true | false | - | - | - | - | Pending | warning | Complete your tax and cash payout setup to receive your rewards. |
+ | true | true | W9 | missing | - | present | Pending | warning | Submit your tax documents to receive your rewards. |
+ | true | true | W9 | present | INACTIVE | present | Pending | warning | Invalid tax form. Submit a new form to receive your rewards. |
+ | true | true | W9 | present | NOT_VERIFIED | present | Pending | warning | Awaiting tax form review. |
+ | true | true | W9 | present | ACTIVE | missing | Pending | warning | Complete your tax and cash payout setup to receive your rewards. |
# ============================================================
# 3. STATUS → BADGE COLOUR MAPPING
# ============================================================
@@ -73,18 +120,19 @@ Feature: Reward Table Status Column
Then the badge is shown in a pill with
Examples:
- | status | text | pillColour |
- | AVAILABLE | Available | success |
- | REDEEMED | Redeemed | primary |
- | PAYOUT_APPROVED | Payout Approved | primary |
- | PENDING | Pending | warning |
- | PENDING_REVIEW | Pending | warning |
- | PROCESSING | Processing | warning |
- | CANCELLED | Cancelled | danger |
- | EXPIRED | Expired | danger |
- | DENIED | Denied | danger |
- | PAYOUT_FAILED | Payout Failed | danger |
- | PAYOUT_CANCELLED | Payout Cancelled | danger |
+ | status | text | pillColour |
+ | AVAILABLE | Available | success |
+ | REDEEMED | Redeemed | primary |
+ | PAYOUT_APPROVED | Payout Approved | primary |
+ | PENDING | Pending | warning |
+ | PENDING_REVIEW | Pending | warning |
+ | PROCESSING | Payment Processing | warning |
+ | CANCELLED | Cancelled | danger |
+ | EXPIRED | Expired | danger |
+ | DENIED | Denied | danger |
+ | PAYOUT_FAILED | Payout Failed | danger |
+ | PAYOUT_CANCELLED | Payout Cancelled | danger |
+ | (other / "") | Not available | danger |
# ============================================================
# 4. DESCRIPTION LINE PRECEDENCE
# The description under the badge is selected in this order:
@@ -120,59 +168,15 @@ Feature: Reward Table Status Column
| EXPIRED | dateExpires | |
| CANCELLED | dateCancelled | |
| REDEEMED | dateRedeemed | |
-
- @motivating @ui
- Scenario Outline: Payout descriptions for PFT-derived statuses
- Given a reward whose computed status is
- When the cell is rendered
- Then the description line shows
-
- Examples:
- | status | description |
- | PAYOUT_APPROVED | Payout approved and scheduled for payment based on your settings. |
- | PAYOUT_FAILED | Payout failed due to a fulfillment issue and is currently being retried. |
- | PAYOUT_CANCELLED | If you think this is a mistake, contact our Support team. |
- | PROCESSING | Processing until . Payout is then scheduled based on your settings. |
# ============================================================
- # 5. PENDING DESCRIPTION RESOLUTION (getTaxPendingReasons)
- # When the computed status is PENDING the description is the first
- # non-empty value of:
- # a) tax/payout reason (getTaxPendingReasons)
- # b) reward.pendingReasons mapped through pendingCodeMap, joined by ", "
+ # 5. PENDING DESCRIPTION PRECEDENCE
+ # Once the status precedence ladder in § 2 has produced PENDING, the
+ # description shown under the "Pending" pill is determined by the
+ # following ordered ladder (mirrors getTaxPendingReasons + the
+ # pendingCodeMap fallback). All rules render a warning pill with text
+ # "Pending"; only the description varies.
# ============================================================
- @motivating @ui
- Scenario Outline: US_TAX pending reason resolves based on the tax connection state
- Given the user has a PENDING reward whose pendingReasons include "US_TAX"
- And the user's impactConnection.taxHandlingEnabled is
- And the user's impactConnection.connected is
- And the user's publisher.requiredTaxDocumentType is
- And the user's publisher.currentTaxDocument is
- And the user's publisher.currentTaxDocument.status is
- And the user's publisher.withdrawalSettings is
- Then the description line shows
-
- Examples:
- | taxHandlingEnabled | connected | requiredTaxDocumentType | currentTaxDocument | currentTaxDocumentStatus | withdrawalSettings | description |
- | false | true | W9 | present | ACTIVE | present | W-9 required |
- | true | false | - | - | - | - | Complete your tax and cash payout setup to receive your rewards. |
- | true | true | W9 | missing | - | present | Submit your tax documents to receive your rewards. |
- | true | true | W9 | present | INACTIVE | present | Invalid tax form. Submit a new form to receive your rewards. |
- | true | true | W9 | present | NOT_VERIFIED | present | Awaiting tax form review. |
- | true | true | W9 | present | ACTIVE | missing | Complete your tax and cash payout setup to receive your rewards. |
-
- @motivating @ui
- Scenario: MISSING_PAYOUT_CONFIGURATION pending reason shows the partner-creation prompt
- Given the user has a PENDING reward whose pendingReasons include "MISSING_PAYOUT_CONFIGURATION"
- And the user is connected with publisher.withdrawalSettings missing
- Then the description line shows "Complete your tax and cash payout setup to receive your rewards."
-
- @motivating @ui
- Scenario: Connected user without withdrawal settings shows the partner-creation prompt as a fallback
- Given the user has a PENDING reward whose pendingReasons array is empty
- And the user is connected with publisher.withdrawalSettings missing
- Then the description line shows "Complete your tax and cash payout setup to receive your rewards."
-
@motivating @ui
Scenario Outline: Generic pendingReasons codes are mapped via pendingCodeMap
Given the user has a PENDING reward
diff --git a/packages/mint-components/src/components/sqm-rewards-table/useRewardsTable.tsx b/packages/mint-components/src/components/sqm-rewards-table/useRewardsTable.tsx
index 12019131cd..8d68cd9dbf 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/useRewardsTable.tsx
+++ b/packages/mint-components/src/components/sqm-rewards-table/useRewardsTable.tsx
@@ -60,6 +60,7 @@ const GET_REWARDS = gql`
fuelTankCode
fuelTankType
currency
+ rewardedCash
prettyValue(locale: $locale)
prettyValueNumber: prettyValue(
formatType: NUMBER_FORMATTED
diff --git a/packages/mint-components/src/saasquatch.d.ts b/packages/mint-components/src/saasquatch.d.ts
index 6fadd6eab5..cd1b4fbcfa 100644
--- a/packages/mint-components/src/saasquatch.d.ts
+++ b/packages/mint-components/src/saasquatch.d.ts
@@ -146,6 +146,7 @@ interface Reward {
}
];
};
+ rewardedCash?: boolean;
}
interface ReferralVariables {
From b614540e4726033b53ed4d5413d3d8ad71d9f7c9 Mon Sep 17 00:00:00 2001
From: Andy
Date: Wed, 13 May 2026 15:05:36 -0700
Subject: [PATCH 29/64] update specs"
---
.../referral-table-rewards-column-new.feature | 49 ++++---
.../referral-table-rewards-column.feature | 127 +++++++++++-------
...qm-rewards-table-status-column-new.feature | 42 +++---
.../sqm-rewards-table-status-column.feature | 44 ++++++
4 files changed, 166 insertions(+), 96 deletions(-)
diff --git a/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature b/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
index 8505ece74f..d1b512a8be 100644
--- a/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
+++ b/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
@@ -122,32 +122,29 @@ Feature: Referral Table Rewards Cell
@motivating
Scenario: State precedence ladder
Given a reward, its referral's fraud state, and the user's tax connection
- And dummy data is used where applicable: dateModerated/dateExpires/dateCancelled/dateScheduledFor/partnerFundsTransfer.dateScheduled = Jan 1, 2026; deniedHelpText = "Contact support."
- Then the displayed state is determined in the following order, returning at the first match:
- | order | rule | resulting state | resulting badge text | resulting description body |
- | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Denied on Jan 1, 2026. Contact support. |
- | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Pending since Jan 1, 2026 |
- | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
- | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
- | 7 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
- | 8 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
- | 9 | reward.pendingReasons includes "US_TAX" AND impactConnection.taxHandlingEnabled is false | PENDING | Pending | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
- | 10 | reward.pendingReasons includes "US_TAX" AND impactConnection.connected is false | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 11 | reward.pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument is missing | PENDING_TAX_SUBMISSION | Pending | Submit your tax documents to receive your rewards |
- | 12 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "INACTIVE" / "INVALID_W9_ELECTRONIC_DOCUMENT" / "INVALID_W9_ELECTRONIC_DOCUMENT_CHECK_INTERNAL" | PENDING_NEW_TAX_FORM | Pending | Invalid tax form. Submit a new form to receive your rewards. |
- | 13 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING_TAX_REVIEW | Pending | Awaiting tax form review |
- | 14 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "ACTIVE" AND publisher.withdrawalSettings missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 15 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 19 | none of the above | undefined | Not available | (no state-specific body line) |
- But for rewards where reward.rewardedCash is false (non-cash rewards, e.g. CREDIT/POINTS, PCT_DISCOUNT, INTEGRATION, FUELTANK — these skip rules 3a/3b entirely and never carry a partnerFundsTransfer or US_TAX/MISSING_PAYOUT_CONFIGURATION pendingReason, so they always fall through to the reward.statuses fallback), the following non-cash-only rules are inserted between rule 14 and rule 18, in this order:
- | order | rule | resulting state | resulting badge text | resulting description body |
- | 15 | statuses includes "REDEEMED" | REDEEMED | Redeemed | (no state-specific body line) |
- | 16 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Reward cancelled on Jan 1, 2026 |
- | 17 | statuses includes "EXPIRED" | EXPIRED | Expired | Reward expired on Jan 1, 2026 |
- | 17a | statuses includes "PENDING" | PENDING | Pending (or "Pending for {date}" overlay if dateScheduledFor set) | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
- | 17b | statuses includes "AVAILABLE" | AVAILABLE | Available (plus info pill "{expiringText} {relative}" if dateExpires set) | Reward expiring on Jan 1, 2026 |
+ Then is produced
+ And the , , and is determined in the following order:
+ | order | rule | resulting state | resulting badge text | resulting description body |
+ | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Denied on Jan 1, 2026. Contact support. |
+ | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Pending since Jan 1, 2026 |
+ | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
+ | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
+ | 7 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 8 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 9 | reward.pendingReasons includes "US_TAX" AND impactConnection.taxHandlingEnabled is false | PENDING | Pending | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
+ | 10 | reward.pendingReasons includes "US_TAX" AND impactConnection.connected is false | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 11 | reward.pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument is missing | PENDING_TAX_SUBMISSION | Pending | Submit your tax documents to receive your rewards |
+ | 12 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "INACTIVE" / "INVALID_W9_ELECTRONIC_DOCUMENT" / "INVALID_W9_ELECTRONIC_DOCUMENT_CHECK_INTERNAL" | PENDING_NEW_TAX_FORM | Pending | Invalid tax form. Submit a new form to receive your rewards. |
+ | 13 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING_TAX_REVIEW | Pending | Awaiting tax form review |
+ | 14 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "ACTIVE" AND publisher.withdrawalSettings missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 15 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 16 | statuses includes "REDEEMED" | REDEEMED | Redeemed | (no state-specific body line) |
+ | 17 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Reward cancelled on Jan 1, 2026 |
+ | 18 | statuses includes "EXPIRED" | EXPIRED | Expired | Reward expired on Jan 1, 2026 |
+ | 19 | statuses includes "PENDING" | PENDING | Pending (or "Pending for {date}" overlay if dateScheduledFor set) | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
+ | 20 | statuses includes "AVAILABLE" | AVAILABLE | Available (plus info pill "{expiringText} {relative}" if dateExpires set) | Reward expiring on Jan 1, 2026 |
@motivating
Scenario: Cash reward with connected partner but no withdrawal settings overrides any PFT-derived state
diff --git a/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column.feature b/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column.feature
index 982a5d960f..0f682645d2 100644
--- a/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column.feature
+++ b/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column.feature
@@ -2,11 +2,38 @@
Feature: Referral Table Reward Column
Shows the reward associated with each referral
- Background:
+ Background:
Given the status column is included in the referral table
And at least one referral exists
+ @motivating
+ Scenario Outline: State precedence ladder
+ Given a reward, its referral's fraud state, and the user's tax connection
+ Then is produced
+ And the , , and is determined in the following :
+ Examples:
+ | order | rule | resultingState | resultingBadgeText | resultingDescriptionBody |
+ | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Denied on Jan 1, 2026. Contact support. |
+ | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Pending since Jan 1, 2026 |
+ | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
+ | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
+ | 7 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 8 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 9 | reward.pendingReasons includes "US_TAX" AND impactConnection.taxHandlingEnabled is false | PENDING | Pending | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
+ | 10 | reward.pendingReasons includes "US_TAX" AND impactConnection.connected is false | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 11 | reward.pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument is missing | PENDING_TAX_SUBMISSION | Pending | Submit your tax documents to receive your rewards |
+ | 12 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "INACTIVE" / "INVALID_W9_ELECTRONIC_DOCUMENT" / "INVALID_W9_ELECTRONIC_DOCUMENT_CHECK_INTERNAL" | PENDING_NEW_TAX_FORM | Pending | Invalid tax form. Submit a new form to receive your rewards. |
+ | 13 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING_TAX_REVIEW | Pending | Awaiting tax form review |
+ | 14 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "ACTIVE" AND publisher.withdrawalSettings missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 15 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
+ | 16 | statuses includes "REDEEMED" | REDEEMED | Redeemed | (no state-specific body line) |
+ | 17 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Reward cancelled on Jan 1, 2026 |
+ | 18 | statuses includes "EXPIRED" | EXPIRED | Expired | Reward expired on Jan 1, 2026 |
+ | 19 | statuses includes "PENDING" | PENDING | Pending (or "Pending for {date}" overlay if dateScheduledFor set) | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
+ | 20 | statuses includes "AVAILABLE" | AVAILABLE | Available (plus info pill "{expiringText} {relative}" if dateExpires set) | Reward expiring on Jan 1, 2026 |
@motivating @ui
Scenario Outline: The referral reward and its status are shown for each referral
@@ -15,24 +42,24 @@ Feature: Referral Table Reward Column
And the status of each reward is displayed as a pill in the cell
And rewards of have a pill with the text
- Examples:
- | status | pillColour | statusText |
- | Available | success | Available |
- | Pending | warning | Pending |
- | Pending Fraud Review | warning | Pending |
- | Pending Tax Review | warning | Pending |
- | Pending New Tax Form | warning | Pending |
- | Pending Tax Submission | warning | Pending |
- | Pending Partner Creation | warning | Pending |
- | Cancelled | danger | Cancelled |
- | Payout Overdue | danger | Payout Failed |
- | Payout Reversed | danger | Payout Cancelled |
- | Expired | danger | Expired |
- | Denied | danger | Denied |
- | Redeemed | primary | Redeemed |
- | Payout Transferred | primary | Payout Approved |
- | Payout Not Yet Due | primary | Payout Approved |
- | Payout Processing | primary | Payment Processing |
+ Examples:
+ | status | pillColour | statusText |
+ | Available | success | Available |
+ | Pending | warning | Pending |
+ | Pending Fraud Review | warning | Pending |
+ | Pending Tax Review | warning | Pending |
+ | Pending New Tax Form | warning | Pending |
+ | Pending Tax Submission | warning | Pending |
+ | Pending Partner Creation | warning | Pending |
+ | Cancelled | danger | Cancelled |
+ | Payout Overdue | danger | Payout Failed |
+ | Payout Reversed | danger | Payout Cancelled |
+ | Expired | danger | Expired |
+ | Denied | danger | Denied |
+ | Redeemed | primary | Redeemed |
+ | Payout Transferred | primary | Payout Approved |
+ | Payout Not Yet Due | primary | Payout Approved |
+ | Payout Processing | primary | Payment Processing |
@motivating
Scenario: The pending period of a referral reward is shown inside the pill if scheduled
@@ -41,11 +68,11 @@ Feature: Referral Table Reward Column
Then the status pill of the reward will contain the text "Pending for "
And the date is localized to the user's locale
- Examples:
+ Examples:
| relativeTime |
- | 2 days |
- | 1 week |
- | 3 months |
+ | 2 days |
+ | 1 week |
+ | 3 months |
@motivating
Scenario: The expiry date of a reward is shown in a secondary pill
@@ -54,10 +81,10 @@ Feature: Referral Table Reward Column
Then an additional info pill will appear next to the status pill with the text "Expiring in "
And the date is localized to the user's locale
- Examples:
+ Examples:
| relativeTime |
- | 2 days |
- | 1 week |
+ | 2 days |
+ | 1 week |
@motivating @ui
Scenario Outline: Expanding the reward cell shows specific detailed status messages
@@ -67,28 +94,28 @@ Feature: Referral Table Reward Column
Then the detail text displays
Examples: Payout States
- | status | detailMessage |
- | Payout Approved | Processing until {date}. Payout is then scheduled based on your settings. |
- | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
- | Payout Cancelled | If you think this is a mistake, contact our Support team. |
- | Processing | Processing until {date}. Payout is then scheduled based on your settings. |
+ | status | detailMessage |
+ | Payout Approved | Processing until {date}. Payout is then scheduled based on your settings. |
+ | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
+ | Payout Cancelled | If you think this is a mistake, contact our Support team. |
+ | Processing | Processing until {date}. Payout is then scheduled based on your settings. |
Examples: Tax Compliance States
- | status | detailMessage |
- | Pending Tax Review | Awaiting tax form review |
- | Pending New Tax Form | Invalid tax form. Submit a new form to receive your rewards. |
- | Pending Tax Submission | Submit your tax documents to receive your rewards |
- | Pending Partner Creation | Complete your tax and cash payout setup to receive your rewards |
+ | status | detailMessage |
+ | Pending Tax Review | Awaiting tax form review |
+ | Pending New Tax Form | Invalid tax form. Submit a new form to receive your rewards. |
+ | Pending Tax Submission | Submit your tax documents to receive your rewards |
+ | Pending Partner Creation | Complete your tax and cash payout setup to receive your rewards |
Examples: Standard States
- | status | detailMessage |
- | Available | Reward expiring on |
- | Cancelled | Reward cancelled on |
- | Pending | Available on |
- | Pending Review | Pending since |
- | Denied | Denied on |
- | Expired | Reward expired on |
- | Redeemed | Redeemed |
+ | status | detailMessage |
+ | Available | Reward expiring on |
+ | Cancelled | Reward cancelled on |
+ | Pending | Available on |
+ | Pending Review | Pending since |
+ | Denied | Denied on |
+ | Expired | Reward expired on |
+ | Redeemed | Redeemed |
@motivating
Scenario: Fuel Tank codes are displayed in the expanded view
@@ -114,9 +141,9 @@ Feature: Referral Table Reward Column
And the status is displayed in a pill
Examples:
- | pftState | status | text | pillColour |
- | transfer date is in the future | PROCESSING | Payment Processing | primary |
- | successfully transferred to payment provider | PAYOUT_TRANSFERRED | Payout Approved | primary |
- | approved but payout scheduled date not yet arrived | PAYOUT_NOT_YET_DUE | Payout Approved | primary |
- | failed due to fulfillment issue and retrying | PAYOUT_OVERDUE | Payout Failed | danger |
- | reversed or cancelled after being processed | PAYOUT_REVERSED | Payout Cancelled | danger |
+ | pftState | status | text | pillColour |
+ | transfer date is in the future | PROCESSING | Payment Processing | primary |
+ | successfully transferred to payment provider | PAYOUT_TRANSFERRED | Payout Approved | primary |
+ | approved but payout scheduled date not yet arrived | PAYOUT_NOT_YET_DUE | Payout Approved | primary |
+ | failed due to fulfillment issue and retrying | PAYOUT_OVERDUE | Payout Failed | danger |
+ | reversed or cancelled after being processed | PAYOUT_REVERSED | Payout Cancelled | danger |
diff --git a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
index 1df30a794f..fbe54a04b4 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
+++ b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
@@ -42,26 +42,26 @@ Feature: Reward Table Status Column
@motivating
Scenario: Status precedence ladder
Given a reward, its referral fraud state, the user's Impact tax connection
- Then the displayed status is determined in the following order:
- | order | rule | resulting status | resulting badge text | resulting description |
- | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Detected self-referral |
- | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Awaiting review |
- | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
- | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
- | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
- | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
- | 7 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
- | 8 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
- | 9 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Payout approved and scheduled for payment based on your settings. |
- | 10 | reward.dateCancelled is set | CANCELLED | Cancelled | Jan 1, 2026 |
- | 11 | reward.statuses includes "EXPIRED" | EXPIRED | Expired | Jan 1, 2026 |
- | 12 | reward.statuses includes "PENDING" | PENDING | Pending | Until Jan 1, 2026 |
- | 16 | none of the above | "" (no badge text) | (no badge text) | (no description) |
- But for rewards where reward.rewardedCash is false (non-cash rewards, e.g. CREDIT/POINTS, PCT_DISCOUNT, INTEGRATION, FUELTANK), the following non-cash-only rules are inserted between rule 12 and rule 13, in this order:
- | order | rule | resulting status | resulting badge text | resulting description |
- | 13 | statuses includes "REDEEMED" | REDEEMED | Redeemed | Jan 1, 2026 |
- | 14 | statuses includes "AVAILABLE" | AVAILABLE | Available | Expires Jan 1, 2026 |
- | 15 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Jan 1, 2026 |
+ Then is produced
+ And the , , and is determined in the following order:
+ | order | rule | resulting status | resulting badge text | resulting description |
+ | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Detected self-referral |
+ | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Awaiting review |
+ | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
+ | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
+ | 7 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 8 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 9 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Payout approved and scheduled for payment based on your settings. |
+ | 10 | reward.dateCancelled is set | CANCELLED | Cancelled | Jan 1, 2026 |
+ | 11 | reward.statuses includes "EXPIRED" | EXPIRED | Expired | Jan 1, 2026 |
+ | 12 | reward.statuses includes "PENDING" | PENDING | Pending | Until Jan 1, 2026 |
+ | 13 | statuses includes "REDEEMED" | REDEEMED | Redeemed | Jan 1, 2026 |
+ | 14 | statuses includes "AVAILABLE" | AVAILABLE | Available | Expires Jan 1, 2026 |
+ | 15 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Jan 1, 2026 |
+# This spec should probably be inserted in to the above spec after rule 9 because it gets invoked when the reward state is pending
+# and does not hit the rules that output pending from above
@motivating
Scenario: PENDING description precedence ladder
@@ -75,6 +75,8 @@ Feature: Reward Table Status Column
| 5 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING | Pending | Awaiting tax form review. |
| 6 | pendingReasons includes "US_TAX" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
| 7 | pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+ | 8 | reward.rewardedCash is true AND impactConnection is NOT connected (fallback when no pendingReason returned) | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+ | 9 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing (fallback) | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
@motivating @ui
Scenario Outline: Payout descriptions for PFT-derived statuses
diff --git a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column.feature b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column.feature
index 8509e4bae9..e8e7aae672 100644
--- a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column.feature
+++ b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column.feature
@@ -41,6 +41,50 @@ Feature: Reward Table Status Column
| PENDING_PARTNER_CREATION | Pending | warning |
| DENIED | Denied | danger |
+ @motivating
+ Scenario Outline: Status precedence ladder
+ Given a reward, its referral fraud state, the user's Impact tax connection
+ Then is produced
+ And the , , and is determined in the following :
+
+ Examples:
+ | order | rule | resultingStatus | resultingBadgeText | resultingDescription |
+ | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Detected self-referral |
+ | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Awaiting review |
+ | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
+ | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
+ | 7 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
+ | 8 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
+ | 9 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Payout approved and scheduled for payment based on your settings. |
+ | 10 | reward.dateCancelled is set | CANCELLED | Cancelled | Jan 1, 2026 |
+ | 11 | reward.statuses includes "EXPIRED" | EXPIRED | Expired | Jan 1, 2026 |
+ | 12 | reward.statuses includes "PENDING" | PENDING | Pending | Until Jan 1, 2026 |
+ | 13 | statuses includes "REDEEMED" | REDEEMED | Redeemed | Jan 1, 2026 |
+ | 14 | statuses includes "AVAILABLE" | AVAILABLE | Available | Expires Jan 1, 2026 |
+ | 15 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Jan 1, 2026 |
+# This spec should probably be inserted in to the above spec after rule 9 because it gets invoked when the reward state is pending
+# and does not hit the rules that output pending from above
+
+ @motivating
+ Scenario Outline: PENDING description precedence ladder
+ Given a PENDING reward, its pendingReasons, and the user's Impact tax connection
+ Then is produced
+ And the , , and is determined in the following order:
+
+ Examples:
+ | order | rule | resultingStatus | resultingBadgeText | resultingDescription |
+ | 1 | pendingReasons includes "US_TAX" AND impactConnection.taxHandlingEnabled is false | PENDING | Pending | W-9 required |
+ | 2 | pendingReasons includes "US_TAX" AND impactConnection is NOT connected | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+ | 3 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument is missing | PENDING | Pending | Submit your tax documents to receive your rewards. |
+ | 4 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument.status is "INACTIVE" | PENDING | Pending | Invalid tax form. Submit a new form to receive your rewards. |
+ | 5 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING | Pending | Awaiting tax form review. |
+ | 6 | pendingReasons includes "US_TAX" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+ | 7 | pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+ | 8 | reward.rewardedCash is true AND impactConnection is NOT connected (fallback when no pendingReason returned) | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+ | 9 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing (fallback) | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
+
@motivating
Scenario Outline: Reward status related information is displayed under status pills
Given a user
From 385dddc9038d7483d2b5befa6e876f9d4b00a56b Mon Sep 17 00:00:00 2001
From: Andy
Date: Thu, 21 May 2026 09:19:14 -0700
Subject: [PATCH 30/64] Remove draft spec files
---
.../referral-table-rewards-column-new.feature | 777 ------------------
...qm-rewards-table-status-column-new.feature | 240 ------
2 files changed, 1017 deletions(-)
delete mode 100644 packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
delete mode 100644 packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
diff --git a/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature b/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
deleted file mode 100644
index d1b512a8be..0000000000
--- a/packages/mint-components/src/components/sqm-referral-table/columns/referral-table-rewards-column-new.feature
+++ /dev/null
@@ -1,777 +0,0 @@
-@author:derek @owner:derek
-Feature: Referral Table Rewards Cell
- Renders the rewards earned for each referral as an `` block.
- Each reward shows:
- - the reward value (e.g. "$50.00") in the summary
- - a coloured badge "pill" with status text
- - optionally a second "info" pill (only for AVAILABLE rewards with an expiry)
- - a description body that is a STACK of zero or more conditional lines:
- 1. a state-specific status line (only for some states)
- 2. a "reward received" line (only when reward.dateGiven is set)
- 3. a fuel-tank code line (only when reward.fuelTankCode is set)
- The state shown is computed by `getState()` from:
- 1. the referral's fraud moderation status,
- 2. the user's Impact tax/payout connection (taxConnection prop),
- 3. the reward's PartnerFundsTransfer (PFT),
- 4. the reward's `pendingReasons` (US_TAX, MISSING_PAYOUT_CONFIGURATION),
- 5. the reward's `statuses` array (fallback).
-
- Background:
- Given the user is viewing the referral table
- And each row may show one or more rewards via sqm-referral-table-rewards-cell
- And the reward value is always shown in the summary as the bold prettyValue (e.g. "$50.00")
- # ============================================================
- # 1. CELL CONFIGURATION (every prop in isolation)
- # ============================================================
-
- @motivating @ui
- Scenario: hideDetails=true hides the disclosure caret and disables expansion
- Given the "hide-details" prop is true
- When the cell is rendered
- Then the sl-details summary-icon is set to display:none
- And the sl-details element is rendered with the disabled attribute
- And the summary cursor style is "default"
-
- @motivating @ui
- Scenario: hideDetails=false (default) shows the disclosure caret and allows expansion
- Given the "hide-details" prop is false
- When the cell is rendered
- Then the sl-details summary-icon is set to display:flex
- And the summary cursor style is "pointer"
-
- @minutia @ui
- Scenario Outline: rewardReceivedText prop drives the reward-received line
- Given a reward with dateGiven Jan 1, 2026
- And the "reward-received-text" prop is ""
- When the cell is rendered
- Then the description body contains " Jan 1, 2026" with "Jan 1, 2026" rendered in bold
-
- Examples:
- | value |
- | Reward given |
- | You earned on |
- | (empty string) |
-
- @minutia @ui
- Scenario Outline: expiringText prop drives the AVAILABLE info pill
- Given an AVAILABLE reward with dateExpires Aug 31, 2026
- And the current date is May 7, 2026
- And the "expiring-text" prop is ""
- When the cell is rendered
- Then the second info pill text is exactly ""
-
- Examples:
- | value | rendered |
- | Expiring | Expiring 3 months |
- | Expires | Expires 3 months |
- | (unset) | undefined 3 months |
-
- @minutia @ui
- Scenario Outline: pendingForText prop drives the badge text for PENDING+dateScheduledFor
- Given a PENDING reward with dateScheduledFor Aug 31, 2026
- And the current date is May 7, 2026
- And the "pending-for-text" prop is ""
- When the cell is rendered
- Then the primary badge text is exactly ""
-
- Examples:
- | value | rendered |
- | {status} for {date} | Pending for 3 months |
- | Available {date} | Available 3 months |
-
- @motivating @ui
- Scenario: deniedHelpText prop is appended to the DENIED description with a leading space
- Given a DENIED reward with referral.dateModerated Jan 1, 2026
- And the "denied-help-text" prop is "Contact support if you believe this is an error."
- When the cell is rendered
- Then the description body contains "Denied on Jan 1, 2026. Contact support if you believe this is an error."
-
- @motivating @ui
- Scenario: deniedHelpText prop omitted leaves the DENIED description with only the trailing period
- Given a DENIED reward with referral.dateModerated Jan 1, 2026
- And the "denied-help-text" prop is unset
- When the cell is rendered
- Then the description body contains "Denied on Jan 1, 2026."
- And the description body does NOT contain any text after that period
-
- @motivating @ui
- Scenario: fuelTankText prop drives the fuel-tank line
- Given a reward with fuelTankCode "ABC-123"
- And the "fuel-tank-text" prop is "Your code:"
- When the cell is rendered
- Then the description body contains "Your code: ABC-123" with "ABC-123" rendered in bold
-
- @minutia @ui
- Scenario: locale prop changes the date formatter and relative time formatter
- Given the "locale" prop is set to a supported locale
- Then every Luxon date is formatted using `luxonLocale(locale)` with `DateTime.DATE_MED`
- And every relative time uses `DateTime.toRelative()` with the same locale, with the leading "in " stripped
- And every prop-driven message string is run through `intl.formatMessage`
- # ============================================================
- # 2. STATE PRECEDENCE LADDER
- # `getState()` walks the rules below from top to bottom and returns
- # at the FIRST matching rule. Note: rules 3a and 3b (cash-reward payout-
- # setup gate) fire BEFORE any PFT branch, so they suppress PFT-derived
- # PROCESSING / PAYOUT_APPROVED states whenever the user has a cash
- # reward but has not finished tax/payout setup (either not connected at
- # all, or connected without withdrawalSettings). For cash rewards,
- # PAYOUT_CANCELLED (REVERSED) and PAYOUT_FAILED (OVERDUE) are
- # unreachable past rules 3a/3b when those gates fire.
- # ============================================================
-
- @motivating
- Scenario: State precedence ladder
- Given a reward, its referral's fraud state, and the user's tax connection
- Then is produced
- And the , , and is determined in the following order:
- | order | rule | resulting state | resulting badge text | resulting description body |
- | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Denied on Jan 1, 2026. Contact support. |
- | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Pending since Jan 1, 2026 |
- | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
- | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
- | 7 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
- | 8 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
- | 9 | reward.pendingReasons includes "US_TAX" AND impactConnection.taxHandlingEnabled is false | PENDING | Pending | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
- | 10 | reward.pendingReasons includes "US_TAX" AND impactConnection.connected is false | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 11 | reward.pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument is missing | PENDING_TAX_SUBMISSION | Pending | Submit your tax documents to receive your rewards |
- | 12 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "INACTIVE" / "INVALID_W9_ELECTRONIC_DOCUMENT" / "INVALID_W9_ELECTRONIC_DOCUMENT_CHECK_INTERNAL" | PENDING_NEW_TAX_FORM | Pending | Invalid tax form. Submit a new form to receive your rewards. |
- | 13 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING_TAX_REVIEW | Pending | Awaiting tax form review |
- | 14 | reward.pendingReasons includes "US_TAX" AND publisher.currentTaxDocument.status is "ACTIVE" AND publisher.withdrawalSettings missing | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 15 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING_PARTNER_CREATION | Pending | Complete your tax and cash payout setup to receive your rewards |
- | 16 | statuses includes "REDEEMED" | REDEEMED | Redeemed | (no state-specific body line) |
- | 17 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Reward cancelled on Jan 1, 2026 |
- | 18 | statuses includes "EXPIRED" | EXPIRED | Expired | Reward expired on Jan 1, 2026 |
- | 19 | statuses includes "PENDING" | PENDING | Pending (or "Pending for {date}" overlay if dateScheduledFor set) | Available on Jan 1, 2026 (if dateScheduledFor set; else no body line) |
- | 20 | statuses includes "AVAILABLE" | AVAILABLE | Available (plus info pill "{expiringText} {relative}" if dateExpires set) | Reward expiring on Jan 1, 2026 |
-
- @motivating
- Scenario: Cash reward with connected partner but no withdrawal settings overrides any PFT-derived state
- Given a cash reward (reward.rewardedCash is true) with partnerFundsTransfer status "TRANSFERRED" and dateScheduled in the past
- And taxConnection.connected is true
- And taxConnection.publisher.withdrawalSettings is missing
- When the cell is rendered
- Then the resulting state is PENDING_PARTNER_CREATION
-
- @motivating
- Scenario: Cash reward with no impact connection overrides any PFT-derived state
- Given a cash reward (reward.rewardedCash is true) with partnerFundsTransfer status "TRANSFERRED" and dateScheduled in the past
- And taxConnection.connected is false
- When the cell is rendered
- Then the resulting state is PENDING_PARTNER_CREATION
-
- @motivating
- Scenario: Non-cash reward skips the payout-setup gate
- Given a non-cash reward (reward.rewardedCash is false) with reward.statuses ["AVAILABLE"]
- And taxConnection.connected is false
- When the cell is rendered
- Then the resulting state is AVAILABLE
-
- @minutia
- Scenario: Connected partner with no withdrawal settings does NOT override fraud states
- Given a reward whose referral.fraudData.moderationStatus is "DENIED"
- And taxConnection.connected is true
- And taxConnection.publisher.withdrawalSettings is missing
- When the cell is rendered
- Then the resulting state is DENIED
- # ============================================================
- # 3. STATE → BADGE COLOUR (`getSLBadgeType`)
- # ============================================================
-
- @motivating @ui
- Scenario Outline: Each state maps to a Shoelace badge type
- Given a reward whose computed state is ""
- When the cell is rendered
- Then the primary pill is rendered with type ""
- And the primary pill is rendered with the "" CSS class
- # CSS class applied: primary→RedeemBadge, danger→DangerBadge,
- # warning→WarningBadge, success→SuccessBadge, info→WarningBadge.
- # Note: getSLBadgeType returns undefined for any state outside the cases
- # below; the resulting CSS class then defaults to WarningBadge.
-
- Examples:
- | state | slBadgeType | cssClass |
- | REDEEMED | primary | RedeemBadge |
- | PAYOUT_APPROVED | primary | RedeemBadge |
- | DENIED | danger | DangerBadge |
- | EXPIRED | danger | DangerBadge |
- | CANCELLED | danger | DangerBadge |
- | PAYOUT_FAILED | danger | DangerBadge |
- | PAYOUT_CANCELLED | danger | DangerBadge |
- | PENDING | warning | WarningBadge |
- | PENDING_REVIEW | warning | WarningBadge |
- | PENDING_TAX_REVIEW | warning | WarningBadge |
- | PENDING_NEW_TAX_FORM | warning | WarningBadge |
- | PENDING_TAX_SUBMISSION | warning | WarningBadge |
- | PENDING_PARTNER_CREATION | warning | WarningBadge |
- | PROCESSING | warning | WarningBadge |
- | AVAILABLE | success | SuccessBadge |
- | (empty string "") | undefined | WarningBadge |
- | (any unknown string) | undefined | WarningBadge |
- # ============================================================
- # 4. PRIMARY BADGE TEXT
- # The primary badge ALWAYS renders. Its text comes from one of two paths:
- # - "pendingFor" overlay: state==="PENDING" AND reward.dateScheduledFor truthy
- # - default: intl.formatMessage(statusText, {status: state})
- # The default `statusText` ICU message maps every state below.
- # ============================================================
-
- @motivating @ui
- Scenario Outline: Default primary badge text per state (no PENDING+dateScheduledFor overlay)
- Given a reward whose computed state is ""
- And NOT (state is PENDING and reward.dateScheduledFor is set)
- And the "status-text" prop is the default
- When the cell is rendered
- Then the primary badge text is exactly ""
-
- Examples:
- | state | text |
- | AVAILABLE | Available |
- | CANCELLED | Cancelled |
- | PENDING | Pending |
- | PENDING_REVIEW | Pending |
- | PAYOUT_APPROVED | Payout Approved |
- | PROCESSING | Payment Processing |
- | PAYOUT_FAILED | Payout Failed |
- | PAYOUT_CANCELLED | Payout Cancelled |
- | PENDING_TAX_REVIEW | Pending |
- | PENDING_NEW_TAX_FORM | Pending |
- | PENDING_TAX_SUBMISSION | Pending |
- | PENDING_PARTNER_CREATION | Pending |
- | DENIED | Denied |
- | EXPIRED | Expired |
- | REDEEMED | Redeemed |
- | (empty string "") | Not available |
- | (any unknown string) | Not available |
-
- @motivating @ui
- Scenario: PENDING + dateScheduledFor uses the pendingForText overlay (default ICU)
- Given a PENDING reward with dateScheduledFor Aug 31, 2026
- And the current date is May 7, 2026
- And the "status-text" prop is the default
- And the "pending-for-text" prop is the default "{status} for {date}"
- When the cell is rendered
- Then the primary badge text is exactly "Pending for 3 months"
-
- @motivating @ui
- Scenario: PENDING WITHOUT dateScheduledFor falls back to the default badge text
- Given a PENDING reward whose dateScheduledFor is unset
- When the cell is rendered
- Then the primary badge text is exactly "Pending"
-
- @minutia @ui
- Scenario: pendingForText overlay is suppressed for non-PENDING states even with dateScheduledFor
- Given an AVAILABLE reward whose dateScheduledFor is set Aug 31, 2026
- When the cell is rendered
- Then the primary badge text is exactly "Available"
- And the pendingForText template is NOT applied
- # ============================================================
- # 5. SECONDARY ("INFO") PILL
- # The second pill renders ONLY when state==="AVAILABLE" AND reward.dateExpires is truthy.
- # Its text is `${expiringText} ${getTimeDiff(dateExpires)}` — note the leading space
- # always present and the prop value is rendered as-is (undefined → literal "undefined ...").
- # ============================================================
-
- @motivating @ui
- Scenario Outline: Secondary info pill renders only for AVAILABLE+dateExpires
- Given a reward whose computed state is ""
- And reward.dateExpires is
- When the cell is rendered
- Then the secondary info pill is rendered:
-
- Examples:
- | state | dateExpires | rendered |
- | AVAILABLE | Aug 31, 2026 (set) | yes |
- | AVAILABLE | unset | no |
- | EXPIRED | Aug 31, 2026 (set) | no |
- | REDEEMED | Aug 31, 2026 (set) | no |
- | PENDING | Aug 31, 2026 (set) | no |
- | CANCELLED | Aug 31, 2026 (set) | no |
- | PENDING_REVIEW | Aug 31, 2026 (set) | no |
- | DENIED | Aug 31, 2026 (set) | no |
- | PAYOUT_APPROVED | Aug 31, 2026 (set) | no |
- | PROCESSING | Aug 31, 2026 (set) | no |
-
- @motivating @ui
- Scenario Outline: Secondary info pill text composition
- Given an AVAILABLE reward with dateExpires Aug 31, 2026
- And the current date is May 7, 2026
- And the "expiring-text" prop is
- When the cell is rendered
- Then the secondary info pill is rendered with type "info"
- And the secondary info pill is rendered with the WarningBadge CSS class
- And the secondary info pill text is exactly ""
-
- Examples:
- | expiringText | text |
- | "Expiring" | Expiring 3 months |
- | "" | 3 months |
- | unset | undefined 3 months |
- # ============================================================
- # 6. DESCRIPTION BODY — PER-STATE STATUS LINE
- # The body is a stack of conditional render blocks, evaluated in source order:
- # PENDING_REVIEW → "" → PROCESSING → PAYOUT_FAILED → PAYOUT_CANCELLED →
- # PENDING_TAX_REVIEW → PENDING_NEW_TAX_FORM → PENDING_TAX_SUBMISSION →
- # PENDING_PARTNER_CREATION → DENIED → dateGiven → EXPIRED → CANCELLED →
- # PENDING → AVAILABLE → fuelTankCode.
- # All other states (REDEEMED, etc.) render NO state-specific
- # status line — only the dateGiven/fuelTankCode lines below if applicable.
- # ============================================================
-
- @motivating @ui
- Scenario: PENDING_REVIEW with dateModerated renders the "Pending since" line
- Given a reward whose computed state is PENDING_REVIEW
- And reward.referral.dateModerated is Jan 1, 2026
- When the cell is rendered
- Then the description body contains "Pending since Jan 1, 2026" with "Jan 1, 2026" in bold
-
- @motivating @ui
- Scenario: PENDING_REVIEW WITHOUT dateModerated renders no "Pending since" line
- Given a reward whose computed state is PENDING_REVIEW
- And reward.referral.dateModerated is unset
- When the cell is rendered
- Then the description body does NOT contain a "Pending since" line
-
- @motivating @ui
- Scenario: state === "" renders the bare "Not available" statusText line
- Given a reward whose computed state is the empty string ""
- When the cell is rendered
- Then the description body contains exactly the text "Not available"
-
- @minutia @ui
- Scenario: state === undefined does NOT render the "Not available" line in the body
- Given a reward whose computed state is undefined
- When the cell is rendered
- Then the description body does NOT contain "Not available"
- And only the dateGiven and fuelTankCode lines (if any) are rendered
-
- @motivating @ui
- Scenario: PROCESSING renders the "Processing until {date}." line
- Given a reward whose computed state is PROCESSING
- And reward.partnerFundsTransfer.dateScheduled is Jan 1, 2026
- When the cell is rendered
- Then the description body contains "Processing until Jan 1, 2026. Payout is then scheduled based on your settings."
-
- @motivating @ui
- Scenario: PAYOUT_APPROVED renders the "Processing until {date}." line
- Given a reward whose computed state is PAYOUT_APPROVED
- And reward.partnerFundsTransfer.dateScheduled is Jan 1, 2026
- When the cell is rendered
- Then the description body contains "Processing until Jan 1, 2026. Payout is then scheduled based on your settings."
-
- @motivating @ui
- Scenario: PAYOUT_FAILED renders the failed-fulfillment line
- Given a reward whose computed state is PAYOUT_FAILED
- When the cell is rendered
- Then the description body contains "Payout failed due to a fulfillment issue and is currently being retried."
-
- @motivating @ui
- Scenario: PAYOUT_CANCELLED renders the contact-support line
- Given a reward whose computed state is PAYOUT_CANCELLED
- When the cell is rendered
- Then the description body contains "If you think this is a mistake, contact our Support team."
-
- @motivating @ui
- Scenario: PENDING_TAX_REVIEW renders the tax-review line
- Given a reward whose computed state is PENDING_TAX_REVIEW
- When the cell is rendered
- Then the description body contains "Awaiting tax form review"
-
- @motivating @ui
- Scenario: PENDING_NEW_TAX_FORM renders the invalid-tax-form line
- Given a reward whose computed state is PENDING_NEW_TAX_FORM
- When the cell is rendered
- Then the description body contains "Invalid tax form. Submit a new form to receive your rewards."
-
- @motivating @ui
- Scenario: PENDING_TAX_SUBMISSION renders the submit-tax-documents line
- Given a reward whose computed state is PENDING_TAX_SUBMISSION
- When the cell is rendered
- Then the description body contains "Submit your tax documents to receive your rewards"
-
- @motivating @ui
- Scenario: PENDING_PARTNER_CREATION renders the complete-payout-setup line
- Given a reward whose computed state is PENDING_PARTNER_CREATION
- When the cell is rendered
- Then the description body contains "Complete your tax and cash payout setup to receive your rewards"
-
- @motivating @ui
- Scenario: DENIED with dateModerated renders "Denied on {date}." with trailing period
- Given a reward whose computed state is DENIED
- And reward.referral.dateModerated is Jan 1, 2026
- And the "denied-help-text" prop is unset
- When the cell is rendered
- Then the description body contains "Denied on Jan 1, 2026." with "Jan 1, 2026" in bold
-
- @motivating @ui
- Scenario: DENIED with dateModerated AND deniedHelpText appends help text after the period
- Given a reward whose computed state is DENIED
- And reward.referral.dateModerated is Jan 1, 2026
- And the "denied-help-text" prop is "Contact our support team."
- When the cell is rendered
- Then the description body contains "Denied on Jan 1, 2026. Contact our support team."
-
- @motivating @ui
- Scenario: DENIED WITHOUT dateModerated renders no "Denied on" line
- Given a reward whose computed state is DENIED
- And reward.referral.dateModerated is unset
- When the cell is rendered
- Then the description body does NOT contain a "Denied on" line
- And the deniedHelpText is NOT rendered (it lives inside the dateModerated block)
-
- @motivating @ui
- Scenario: EXPIRED with dateExpires renders the "Reward expired on {date}" line
- Given a reward whose computed state is EXPIRED
- And reward.dateExpires is Jan 1, 2026
- When the cell is rendered
- Then the description body contains "Reward expired on Jan 1, 2026" with "Jan 1, 2026" in bold
-
- @motivating @ui
- Scenario: EXPIRED WITHOUT dateExpires renders no expired line
- Given a reward whose computed state is EXPIRED
- And reward.dateExpires is unset
- When the cell is rendered
- Then the description body does NOT contain "Reward expired on"
-
- @motivating @ui
- Scenario: CANCELLED with dateCancelled renders the "Reward cancelled on {date}" line
- Given a reward whose computed state is CANCELLED
- And reward.dateCancelled is Jan 1, 2026
- When the cell is rendered
- Then the description body contains "Reward cancelled on Jan 1, 2026" with "Jan 1, 2026" in bold
-
- @motivating @ui
- Scenario: CANCELLED WITHOUT dateCancelled renders no cancelled line
- Given a reward whose computed state is CANCELLED
- And reward.dateCancelled is unset
- When the cell is rendered
- Then the description body does NOT contain "Reward cancelled on"
-
- @motivating @ui
- Scenario: PENDING with dateScheduledFor renders the "Available on {date}" line
- Given a reward whose computed state is PENDING
- And reward.dateScheduledFor is Jan 1, 2026
- When the cell is rendered
- Then the description body contains "Available on Jan 1, 2026" with "Jan 1, 2026" in bold
-
- @motivating @ui
- Scenario: PENDING WITHOUT dateScheduledFor renders no "Available on" line
- Given a reward whose computed state is PENDING
- And reward.dateScheduledFor is unset
- When the cell is rendered
- Then the description body does NOT contain "Available on"
- And the badge falls back to plain "Pending"
-
- @motivating @ui
- Scenario: AVAILABLE with dateExpires renders the "Reward expiring on {date}" body line
- Given a reward whose computed state is AVAILABLE
- And reward.dateExpires is Aug 31, 2026
- When the cell is rendered
- Then the description body contains "Reward expiring on Aug 31, 2026" with "Aug 31, 2026" in bold
-
- @motivating @ui
- Scenario: AVAILABLE WITHOUT dateExpires renders no body line and no info pill
- Given a reward whose computed state is AVAILABLE
- And reward.dateExpires is unset
- When the cell is rendered
- Then the description body does NOT contain "Reward expiring on"
- And the secondary info pill is NOT rendered
-
- @motivating @ui
- Scenario: REDEEMED renders no state-specific body line
- Given a reward whose computed state is REDEEMED
- When the cell is rendered
- Then the description body has NO state-specific status line
- And only the dateGiven and fuelTankCode lines (if any) are rendered
- # ============================================================
- # 7. ALWAYS-ON BODY LINES (dateGiven + fuelTankCode)
- # These render REGARDLESS of state, layered on top of (or instead of)
- # the per-state status line.
- # ============================================================
-
- @motivating @ui
- Scenario Outline: dateGiven line renders for every state when reward.dateGiven is truthy
- Given a reward with dateGiven Jan 1, 2026
- And the "reward-received-text" prop is "Reward given"
- And the reward's computed state is ""
- When the cell is rendered
- Then the description body contains "Reward given Jan 1, 2026" with "Jan 1, 2026" in bold
-
- Examples:
- | state |
- | AVAILABLE |
- | REDEEMED |
- | PENDING |
- | PENDING_REVIEW |
- | EXPIRED |
- | CANCELLED |
- | DENIED |
- | PAYOUT_APPROVED |
- | PAYOUT_CANCELLED |
- | PAYOUT_FAILED |
- | PROCESSING |
- | PENDING_TAX_REVIEW |
- | PENDING_NEW_TAX_FORM |
- | PENDING_TAX_SUBMISSION |
- | PENDING_PARTNER_CREATION |
-
- @motivating @ui
- Scenario: dateGiven line is suppressed when reward.dateGiven is unset
- Given a reward whose dateGiven is unset
- When the cell is rendered
- Then the description body does NOT contain a reward-received line
-
- @motivating @ui
- Scenario Outline: fuelTankCode line renders for every state when reward.fuelTankCode is truthy
- Given a reward with fuelTankCode "ABC-123"
- And the "fuel-tank-text" prop is "Code:"
- And the reward's computed state is ""
- When the cell is rendered
- Then the description body contains "Code: ABC-123" with "ABC-123" in bold
-
- Examples:
- | state |
- | AVAILABLE |
- | REDEEMED |
- | PENDING |
- | PENDING_REVIEW |
- | EXPIRED |
- | CANCELLED |
- | DENIED |
- | PAYOUT_APPROVED |
- | PAYOUT_CANCELLED |
- | PAYOUT_FAILED |
- | PROCESSING |
- | PENDING_TAX_REVIEW |
- | PENDING_NEW_TAX_FORM |
- | PENDING_TAX_SUBMISSION |
- | PENDING_PARTNER_CREATION |
-
- @motivating @ui
- Scenario: fuelTankCode line is suppressed when reward.fuelTankCode is unset
- Given a reward whose fuelTankCode is unset
- When the cell is rendered
- Then the description body does NOT contain a fuel-tank line
-
- @minutia @ui
- Scenario: Stacking order in the description body
- Given an AVAILABLE reward with dateExpires Aug 31, 2026, dateGiven Jan 1, 2026, fuelTankCode "ABC-123"
- When the cell is rendered
- Then the description body lines appear in this order:
- | order | line |
- | 1 | Reward given Jan 1, 2026 (dateGiven block) |
- | 2 | Reward expiring on Aug 31, 2026 (AVAILABLE block) |
- | 3 | ABC-123 (fuelTankCode block) |
- # ============================================================
- # 8. PARTNER FUNDS TRANSFER (PFT) MATRIX
- # Every PFT permutation, with the cash-reward "needsPayoutSetup" gate
- # (rules 3a/3b above) toggled on/off. The gate fires BEFORE PFT branches
- # for cash rewards, but rules 4–5 (REVERSED, OVERDUE) are unreachable
- # when the gate fires because the gate already returned
- # PENDING_PARTNER_CREATION.
- # ============================================================
-
- @motivating
- Scenario Outline: PFT permutations when withdrawalSettings ARE present (gate does not fire)
- Given taxConnection.connected is true
- And taxConnection.publisher.withdrawalSettings is present
- And the reward has a partnerFundsTransfer with status and dateScheduled
- When the cell is rendered
- Then the resulting state is ""
-
- Examples:
- | pftStatus | pftDateScheduled | state |
- | REVERSED | (any) | PAYOUT_CANCELLED |
- | OVERDUE | (any) | PAYOUT_FAILED |
- | TRANSFERRED | future | PROCESSING |
- | TRANSFERRED | past | PAYOUT_APPROVED |
- | TRANSFERRED | unset | PAYOUT_APPROVED |
- | NOT_YET_DUE | future | PROCESSING |
- | NOT_YET_DUE | past | PAYOUT_APPROVED |
- | NOT_YET_DUE | unset | PAYOUT_APPROVED |
- | (null) | future | PROCESSING |
- | (null) | past | PAYOUT_APPROVED |
-
- @motivating
- Scenario Outline: PFT permutations when withdrawalSettings are MISSING (gate fires first)
- Given taxConnection.connected is true
- And taxConnection.publisher.withdrawalSettings is missing
- And the reward has a partnerFundsTransfer with status and dateScheduled
- When the cell is rendered
- Then the resulting state is ""
-
- Examples:
- | pftStatus | pftDateScheduled | state |
- | REVERSED | (any) | PENDING_PARTNER_CREATION |
- | OVERDUE | (any) | PENDING_PARTNER_CREATION |
- | TRANSFERRED | future | PENDING_PARTNER_CREATION |
- | TRANSFERRED | past | PENDING_PARTNER_CREATION |
- | NOT_YET_DUE | future | PENDING_PARTNER_CREATION |
- | NOT_YET_DUE | past | PENDING_PARTNER_CREATION |
- | (null) | future | PENDING_PARTNER_CREATION |
- | (null) | past | PENDING_PARTNER_CREATION |
-
- @motivating
- Scenario: PFT branch is skipped entirely when reward.partnerFundsTransfer is missing
- Given the reward has no partnerFundsTransfer
- And the reward has no fraud / pendingReasons / statuses overrides
- When the cell is rendered
- Then PFT rules 4–9 are skipped
- And the resulting state is determined by the next applicable rule
- # ============================================================
- # 9. US_TAX PENDING-REASON MATRIX
- # Every permutation of taxConnection state when reward.pendingReasons
- # includes "US_TAX". Once US_TAX matches a sub-rule, no later rule fires.
- # ============================================================
-
- @motivating @ui
- Scenario Outline: US_TAX pending matrix
- Given a reward whose pendingReasons include "US_TAX"
- And taxConnection.taxHandlingEnabled is
- And taxConnection.connected is
- And taxConnection.publisher.requiredTaxDocumentType is
- And taxConnection.publisher.currentTaxDocument is
- And taxConnection.publisher.currentTaxDocument.status is
- And taxConnection.publisher.withdrawalSettings is
- When the cell is rendered
- Then the resulting state is ""
-
- Examples:
- | taxHandlingEnabled | connected | requiredTaxDocumentType | currentTaxDocument | currentTaxDocumentStatus | withdrawalSettings | state |
- | false | (any) | (any) | (any) | (any) | (any) | PENDING |
- | true | false | (any) | (any) | (any) | (any) | PENDING_PARTNER_CREATION |
- | true | true | unset | (any) | (any) | present | (falls through) |
- | true | true | unset | (any) | (any) | missing | (falls through) |
- | true | true | W9 | missing | - | (any) | PENDING_TAX_SUBMISSION |
- | true | true | W9 | present | INACTIVE | (any) | PENDING_NEW_TAX_FORM |
- | true | true | W9 | present | INVALID_W9_ELECTRONIC_DOCUMENT | (any) | PENDING_NEW_TAX_FORM |
- | true | true | W9 | present | INVALID_W9_ELECTRONIC_DOCUMENT_CHECK_INTERNAL | (any) | PENDING_NEW_TAX_FORM |
- | true | true | W9 | present | NOT_VERIFIED | (any) | PENDING_TAX_REVIEW |
- | true | true | W9 | present | ACTIVE | missing | PENDING_PARTNER_CREATION |
- | true | true | W9 | present | ACTIVE | present | (falls through) |
-
- @motivating @ui
- Scenario: MISSING_PAYOUT_CONFIGURATION pendingReason resolves to PENDING_PARTNER_CREATION
- Given a reward whose pendingReasons include "MISSING_PAYOUT_CONFIGURATION"
- And no earlier rule matches
- When the cell is rendered
- Then the resulting state is PENDING_PARTNER_CREATION
- # ============================================================
- # 10. STATUSES-ARRAY FALLBACK (rules 19–34)
- # ============================================================
-
- @motivating
- Scenario Outline: Single-entry statuses array returns that single value (rule 19)
- Given a reward whose pendingReasons array is empty
- And reward.partnerFundsTransfer is missing
- And reward.statuses is
- When the cell is rendered
- Then the resulting state is ""
-
- Examples:
- | statuses | state |
- | ["AVAILABLE"] | AVAILABLE |
- | ["REDEEMED"] | REDEEMED |
- | ["EXPIRED"] | EXPIRED |
- | ["CANCELLED"] | CANCELLED |
- | ["PENDING"] | PENDING |
- | ["DENIED"] | DENIED |
- | ["UNKNOWN_STATUS"] | UNKNOWN_STATUS |
-
- @motivating
- Scenario Outline: Multi-entry statuses array returns the first matching possibleState (rules 20–34)
- Given a reward whose pendingReasons array is empty
- And reward.partnerFundsTransfer is missing
- And reward.statuses is
- When the cell is rendered
- Then the resulting state is ""
- # possibleStates priority order:
- # REDEEMED > CANCELLED > EXPIRED > PENDING > AVAILABLE > PENDING_REVIEW
- # > DENIED > PAYOUT_APPROVED > PAYOUT_CANCELLED > PAYOUT_FAILED
- # > PENDING_TAX_REVIEW > PENDING_NEW_TAX_FORM > PENDING_TAX_SUBMISSION
- # > PENDING_PARTNER_CREATION > PROCESSING
-
- Examples:
- | statuses | state |
- | ["AVAILABLE", "PENDING"] | PENDING |
- | ["AVAILABLE", "REDEEMED"] | REDEEMED |
- | ["EXPIRED", "PENDING"] | EXPIRED |
- | ["PENDING", "AVAILABLE"] | PENDING |
- | ["AVAILABLE", "DENIED"] | AVAILABLE |
- | ["CANCELLED", "AVAILABLE"] | CANCELLED |
- | ["EXPIRED", "CANCELLED", "REDEEMED"] | REDEEMED |
- | ["PENDING_REVIEW", "DENIED", "AVAILABLE"] | AVAILABLE |
- | ["PROCESSING", "PENDING_PARTNER_CREATION"] | PENDING_PARTNER_CREATION |
-
- @minutia
- Scenario: Multi-entry statuses with no matching possibleState returns undefined
- Given a reward whose pendingReasons array is empty
- And reward.partnerFundsTransfer is missing
- And reward.statuses is ["UNKNOWN_A", "UNKNOWN_B"]
- When the cell is rendered
- Then the resulting state is undefined
- And the primary badge text is "Not available"
- And the description body has no state-specific status line
-
- @minutia
- Scenario: Empty statuses array with no other matches returns undefined
- Given a reward whose pendingReasons array is empty
- And reward.partnerFundsTransfer is missing
- And reward.statuses is []
- When the cell is rendered
- Then the resulting state is undefined
- And the primary badge text is "Not available"
- # ============================================================
- # 11. ICU CUSTOMIZATION (statusText, statusLongText)
- # ============================================================
-
- @motivating
- Scenario Outline: statusText prop overrides the primary badge text per state
- Given the "status-text" prop overrides "" to ""
- And a reward whose computed state is ""
- And NOT (state is PENDING and reward.dateScheduledFor is set)
- When the cell is rendered
- Then the primary badge text is exactly ""
-
- Examples:
- | state | customLabel |
- | AVAILABLE | Redeem me! |
- | PENDING | Coming soon! |
- | PAYOUT_APPROVED | Payout Sent! |
- | DENIED | Unlucky! |
- | PENDING_TAX_REVIEW | Tax review in progress |
- | PENDING_PARTNER_CREATION | Finish setup |
-
- @motivating
- Scenario Outline: statusLongText prop overrides the description body per state
- Given the "status-long-text" prop overrides "" to ""
- And a reward whose computed state is ""
- And the conditional render block for "" fires
- When the cell is rendered
- Then the description body contains ""
-
- Examples:
- | state | customLabel |
- | DENIED | Sorry, this referral was denied |
- | PAYOUT_FAILED | We were unable to send your money |
- | PENDING_TAX_SUBMISSION | Please upload your W-9 form |
- | PENDING_PARTNER_CREATION | Finish onboarding |
-
- @minutia
- Scenario: statusLongText for a state without a render block has no effect on the body
- Given the "status-long-text" prop overrides "REDEEMED" to "You redeemed!"
- And a reward whose computed state is REDEEMED
- When the cell is rendered
- Then the description body does NOT contain "You redeemed!"
- And only the dateGiven and fuelTankCode lines (if any) are rendered
- # ============================================================
- # 12. LOCALIZATION
- # ============================================================
-
- @minutia
- Scenario: All dates and ICU strings flow through the configured locale
- Given the "locale" prop is set to a supported locale
- Then dateGiven, dateExpires, dateCancelled, dateModerated, dateScheduledFor,
- And relative time expressions use `DateTime.toRelative()` with the same locale, with the leading "in " stripped
- And every prop-driven message string is run through `intl.formatMessage`
diff --git a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature b/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
deleted file mode 100644
index fbe54a04b4..0000000000
--- a/packages/mint-components/src/components/sqm-rewards-table/columns/sqm-rewards-table-status-column-new.feature
+++ /dev/null
@@ -1,240 +0,0 @@
-@author:derek @owner:derek
-Feature: Reward Table Status Column
- Shows the status of each reward as a coloured pill plus a description
- line. The status is derived from the reward's fraud state, the user's
- Impact tax/payout connection, the reward's PartnerFundsTransfer (PFT),
- the reward's lifecycle dates, and the reward's `statuses` /
- `pendingReasons` arrays.
-
- Background:
- Given the status column is included in the reward table
- # ============================================================
- # 1. COLUMN CONFIGURATION
- # ============================================================
-
- @motivating @ui
- Scenario Outline: The title of the status column is configurable
- Given the "column-title" prop is set to
- Then the status column is shown with
-
- Examples:
- | value | columnTitle |
- | Status | |
- | My column title | My column title |
-
- @minutia @ui
- Scenario Outline: Expiry status date text can be configured
- Given the "expiry-text" prop has
- And a user with an available reward with an expiry date
- When they view the reward table
- Then they see under the Available Status pill
-
- Examples:
- | value | text |
- | Expires | Expires |
- | Redeem before | Redeem before |
- # ============================================================
- # 2. STATUS PRECEDENCE
- # rewardStatus() walks the rules below from top to bottom and the first
- # matching rule wins.
- # ============================================================
-
- @motivating
- Scenario: Status precedence ladder
- Given a reward, its referral fraud state, the user's Impact tax connection
- Then is produced
- And the , , and is determined in the following order:
- | order | rule | resulting status | resulting badge text | resulting description |
- | 1 | referral.fraudData.moderationStatus is "DENIED" | DENIED | Denied | Detected self-referral |
- | 2 | referral.fraudData.moderationStatus is "PENDING" | PENDING_REVIEW | Pending | Awaiting review |
- | 3 | reward.rewardedCash is true AND impactConnection is NOT connected | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
- | 4 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
- | 5 | partnerFundsTransfer.status is "REVERSED" | PAYOUT_CANCELLED | Payout Cancelled | If you think this is a mistake, contact our Support team. |
- | 6 | partnerFundsTransfer.status is "OVERDUE" | PAYOUT_FAILED | Payout Failed | Payout failed due to a fulfillment issue and is currently being retried. |
- | 7 | reward.pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your cash payout setup to receive your rewards. |
- | 8 | partnerFundsTransfer.dateScheduled is in the future | PROCESSING | Payment Processing | Processing until Jan 1, 2026. Payout is then scheduled based on your settings. |
- | 9 | partnerFundsTransfer.status is "TRANSFERRED" / "NOT_YET_DUE", or dateScheduled has passed without REVERSED/OVERDUE | PAYOUT_APPROVED | Payout Approved | Payout approved and scheduled for payment based on your settings. |
- | 10 | reward.dateCancelled is set | CANCELLED | Cancelled | Jan 1, 2026 |
- | 11 | reward.statuses includes "EXPIRED" | EXPIRED | Expired | Jan 1, 2026 |
- | 12 | reward.statuses includes "PENDING" | PENDING | Pending | Until Jan 1, 2026 |
- | 13 | statuses includes "REDEEMED" | REDEEMED | Redeemed | Jan 1, 2026 |
- | 14 | statuses includes "AVAILABLE" | AVAILABLE | Available | Expires Jan 1, 2026 |
- | 15 | statuses includes "CANCELLED" | CANCELLED | Cancelled | Jan 1, 2026 |
-# This spec should probably be inserted in to the above spec after rule 9 because it gets invoked when the reward state is pending
-# and does not hit the rules that output pending from above
-
- @motivating
- Scenario: PENDING description precedence ladder
- Given a PENDING reward, its pendingReasons, and the user's Impact tax connection
- Then the description shown under the Pending pill is determined in the following order:
- | order | rule | resulting status | resulting badge text | resulting description |
- | 1 | pendingReasons includes "US_TAX" AND impactConnection.taxHandlingEnabled is false | PENDING | Pending | W-9 required |
- | 2 | pendingReasons includes "US_TAX" AND impactConnection is NOT connected | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
- | 3 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument is missing | PENDING | Pending | Submit your tax documents to receive your rewards. |
- | 4 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument.status is "INACTIVE" | PENDING | Pending | Invalid tax form. Submit a new form to receive your rewards. |
- | 5 | pendingReasons includes "US_TAX" AND publisher.requiredTaxDocumentType is set AND publisher.currentTaxDocument.status is "NOT_VERIFIED" | PENDING | Pending | Awaiting tax form review. |
- | 6 | pendingReasons includes "US_TAX" AND publisher.withdrawalSettings is missing | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
- | 7 | pendingReasons includes "MISSING_PAYOUT_CONFIGURATION" | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
- | 8 | reward.rewardedCash is true AND impactConnection is NOT connected (fallback when no pendingReason returned) | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
- | 9 | reward.rewardedCash is true AND impactConnection is connected AND publisher.withdrawalSettings is missing (fallback) | PENDING | Pending | Complete your tax and cash payout setup to receive your rewards. |
-
- @motivating @ui
- Scenario Outline: Payout descriptions for PFT-derived statuses
- Given a reward whose computed status is
- When the cell is rendered
- Then the description line shows
-
- Examples:
- | status | description |
- | PAYOUT_APPROVED | Payout approved and scheduled for payment based on your settings. |
- | PAYOUT_FAILED | Payout failed due to a fulfillment issue and is currently being retried. |
- | PAYOUT_CANCELLED | If you think this is a mistake, contact our Support team. |
- | PROCESSING | Processing until . Payout is then scheduled based on your settings. |
-
- @motivating @ui
- Scenario Outline: US_TAX pending reason resolves based on the tax connection state
- Given the user has a PENDING reward whose pendingReasons include "US_TAX"
- And the user's impactConnection.taxHandlingEnabled is
- And the user's impactConnection.connected is
- And the user's publisher.requiredTaxDocumentType is
- And the user's publisher.currentTaxDocument is
- And the user's publisher.currentTaxDocument.status is
- And the user's publisher.withdrawalSettings is
- Then the badge is shown in a pill with text
- And the description line shows
-
- Examples:
- | taxHandlingEnabled | connected | requiredTaxDocumentType | currentTaxDocument | currentTaxDocumentStatus | withdrawalSettings | badgeText | pillColour | description |
- | false | true | W9 | present | ACTIVE | present | Pending | warning | W-9 required |
- | true | false | - | - | - | - | Pending | warning | Complete your tax and cash payout setup to receive your rewards. |
- | true | true | W9 | missing | - | present | Pending | warning | Submit your tax documents to receive your rewards. |
- | true | true | W9 | present | INACTIVE | present | Pending | warning | Invalid tax form. Submit a new form to receive your rewards. |
- | true | true | W9 | present | NOT_VERIFIED | present | Pending | warning | Awaiting tax form review. |
- | true | true | W9 | present | ACTIVE | missing | Pending | warning | Complete your tax and cash payout setup to receive your rewards. |
- # ============================================================
- # 3. STATUS → BADGE COLOUR MAPPING
- # ============================================================
-
- @motivating @ui
- Scenario Outline: Each status maps to a badge colour and default text
- Given a reward whose computed status is
- When the cell is rendered
- Then the badge is shown in a pill with
-
- Examples:
- | status | text | pillColour |
- | AVAILABLE | Available | success |
- | REDEEMED | Redeemed | primary |
- | PAYOUT_APPROVED | Payout Approved | primary |
- | PENDING | Pending | warning |
- | PENDING_REVIEW | Pending | warning |
- | PROCESSING | Payment Processing | warning |
- | CANCELLED | Cancelled | danger |
- | EXPIRED | Expired | danger |
- | DENIED | Denied | danger |
- | PAYOUT_FAILED | Payout Failed | danger |
- | PAYOUT_CANCELLED | Payout Cancelled | danger |
- | (other / "") | Not available | danger |
- # ============================================================
- # 4. DESCRIPTION LINE PRECEDENCE
- # The description under the badge is selected in this order:
- # 1. Fraud descriptions (PENDING_REVIEW / DENIED)
- # 2. Pending-reason descriptions (only when status is PENDING)
- # 3. Payout descriptions (PAYOUT_APPROVED / PAYOUT_FAILED /
- # PAYOUT_CANCELLED / PROCESSING)
- # 4. Reward date (dateCancelled / dateExpires / dateRedeemed),
- # prefixed with the configured expiry-text when status is AVAILABLE
- # ============================================================
-
- @motivating @ui
- Scenario Outline: Fraud descriptions are shown for fraud-derived statuses
- Given a reward whose computed status is
- When the cell is rendered
- Then the description line shows
-
- Examples:
- | status | description |
- | DENIED | Detected self-referral |
- | PENDING_REVIEW | Awaiting review |
-
- @motivating @ui
- Scenario Outline: Date-based descriptions for terminal lifecycle states
- Given a reward whose computed status is
- And the reward has populated
- When the cell is rendered
- Then the description line shows
-
- Examples:
- | status | date | text |
- | AVAILABLE | dateExpires | Expires |
- | EXPIRED | dateExpires | |
- | CANCELLED | dateCancelled | |
- | REDEEMED | dateRedeemed | |
- # ============================================================
- # 5. PENDING DESCRIPTION PRECEDENCE
- # Once the status precedence ladder in § 2 has produced PENDING, the
- # description shown under the "Pending" pill is determined by the
- # following ordered ladder (mirrors getTaxPendingReasons + the
- # pendingCodeMap fallback). All rules render a warning pill with text
- # "Pending"; only the description varies.
- # ============================================================
-
- @motivating @ui
- Scenario Outline: Generic pendingReasons codes are mapped via pendingCodeMap
- Given the user has a PENDING reward
- And the reward has no tax/payout pending reason
- And the reward.pendingReasons include
- When the cell is rendered
- Then the description line shows
-
- Examples:
- | pendingReason | text |
- | SCHEDULED | Until |
- | UNHANDLED_ERROR | Fulfillment error |
- | SUSPECTED_FRAUD | Awaiting review |
-
- @minutia
- Scenario: Multiple pending reasons are joined with commas
- Given the user has a PENDING reward
- And the reward has no tax/payout pending reason
- And the reward.pendingReasons include both "UNHANDLED_ERROR" and "SCHEDULED"
- Then the description line shows the mapped strings joined by ", "
-
- @minutia
- Scenario: Unknown pending reason codes pass through verbatim
- Given the user has a PENDING reward
- And the reward.pendingReasons include a code not present in the pendingCodeMap
- Then the raw code is shown in the description line
- # ============================================================
- # 6. STATUS TEXT CUSTOMIZATION (status-text prop)
- # ============================================================
-
- @motivating
- Scenario Outline: Statuses can be customized via ICU format
- Given the "status-text" prop is "{status, select, AVAILABLE {Redeem me!} CANCELLED {Unavailable} PENDING {Coming soon!} EXPIRED {Past due} REDEEMED {Spent} PENDING_REVIEW {Pending Review!} PAYOUT_APPROVED {Payout Sent!} PAYOUT_FAILED {Payout Failed!} PAYOUT_CANCELLED {Payout Cancelled!} PROCESSING {Processing!} DENIED {Unlucky!}}"
- And a reward whose computed status is
- When the cell is rendered
- Then the badge is rendered in a pill with text
-
- Examples:
- | status | text | pillColour |
- | AVAILABLE | Redeem me! | success |
- | CANCELLED | Unavailable | danger |
- | PENDING | Coming soon! | warning |
- | EXPIRED | Past due | danger |
- | REDEEMED | Spent | primary |
- | PENDING_REVIEW | Pending Review! | warning |
- | PAYOUT_APPROVED | Payout Sent! | primary |
- | PAYOUT_FAILED | Payout Failed! | danger |
- | PAYOUT_CANCELLED | Payout Cancelled! | danger |
- | PROCESSING | Processing! | warning |
- | DENIED | Unlucky! | danger |
- # ============================================================
- # 7. LOCALIZATION
- # ============================================================
-
- @minutia
- Scenario: Dates are formatted in the user's locale
- Given the "locale" prop is set to a supported locale
- Then every placeholder above is formatted with that locale
- And the configurable text props (expiryText, payoutProcessing, etc.) flow through `intl.formatMessage`
From 92dab7fa47e9ad78df36c69ac301afb2ec6a5c4e Mon Sep 17 00:00:00 2001
From: Andy
Date: Thu, 21 May 2026 15:04:38 -0700
Subject: [PATCH 31/64] Add support ICU string in partner modal
---
packages/mint-components/package.json | 2 +-
packages/mint-components/src/components.d.ts | 10 +++++++
.../PartnerInfoModal.stories.tsx | 26 +++++++++++++++++++
.../sqm-partner-info-modal/readme.md | 5 +++-
.../sqm-partner-info-modal-view.tsx | 17 +++++++++++-
.../sqm-partner-info-modal.tsx | 11 +++++++-
.../src/components/sqm-stencilbook/readme.md | 4 ++-
7 files changed, 70 insertions(+), 5 deletions(-)
diff --git a/packages/mint-components/package.json b/packages/mint-components/package.json
index c3d7aa4edb..bed5330040 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.2.0-2",
+ "version": "2.2.0-3",
"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 e23a0a9f66..a9d41352ec 100644
--- a/packages/mint-components/src/components.d.ts
+++ b/packages/mint-components/src/components.d.ts
@@ -2398,6 +2398,11 @@ export namespace Components {
* @uiWidget textArea
*/
"supportDescriptionExistingPartner": string;
+ /**
+ * Support description for existing partner confirmation
+ * @uiName Existing partner support description
+ */
+ "supportLink": string;
/**
* The link text that appears in the terms and conditions checkbox
* @uiName Terms and conditions text
@@ -10600,6 +10605,11 @@ declare namespace LocalJSX {
* @uiWidget textArea
*/
"supportDescriptionExistingPartner"?: string;
+ /**
+ * Support description for existing partner confirmation
+ * @uiName Existing partner support description
+ */
+ "supportLink"?: string;
/**
* The link text that appears in the terms and conditions checkbox
* @uiName Terms and conditions text
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
index 1c6f43c69f..7d32e8ac2a 100644
--- 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
@@ -45,6 +45,7 @@ const defaultText = {
"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.",
+ supportLink: "Support",
countryLabel: "Country",
currencyLabel: "Currency",
submitButtonLabel: "Submit",
@@ -182,3 +183,28 @@ export const Closed = () => {
};
return ;
};
+
+export const SQMComponentExistingPartner = () => {
+ return (
+
+ );
+};
+
+export const SQMComponentNewPartner = () => {
+ 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
index be3910479f..da55359694 100644
--- a/packages/mint-components/src/components/sqm-partner-info-modal/readme.md
+++ b/packages/mint-components/src/components/sqm-partner-info-modal/readme.md
@@ -25,7 +25,8 @@
| `searchCurrencyPlaceholder` | `search-currency-placeholder` | | `string` | `"Search for a currency"` |
| `stateController` | `state-controller` | | `string` | `"{}"` |
| `submitButtonLabel` | `submit-button-label` | | `string` | `"Submit"` |
-| `supportDescriptionExistingPartner` | `support-description-existing-partner` | Support description for existing partner confirmation | `string` | `"If this is a mistake, please contact Support or sign up for this referral program with a different email."` |
+| `supportDescriptionExistingPartner` | `support-description-existing-partner` | Support description for existing partner confirmation | `string` | `"If this is a mistake, please contact {supportLink} or sign up for this referral program with a different email."` |
+| `supportLink` | `support-link` | Support description for existing partner confirmation | `string` | `"Support"` |
| `termsAndConditionsLabel` | `terms-and-conditions-label` | The link text that appears in the terms and conditions checkbox | `string` | `"terms and conditions"` |
| `termsAndConditionsLink` | `terms-and-conditions-link` | The link that appears in the terms and conditions checkbox | `string` | `"https://terms.advocate.impact.com/PayoutTermsAndConditions.html"` |
@@ -34,6 +35,7 @@
### Used by
+ - [sqm-stencilbook](../sqm-stencilbook)
- [sqm-widget-verification](../sqm-widget-verification)
### Depends on
@@ -45,6 +47,7 @@
graph TD;
sqm-partner-info-modal --> sqm-form-message
sqm-form-message --> sqm-skeleton
+ sqm-stencilbook --> sqm-partner-info-modal
sqm-widget-verification --> sqm-partner-info-modal
style sqm-partner-info-modal fill:#f9f,stroke:#333,stroke-width:4px
```
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
index ed53a6b85f..44a8d18943 100644
--- 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
@@ -37,6 +37,7 @@ export interface PartnerInfoModalViewProps {
searchCountryPlaceholder: string;
searchCurrencyPlaceholder: string;
supportDescriptionExistingPartner: string;
+ supportLink: string;
modalHeaderExistingPartner: string;
allowBankingCollection: string;
termsAndConditionsLabel: string;
@@ -113,10 +114,24 @@ export function PartnerInfoModalContentView(props: PartnerInfoModalViewProps) {
const sheet = createStyleSheet(style);
const styleString = sheet.toString();
+ const supportMessage = intl.formatMessage(
+ {
+ id: "supportDescriptionExistingPartner",
+ defaultMessage: text.supportDescriptionExistingPartner,
+ },
+ {
+ supportLink: (
+
+ {text.supportLink}
+
+ ),
+ },
+ );
+
const description = states.isExistingPartner ? (
{text.descriptionExistingPartner}
-
{text.supportDescriptionExistingPartner}
+
{supportMessage}
) : (
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
index 898887990f..c130e9979f 100644
--- 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
@@ -72,7 +72,15 @@ export class PartnerInfoModal {
*/
@Prop()
supportDescriptionExistingPartner: string =
- "If this is a mistake, please contact Support or sign up for this referral program with a different email.";
+ "If this is a mistake, please contact {supportLink} or sign up for this referral program with a different email.";
+
+ /**
+ * Support description for existing partner confirmation
+ *
+ * @uiName Existing partner support description
+ */
+ @Prop()
+ supportLink: string = "Support";
/**
* Edit the property called terms and conditions text to change what's displayed for {termsAndConditionsLink}.
@@ -250,6 +258,7 @@ function useDemoPartnerInfoModal(
searchCurrencyPlaceholder: props.searchCurrencyPlaceholder,
supportDescriptionExistingPartner:
props.supportDescriptionExistingPartner,
+ supportLink: props.supportLink,
modalHeaderExistingPartner: props.modalHeaderExistingPartner,
},
},
diff --git a/packages/mint-components/src/components/sqm-stencilbook/readme.md b/packages/mint-components/src/components/sqm-stencilbook/readme.md
index f28bfb36e6..77969aaccf 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)
- [sqm-widget-verification](../sqm-widget-verification)
### Graph
@@ -206,6 +207,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-stencilbook --> sqm-widget-verification
sqm-form-message --> sqm-skeleton
sqm-portal-register --> sqm-form-message
@@ -285,10 +287,10 @@ graph TD;
sqm-payout-status-alert --> sqm-form-message
sqm-lead-form --> sqm-form-message
sqm-lead-form --> sqm-lead-input-field
+ sqm-partner-info-modal --> sqm-form-message
sqm-widget-verification --> sqm-partner-info-modal
sqm-widget-verification --> sqm-code-verification
sqm-widget-verification --> sqm-email-verification
- sqm-partner-info-modal --> sqm-form-message
style sqm-stencilbook fill:#f9f,stroke:#333,stroke-width:4px
```
From fdf4354481804a86a6e8e10f01e380646a9fa436 Mon Sep 17 00:00:00 2001
From: Andy
Date: Fri, 22 May 2026 16:41:19 -0700
Subject: [PATCH 32/64] Re-add removed code to fix code verification not
showing after email was sent
---
packages/mint-components/package.json | 2 +-
.../useEmailVerification.ts | 35 +++--
.../useWidgetVerification.ts | 7 +
.../sqm-user-info-form.feature | 140 +++++++++++++++++-
4 files changed, 165 insertions(+), 19 deletions(-)
diff --git a/packages/mint-components/package.json b/packages/mint-components/package.json
index bed5330040..b576fb64cd 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.2.0-3",
+ "version": "2.2.0-4",
"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/sqm-widget-verification/sqm-email-verification/useEmailVerification.ts b/packages/mint-components/src/components/sqm-widget-verification/sqm-email-verification/useEmailVerification.ts
index 3a9e9bbbbf..89dfd0dc06 100644
--- a/packages/mint-components/src/components/sqm-widget-verification/sqm-email-verification/useEmailVerification.ts
+++ b/packages/mint-components/src/components/sqm-widget-verification/sqm-email-verification/useEmailVerification.ts
@@ -87,8 +87,8 @@ export function useUpsertUserEmail() {
export function useWidgetEmailVerification(
props: WidgetEmailVerification
): WidgetEmailVerificationViewProps {
- const [_, setShowCode] = useParent(SHOW_CODE_NAMESPACE);
- const [email, setEmail] = useParent(VERIFICATION_EMAIL_NAMESPACE);
+ const [_, setShowCode] = useParent(SHOW_CODE_NAMESPACE);
+ const [_email, setEmail] = useParent(VERIFICATION_EMAIL_NAMESPACE);
const [emailExists, setEmailExists] = useState(false);
const [error, setError] = useState(false);
@@ -121,27 +121,40 @@ export function useWidgetEmailVerification(
if (!data?.viewer) return;
setLoading(true);
- const toAddress = data.viewer.email;
+ setMutationError(false);
+ setError(false);
+
+
+ let toAddress = data.viewer.email;
if (!toAddress) {
- // If no email on the user, set one
- const formData = e.detail.formData;
- const newEmail = formData.get("email").toString();
+ const formData = e.detail?.formData;
+ const newEmail = formData?.get("email")?.toString() ?? "";
if (!emailRegex.test(newEmail)) {
setError(true);
+ setLoading(false);
return;
}
- const result = await upsertUserEmail(newEmail);
- if (!result || !result.user.email) setError(true);
+ const upsertResult = await upsertUserEmail(newEmail);
+ if (!upsertResult || !upsertResult.upsertUser?.email) {
+ setError(true);
+ setLoading(false);
+ return;
+ }
+ toAddress = upsertResult.upsertUser.email;
}
// UI should not allow this call til initialisation is done
- if (!initialized) return;
+ if (!initialized) {
+ setLoading(false);
+ return;
+ }
const result = await sendEmail();
- if (!result || !result.success) setMutationError(true);
- else {
+ if (!result || !result.success) {
+ setMutationError(true);
+ } else {
// This is used to let the code verification widget know an email was already sent
setEmail(toAddress);
setShowCode(true);
diff --git a/packages/mint-components/src/components/sqm-widget-verification/useWidgetVerification.ts b/packages/mint-components/src/components/sqm-widget-verification/useWidgetVerification.ts
index 1684880e69..809784bb72 100644
--- a/packages/mint-components/src/components/sqm-widget-verification/useWidgetVerification.ts
+++ b/packages/mint-components/src/components/sqm-widget-verification/useWidgetVerification.ts
@@ -10,6 +10,7 @@ import {
PARTNER_CREATED_NAMESPACE,
SHOW_CODE_NAMESPACE,
SHOW_PARTNER_MODAL_NAMESPACE,
+ VERIFICATION_EMAIL_NAMESPACE,
VERIFICATION_PARENT_NAMESPACE,
} from "./keys";
@@ -38,6 +39,12 @@ export function useWidgetVerification() {
namespace: SHOW_CODE_NAMESPACE,
initialValue: false,
});
+
+ useParentState({
+ namespace: VERIFICATION_EMAIL_NAMESPACE,
+ initialValue: undefined,
+ });
+
const setContext = useSetParent(VERIFICATION_PARENT_NAMESPACE);
const [loading, setLoading] = useState(true);
const [showPartnerModal, setShowPartnerModal] = useParentState({
diff --git a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form.feature b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form.feature
index 82fe0d3328..d5c8f1e7a4 100644
--- a/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form.feature
+++ b/packages/mint-components/src/components/tax-and-cash/sqm-user-info-form/sqm-user-info-form.feature
@@ -13,6 +13,7 @@ Feature: Tax Form Step One
And each field has label