import { Box, CounterBadge, CustomModalLayoutProps, Heading, Text, TextButton, } from '@wix/design-system'; import { ImportState } from '@wix/bex-core'; import React, { ReactNode } from 'react'; import { ImportStepUpload } from './ImportStepUpload'; import { ImportStepConfiguration } from './ImportStepConfiguration'; import { ImportStepProgress } from './ImportStepProgress'; import { ImportRequiredFieldsSideNote } from './ImportRequiredFieldsSideNote'; import { ImportStepSummary } from './ImportStepSummary'; export interface GetImportModalStepProps { state: ImportState; isMobile?: boolean; } export function getImportModalStepProps({ state, isMobile, }: GetImportModalStepProps): Partial< CustomModalLayoutProps & { children?: ReactNode; onRequestClose?: () => void } > { const { currentStep, translate: t } = state; if (currentStep === 'upload') { return { title: t('cairo.import.title'), subtitle: t('cairo.import.subtitle'), children: , footnote: ( {t('cairo.import.footerText')} {t('cairo.import.footerLink')} ), showFooterDivider: false, secondaryButtonText: t('cairo.import.cancel'), secondaryButtonOnClick: state.close, closeButtonProps: { onClick: state.close, autoFocus: true }, onRequestClose: state.close, }; } if (currentStep === 'configuration') { const handleClose = () => state.discardAndClose(); return { removeContentPadding: true, title: isMobile ? ( {t('cairo.import.configureMappingsTitle')} {state.csvHeaders.length} ) : ( {t('cairo.import.configureMappingsTitle')} {state.csvHeaders.length} ), subtitle: t('cairo.import.subtitle'), children: , // Left-aligned footer side-note while required fields are unmapped // (CAIRO-4452). Sits in the footer's button row (`sideActions`), not the // full-width footnote strip. The Import button stays enabled; the click is // blocked with a toast in `startImport`. sideActions: state.hasMissingRequiredFields ? ( ) : undefined, showFooterDivider: true, primaryButtonText: t('cairo.import.startImport'), primaryButtonOnClick: state.hasMappings ? state.startImport : undefined, ...(isMobile ? { primaryButtonProps: { disabled: !state.hasMappings } } : { primaryButtonTooltipProps: !state.hasMappings ? { content: t('cairo.import.noMappingsTooltip') } : undefined, }), secondaryButtonText: t('cairo.import.cancel'), secondaryButtonOnClick: handleClose, closeButtonProps: { onClick: handleClose, autoFocus: true, }, onRequestClose: handleClose, }; } if (currentStep === 'summary') { const { succeeded, failed } = state.result; const hasFailures = failed > 0; return { title: t('cairo.import.summaryTitle', { imported: String(succeeded), total: state.totalCount, }), children: , showFooterDivider: false, // When rows failed, "Download CSV" is the primary (emphasized) action and // "Close" the secondary — the user's next step is to fix the failures. A // fully successful import has nothing to download, so "Close" is primary // and stands alone. ...(hasFailures ? { primaryButtonText: t('cairo.import.downloadCsv'), primaryButtonOnClick: state.downloadFailedRows, secondaryButtonText: t('cairo.import.close'), secondaryButtonOnClick: state.done, } : { primaryButtonText: t('cairo.import.close'), primaryButtonOnClick: state.done, }), closeButtonProps: { onClick: state.done, autoFocus: true }, onRequestClose: state.done, }; } const hasError = state.importStatus.isError; return { title: hasError ? t('cairo.import.failedTitle') : t('cairo.import.progressTitle'), children: , showFooterDivider: false, primaryButtonText: hasError ? t('cairo.import.tryAgain') : t('cairo.import.importing'), primaryButtonOnClick: hasError ? state.startImport : undefined, primaryButtonProps: { disabled: !hasError }, secondaryButtonText: state.isRestoring ? t('cairo.import.restoring') : t('cairo.import.cancel'), secondaryButtonOnClick: state.close, secondaryButtonProps: { disabled: state.isRestoring }, closeButtonProps: { onClick: state.close }, onRequestClose: state.isRestoring ? undefined : state.close, }; }