@vpdev2/metakyc-sdk 1.0.78 → 1.0.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/types/enums.ts","../src/types/applicant.ts","../src/types/upload-document.ts","../src/types/appropriateness-test.ts","../src/types/risk-scoring.ts","../src/types/investor-categorization.ts","../src/types/form-config.ts","../src/types/theme.ts","../src/client/config.ts","../src/client/endpoint-builder.ts","../src/client/error-handler.ts","../src/client/http-client.ts","../src/services/applicant.service.ts","../src/services/questionnaire.service.ts","../src/services/upload-document.service.ts","../src/services/appropriateness-test.service.ts","../src/services/overview.service.ts","../src/services/risk-scoring.service.ts","../src/services/identity.service.ts","../src/services/base-information.service.ts","../src/services/investor-categorization.service.ts","../src/theme/presets.ts","../src/services/theme.service.ts","../src/state/event-emitter.ts","../src/state/workflow-state.ts","../src/state/step-router.ts","../src/state/workflow-orchestrator.ts","../src/identity/load-script.ts","../src/identity/providers/sumsub.ts","../src/identity/providers/onfido.ts","../src/identity/providers/sardin-ai.ts","../src/identity/provider-manager.ts","../src/theme/theme-manager.ts","../src/context/MetaKYCContext.tsx","../src/context/MetaKYCProvider.tsx","../src/context/useMetaKYC.ts","../src/utils/file.ts","../src/utils/cn.ts","../src/utils/storage.ts","../src/hooks/useKycWorkflow.ts","../src/hooks/useQuestionnaire.ts","../src/hooks/useUploadDocument.ts","../src/hooks/useAppropriatenessTest.ts","../src/hooks/useOverview.ts","../src/hooks/useIdentityVerification.ts","../src/hooks/useRiskScoring.ts","../src/hooks/useApplicant.ts","../src/components/core/Button.tsx","../src/components/core/Input.tsx","../src/components/core/Card.tsx","../src/components/core/Badge.tsx","../src/components/core/Spinner.tsx","../src/components/core/Select.tsx","../src/components/core/MultiSelect.tsx","../src/components/core/SearchableSelect.tsx","../src/components/core/FileUpload.tsx","../src/components/core/PhoneInput.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/chevron-left.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../src/components/steps/QuestionnaireStep.tsx","../src/components/steps/UploadDocumentStep.tsx","../src/components/steps/OverviewStep.tsx","../src/components/steps/RiskScoringStep.tsx","../src/components/steps/InvestorCategorizationStep.tsx","../src/components/steps/AppropriatenessTestStep.tsx","../src/components/identity/IdentityVerificationStep.tsx","../src/components/status/KycStatusDisplay.tsx","../src/components/Logo.tsx","../src/components/Header.tsx","../src/components/CreateApplicantForm.tsx","../src/components/KycWorkflow.tsx","../src/validation/questionnaire-schema.ts","../src/validation/upload-document-schema.ts","../src/validation/risk-scoring-schema.ts","../src/validation/appropriateness-schema.ts"],"sourcesContent":["/**\n * Workflow step action types\n * Defines all possible workflow steps in the KYC process\n */\nexport enum WorkflowStepAction {\n IdentitySdk = 0,\n RiskScoring = 1,\n Questionaries = 2,\n AdditionalData = 3,\n AppropriatenessTest = 4,\n UploadDocument = 5,\n ManualReview = 6,\n Overview = 7,\n InvestorCategorization = 8,\n}\n\n/**\n * Workflow result types\n * Indicates the overall result/status of a workflow\n */\nexport enum WorkflowResultType {\n NotStarted = 0,\n InProgress = 1,\n Success = 2,\n PartialSuccess = 3,\n Failed = 4,\n Skipped = 5,\n AdminReview = 6,\n SkippedAndAdminReview = 7,\n}\n\n/**\n * Applicant progress status\n * Tracks the current status of an applicant's workflow progress\n */\nexport enum ApplicantProgressStatus {\n None = 0,\n InProgress = 1,\n Finished = 2,\n OnHold = 3,\n IdentityPending = 4,\n}\n\n/**\n * Reason for applicant progress being on hold\n */\nexport enum ApplicantProgressOnHoldReason {\n None = 0,\n RepresentativeKYC = 1,\n ManualRiskCriteria = 2,\n UploadDocumentReview = 3,\n AdminReview = 4,\n}\n\n/**\n * Risk level assessment\n */\nexport enum RiskLevel {\n LowRisk = 0,\n MediumRisk = 1,\n HighRisk = 2,\n Alert = 3,\n}\n\n/**\n * KYC status\n */\nexport enum KycStatus {\n None = 0,\n Pending = 1,\n Approved = 2,\n Rejected = 3,\n ResendRequested = 4,\n Unknown = 5,\n InProgress = 6,\n}\n\n/**\n * Review status\n */\nexport enum ReviewStatus {\n Approved = 0,\n Reject = 1,\n UnderReview = 2,\n Closed = 3,\n AdminReview = 4,\n New = 5,\n InProgress = 6,\n}\n\n/**\n * Applicant status\n */\nexport enum ApplicantStatus {\n ProviderResultPending = 0,\n ProviderResultReceived = 1,\n Canceled = 2,\n ExtendedToNewApplicant = 3,\n}\n\n/**\n * KYC process status\n */\nexport enum KycProcessStatus {\n None = 0,\n ProviderResultPending = 1,\n ProviderResultReceived = 2,\n Canceled = 3,\n}\n\n/**\n * Identity verification provider types\n * IMPORTANT: These values MUST match the backend enum exactly!\n */\nexport enum IdentityVerificationProvider {\n Onfido = 0,\n Sumsub = 2, // Backend uses 2, not 1!\n SardinAI = 3, // Backend uses 3, not 2!\n}\n\n/**\n * User type\n */\nexport enum UserType {\n Individual = 0,\n Company = 1,\n}\n","/**\n * Gender type\n */\nexport enum GenderType {\n Male = 0,\n Female = 1,\n Other = 2,\n}\n\n/**\n * Tax country information\n */\nexport interface TaxCountry {\n country: string;\n taxNumber: string;\n}\n\n/**\n * Additional data for applicant\n */\nexport interface ApplicantAdditionalData {\n paramName: string;\n value: string;\n}\n\n/**\n * Applicant registration request input (Individual)\n */\nexport interface ApplicantRegistrationRequestInput {\n applicantId?: number | null;\n ownerClientId?: number | null;\n workflowKey: string;\n firstName: string;\n lastName: string;\n title?: string;\n email: string;\n dateOfBirth?: string;\n phonenumber: string;\n externalRefId: string; // Required: must always be provided\n mobileCountryCode?: string;\n street?: string;\n streetNumber?: string;\n zip?: string;\n city?: string;\n country?: string;\n nationality?: string;\n otherNationality?: string[];\n defaultLanguage?: string;\n taxCountry?: string;\n placeOfBirth?: string;\n countryOfBirth?: string;\n salutation?: GenderType | null;\n educationLevel?: string;\n occupation?: string;\n taxNumber?: string;\n otherTaxCountries?: TaxCountry[];\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * Company applicant registration request input\n */\nexport interface CompanyApplicantRegistrationRequestInput {\n applicantId?: number | null;\n ownerClientId?: number | null;\n workflowKey: string;\n companyName: string;\n companyRegistrationNumber: string;\n companyEmail: string;\n companyPhone: string;\n companyCountry?: string;\n companyCity?: string;\n companyStreet?: string;\n companyZip?: string;\n legalForm?: string;\n industry?: string;\n externalRefId?: string;\n defaultLanguage?: string;\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * Applicant request data DTO (nested in ApplicantDataDto)\n */\nexport interface ApplicantRequestDataDto {\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n dateOfBirth?: string;\n salutation?: string;\n title?: string;\n phonenumber: string;\n mobileCountryCode?: string;\n street?: string;\n streetNumber?: string;\n zip?: string;\n city?: string;\n country?: string;\n nationality?: string;\n countryOfBirth?: string;\n placeOfBirth?: string;\n taxCountry?: string;\n taxNumber?: string;\n educationLevel?: string;\n occupation?: string;\n defaultLanguage?: string;\n isCompanyRepresentative: boolean;\n otherNationalities?: string[];\n otherTaxResidencies?: string[];\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * A single questionnaire question result (from GetApplicantData)\n */\nexport interface QuestionnaireResultItem {\n question: string;\n answers: string[];\n}\n\n/**\n * A single risk criterion result (from GetApplicantData)\n */\nexport interface RiskCriteriaResultItem {\n riskCriteriaId?: number;\n riskCriteria?: string;\n answer?: string;\n}\n\n/**\n * A risk scoring plan result (from GetApplicantData)\n */\nexport interface RiskScoringResultItem {\n riskScoringPlanId?: number;\n totalScore?: number;\n riskLevel?: number;\n riskCriteriaResults?: RiskCriteriaResultItem[];\n}\n\n/**\n * Applicant data DTO (full response from GetApplicantData)\n */\nexport interface ApplicantDataDto {\n id: number;\n providerTokenObject?: string;\n applicantStatus?: number;\n reviewStatus?: number;\n kycStatus?: number;\n storageStatus?: number;\n providerResult?: string;\n externalRefId?: string;\n workflowId: number;\n workflowName: string;\n workflowColor?: string;\n riskLevel?: number;\n relatedApplicantId?: number;\n applicantRequestData?: ApplicantRequestDataDto;\n companyApplicantRequestData?: any;\n applicantDocuments?: any[];\n riskScoringResults?: RiskScoringResultItem[];\n questionnaireResults?: QuestionnaireResultItem[];\n uploadDocumentResults?: any[];\n appropriatenessTestResults?: any[];\n kycRecords?: any[];\n progressStatus?: number;\n onHoldReason?: number;\n}\n\n/**\n * Duplicate applicant input\n */\nexport interface DuplicateApplicantInput {\n sourceApplicantId: number;\n newWorkflowKey: string;\n}\n","/**\n * File type enum\n */\nexport enum FileType {\n Image = 0,\n Video = 1,\n PDF = 2,\n OfficePDF = 3,\n Custom = 4,\n}\n\n/**\n * Document review status\n */\nexport enum DocumentReviewStatus {\n Pending = 0,\n Approved = 1,\n Rejected = 2,\n RequiresRevision = 3,\n}\n\n/**\n * Upload document file DTO\n */\nexport interface UploadDocumentFileDto {\n id: number;\n name: string;\n displayName: string;\n subtitle?: string;\n fileType: FileType;\n maxEachFileSizeByte: number;\n allowedTypes?: string;\n multipleFile: boolean;\n isRequired: boolean;\n order: number;\n}\n\n/**\n * Upload document output DTO\n */\nexport interface UploadDocumentOutputDto {\n id: number;\n name: string;\n displayName: string;\n subtitle: string;\n description: string;\n uploadDocumentFiles: UploadDocumentFileDto[];\n}\n\n/**\n * Upload document file result\n */\nexport interface UploadDocumentFileResult {\n fileName: string;\n fileData: string; // base64\n}\n\n/**\n * Upload document result\n */\nexport interface UploadDocumentResult {\n uploadDocumentFileId: number;\n valueList: UploadDocumentFileResult[];\n}\n\n/**\n * Fill upload document input\n */\nexport interface FillUploadDocumentInput {\n applicantId: number;\n uploadDocumentId: number;\n uploadDocumentResults: UploadDocumentResult[];\n}\n\n/**\n * Review upload document DTO\n */\nexport interface ReviewUploadDocumentDto {\n applicantId: number;\n uploadDocumentResultId: number;\n status: DocumentReviewStatus;\n reviewNotes?: string;\n}\n","/**\n * Appropriateness question output DTO (matches backend)\n */\nexport interface AppropriatenessQuestionOutputDto {\n id: number;\n name: string;\n groupName: string;\n question: string;\n answers: string[]; // Array of shuffled answers (correct + wrong answers)\n}\n\n/**\n * Appropriateness test output DTO (matches backend)\n */\nexport interface AppropriatenessTestOutputDto {\n id: number;\n applicantId: number;\n name: string;\n displayName: string;\n subtitle: string;\n description: string;\n testDurationSec: number;\n testAllowedMaxTry: number;\n testCorrectAnswerPassLimit: number;\n totalFailedTries: number;\n totalQuestionCount: number;\n waitTimeSpanForNextTry: string; // TimeSpan as ISO string (e.g., \"00:05:00\")\n appropriatenessQuestions: AppropriatenessQuestionOutputDto[];\n}\n\n/**\n * Appropriateness question result\n */\nexport interface AppropriatenessQuestionResult {\n appropriatenessQuestionId: number;\n value: string;\n}\n\n/**\n * Fill appropriateness test input\n */\nexport interface FillAppropriatenessTestInput {\n applicantId: number;\n appropriatenessTestId: number;\n appropriatenessQuestionResults: AppropriatenessQuestionResult[];\n}\n\n/**\n * Fill appropriateness test result\n */\nexport interface FillAppropriatenessTestResult {\n message: string;\n}\n\n// Legacy types (kept for compatibility)\nexport enum AppropriatenessQuestionType {\n SingleChoice = 0,\n MultipleChoice = 1,\n Text = 2,\n}\n\nexport interface AppropriatenessAnswerDto {\n id: number;\n text: string;\n value: string;\n order: number;\n score?: number;\n}\n\nexport interface AppropriatenessQuestionDto {\n id: number;\n text: string;\n questionType: AppropriatenessQuestionType;\n order: number;\n isRequired: boolean;\n answers: AppropriatenessAnswerDto[];\n}\n","import { RiskLevel } from './enums';\n\n/**\n * Value data type for risk criteria\n */\nexport enum ValueDataType {\n String = 0,\n Integer = 1,\n /** Backend value 2 — Money/currency type; triggers locale-aware number formatting in options */\n Money = 2,\n Boolean = 3,\n Date = 4,\n Country = 5,\n DigitOnly = 6,\n}\n\n/**\n * Risk criteria type\n */\nexport enum RiskCriteriaType {\n Text = 0,\n Radio = 1,\n Checkbox = 2,\n Dropdown = 3,\n Country = 4,\n}\n\n/**\n * Built-in criteria type enum\n */\nexport enum CriteriaBuiltInType {\n None = 0,\n Country = 1,\n // Add other built-in types as needed\n}\n\n/**\n * Risk criteria answer DTO (legacy - for full admin interface)\n */\nexport interface RiskCriteriaAnswerDto {\n id: number;\n text: string;\n value: string;\n score: number;\n order: number;\n}\n\n/**\n * Risk criteria DTO (light version from GetCriterias API)\n */\nexport interface RiskCriteriaDto {\n id: number;\n name: string;\n displayName: string;\n description?: string;\n builtInType?: CriteriaBuiltInType;\n valueDataType: ValueDataType;\n defaultValues?: string[]; // Simple string array from API\n multipleValue: boolean; // Can select multiple values\n hasCustomValue: boolean;\n hideCriteriaThresholds: boolean;\n isRequired: boolean;\n pageNumber?: number;\n // Legacy fields (kept for compatibility)\n criteriaType?: RiskCriteriaType;\n order?: number;\n answers?: RiskCriteriaAnswerDto[];\n min?: number;\n max?: number;\n regex?: string;\n errorMessage?: string;\n}\n\n/**\n * Criteria value input (matches C# DTO)\n */\nexport interface CriteriaValueInput {\n riskCriteriaId: number;\n values: string[]; // Array of strings, not single string\n}\n\n/**\n * Risk calculation input (matches C# DTO exactly)\n */\nexport interface RiskCalculationInput {\n applicantId?: number;\n riskPlanId?: number;\n criteriaValueInputs: CriteriaValueInput[];\n}\n\n// Legacy types (kept for compatibility)\nexport interface RiskCalculationItem {\n criteriaId: number;\n value: string;\n}\n\n/**\n * Risk scoring result\n */\nexport interface RiskScoringResult {\n success: boolean;\n riskLevel: RiskLevel;\n totalScore: number;\n message?: string;\n}\n\n/**\n * Risk scoring plan DTO\n */\nexport interface RiskScoringPlanDto {\n id: number;\n name: string;\n displayName: string;\n description?: string;\n lowRiskThreshold: number;\n mediumRiskThreshold: number;\n highRiskThreshold: number;\n}\n","/**\n * Investor categorization type (matches backend enum)\n */\nexport enum InvestorCategorizationType {\n Individual = 0,\n Sophisticated = 1,\n HighNetWorth = 2,\n Business = 3,\n}\n\n/**\n * Investor categorization input\n */\nexport interface InvestorCategorizationInput {\n applicantId: number;\n investorType: InvestorCategorizationType;\n}\n\n/**\n * Set investor categorization result\n */\nexport interface SetInvestorCategorizationResult {\n success: boolean;\n message?: string;\n}\n\n// Legacy types (kept for compatibility)\nexport enum InvestorCategoryType {\n Retail = 0,\n Professional = 1,\n EligibleCounterparty = 2,\n}\n\nexport interface InvestorCategorizationResult {\n success: boolean;\n category: InvestorCategoryType;\n message?: string;\n}\n","import type { ApplicantFormField } from '../client/config';\n\n// ── Countries type enum (mirrors backend CountiresType) ───────────────────────\n\nexport const CountriesType = {\n Nationality: 10,\n Address: 20,\n CountryOfBirth: 30,\n PhoneNumber: 40,\n UboAddress: 50,\n} as const;\n\nexport type CountriesTypeValue = typeof CountriesType[keyof typeof CountriesType];\n\n// ── Field metadata ────────────────────────────────────────────────────────────\n\nexport interface FieldMeta {\n label: string;\n type: 'text' | 'email' | 'tel' | 'date' | 'select' | 'multiselect';\n /** For select/multiselect country fields: the default CountriesType passed to the API */\n countriesType?: CountriesTypeValue;\n}\n\n// ── Review page field configuration ──────────────────────────────────────────\n\n/** A single field entry for the identity review page */\nexport interface ReviewFieldEntry {\n /** Built-in field name from FIELD_METADATA (e.g. 'firstName', 'country') */\n name: string;\n /** true = rendered as an editable input; false / absent = read-only display */\n editable?: boolean;\n /** Optional label override */\n displayText?: string;\n /** Column span in the 4-column grid (1=quarter, 2=half, 3=three-quarter, 4=full) */\n colSpan?: 1 | 2 | 3 | 4;\n}\n\nexport const FIELD_METADATA: Record<string, FieldMeta> = {\n firstName: { label: 'First Name', type: 'text' },\n lastName: { label: 'Last Name', type: 'text' },\n email: { label: 'Email', type: 'email' },\n phonenumber: { label: 'Phone Number', type: 'tel' },\n dateOfBirth: { label: 'Date of Birth', type: 'date' },\n salutation: { label: 'Salutation', type: 'select' },\n title: { label: 'Title', type: 'text' },\n mobileCountryCode: { label: 'Mobile Country Code', type: 'select', countriesType: CountriesType.PhoneNumber },\n street: { label: 'Street', type: 'text' },\n streetNumber: { label: 'Street Number', type: 'text' },\n zip: { label: 'ZIP / Postal Code', type: 'text' },\n city: { label: 'City', type: 'text' },\n country: { label: 'Country', type: 'select', countriesType: CountriesType.Address },\n nationality: { label: 'Nationality', type: 'select', countriesType: CountriesType.Nationality },\n otherNationality: { label: 'Other Nationalities', type: 'multiselect', countriesType: CountriesType.Nationality },\n countryOfBirth: { label: 'Country of Birth', type: 'select', countriesType: CountriesType.CountryOfBirth },\n placeOfBirth: { label: 'Place of Birth', type: 'text' },\n taxCountry: { label: 'Tax Country', type: 'select', countriesType: CountriesType.Address },\n taxNumber: { label: 'Tax Number', type: 'text' },\n defaultLanguage: { label: 'Default Language', type: 'select' },\n educationLevel: { label: 'Education Level', type: 'text' },\n occupation: { label: 'Occupation', type: 'text' },\n};\n\nexport const DEFAULT_VISIBLE_FIELDS: ApplicantFormField[] = [\n 'firstName',\n 'lastName',\n 'email',\n 'phonenumber',\n 'dateOfBirth',\n];\n\nexport const ALLOWED_LANGUAGES: Array<{ value: string; label: string }> = [\n { value: 'EN', label: 'English' },\n { value: 'DE', label: 'German' },\n { value: 'FR', label: 'French' },\n { value: 'ES', label: 'Spanish' },\n { value: 'IT', label: 'Italian' },\n { value: 'PT', label: 'Portuguese' },\n { value: 'NL', label: 'Dutch' },\n { value: 'PL', label: 'Polish' },\n { value: 'RU', label: 'Russian' },\n { value: 'ZH', label: 'Chinese' },\n { value: 'JA', label: 'Japanese' },\n { value: 'AR', label: 'Arabic' },\n { value: 'TR', label: 'Turkish' },\n { value: 'SV', label: 'Swedish' },\n { value: 'DA', label: 'Danish' },\n { value: 'FI', label: 'Finnish' },\n { value: 'NO', label: 'Norwegian' },\n];\n\n// ── Multi-page form configuration (set via Panel SDK Config) ──────────────────\n\n/**\n * A single field entry inside a form page.\n * Either refers to a built-in applicant field (name) or a custom field.\n */\nexport interface FormFieldEntry {\n /** Built-in field identifier: 'firstName', 'lastName', 'email', etc. Omit for custom fields. */\n name?: string;\n /** Column span in the 4-column grid. 1 = quarter, 2 = half, 3 = three-quarter, 4 = full. */\n colSpan: 1 | 2 | 3 | 4;\n /** Whether this is a custom out-of-scope field */\n isCustom?: boolean;\n /** Type of custom field */\n customType?: 'text' | 'checkbox' | 'link_checkbox' | 'link' | 'group_checkbox' | 'radio_group' | 'paragraph' | 'html' | 'br';\n /** Override the label shown to the user. If empty, falls back to the default field name/label. */\n displayText?: string;\n /** Display label for the custom field */\n label?: string;\n /** Key under which the value is stored in applicantAdditionalData.paramName */\n paramName?: string;\n /** Whether the field is mandatory */\n required?: boolean;\n /** For link_checkbox: URL the hyperlink points to */\n linkUrl?: string;\n /** For link_checkbox: text of the hyperlink (e.g. \"Terms & Conditions\") */\n linkText?: string;\n /** For group_checkbox / radio_group: the selectable options */\n options?: Array<{ value: string; label: string }>;\n /**\n * For group_checkbox: when true only one option can be checked at a time\n * (mutually exclusive checkboxes, distinct from radio_group in appearance).\n */\n singleSelect?: boolean;\n /**\n * For country-type built-in fields: overrides the default CountriesType used when fetching\n * the country list from the API (e.g. Nationality=10, Address=20, CountryOfBirth=30, PhoneNumber=40).\n * If omitted, the SDK uses the default from FIELD_METADATA for that field.\n */\n countriesType?: number;\n /**\n * Optional help/tooltip text shown next to the field as a clickable ? button.\n * Applies to both built-in and custom fields.\n */\n helpText?: string;\n /**\n * Review-page mode only.\n * true = field is rendered as an editable input; false / absent = rendered as read-only text.\n */\n editable?: boolean;\n}\n\n/**\n * A single page of the applicant form with optional header text and an ordered list of fields.\n */\nexport interface FormPage {\n title?: string;\n subtitle?: string;\n description?: string;\n fields: FormFieldEntry[];\n /**\n * If set, this page is only shown when the custom field with this paramName has value 'true'\n * (or any non-empty value for radio/text). Typically tied to a checkbox on a previous page.\n */\n conditionalOn?: string;\n /**\n * Optional help/tooltip text shown as a ? button next to the conditional gate checkbox.\n */\n conditionalHelpText?: string;\n}\n","/**\n * Logo configuration\n */\nexport interface LogoConfig {\n url?: string;\n width?: string;\n height?: string;\n alt?: string;\n visible?: boolean; // Show/hide logo\n}\n\n/**\n * Color palette configuration\n */\nexport interface ColorPalette {\n // Primary brand colors\n primary: string;\n primaryHover: string;\n primaryLight: string;\n primaryDark: string;\n \n // Secondary colors\n secondary: string;\n secondaryHover: string;\n \n // Semantic colors\n success: string;\n warning: string;\n danger: string;\n info: string;\n \n // UI colors\n background: string;\n surface: string;\n border: string;\n \n // Text colors\n textPrimary: string;\n textSecondary: string;\n textMuted: string;\n\n // Input-specific overrides (optional — fall back to general colors when absent)\n inputBg?: string; // input background (→ --metakyc-input-bg)\n inputText?: string; // input text color (→ --metakyc-input-text)\n inputBorder?: string; // input border (→ --metakyc-input-border)\n inputBorderFocus?: string; // focus ring/border (→ --metakyc-input-border-focus)\n inputPlaceholder?: string; // placeholder text (→ --metakyc-input-placeholder)\n}\n\n/**\n * Typography configuration\n */\nexport interface TypographyConfig {\n fontFamily: string;\n headingFont?: string;\n fontSize?: {\n xs: string;\n sm: string;\n base: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n };\n fontWeight?: {\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n };\n}\n\n/**\n * Spacing and layout configuration\n */\nexport interface SpacingConfig {\n borderRadius: string;\n cardPadding: string;\n inputHeight: string;\n}\n\n/**\n * Complete theme configuration\n */\nexport interface ThemeConfig {\n /** Theme name/identifier */\n name?: string;\n \n /** Title/heading for the SDK */\n title?: string;\n \n /** Logo configuration */\n logo?: LogoConfig;\n \n /** Color palette */\n colors: ColorPalette;\n \n /** Typography settings */\n typography?: TypographyConfig;\n \n /** Spacing and layout */\n spacing?: SpacingConfig;\n \n /** Custom CSS to inject */\n customCSS?: string;\n \n /** Dark mode color overrides */\n darkMode?: {\n colors: Partial<ColorPalette>;\n };\n\n /** Applicant form visible fields (ordered) from backend config */\n applicantFormVisibleFields?: string[];\n\n /** Applicant form client-required fields from backend config */\n applicantFormRequiredFields?: string[];\n\n /** Allowed language codes for the Default Language dropdown e.g. ['EN','DE'] */\n allowedLanguages?: string[];\n\n /** Multi-page applicant form layout configuration */\n applicantFormPages?: import('./form-config').FormPage[];\n\n /** Identity review page — single FormPage with fields + editable flags */\n reviewPageFields?: import('./form-config').FormPage[];\n\n /**\n * When true the identity review/confirmation page is skipped entirely.\n * The SDK auto-requests identity on mount and shows the provider UI directly.\n */\n reviewPageDisabled?: boolean;\n}\n\n\n/**\n * Predefined theme presets\n */\nexport enum ThemePreset {\n Default = 'default',\n Corporate = 'corporate',\n Fintech = 'fintech',\n Healthcare = 'healthcare',\n Modern = 'modern',\n Minimal = 'minimal',\n}\n\n/**\n * Theme configuration from backend\n */\nexport interface ThemeConfigurationDto {\n tenantId?: number;\n isEnabled: boolean;\n preset?: ThemePreset;\n title?: string;\n logo?: LogoConfig;\n colors?: Partial<ColorPalette>;\n typography?: TypographyConfig;\n spacing?: SpacingConfig;\n customCSS?: string;\n darkMode?: {\n colors: Partial<ColorPalette>;\n };\n applicantFormVisibleFields?: string[];\n applicantFormRequiredFields?: string[];\n allowedLanguages?: string[];\n applicantFormPages?: import('./form-config').FormPage[];\n reviewPageFields?: import('./form-config').FormPage[];\n reviewPageDisabled?: boolean;\n}\n\n","/**\n * Endpoint pattern types\n * - host-controller: /api/[Controller]/[Action]\n * - application-service: /services/app/[Service]/[Method]\n */\nexport type EndpointPattern = 'host-controller' | 'application-service' | 'custom';\n\n/**\n * Custom endpoint paths configuration\n */\nexport interface CustomEndpointPaths {\n [key: string]: string;\n}\n\n/**\n * Endpoint configuration\n */\nexport interface EndpointConfig {\n pattern: EndpointPattern;\n customPaths?: CustomEndpointPaths;\n}\n\n/**\n * SardinAI provider configuration\n */\nexport interface SardinAIProviderConfig {\n clientId: string;\n clientSecret?: string;\n environment: 'sandbox' | 'production';\n region?: 'us' | 'eu' | 'ca' | 'au';\n enableBiometrics?: boolean;\n enablePortScanning?: boolean;\n flow?: string;\n}\n\n/**\n * Identity provider configurations\n */\nexport interface IdentityProviderConfigs {\n sardinai?: SardinAIProviderConfig;\n sumsub?: Record<string, any>;\n onfido?: Record<string, any>;\n}\n\n/**\n * Applicant form field name type\n */\nexport type ApplicantFormField =\n | 'firstName'\n | 'lastName'\n | 'title'\n | 'email'\n | 'dateOfBirth'\n | 'phonenumber'\n | 'mobileCountryCode'\n | 'street'\n | 'streetNumber'\n | 'zip'\n | 'city'\n | 'country'\n | 'nationality'\n | 'otherNationality'\n | 'defaultLanguage'\n | 'taxCountry'\n | 'placeOfBirth'\n | 'countryOfBirth'\n | 'salutation'\n | 'educationLevel'\n | 'occupation'\n | 'taxNumber'\n | 'externalRefId';\n\n/**\n * Applicant form configuration\n */\nexport interface ApplicantFormConfig {\n /** List of fields to show in the form. If not specified, shows default fields */\n visibleFields?: ApplicantFormField[];\n \n /** Default workflow key for applicant creation. Can be overridden per component instance */\n workflowKey?: string;\n \n /** Default external reference ID. Required if not shown in visible fields. */\n externalRefId?: string;\n\n /** Pre-fill the email field in the applicant form (e.g. for testing or SSO flows). */\n email?: string;\n}\n\n/**\n * MetaKYC client configuration\n */\nexport interface MetaKYCClientConfig {\n /** API key for authentication */\n apiKey: string;\n\n /** Tenant ID */\n tenantId: number;\n\n /** Base URL of the MetaKYC API */\n baseUrl: string;\n\n /** Endpoint configuration */\n endpoints?: EndpointConfig;\n\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n\n /** Number of retry attempts for failed requests (default: 3) */\n retries?: number;\n\n /** Locale/language code (default: 'en') */\n locale?: string;\n\n /** Identity provider configurations */\n identityProviders?: IdentityProviderConfigs;\n\n /** Applicant form configuration */\n applicantForm?: ApplicantFormConfig;\n\n /** Theme configuration (optional - will fetch from backend if not provided) */\n theme?: any; // Imported dynamically to avoid circular dependency\n}\n\n/**\n * Default configuration values\n */\nexport const defaultConfig: Partial<MetaKYCClientConfig> = {\n timeout: 30000,\n retries: 3,\n locale: 'en',\n endpoints: {\n pattern: 'host-controller',\n },\n};\n","import { EndpointConfig } from './config';\n\n/**\n * Builds API endpoint URLs based on the configured pattern\n */\nexport class EndpointBuilder {\n constructor(private config: EndpointConfig) {}\n\n /**\n * Build an endpoint URL\n * @param controller - Controller name (e.g., 'Applicant')\n * @param action - Action/method name (e.g., 'GetApplicantProgress')\n * @returns The full endpoint path\n */\n build(controller: string, action: string): string {\n // Check for custom path first\n const customKey = `${controller}.${action}`;\n if (this.config.customPaths && this.config.customPaths[customKey]) {\n return this.config.customPaths[customKey];\n }\n\n // Build based on pattern\n switch (this.config.pattern) {\n case 'host-controller':\n return `/api/${controller}/${action}`;\n\n case 'application-service':\n // For application service pattern, convert controller/action to service/method\n const serviceName = this.getServiceName(controller);\n return `/services/app/${serviceName}/${action}`;\n\n case 'custom':\n throw new Error(\n `Custom endpoint path not found for ${customKey}. Please provide it in customPaths.`\n );\n\n default:\n throw new Error(`Unknown endpoint pattern: ${this.config.pattern}`);\n }\n }\n\n /**\n * Convert controller name to service name for application-service pattern\n */\n private getServiceName(controller: string): string {\n // Map controller names to service names\n const serviceMap: Record<string, string> = {\n Applicant: 'MetaKYCVerification',\n Questionnaire: 'MetaKYCVerification',\n UploadDocument: 'MetaKYCVerification',\n AppropriatenessTest: 'MetaKYCVerification',\n BaseInformation: 'MetaKYCVerification',\n };\n\n return serviceMap[controller] || controller;\n }\n}\n","import { ApiError } from '../types';\n\n/**\n * Custom error class for MetaKYC API errors\n */\nexport class MetaKYCError extends Error {\n public response?: any;\n \n constructor(\n message: string,\n public code?: number,\n public details?: string,\n public validationErrors?: Array<{ message: string; members: string[] }>,\n response?: any\n ) {\n super(message);\n this.name = 'MetaKYCError';\n this.response = response;\n Object.setPrototypeOf(this, MetaKYCError.prototype);\n }\n}\n\n/**\n * Handles API errors and converts them to MetaKYCError\n */\nexport class ErrorHandler {\n /**\n * Process an error from the API response\n */\n static handleApiError(error: ApiError): MetaKYCError {\n return new MetaKYCError(\n error.message || 'An unknown error occurred',\n error.code,\n error.details || undefined,\n error.validationErrors || undefined\n );\n }\n\n /**\n * Process an Axios error\n */\n static handleAxiosError(error: any): MetaKYCError {\n if (error.response) {\n // Server responded with error status\n const data = error.response.data;\n\n if (data && data.error) {\n return new MetaKYCError(\n data.error.message || 'An unknown error occurred',\n data.error.code,\n data.error.details || undefined,\n data.error.validationErrors || undefined,\n error.response\n );\n }\n\n // Check for result.message (common in ABP framework)\n if (data && data.result && data.result.message) {\n return new MetaKYCError(\n data.result.message,\n error.response.status,\n `HTTP ${error.response.status}: ${error.response.statusText}`,\n undefined,\n error.response\n );\n }\n\n return new MetaKYCError(\n data?.message || error.message || 'Request failed',\n error.response.status,\n `HTTP ${error.response.status}: ${error.response.statusText}`,\n undefined,\n error.response\n );\n } else if (error.request) {\n // Request was made but no response\n return new MetaKYCError(\n 'No response from server',\n 0,\n 'The request was made but no response was received. Please check your network connection.'\n );\n } else {\n // Something else happened\n return new MetaKYCError(error.message || 'An unexpected error occurred', 0, error.toString());\n }\n }\n\n /**\n * Check if an error is a MetaKYCError\n */\n static isMetaKYCError(error: any): error is MetaKYCError {\n return error instanceof MetaKYCError;\n }\n}\n","import axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport { MetaKYCClientConfig, defaultConfig } from './config';\nimport { EndpointBuilder } from './endpoint-builder';\nimport { ErrorHandler } from './error-handler';\nimport { ApiResponse } from '../types';\n\n/**\n * HTTP client for MetaKYC API\n * Handles all HTTP communication with configurable endpoints\n */\nexport class HttpClient {\n private axiosInstance: AxiosInstance;\n private endpointBuilder: EndpointBuilder;\n private config: MetaKYCClientConfig;\n\n constructor(config: MetaKYCClientConfig) {\n this.config = { ...defaultConfig, ...config };\n\n // Initialize endpoint builder\n this.endpointBuilder = new EndpointBuilder(this.config.endpoints!);\n\n // Create axios instance\n this.axiosInstance = axios.create({\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor\n this.axiosInstance.interceptors.request.use(\n (config) => {\n // Add required headers\n config.headers['Abp-TenantId'] = this.config.tenantId.toString();\n config.headers['ApiKey'] = this.config.apiKey;\n config.headers['X-API-KEY'] = this.config.apiKey;\n\n // Add locale if provided\n if (this.config.locale) {\n config.headers['Accept-Language'] = this.config.locale;\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n // Add response interceptor\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n // Retry logic for failed requests\n if (error.response?.status >= 500 && !originalRequest._retry) {\n originalRequest._retry = true;\n originalRequest._retryCount = (originalRequest._retryCount || 0) + 1;\n\n if (originalRequest._retryCount < (this.config.retries || 3)) {\n // Wait before retrying (exponential backoff)\n await new Promise((resolve) =>\n setTimeout(resolve, 1000 * originalRequest._retryCount)\n );\n return this.axiosInstance(originalRequest);\n }\n }\n\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Build endpoint URL\n */\n buildEndpoint(controller: string, action: string): string {\n return this.endpointBuilder.build(controller, action);\n }\n\n /**\n * Make a GET request\n */\n async get<T>(controller: string, action: string, params?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.get(url, {\n params,\n });\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a POST request\n */\n async post<T>(controller: string, action: string, data?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.post(url, data);\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a PUT request\n */\n async put<T>(controller: string, action: string, data?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.put(url, data);\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a DELETE request\n */\n async delete<T>(controller: string, action: string, params?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.delete(url, {\n params,\n });\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Handle API response\n */\n private handleResponse<T>(response: AxiosResponse<ApiResponse<T>>): ApiResponse<T> {\n const data = response.data;\n\n // Check if response indicates an error\n if (!data.success && data.error) {\n throw ErrorHandler.handleApiError(data.error);\n }\n\n return data;\n }\n\n /**\n * Get the underlying axios instance for advanced usage\n */\n getAxiosInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n ApplicantRegistrationRequestInput,\n CompanyApplicantRegistrationRequestInput,\n ProgressApplicantResult,\n ProgressApplicantStatusResult,\n ApplicantDataDto,\n DuplicateApplicantInput,\n} from '../types';\n\n/**\n * Applicant service\n * Handles all applicant-related API calls\n */\nexport class ApplicantService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Create a new individual applicant\n */\n async createApplicant(input: ApplicantRegistrationRequestInput): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'ApplicantRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Create a new company applicant\n */\n async createCompanyApplicant(\n input: CompanyApplicantRegistrationRequestInput\n ): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'ApplicantCompanyRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Duplicate an existing applicant with a new workflow\n */\n async duplicateApplicant(input: DuplicateApplicantInput): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'DuplicateApplicantRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Get applicant progress\n */\n async getProgress(applicantId: number): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.get<ProgressApplicantResult>(\n 'Applicant',\n 'GetApplicantProgress',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant progress status (simplified)\n */\n async getProgressStatus(applicantId: number): Promise<ProgressApplicantStatusResult> {\n const response = await this.httpClient.get<ProgressApplicantStatusResult>(\n 'Applicant',\n 'GetApplicantProgressStaus', // Note: typo in API endpoint name\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant data\n */\n async getApplicantData(applicantId: number): Promise<ApplicantDataDto> {\n const response = await this.httpClient.get<ApplicantDataDto>(\n 'Applicant',\n 'GetApplicantData',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant status\n */\n async getApplicantStatus(applicantId: number): Promise<any> {\n const response = await this.httpClient.get(\n 'Applicant',\n 'GetApplicantStatus',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Stop applicant progress\n */\n async stopProgress(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'StopProgress', { applicantId });\n }\n\n /**\n * Move back one step in the workflow\n */\n async progressStepBack(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'ProgressStepBack', { applicantId });\n }\n\n /**\n * Set applicant language\n */\n async setLanguage(applicantId: number, language: string): Promise<void> {\n await this.httpClient.post('Applicant', 'SetApplicantLng', {\n applicantId,\n language,\n });\n }\n\n /**\n * Activate applicant\n */\n async activateApplicant(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'ActivateApplicant', { applicantId });\n }\n\n /**\n * Delete applicant\n */\n async deleteApplicant(applicantId: number): Promise<void> {\n await this.httpClient.delete('Applicant', 'DeleteApplicant', { applicantId });\n }\n\n /**\n * Check if applicant exists by external reference ID\n */\n async checkApplicantExists(externalRefId: string): Promise<boolean> {\n const response = await this.httpClient.get<boolean>(\n 'Applicant',\n 'CheckApplicantIfExists',\n { externalRefId }\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n QuestionnaireOutput,\n FillQuestionnarieInput,\n FillQuestionnairesResult,\n} from '../types';\n\n/**\n * Questionnaire service\n * Handles questionnaire-related API calls\n */\nexport class QuestionnaireService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get questionnaire for an applicant\n */\n async getQuestionnaire(applicantId: number): Promise<QuestionnaireOutput> {\n const response = await this.httpClient.get<QuestionnaireOutput>(\n 'Questionnaire',\n 'GetQuestionnaire',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit questionnaire answers\n */\n async fillQuestionnaire(input: FillQuestionnarieInput): Promise<FillQuestionnairesResult> {\n const response = await this.httpClient.post<FillQuestionnairesResult>(\n 'Applicant',\n 'FillQuestionnarie', // Note: typo in API endpoint name\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n UploadDocumentOutputDto,\n FillUploadDocumentInput,\n ReviewUploadDocumentDto,\n} from '../types';\n\n/**\n * Upload document service\n * Handles document upload-related API calls\n */\nexport class UploadDocumentService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get upload document requirements for an applicant\n */\n async getUploadDocument(applicantId: number): Promise<UploadDocumentOutputDto> {\n const response = await this.httpClient.get<UploadDocumentOutputDto>(\n 'UploadDocument',\n 'GetUploadDocument',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit uploaded documents\n */\n async fillUploadDocument(input: FillUploadDocumentInput): Promise<void> {\n await this.httpClient.post('Applicant', 'FillUploadDocument', input);\n }\n\n /**\n * Review uploaded documents (admin function)\n */\n async reviewUploadDocument(input: ReviewUploadDocumentDto): Promise<void> {\n await this.httpClient.post('UploadDocument', 'ReviewUploadDocument', input);\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n FillAppropriatenessTestResult,\n} from '../types';\n\n/**\n * Appropriateness test service\n * Handles appropriateness test-related API calls\n */\nexport class AppropriatenessTestService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get appropriateness test for an applicant\n */\n async getAppropriatenessTest(applicantId: number): Promise<AppropriatenessTestOutputDto> {\n const response = await this.httpClient.get<AppropriatenessTestOutputDto>(\n 'AppropriatenessTest',\n 'GetAppropriatenessTest',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit appropriateness test answers\n */\n async fillAppropriatenessTest(\n input: FillAppropriatenessTestInput\n ): Promise<FillAppropriatenessTestResult> {\n const response = await this.httpClient.post<FillAppropriatenessTestResult>(\n 'Applicant',\n 'FillAppropriatenessTest',\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { OverviewDataDto } from '../types';\n\n/**\n * Overview service\n * Handles overview step-related API calls\n */\nexport class OverviewService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get overview data for an applicant\n */\n async getOverviewData(applicantId: number): Promise<OverviewDataDto> {\n const response = await this.httpClient.get<OverviewDataDto>(\n 'Applicant',\n 'GetOverviewData',\n { ApplicantId: applicantId } // Note: capital 'A' in API\n );\n return response.result;\n }\n\n /**\n * Pass the overview step\n */\n async passOverview(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'PassOverview', { applicantId });\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n RiskCriteriaDto,\n RiskCalculationInput,\n RiskScoringResult,\n RiskScoringPlanDto,\n} from '../types';\n\n/**\n * Risk scoring service\n * Handles risk scoring-related API calls\n */\nexport class RiskScoringService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get risk scoring plan information\n */\n async getRiskScoringPlan(): Promise<RiskScoringPlanDto> {\n const response = await this.httpClient.get<RiskScoringPlanDto>(\n 'Applicant',\n 'GetRiskScoringPlanInfo'\n );\n return response.result;\n }\n\n /**\n * Get risk criteria for scoring\n * Note: Requires applicantId as query parameter\n */\n async getRiskCriterias(applicantId: number): Promise<RiskCriteriaDto[]> {\n const response = await this.httpClient.get<RiskCriteriaDto[]>(\n 'Risk',\n 'GetCriterias',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Submit risk scoring calculation\n */\n async submitRiskScoring(input: RiskCalculationInput): Promise<RiskScoringResult> {\n const response = await this.httpClient.post<RiskScoringResult>(\n 'Applicant',\n 'RiskScoringRequest',\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { IdentityRequest, ApplicantRegistrationRequestOutput } from '../types';\n\n/**\n * Identity service\n * Handles identity verification-related API calls\n */\nexport class IdentityService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Request identity verification for individual applicant\n */\n async identityRequest(input: IdentityRequest): Promise<ApplicantRegistrationRequestOutput> {\n console.log('[IdentityService] Calling IdentityRequest with input:', input);\n const response = await this.httpClient.post<ApplicantRegistrationRequestOutput>(\n 'Applicant',\n 'IdentityRequest',\n input\n );\n console.log('[IdentityService] IdentityRequest response:', response);\n return response.result;\n }\n\n /**\n * Request identity verification for company applicant\n */\n async identityCompanyRequest(input: IdentityRequest): Promise<ApplicantRegistrationRequestOutput> {\n const response = await this.httpClient.post<ApplicantRegistrationRequestOutput>(\n 'Applicant',\n 'IdentityCompanyRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Restart identity verification (individual)\n * Uses IdentityRequest with restart flag\n */\n async restartIdentityRequest(applicantId: number): Promise<ApplicantRegistrationRequestOutput> {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n console.log('[IdentityService] Restarting identity with restart=true:', input);\n return this.identityRequest(input);\n }\n\n /**\n * Restart identity verification (company)\n * Uses IdentityCompanyRequest with restart flag\n */\n async restartIdentityCompanyRequest(applicantId: number): Promise<ApplicantRegistrationRequestOutput> {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n return this.identityCompanyRequest(input);\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { CountryDto, BranchDto, LegalEntityDto } from '../types';\n\n/**\n * Base information service\n * Handles reference data API calls (countries, branches, legal entities)\n */\nexport class BaseInformationService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get all countries\n * @param filter - Optional filter string\n * @param lng - Language code (e.g., 'en', 'de')\n * @param type - Optional country type filter\n */\n async getCountries(filter?: string, lng?: string, type?: number): Promise<CountryDto[]> {\n const response = await this.httpClient.get<CountryDto[]>(\n 'BaseInformation',\n 'GetAllCountries',\n { filter: filter || '', lng: lng || 'en', type }\n );\n return response.result;\n }\n\n /**\n * Get all branches\n */\n async getBranches(): Promise<BranchDto[]> {\n const response = await this.httpClient.get<BranchDto[]>(\n 'BaseInformation',\n 'GetBranches'\n );\n return response.result;\n }\n\n /**\n * Get all legal entities\n */\n async getLegalEntities(): Promise<LegalEntityDto[]> {\n const response = await this.httpClient.get<LegalEntityDto[]>(\n 'BaseInformation',\n 'GetLegalEntities'\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n InvestorCategorizationInput,\n SetInvestorCategorizationResult,\n} from '../types';\n\n/**\n * Investor categorization service\n * Handles investor categorization-related API calls\n */\nexport class InvestorCategorizationService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Set investor categorization\n */\n async setInvestorCategorization(\n input: InvestorCategorizationInput\n ): Promise<SetInvestorCategorizationResult> {\n const response = await this.httpClient.post<SetInvestorCategorizationResult>(\n 'Applicant',\n 'SetInvestorCategorization',\n input\n );\n return response.result;\n }\n\n /**\n * Get investor categorization\n */\n async getInvestorCategorization(applicantId: number): Promise<InvestorCategorizationInput> {\n const response = await this.httpClient.get<InvestorCategorizationInput>(\n 'Applicant',\n 'GetInvestorCategorisation', // Note: British spelling in API\n { applicantId }\n );\n return response.result;\n }\n}\n","import { ThemeConfig, ThemePreset } from '../types/theme';\n\n/**\n * Default theme preset\n */\nexport const defaultTheme: ThemeConfig = {\n name: 'Default',\n title: 'KYC Verification',\n logo: {\n url: '',\n height: '40px',\n visible: true,\n },\n colors: {\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n primaryLight: '#dbeafe',\n primaryDark: '#1e40af',\n \n secondary: '#64748b',\n secondaryHover: '#475569',\n \n success: '#10b981',\n warning: '#f59e0b',\n danger: '#ef4444',\n info: '#3b82f6',\n \n background: '#ffffff',\n surface: '#f9fafb',\n border: '#e5e7eb',\n \n textPrimary: '#111827',\n textSecondary: '#6b7280',\n textMuted: '#9ca3af',\n },\n typography: {\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n },\n fontWeight: {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n },\n spacing: {\n borderRadius: '0.5rem',\n cardPadding: '1.5rem',\n inputHeight: '2.5rem',\n },\n darkMode: {\n colors: {\n background: '#111827',\n surface: '#1f2937',\n border: '#374151',\n textPrimary: '#f9fafb',\n textSecondary: '#d1d5db',\n textMuted: '#9ca3af',\n },\n },\n};\n\n/**\n * Corporate blue theme preset\n */\nexport const corporateTheme: ThemeConfig = {\n name: 'Corporate',\n logo: {\n url: '',\n height: '40px',\n visible: true,\n },\n colors: {\n primary: '#0052CC',\n primaryHover: '#0747A6',\n primaryLight: '#DEEBFF',\n primaryDark: '#0747A6',\n \n secondary: '#6B778C',\n secondaryHover: '#5E6C84',\n \n success: '#00875A',\n warning: '#FF991F',\n danger: '#DE350B',\n info: '#0065FF',\n \n background: '#ffffff',\n surface: '#F4F5F7',\n border: '#DFE1E6',\n \n textPrimary: '#172B4D',\n textSecondary: '#5E6C84',\n textMuted: '#97A0AF',\n },\n typography: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n spacing: {\n borderRadius: '0.25rem',\n cardPadding: '1.5rem',\n inputHeight: '2.5rem',\n },\n};\n\n/**\n * Fintech green theme preset\n */\nexport const fintechTheme: ThemeConfig = {\n name: 'Fintech',\n logo: {\n url: '',\n height: '36px',\n visible: true,\n },\n colors: {\n primary: '#00B386',\n primaryHover: '#009973',\n primaryLight: '#D1FAE5',\n primaryDark: '#047857',\n \n secondary: '#7C3AED',\n secondaryHover: '#6D28D9',\n \n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#F9FAFB',\n border: '#E5E7EB',\n \n textPrimary: '#111827',\n textSecondary: '#6B7280',\n textMuted: '#9CA3AF',\n },\n typography: {\n fontFamily: 'Montserrat, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '0.75rem',\n cardPadding: '2rem',\n inputHeight: '3rem',\n },\n};\n\n/**\n * Healthcare theme preset\n */\nexport const healthcareTheme: ThemeConfig = {\n name: 'Healthcare',\n logo: {\n url: '',\n height: '44px',\n visible: true,\n },\n colors: {\n primary: '#06B6D4',\n primaryHover: '#0891B2',\n primaryLight: '#CFFAFE',\n primaryDark: '#0E7490',\n \n secondary: '#8B5CF6',\n secondaryHover: '#7C3AED',\n \n success: '#059669',\n warning: '#D97706',\n danger: '#DC2626',\n info: '#0284C7',\n \n background: '#ffffff',\n surface: '#F0F9FF',\n border: '#E0F2FE',\n \n textPrimary: '#0F172A',\n textSecondary: '#475569',\n textMuted: '#94A3B8',\n },\n typography: {\n fontFamily: 'Lato, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '0.5rem',\n cardPadding: '1.75rem',\n inputHeight: '2.75rem',\n },\n darkMode: {\n colors: {\n background: '#0F172A',\n surface: '#1E293B',\n border: '#334155',\n textPrimary: '#F1F5F9',\n textSecondary: '#CBD5E1',\n },\n },\n};\n\n/**\n * Modern theme preset\n */\nexport const modernTheme: ThemeConfig = {\n name: 'Modern',\n logo: {\n url: '',\n height: '38px',\n visible: true,\n },\n colors: {\n primary: '#8B5CF6',\n primaryHover: '#7C3AED',\n primaryLight: '#EDE9FE',\n primaryDark: '#6D28D9',\n \n secondary: '#EC4899',\n secondaryHover: '#DB2777',\n \n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#FAFAFA',\n border: '#E5E5E5',\n \n textPrimary: '#171717',\n textSecondary: '#737373',\n textMuted: '#A3A3A3',\n },\n typography: {\n fontFamily: 'Poppins, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '1rem',\n cardPadding: '2rem',\n inputHeight: '3rem',\n },\n};\n\n/**\n * Minimal theme preset\n */\nexport const minimalTheme: ThemeConfig = {\n name: 'Minimal',\n logo: {\n url: '',\n height: '32px',\n visible: true,\n },\n colors: {\n primary: '#000000',\n primaryHover: '#18181B',\n primaryLight: '#F4F4F5',\n primaryDark: '#000000',\n \n secondary: '#71717A',\n secondaryHover: '#52525B',\n \n success: '#22C55E',\n warning: '#EAB308',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#FAFAFA',\n border: '#E4E4E7',\n \n textPrimary: '#09090B',\n textSecondary: '#71717A',\n textMuted: '#A1A1AA',\n },\n typography: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n spacing: {\n borderRadius: '0.25rem',\n cardPadding: '1.25rem',\n inputHeight: '2.25rem',\n },\n};\n\n/**\n * Map of all theme presets\n */\nexport const themePresets: Record<ThemePreset, ThemeConfig> = {\n [ThemePreset.Default]: defaultTheme,\n [ThemePreset.Corporate]: corporateTheme,\n [ThemePreset.Fintech]: fintechTheme,\n [ThemePreset.Healthcare]: healthcareTheme,\n [ThemePreset.Modern]: modernTheme,\n [ThemePreset.Minimal]: minimalTheme,\n};\n\n/**\n * Get theme preset by name\n */\nexport function getThemePreset(preset: ThemePreset): ThemeConfig {\n return themePresets[preset] || defaultTheme;\n}\n","import { HttpClient } from '../client';\nimport { ThemeConfigurationDto, ThemeConfig, ThemePreset } from '../types/theme';\nimport { getThemePreset } from '../theme/presets';\n\n/**\n * Theme Service\n * Handles backend communication for theme configuration\n */\nexport class ThemeService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get theme configuration from backend\n */\n async getThemeConfiguration(): Promise<ThemeConfig> {\n try {\n const response = await this.httpClient.get<ThemeConfigurationDto>(\n 'Tenant',\n 'GetThemeConfiguration'\n );\n\n // If theme is disabled or not configured, return default\n if (!response.result.isEnabled) {\n return getThemePreset(ThemePreset.Default);\n }\n\n // Start with preset if specified\n let theme: ThemeConfig = response.result.preset \n ? getThemePreset(response.result.preset)\n : getThemePreset(ThemePreset.Default);\n\n // Apply custom overrides\n if (response.result.title) {\n theme.title = response.result.title;\n }\n\n if (response.result.logo) {\n theme.logo = { ...theme.logo, ...response.result.logo };\n }\n\n if (response.result.colors) {\n theme.colors = { ...theme.colors, ...response.result.colors };\n }\n\n if (response.result.typography) {\n theme.typography = { ...theme.typography, ...response.result.typography };\n }\n\n if (response.result.spacing) {\n theme.spacing = { ...theme.spacing, ...response.result.spacing };\n }\n\n if (response.result.customCSS) {\n theme.customCSS = response.result.customCSS;\n }\n\n if (response.result.darkMode) {\n theme.darkMode = {\n colors: {\n ...theme.darkMode?.colors,\n ...response.result.darkMode.colors,\n },\n };\n }\n\n if (response.result.applicantFormVisibleFields && response.result.applicantFormVisibleFields.length > 0) {\n theme.applicantFormVisibleFields = response.result.applicantFormVisibleFields;\n }\n\n if (response.result.applicantFormRequiredFields && response.result.applicantFormRequiredFields.length > 0) {\n theme.applicantFormRequiredFields = response.result.applicantFormRequiredFields;\n }\n\n if (response.result.allowedLanguages && response.result.allowedLanguages.length > 0) {\n theme.allowedLanguages = response.result.allowedLanguages;\n }\n\n if (response.result.applicantFormPages) {\n try {\n const parsed = typeof response.result.applicantFormPages === 'string'\n ? JSON.parse(response.result.applicantFormPages)\n : response.result.applicantFormPages;\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Migrate old 2-column format (_v < 4): colSpan 1→2, 2→4\n theme.applicantFormPages = parsed.map((p: any) => {\n const isOldFormat = !p._v || p._v < 4;\n return {\n ...p,\n fields: (p.fields || []).map((f: any) => ({\n ...f,\n colSpan: isOldFormat\n ? (f.colSpan === 1 ? 2 : 4)\n : Math.min(4, Math.max(1, f.colSpan ?? 4)),\n })),\n };\n });\n }\n } catch {\n // malformed JSON — fall back to flat layout\n }\n }\n\n if (response.result.reviewPageFields) {\n try {\n const parsed = typeof response.result.reviewPageFields === 'string'\n ? JSON.parse(response.result.reviewPageFields)\n : response.result.reviewPageFields;\n if (Array.isArray(parsed) && parsed.length > 0) {\n theme.reviewPageFields = parsed;\n }\n } catch {\n // malformed JSON — fall back to static layout\n }\n }\n\n if (response.result.reviewPageDisabled) {\n theme.reviewPageDisabled = true;\n }\n\n return theme;\n } catch (error) {\n console.warn('[ThemeService] Failed to fetch theme configuration:', error);\n // Return default theme on error\n return getThemePreset(ThemePreset.Default);\n }\n }\n\n /**\n * Save theme configuration (for Panel use)\n */\n async saveThemeConfiguration(config: ThemeConfigurationDto): Promise<void> {\n await this.httpClient.post<void>('Tenant', 'SaveThemeConfiguration', config);\n }\n\n /**\n * Get available theme presets\n */\n getAvailablePresets(): Array<{ id: ThemePreset; name: string }> {\n return [\n { id: ThemePreset.Default, name: 'Default' },\n { id: ThemePreset.Corporate, name: 'Corporate' },\n { id: ThemePreset.Fintech, name: 'Fintech' },\n { id: ThemePreset.Healthcare, name: 'Healthcare' },\n { id: ThemePreset.Modern, name: 'Modern' },\n { id: ThemePreset.Minimal, name: 'Minimal' },\n ];\n }\n\n /**\n * Preview theme (doesn't save)\n */\n getPreviewTheme(preset: ThemePreset, overrides?: Partial<ThemeConfig>): ThemeConfig {\n const baseTheme = getThemePreset(preset);\n \n if (!overrides) {\n return baseTheme;\n }\n\n return {\n ...baseTheme,\n ...overrides,\n logo: { ...baseTheme.logo, ...overrides.logo },\n colors: { ...baseTheme.colors, ...overrides.colors },\n typography: overrides.typography ? \n { ...baseTheme.typography, ...overrides.typography } : \n baseTheme.typography,\n spacing: overrides.spacing ? \n { ...baseTheme.spacing, ...overrides.spacing } : \n baseTheme.spacing,\n };\n }\n}\n","/**\n * Simple event emitter for state changes\n */\nexport class EventEmitter<T = any> {\n private listeners: Map<string, Set<(data: T) => void>> = new Map();\n\n /**\n * Subscribe to an event\n */\n on(event: string, callback: (data: T) => void): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n\n this.listeners.get(event)!.add(callback);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: string, callback: (data: T) => void): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n }\n }\n\n /**\n * Emit an event\n */\n emit(event: string, data: T): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for \"${event}\":`, error);\n }\n });\n }\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Remove all listeners for a specific event\n */\n clearEvent(event: string): void {\n this.listeners.delete(event);\n }\n}\n","import {\n ProgressApplicantResult,\n FlowStep,\n StepInfo,\n ApplicantProgressStatus,\n WorkflowResultType,\n} from '../types';\nimport { EventEmitter } from './event-emitter';\n\n/**\n * Workflow state events\n */\nexport interface WorkflowStateEvents {\n progressUpdated: ProgressApplicantResult;\n stepChanged: FlowStep | null;\n statusChanged: ApplicantProgressStatus;\n error: Error;\n completed: WorkflowResultType;\n}\n\n/**\n * Workflow state manager\n * Manages the current state of a workflow execution\n */\nexport class WorkflowState {\n private events = new EventEmitter<any>();\n private _applicantId: number | null = null;\n private _progress: ProgressApplicantResult | null = null;\n private _error: Error | null = null;\n\n constructor() {}\n\n /**\n * Get current applicant ID\n */\n get applicantId(): number | null {\n return this._applicantId;\n }\n\n /**\n * Get current progress\n */\n get progress(): ProgressApplicantResult | null {\n return this._progress;\n }\n\n /**\n * Get current step\n */\n get currentStep(): FlowStep | null {\n return this._progress?.currentStep || null;\n }\n\n /**\n * Get all workflow steps\n */\n get steps(): StepInfo[] {\n return this._progress?.stepInfoList || [];\n }\n\n /**\n * Get current status\n */\n get status(): ApplicantProgressStatus {\n return this._progress?.status || ApplicantProgressStatus.None;\n }\n\n /**\n * Get workflow result\n */\n get workflowResult(): WorkflowResultType | null {\n return this._progress?.workflowResult || null;\n }\n\n /**\n * Get current error\n */\n get error(): Error | null {\n return this._error;\n }\n\n /**\n * Check if workflow is complete\n */\n get isComplete(): boolean {\n return this.status === ApplicantProgressStatus.Finished;\n }\n\n /**\n * Check if workflow is on hold\n */\n get isOnHold(): boolean {\n return this.status === ApplicantProgressStatus.OnHold;\n }\n\n /**\n * Check if workflow is in progress\n */\n get isInProgress(): boolean {\n return this.status === ApplicantProgressStatus.InProgress;\n }\n\n /**\n * Set applicant ID\n */\n setApplicantId(applicantId: number): void {\n this._applicantId = applicantId;\n }\n\n /**\n * Update progress\n */\n updateProgress(progress: ProgressApplicantResult): void {\n const previousStep = this._progress?.currentStep;\n this._progress = progress;\n this._applicantId = progress.applicantId;\n this._error = null;\n\n // Emit progress updated event\n this.events.emit('progressUpdated', progress);\n\n // Emit step changed event if step changed\n if (previousStep?.order !== progress.currentStep?.order) {\n this.events.emit('stepChanged', progress.currentStep);\n }\n\n // Emit status changed event\n this.events.emit('statusChanged', progress.status);\n\n // Emit completed event if workflow is finished\n if (progress.status === ApplicantProgressStatus.Finished && progress.workflowResult) {\n this.events.emit('completed', progress.workflowResult);\n }\n }\n\n /**\n * Set error\n */\n setError(error: Error): void {\n this._error = error;\n this.events.emit('error', error);\n }\n\n /**\n * Clear error\n */\n clearError(): void {\n this._error = null;\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this._applicantId = null;\n this._progress = null;\n this._error = null;\n }\n\n /**\n * Subscribe to progress updates\n */\n onProgressUpdated(callback: (progress: ProgressApplicantResult) => void): () => void {\n return this.events.on('progressUpdated', callback);\n }\n\n /**\n * Subscribe to step changes\n */\n onStepChanged(callback: (step: FlowStep | null) => void): () => void {\n return this.events.on('stepChanged', callback);\n }\n\n /**\n * Subscribe to status changes\n */\n onStatusChanged(callback: (status: ApplicantProgressStatus) => void): () => void {\n return this.events.on('statusChanged', callback);\n }\n\n /**\n * Subscribe to errors\n */\n onError(callback: (error: Error) => void): () => void {\n return this.events.on('error', callback);\n }\n\n /**\n * Subscribe to completion\n */\n onCompleted(callback: (result: WorkflowResultType) => void): () => void {\n return this.events.on('completed', callback);\n }\n\n /**\n * Clear all event listeners\n */\n clearListeners(): void {\n this.events.clear();\n }\n}\n","import { WorkflowStepAction } from '../types';\n\n/**\n * Step data loader function type\n */\nexport type StepDataLoader<T> = (applicantId: number) => Promise<T>;\n\n/**\n * Step data submitter function type\n */\nexport type StepDataSubmitter<T> = (data: T) => Promise<void>;\n\n/**\n * Step handler configuration\n */\nexport interface StepHandler<TData = any, TSubmit = any> {\n loadData: StepDataLoader<TData>;\n submitData: StepDataSubmitter<TSubmit>;\n}\n\n/**\n * Step router\n * Routes workflow steps to appropriate data loaders and submitters\n */\nexport class StepRouter {\n private handlers = new Map<WorkflowStepAction, StepHandler>();\n\n /**\n * Register a step handler\n */\n registerHandler(action: WorkflowStepAction, handler: StepHandler): void {\n this.handlers.set(action, handler);\n }\n\n /**\n * Get handler for a step action\n */\n getHandler(action: WorkflowStepAction): StepHandler | undefined {\n return this.handlers.get(action);\n }\n\n /**\n * Check if a step has a handler\n */\n hasHandler(action: WorkflowStepAction): boolean {\n return this.handlers.has(action);\n }\n\n /**\n * Load data for a step\n */\n async loadStepData<T>(action: WorkflowStepAction, applicantId: number): Promise<T> {\n const handler = this.getHandler(action);\n if (!handler) {\n throw new Error(`No handler registered for step action: ${WorkflowStepAction[action]}`);\n }\n return handler.loadData(applicantId) as Promise<T>;\n }\n\n /**\n * Submit data for a step\n */\n async submitStepData<T>(action: WorkflowStepAction, data: T): Promise<void> {\n const handler = this.getHandler(action);\n if (!handler) {\n throw new Error(`No handler registered for step action: ${WorkflowStepAction[action]}`);\n }\n return handler.submitData(data);\n }\n}\n","import { WorkflowState } from './workflow-state';\nimport { StepRouter } from './step-router';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n InvestorCategorizationService,\n} from '../services';\nimport { WorkflowStepAction, ProgressApplicantResult } from '../types';\n\n/**\n * Workflow orchestrator\n * Manages workflow execution and step progression\n */\nexport class WorkflowOrchestrator {\n private state: WorkflowState;\n private stepRouter: StepRouter;\n\n constructor(\n private applicantService: ApplicantService,\n private questionnaireService: QuestionnaireService,\n private uploadDocumentService: UploadDocumentService,\n private appropriatenessTestService: AppropriatenessTestService,\n private overviewService: OverviewService,\n private riskScoringService: RiskScoringService,\n _identityService: IdentityService,\n private investorCategorizationService: InvestorCategorizationService\n ) {\n this.state = new WorkflowState();\n this.stepRouter = new StepRouter();\n this.registerStepHandlers();\n }\n\n /**\n * Register all step handlers\n */\n private registerStepHandlers(): void {\n // Questionnaire handler\n this.stepRouter.registerHandler(WorkflowStepAction.Questionaries, {\n loadData: (applicantId) => this.questionnaireService.getQuestionnaire(applicantId),\n submitData: async (data) => {\n await this.questionnaireService.fillQuestionnaire(data);\n },\n });\n\n // Upload document handler\n this.stepRouter.registerHandler(WorkflowStepAction.UploadDocument, {\n loadData: (applicantId) => this.uploadDocumentService.getUploadDocument(applicantId),\n submitData: (data) => this.uploadDocumentService.fillUploadDocument(data),\n });\n\n // Appropriateness test handler\n this.stepRouter.registerHandler(WorkflowStepAction.AppropriatenessTest, {\n loadData: (applicantId) =>\n this.appropriatenessTestService.getAppropriatenessTest(applicantId),\n submitData: async (data) => {\n await this.appropriatenessTestService.fillAppropriatenessTest(data);\n },\n });\n\n // Overview handler\n this.stepRouter.registerHandler(WorkflowStepAction.Overview, {\n loadData: (applicantId) => this.overviewService.getOverviewData(applicantId),\n submitData: (data: { applicantId: number }) =>\n this.overviewService.passOverview(data.applicantId),\n });\n\n // Risk scoring handler\n this.stepRouter.registerHandler(WorkflowStepAction.RiskScoring, {\n loadData: (applicantId) => this.riskScoringService.getRiskCriterias(applicantId),\n submitData: async (data) => {\n await this.riskScoringService.submitRiskScoring(data);\n },\n });\n\n // Identity SDK handler (no data loading, handled by identity service)\n this.stepRouter.registerHandler(WorkflowStepAction.IdentitySdk, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Identity verification required',\n }),\n submitData: async () => {\n // Identity verification is handled externally by provider SDKs\n // Just refresh progress after completion\n },\n });\n\n // Investor categorization handler\n this.stepRouter.registerHandler(WorkflowStepAction.InvestorCategorization, {\n loadData: (applicantId) =>\n this.investorCategorizationService.getInvestorCategorization(applicantId),\n submitData: async (data) => {\n await this.investorCategorizationService.setInvestorCategorization(data);\n },\n });\n\n // Manual review handler (no action needed from user)\n this.stepRouter.registerHandler(WorkflowStepAction.ManualReview, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Your application is under manual review',\n }),\n submitData: async () => {\n // Manual review is done by admin, no user action\n },\n });\n\n // Additional data handler (generic data collection)\n this.stepRouter.registerHandler(WorkflowStepAction.AdditionalData, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Additional data required',\n }),\n submitData: async () => {\n // Additional data submission handled separately\n },\n });\n }\n\n /**\n * Initialize workflow with applicant ID\n */\n async initialize(applicantId: number): Promise<ProgressApplicantResult> {\n try {\n this.state.setApplicantId(applicantId);\n const progress = await this.applicantService.getProgress(applicantId);\n this.state.updateProgress(progress);\n return progress;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Refresh applicant progress\n */\n async refreshProgress(): Promise<ProgressApplicantResult> {\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized. Call initialize() first.');\n }\n\n try {\n const progress = await this.applicantService.getProgress(this.state.applicantId);\n this.state.updateProgress(progress);\n return progress;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Get data for current step\n */\n async getCurrentStepData<T>(): Promise<T> {\n if (!this.state.currentStep) {\n throw new Error('No current step available');\n }\n\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized');\n }\n\n try {\n const data = await this.stepRouter.loadStepData<T>(\n this.state.currentStep.action,\n this.state.applicantId\n );\n return data;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Submit data for current step\n */\n async submitCurrentStep(data: any): Promise<void> {\n if (!this.state.currentStep) {\n throw new Error('No current step available');\n }\n\n try {\n await this.stepRouter.submitStepData(this.state.currentStep.action, data);\n // Refresh progress after submission\n await this.refreshProgress();\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Move to next step (if possible)\n */\n async moveToNextStep(): Promise<ProgressApplicantResult> {\n // Refresh progress to move to next step\n return this.refreshProgress();\n }\n\n /**\n * Move back to previous step\n */\n async moveToPreviousStep(): Promise<ProgressApplicantResult> {\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized');\n }\n\n try {\n await this.applicantService.progressStepBack(this.state.applicantId);\n return await this.refreshProgress();\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Get workflow state\n */\n getState(): WorkflowState {\n return this.state;\n }\n\n /**\n * Get step router\n */\n getStepRouter(): StepRouter {\n return this.stepRouter;\n }\n}\n","/**\n * Dynamically load external scripts\n */\nexport function loadScript(src: string, id?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script already loaded\n if (id && document.getElementById(id)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n if (id) {\n script.id = id;\n }\n script.async = true;\n\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load script: ${src}`));\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * Check if a script is already loaded\n */\nexport function isScriptLoaded(id: string): boolean {\n return !!document.getElementById(id);\n}\n\n/**\n * Remove a loaded script\n */\nexport function removeScript(id: string): void {\n const script = document.getElementById(id);\n if (script) {\n script.remove();\n }\n}\n","import { loadScript } from '../load-script';\nimport { SumsubConfig } from '../../types';\n\ndeclare global {\n interface Window {\n snsWebSdk?: any;\n }\n}\n\n/**\n * Sumsub provider integration\n */\nexport class SumsubProvider {\n private sdk: any = null;\n private config: SumsubConfig;\n\n constructor(config: SumsubConfig) {\n this.config = config;\n }\n\n /**\n * Load Sumsub SDK\n */\n async loadSDK(): Promise<void> {\n await loadScript(\n 'https://cdn.sumsub.com/websdk/v2/production/websdk.js',\n 'sumsub-sdk'\n );\n }\n\n /**\n * Initialize Sumsub SDK\n */\n async initialize(containerId: string): Promise<void> {\n if (!window.snsWebSdk) {\n await this.loadSDK();\n }\n\n if (!window.snsWebSdk) {\n throw new Error('Sumsub SDK failed to load');\n }\n\n this.sdk = window.snsWebSdk\n .init(this.config.accessToken, () => this.config.accessToken)\n .withConf({\n lang: this.config.lang || 'en',\n email: this.config.applicantEmail,\n phone: this.config.applicantPhone,\n i18n: {\n // Customization options\n },\n })\n .on('idCheck.onStepCompleted', (payload: any) => {\n console.log('Sumsub step completed:', payload);\n })\n .on('idCheck.onError', (error: any) => {\n console.error('Sumsub error:', error);\n })\n .build();\n\n this.sdk.launch(`#${containerId}`);\n }\n\n /**\n * Destroy Sumsub SDK\n */\n destroy(): void {\n if (this.sdk) {\n this.sdk.destroy();\n this.sdk = null;\n }\n }\n\n /**\n * Subscribe to completion event\n */\n onComplete(callback: (payload: any) => void): void {\n if (this.sdk) {\n this.sdk.on('idCheck.applicantStatus', (payload: any) => {\n if (payload.applicantStatus === 'completed') {\n callback(payload);\n }\n });\n }\n }\n\n /**\n * Subscribe to error event\n */\n onError(callback: (error: any) => void): void {\n if (this.sdk) {\n this.sdk.on('idCheck.onError', callback);\n }\n }\n}\n","import { loadScript } from '../load-script';\nimport { OnfidoConfig } from '../../types';\n\ndeclare global {\n interface Window {\n Onfido?: any;\n }\n}\n\n/**\n * Onfido provider integration\n */\nexport class OnfidoProvider {\n private sdk: any = null;\n private config: OnfidoConfig;\n\n constructor(config: OnfidoConfig) {\n this.config = config;\n }\n\n /**\n * Load Onfido SDK\n */\n async loadSDK(): Promise<void> {\n await loadScript(\n 'https://sdk.onfido.com/v12.0.0/onfido.min.js',\n 'onfido-sdk'\n );\n }\n\n /**\n * Initialize Onfido SDK\n */\n async initialize(containerId: string): Promise<void> {\n if (!window.Onfido) {\n await this.loadSDK();\n }\n\n if (!window.Onfido) {\n throw new Error('Onfido SDK failed to load');\n }\n\n this.sdk = window.Onfido.init({\n token: this.config.token,\n containerId: containerId,\n steps: this.config.steps || [\n {\n type: 'welcome',\n options: {\n title: 'Identity Verification',\n },\n },\n {\n type: 'document',\n options: {\n documentTypes: {\n passport: true,\n driving_licence: true,\n national_identity_card: true,\n },\n },\n },\n {\n type: 'face',\n options: {\n requestedVariant: 'standard',\n },\n },\n {\n type: 'complete',\n },\n ],\n onComplete: () => {\n if (this.config.onComplete) {\n this.config.onComplete();\n }\n },\n onError: (error: any) => {\n if (this.config.onError) {\n this.config.onError(error);\n }\n },\n });\n }\n\n /**\n * Destroy Onfido SDK\n */\n destroy(): void {\n if (this.sdk) {\n this.sdk.tearDown();\n this.sdk = null;\n }\n }\n}\n","import { SardinAIConfig } from '../../types';\n\ndeclare global {\n interface Window {\n _Sardine?: {\n createContext: (config: any) => any;\n };\n }\n}\n\n/**\n * SardinAI Risk SDK provider integration\n * Implements Sardine's JavaScript SDK for device risk detection\n */\nexport class SardinAIProvider {\n private sardineContext: any = null;\n private config: SardinAIConfig;\n private sessionKey: string;\n\n constructor(config: SardinAIConfig) {\n this.config = config;\n this.sessionKey = config.sessionKey || this.generateSessionKey();\n }\n\n /**\n * Generate a UUID for session key\n */\n private generateSessionKey(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n /**\n * Get Sardine host based on environment and region\n */\n private getSardineHost(): string {\n const { environment, region } = this.config;\n const isSandbox = environment === 'sandbox';\n \n if (isSandbox) {\n return 'api.sandbox.sardine.ai';\n }\n \n switch (region) {\n case 'eu':\n return 'api.eu.sardine.ai';\n case 'ca':\n return 'api.ca.sardine.ai';\n case 'au':\n return 'api.au.sardine.ai';\n default:\n return 'api.sardine.ai';\n }\n }\n\n /**\n * Load SardinAI Risk SDK script\n */\n async loadSDK(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if already loaded\n if (window._Sardine) {\n resolve();\n return;\n }\n\n const sardineHost = this.getSardineHost();\n const loader = document.createElement('script');\n loader.type = 'text/javascript';\n loader.async = true;\n loader.src = `https://${sardineHost}/assets/loader.min.js`;\n \n loader.onload = () => {\n console.log('[SardinAI] SDK loaded successfully');\n resolve();\n };\n \n loader.onerror = () => {\n reject(new Error('Failed to load SardinAI SDK'));\n };\n\n const firstScript = document.getElementsByTagName('script')[0];\n if (firstScript && firstScript.parentNode) {\n firstScript.parentNode.insertBefore(loader, firstScript);\n } else {\n document.head.appendChild(loader);\n }\n });\n }\n\n /**\n * Initialize SardinAI Risk SDK\n */\n async initialize(): Promise<void> {\n try {\n await this.loadSDK();\n\n if (!window._Sardine) {\n throw new Error('SardinAI SDK not available after loading');\n }\n\n const sardineHost = this.getSardineHost();\n const { clientId, environment, flow, enableBiometrics, enablePortScanning } = this.config;\n\n this.sardineContext = window._Sardine.createContext({\n clientId,\n sessionKey: this.sessionKey,\n userIdHash: undefined, // Will be set later via updateConfig\n flow: flow || window.location.pathname,\n environment: environment || 'production',\n parentElement: document.body,\n enableBiometrics: enableBiometrics !== false, // Default true\n enablePortScanning: enablePortScanning === true, // Default false\n region: this.config.region,\n \n // Callback for device response (deprecated but kept for compatibility)\n onDeviceResponse: (data: any) => {\n console.log(`[SardinAI] Device ID: ${data.deviceId}`);\n },\n \n // New callback for session updates\n onConfigUpdate: (event: string, data: any, error: any) => {\n switch (event) {\n case 'SESSION_UPDATE_FAILED':\n console.error('[SardinAI] Session update failed:', error);\n break;\n case 'SESSION_UPDATED':\n console.log('[SardinAI] Session updated:', data);\n break;\n case 'SESSION_NO_UPDATE':\n console.log('[SardinAI] No session update');\n break;\n default:\n console.warn('[SardinAI] Unknown event:', event);\n }\n }\n });\n\n // Add noscript fallback image\n this.addNoScriptFallback(sardineHost);\n\n console.log('[SardinAI] SDK initialized with sessionKey:', this.sessionKey);\n } catch (error) {\n console.error('[SardinAI] Initialization failed:', error);\n throw error;\n }\n }\n\n /**\n * Add noscript fallback for cases where JS is disabled\n */\n private addNoScriptFallback(sardineHost: string): void {\n const noscript = document.createElement('noscript');\n const img = document.createElement('img');\n const { clientId, flow } = this.config;\n \n img.src = `https://${sardineHost}/v1/a.png?clientId=${clientId}&sessionKey=${this.sessionKey}&flow=${flow || 'kyc'}&ns=1`;\n img.style.display = 'none';\n \n noscript.appendChild(img);\n document.body.appendChild(noscript);\n }\n\n /**\n * Update configuration (e.g., set userIdHash after login)\n */\n updateConfig(options: { flow?: string; userIdHash?: string | null; sessionKey?: string }): void {\n if (!this.sardineContext) {\n console.warn('[SardinAI] Cannot update config - SDK not initialized');\n return;\n }\n\n if (options.sessionKey) {\n this.sessionKey = options.sessionKey;\n }\n\n this.sardineContext.updateConfig({\n ...options,\n onConfigUpdate: (event: string, data: any, error: any) => {\n switch (event) {\n case 'SESSION_UPDATE_FAILED':\n console.error('[SardinAI] Config update failed:', error);\n break;\n case 'SESSION_UPDATED':\n console.log('[SardinAI] Config updated:', data);\n break;\n case 'SESSION_NO_UPDATE':\n console.log('[SardinAI] No config update needed');\n break;\n }\n }\n });\n }\n\n /**\n * Get current session key\n */\n getSessionKey(): string {\n return this.sessionKey;\n }\n\n /**\n * Destroy SardinAI SDK instance\n */\n destroy(): void {\n if (this.sardineContext) {\n // SardinAI SDK cleanup if needed\n this.sardineContext = null;\n }\n }\n}\n","import { IdentityVerificationProvider } from '../types';\nimport { SumsubProvider } from './providers/sumsub';\nimport { OnfidoProvider } from './providers/onfido';\nimport { SardinAIProvider } from './providers/sardin-ai';\n\n/**\n * Identity provider manager\n * Factory for creating and managing identity verification providers\n */\nexport class IdentityProviderManager {\n /**\n * Create a provider instance\n */\n static createProvider(\n provider: IdentityVerificationProvider,\n config: any\n ): SumsubProvider | OnfidoProvider | SardinAIProvider {\n switch (provider) {\n case IdentityVerificationProvider.Sumsub:\n return new SumsubProvider(config);\n\n case IdentityVerificationProvider.Onfido:\n return new OnfidoProvider(config);\n\n case IdentityVerificationProvider.SardinAI:\n return new SardinAIProvider(config);\n\n default:\n throw new Error(`Unsupported identity provider: ${provider}`);\n }\n }\n\n /**\n * Get provider configuration from API token object\n */\n static parseProviderConfig(\n provider: IdentityVerificationProvider,\n tokenObject: Record<string, any>,\n contextConfig?: any\n ): any {\n switch (provider) {\n case IdentityVerificationProvider.Sumsub:\n return {\n accessToken: tokenObject.accessToken || tokenObject.token,\n applicantEmail: tokenObject.email,\n applicantPhone: tokenObject.phone,\n externalUserId: tokenObject.externalUserId,\n lang: tokenObject.lang || 'en',\n };\n\n case IdentityVerificationProvider.Onfido:\n return {\n token: tokenObject.token || tokenObject.sdkToken,\n };\n\n case IdentityVerificationProvider.SardinAI:\n // Prioritize context config over backend response\n const sardinConfig = contextConfig?.identityProviders?.sardinai || {};\n return {\n clientId: sardinConfig.clientId || tokenObject.clientId,\n sessionKey: sardinConfig.sessionKey || tokenObject.sessionKey,\n environment: sardinConfig.environment || tokenObject.environment || 'production',\n flow: sardinConfig.flow || tokenObject.flow,\n region: sardinConfig.region,\n enableBiometrics: sardinConfig.enableBiometrics,\n enablePortScanning: sardinConfig.enablePortScanning,\n };\n\n default:\n throw new Error(`Unsupported identity provider: ${provider}`);\n }\n }\n}\n","import { ThemeConfig, ColorPalette } from '../types/theme';\nimport { defaultTheme } from './presets';\n\n/** Builds the CSS block that hard-wires input-specific colors inside .metakyc-sdk\n * AND inside portal dropdowns (.metakyc-searchable-select-dropdown / .metakyc-multiselect-dropdown)\n * which are rendered at document.body level and therefore outside .metakyc-sdk. */\nfunction buildInputCSS(colors: ColorPalette): string {\n const bg = colors.inputBg || colors.background;\n const text = colors.inputText || colors.textPrimary;\n const border = colors.inputBorder || colors.border;\n const focusBorder = colors.inputBorderFocus || colors.primary;\n const placeholder = colors.inputPlaceholder || colors.textMuted;\n // Hover row uses the surface color (slightly lighter/darker than bg) so it contrasts.\n const hoverBg = colors.surface || colors.background;\n\n return `\n/* ── metakyc input overrides (generated by ThemeManager) ── */\n.metakyc-sdk input:not([type=\"color\"]):not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"range\"]),\n.metakyc-sdk select,\n.metakyc-sdk textarea,\n.metakyc-sdk .metakyc-input,\n.metakyc-sdk .metakyc-searchable-select-trigger,\n.metakyc-sdk .metakyc-multiselect-trigger {\n background-color: ${bg} !important;\n color: ${text} !important;\n border-color: ${border} !important;\n}\n/* Portal dropdown panels (rendered at document.body, outside .metakyc-sdk) */\n.metakyc-searchable-select-dropdown,\n.metakyc-multiselect-dropdown {\n background-color: ${bg} !important;\n border-color: ${border} !important;\n color: ${text} !important;\n}\n/* Search input inside portal */\n.metakyc-searchable-select-dropdown input,\n.metakyc-multiselect-dropdown input {\n background-color: ${bg} !important;\n color: ${text} !important;\n border-color: ${border} !important;\n}\n/* Option hover rows inside portal */\n.metakyc-searchable-select-dropdown li:hover,\n.metakyc-multiselect-dropdown li:hover {\n background-color: ${hoverBg} !important;\n}\n/* Placeholder text */\n.metakyc-sdk input::placeholder,\n.metakyc-sdk textarea::placeholder,\n.metakyc-searchable-select-dropdown input::placeholder,\n.metakyc-multiselect-dropdown input::placeholder {\n color: ${placeholder} !important;\n opacity: 1 !important;\n}\n/* Focus ring */\n.metakyc-sdk input:not([type=\"color\"]):not([type=\"checkbox\"]):not([type=\"radio\"]):focus,\n.metakyc-sdk select:focus,\n.metakyc-sdk textarea:focus,\n.metakyc-sdk .metakyc-searchable-select-trigger:focus,\n.metakyc-searchable-select-dropdown input:focus,\n.metakyc-multiselect-dropdown input:focus {\n border-color: ${focusBorder} !important;\n outline-color: ${focusBorder} !important;\n box-shadow: 0 0 0 2px ${focusBorder}33 !important;\n}\n`;\n}\n\n/**\n * Theme Manager\n * Handles theme application and CSS variable management\n */\nexport class ThemeManager {\n private currentTheme: ThemeConfig = defaultTheme;\n private customStyleElement: HTMLStyleElement | null = null;\n private inputStyleElement: HTMLStyleElement | null = null;\n private container: HTMLElement;\n\n constructor(container?: HTMLElement) {\n this.container = container || document.documentElement;\n }\n\n /**\n * Apply theme configuration\n */\n applyTheme(theme: Partial<ThemeConfig>): void {\n // Merge with default theme\n this.currentTheme = this.mergeWithDefault(theme);\n \n // Apply colors\n this.applyColors(this.currentTheme.colors);\n \n // Apply typography\n if (this.currentTheme.typography) {\n this.applyTypography(this.currentTheme.typography);\n }\n \n // Apply spacing\n if (this.currentTheme.spacing) {\n this.applySpacing(this.currentTheme.spacing);\n }\n \n // Apply custom CSS\n if (this.currentTheme.customCSS) {\n this.injectCustomCSS(this.currentTheme.customCSS);\n }\n \n console.log('[ThemeManager] Theme applied:', this.currentTheme.name || 'Custom');\n }\n\n /**\n * Apply color palette as CSS variables\n */\n private applyColors(colors: ColorPalette): void {\n const colorMap: Record<string, string> = {\n primary: colors.primary,\n 'primary-hover': colors.primaryHover,\n 'primary-light': colors.primaryLight,\n 'primary-dark': colors.primaryDark,\n\n secondary: colors.secondary,\n 'secondary-hover': colors.secondaryHover,\n\n success: colors.success,\n warning: colors.warning,\n danger: colors.danger,\n info: colors.info,\n\n background: colors.background,\n surface: colors.surface,\n border: colors.border,\n\n 'text-primary': colors.textPrimary,\n 'text-secondary': colors.textSecondary,\n 'text-muted': colors.textMuted,\n\n // Input-specific — fall back to general colors when not explicitly set.\n // Use || (not ??) so empty string '' also triggers the fallback.\n 'input-bg': colors.inputBg || colors.background,\n 'input-text': colors.inputText || colors.textPrimary,\n 'input-border': colors.inputBorder || colors.border,\n 'input-border-focus': colors.inputBorderFocus || colors.primary,\n 'input-placeholder': colors.inputPlaceholder || colors.textMuted,\n };\n\n Object.entries(colorMap).forEach(([key, value]) => {\n if (value) this.container.style.setProperty(`--metakyc-${key}`, value);\n });\n\n // Inject hard-coded CSS rules for inputs so panel/host CSS cannot override them\n this.injectInputColors(colors);\n\n // Apply dark mode colors if present\n if (this.currentTheme.darkMode?.colors) {\n this.applyDarkModeColors(this.currentTheme.darkMode.colors);\n }\n }\n\n /**\n * Apply dark mode color overrides\n */\n private applyDarkModeColors(colors: Partial<ColorPalette>): void {\n Object.entries(colors).forEach(([key, value]) => {\n if (value) {\n const cssVar = `--metakyc-dark-${this.kebabCase(key)}`;\n this.container.style.setProperty(cssVar, value);\n }\n });\n }\n\n /**\n * Apply typography settings\n */\n private applyTypography(typography: ThemeConfig['typography']): void {\n if (!typography) return;\n\n if (typography.fontFamily) {\n this.container.style.setProperty('--metakyc-font-family', typography.fontFamily);\n }\n\n if (typography.headingFont) {\n this.container.style.setProperty('--metakyc-heading-font', typography.headingFont);\n }\n\n if (typography.fontSize) {\n Object.entries(typography.fontSize).forEach(([key, value]) => {\n this.container.style.setProperty(`--metakyc-font-size-${key}`, value);\n });\n }\n\n if (typography.fontWeight) {\n Object.entries(typography.fontWeight).forEach(([key, value]) => {\n this.container.style.setProperty(`--metakyc-font-weight-${key}`, value.toString());\n });\n }\n }\n\n /**\n * Apply spacing settings\n */\n private applySpacing(spacing: ThemeConfig['spacing']): void {\n if (!spacing) return;\n\n Object.entries(spacing).forEach(([key, value]) => {\n const cssVar = `--metakyc-${this.kebabCase(key)}`;\n this.container.style.setProperty(cssVar, value);\n });\n }\n\n /**\n * Inject hard-coded CSS rules for inputs so the host/panel CSS cannot override them.\n * These rules are placed BEFORE any custom CSS so that custom CSS can still override them.\n */\n private injectInputColors(colors: ColorPalette): void {\n if (this.inputStyleElement) {\n this.inputStyleElement.remove();\n }\n this.inputStyleElement = document.createElement('style');\n this.inputStyleElement.id = 'metakyc-input-colors';\n this.inputStyleElement.textContent = buildInputCSS(colors);\n // Insert before customStyleElement (or at the end of head)\n if (this.customStyleElement && this.customStyleElement.parentNode) {\n document.head.insertBefore(this.inputStyleElement, this.customStyleElement);\n } else {\n document.head.appendChild(this.inputStyleElement);\n }\n }\n\n /**\n * Inject custom CSS into document\n */\n private injectCustomCSS(css: string): void {\n if (this.customStyleElement) {\n this.customStyleElement.remove();\n }\n this.customStyleElement = document.createElement('style');\n this.customStyleElement.id = 'metakyc-custom-css';\n this.customStyleElement.textContent = css;\n document.head.appendChild(this.customStyleElement);\n }\n\n /**\n * Merge partial theme with default theme\n */\n private mergeWithDefault(theme: Partial<ThemeConfig>): ThemeConfig {\n return {\n name: theme.name || defaultTheme.name,\n title: theme.title || defaultTheme.title,\n logo: { ...defaultTheme.logo, ...theme.logo },\n colors: { ...defaultTheme.colors, ...theme.colors },\n typography: theme.typography ? \n { ...defaultTheme.typography, ...theme.typography } : \n defaultTheme.typography,\n spacing: theme.spacing ? \n { ...defaultTheme.spacing, ...theme.spacing } : \n defaultTheme.spacing,\n customCSS: theme.customCSS,\n darkMode: theme.darkMode ? {\n colors: { \n ...defaultTheme.darkMode?.colors, \n ...theme.darkMode.colors \n }\n } : defaultTheme.darkMode,\n applicantFormVisibleFields: theme.applicantFormVisibleFields,\n applicantFormRequiredFields: theme.applicantFormRequiredFields,\n allowedLanguages: theme.allowedLanguages,\n applicantFormPages: theme.applicantFormPages,\n reviewPageFields: theme.reviewPageFields,\n reviewPageDisabled: theme.reviewPageDisabled,\n };\n }\n\n /**\n * Get current theme configuration\n */\n getCurrentTheme(): ThemeConfig {\n return this.currentTheme;\n }\n\n /**\n * Reset to default theme\n */\n resetTheme(): void {\n this.applyTheme(defaultTheme);\n }\n\n /**\n * Remove all custom styles\n */\n cleanup(): void {\n if (this.inputStyleElement) {\n this.inputStyleElement.remove();\n this.inputStyleElement = null;\n }\n if (this.customStyleElement) {\n this.customStyleElement.remove();\n this.customStyleElement = null;\n }\n }\n\n /**\n * Convert camelCase to kebab-case\n */\n private kebabCase(str: string): string {\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n }\n}\n","import { createContext } from 'react';\nimport { HttpClient } from '../client/http-client';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n BaseInformationService,\n InvestorCategorizationService,\n ThemeService,\n} from '../services';\nimport { WorkflowOrchestrator } from '../state';\nimport { MetaKYCClientConfig } from '../client/config';\nimport { ThemeManager } from '../theme/theme-manager';\nimport { ThemeConfig } from '../types/theme';\n\n/**\n * MetaKYC context value\n */\nexport interface MetaKYCContextValue {\n config: MetaKYCClientConfig;\n httpClient: HttpClient;\n applicantService: ApplicantService;\n questionnaireService: QuestionnaireService;\n uploadDocumentService: UploadDocumentService;\n appropriatenessTestService: AppropriatenessTestService;\n overviewService: OverviewService;\n riskScoringService: RiskScoringService;\n identityService: IdentityService;\n baseInformationService: BaseInformationService;\n investorCategorizationService: InvestorCategorizationService;\n themeService: ThemeService;\n themeManager: ThemeManager;\n currentTheme: ThemeConfig | null;\n createOrchestrator: () => WorkflowOrchestrator;\n}\n\n/**\n * MetaKYC context\n */\nexport const MetaKYCContext = createContext<MetaKYCContextValue | null>(null);\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { MetaKYCContext, MetaKYCContextValue } from './MetaKYCContext';\nimport { HttpClient } from '../client/http-client';\nimport { MetaKYCClientConfig } from '../client/config';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n BaseInformationService,\n InvestorCategorizationService,\n ThemeService,\n} from '../services';\nimport { WorkflowOrchestrator } from '../state';\nimport { ThemeManager } from '../theme/theme-manager';\nimport { ThemeConfig } from '../types/theme';\n\n/**\n * Props for MetaKYCProvider\n */\nexport interface MetaKYCProviderProps {\n config: MetaKYCClientConfig;\n children: React.ReactNode;\n}\n\n/**\n * MetaKYC Provider Component\n * Provides MetaKYC client and services to all child components\n */\nexport const MetaKYCProvider: React.FC<MetaKYCProviderProps> = ({ config, children }) => {\n const [currentTheme, setCurrentTheme] = useState<ThemeConfig | null>(null);\n const isLoadingThemeRef = React.useRef(false);\n const hasLoadedThemeRef = React.useRef(false);\n \n // Initialize services once - don't recreate on theme changes\n const services = useMemo(() => {\n const httpClient = new HttpClient(config);\n\n // Initialize all services\n const applicantService = new ApplicantService(httpClient);\n const questionnaireService = new QuestionnaireService(httpClient);\n const uploadDocumentService = new UploadDocumentService(httpClient);\n const appropriatenessTestService = new AppropriatenessTestService(httpClient);\n const overviewService = new OverviewService(httpClient);\n const riskScoringService = new RiskScoringService(httpClient);\n const identityService = new IdentityService(httpClient);\n const baseInformationService = new BaseInformationService(httpClient);\n const investorCategorizationService = new InvestorCategorizationService(httpClient);\n const themeService = new ThemeService(httpClient);\n\n // Initialize theme manager\n const themeManager = new ThemeManager();\n\n return {\n httpClient,\n applicantService,\n questionnaireService,\n uploadDocumentService,\n appropriatenessTestService,\n overviewService,\n riskScoringService,\n identityService,\n baseInformationService,\n investorCategorizationService,\n themeService,\n themeManager,\n };\n }, [config]);\n\n // Create context value with current theme\n const value = useMemo<MetaKYCContextValue>(() => {\n return {\n config,\n ...services,\n currentTheme,\n createOrchestrator: () =>\n new WorkflowOrchestrator(\n services.applicantService,\n services.questionnaireService,\n services.uploadDocumentService,\n services.appropriatenessTestService,\n services.overviewService,\n services.riskScoringService,\n services.identityService,\n services.investorCategorizationService\n ),\n };\n }, [config, services, currentTheme]);\n\n // Load and apply theme on mount (only once)\n useEffect(() => {\n const loadTheme = async () => {\n // Prevent duplicate theme loading\n if (isLoadingThemeRef.current || hasLoadedThemeRef.current) {\n console.log('[MetaKYC] Theme already loading or loaded, skipping...');\n return;\n }\n \n isLoadingThemeRef.current = true;\n \n try {\n // If static theme provided in config, use it\n if (config.theme) {\n console.log('[MetaKYC] Applying static theme from config');\n services.themeManager.applyTheme(config.theme);\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n return;\n }\n\n // Otherwise, fetch from backend (default behavior)\n console.log('[MetaKYC] Fetching theme from backend...');\n const theme = await services.themeService.getThemeConfiguration();\n services.themeManager.applyTheme(theme);\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n console.log('[MetaKYC] Theme loaded and applied', theme);\n } catch (error) {\n console.warn('[MetaKYC] Failed to load theme, using default:', error);\n // Set default theme\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n } finally {\n isLoadingThemeRef.current = false;\n }\n };\n\n loadTheme();\n\n // Cleanup on unmount\n return () => {\n services.themeManager.cleanup();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return <MetaKYCContext.Provider value={value}>{children}</MetaKYCContext.Provider>;\n};\n","import { useContext } from 'react';\nimport { MetaKYCContext, MetaKYCContextValue } from './MetaKYCContext';\n\n/**\n * Hook to access MetaKYC context\n * @throws Error if used outside MetaKYCProvider\n */\nexport function useMetaKYC(): MetaKYCContextValue {\n const context = useContext(MetaKYCContext);\n\n if (!context) {\n throw new Error('useMetaKYC must be used within a MetaKYCProvider');\n }\n\n return context;\n}\n","/**\n * Convert file to base64 string\n */\nexport async function fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n const result = reader.result as string;\n // Remove the data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1];\n resolve(base64);\n };\n reader.onerror = (error) => reject(error);\n });\n}\n\n/**\n * Validate file size\n */\nexport function validateFileSize(file: File, maxSizeBytes: number): boolean {\n return file.size <= maxSizeBytes;\n}\n\n/**\n * Validate file type\n */\nexport function validateFileType(file: File, allowedTypes: string): boolean {\n const mimeTypes = allowedTypes.split(',').map((type) => type.trim());\n return mimeTypes.some((type) => {\n if (type.endsWith('/*')) {\n // Wildcard type (e.g., image/*)\n const prefix = type.slice(0, -2);\n return file.type.startsWith(prefix);\n }\n return file.type === type;\n });\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n}\n\n/**\n * Get accept attribute string for file input\n */\nexport function getAcceptString(allowedTypes: string): string {\n return allowedTypes;\n}\n","/**\n * Simple class name utility\n * Combines class names and filters out falsy values\n */\nexport function cn(...classes: (string | boolean | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Local storage utilities for persisting workflow state\n */\n\nconst STORAGE_KEYS = {\n APPLICANT_ID: 'metakyc_applicant_id',\n WORKFLOW_STATE: 'metakyc_workflow_state',\n} as const;\n\n/**\n * Save applicant ID to local storage\n */\nexport function saveApplicantId(applicantId: number): void {\n try {\n localStorage.setItem(STORAGE_KEYS.APPLICANT_ID, applicantId.toString());\n } catch (error) {\n console.warn('Failed to save applicant ID to storage:', error);\n }\n}\n\n/**\n * Get applicant ID from local storage\n */\nexport function getApplicantId(): number | null {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.APPLICANT_ID);\n return stored ? parseInt(stored, 10) : null;\n } catch (error) {\n console.warn('Failed to retrieve applicant ID from storage:', error);\n return null;\n }\n}\n\n/**\n * Clear applicant ID from local storage\n */\nexport function clearApplicantId(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.APPLICANT_ID);\n } catch (error) {\n console.warn('Failed to clear applicant ID from storage:', error);\n }\n}\n\n/**\n * Persisted workflow state interface\n */\nexport interface PersistedWorkflowState {\n applicantId: number;\n currentStepOrder?: number;\n status: number;\n lastUpdated: string;\n workflowKey?: string;\n nextWorkflowKey?: string;\n}\n\n/**\n * Save workflow state to local storage\n */\nexport function saveWorkflowState(state: PersistedWorkflowState): void {\n try {\n localStorage.setItem(STORAGE_KEYS.WORKFLOW_STATE, JSON.stringify(state));\n } catch (error) {\n console.warn('Failed to save workflow state to storage:', error);\n }\n}\n\n/**\n * Get workflow state from local storage\n */\nexport function getWorkflowState(): PersistedWorkflowState | null {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.WORKFLOW_STATE);\n return stored ? JSON.parse(stored) : null;\n } catch (error) {\n console.warn('Failed to retrieve workflow state from storage:', error);\n return null;\n }\n}\n\n/**\n * Clear workflow state from local storage\n */\nexport function clearWorkflowState(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.WORKFLOW_STATE);\n } catch (error) {\n console.warn('Failed to clear workflow state from storage:', error);\n }\n}\n\n/**\n * Clear all MetaKYC data from local storage\n */\nexport function clearAllStorage(): void {\n clearApplicantId();\n clearWorkflowState();\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport * as React from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n ProgressApplicantResult,\n ApplicantProgressStatus,\n} from '../types';\nimport { WorkflowOrchestrator } from '../state';\nimport { saveApplicantId, getApplicantId, saveWorkflowState } from '../utils';\n\n/**\n * Hook to manage KYC workflow state and progression with automatic persistence\n */\nexport function useKycWorkflow(applicantId?: number) {\n const { createOrchestrator } = useMetaKYC();\n const [progress, setProgress] = useState<ProgressApplicantResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const orchestratorRef = useRef<WorkflowOrchestrator | null>(null);\n \n // Get persisted applicant ID if not provided\n const effectiveApplicantId = applicantId || getApplicantId();\n\n // Initialize orchestrator\n useEffect(() => {\n if (!orchestratorRef.current) {\n orchestratorRef.current = createOrchestrator();\n }\n }, [createOrchestrator]);\n\n // Save progress to localStorage whenever it changes\n useEffect(() => {\n if (progress && effectiveApplicantId) {\n saveApplicantId(effectiveApplicantId);\n saveWorkflowState({\n applicantId: effectiveApplicantId,\n currentStepOrder: progress.currentStep?.order,\n status: progress.status,\n lastUpdated: new Date().toISOString(),\n workflowKey: progress.workFlowKey,\n nextWorkflowKey: progress.nextWorkflowKey,\n });\n }\n }, [progress, effectiveApplicantId]);\n\n // Track if we're currently loading to prevent duplicate requests\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef(false);\n\n // Load progress\n const loadProgress = useCallback(async () => {\n if (!effectiveApplicantId || !orchestratorRef.current) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Workflow] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.initialize(effectiveApplicantId);\n setProgress(result);\n hasLoadedRef.current = true;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [effectiveApplicantId]);\n\n // Load progress on mount or when applicantId changes\n useEffect(() => {\n if (effectiveApplicantId && !hasLoadedRef.current) {\n loadProgress();\n }\n }, [effectiveApplicantId, loadProgress]);\n\n // Refresh progress\n const refreshProgress = useCallback(async () => {\n if (!orchestratorRef.current) return;\n \n // Prevent duplicate refresh requests\n if (isLoadingRef.current) {\n console.log('[Workflow] Refresh already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.refreshProgress();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, []);\n\n // Move to next step\n const moveToNext = useCallback(async () => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.moveToNextStep();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Move to previous step\n const moveBack = useCallback(async () => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.moveToPreviousStep();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Submit current step data\n const submitCurrentStep = useCallback(async (data: any) => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n await orchestratorRef.current.submitCurrentStep(data);\n const result = await orchestratorRef.current.refreshProgress();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Sort steps by order\n const sortedSteps = React.useMemo(() => {\n if (!progress?.stepInfoList) return [];\n return [...progress.stepInfoList].sort((a, b) => a.order - b.order);\n }, [progress?.stepInfoList]);\n\n // Check if workflow has changed\n const hasWorkflowChanged = React.useMemo(() => {\n if (!progress) return false;\n return progress.nextWorkflowKey && progress.nextWorkflowKey !== progress.workFlowKey;\n }, [progress]);\n\n return {\n progress,\n applicantId: effectiveApplicantId,\n currentStep: progress?.currentStep || null,\n steps: sortedSteps,\n status: progress?.status || ApplicantProgressStatus.None,\n workflowResult: progress?.workflowResult || null,\n workflowKey: progress?.workFlowKey,\n nextWorkflowKey: progress?.nextWorkflowKey,\n hasWorkflowChanged,\n isLoading,\n error,\n isComplete: progress?.status === ApplicantProgressStatus.Finished,\n isOnHold: progress?.status === ApplicantProgressStatus.OnHold,\n refreshProgress,\n moveToNext,\n moveBack,\n submitCurrentStep,\n orchestrator: orchestratorRef.current,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { QuestionnaireOutput, FillQuestionnarieInput, FillQuestionnairesResult } from '../types';\n\ntype InitialAnswers = Record<number, string[]>;\n\n/**\n * Hook to manage questionnaire data and submission\n */\nexport function useQuestionnaire(applicantId?: number) {\n const { questionnaireService, applicantService } = useMetaKYC();\n const [questionnaire, setQuestionnaire] = useState<QuestionnaireOutput | null>(null);\n const [initialAnswers, setInitialAnswers] = useState<InitialAnswers>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load questionnaire + existing answers\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Questionnaire] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const [result, applicantData] = await Promise.all([\n questionnaireService.getQuestionnaire(applicantId),\n applicantService.getApplicantData(applicantId).catch(() => null),\n ]);\n setQuestionnaire(result);\n\n // Build initial answers by matching question text to existing results\n if (applicantData?.questionnaireResults?.length && result) {\n const textToAnswers = new Map<string, string[]>();\n for (const qr of applicantData.questionnaireResults) {\n if (qr.question && qr.answers?.length) {\n textToAnswers.set(qr.question.trim().toLowerCase(), qr.answers);\n }\n }\n\n const answers: InitialAnswers = {};\n const allQuestions = result.questionGroups.flatMap(g => g.questions ?? []);\n for (const q of allQuestions) {\n const key = q.text.trim().toLowerCase();\n if (textToAnswers.has(key)) {\n answers[q.id] = textToAnswers.get(key)!;\n }\n }\n setInitialAnswers(answers);\n }\n\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, questionnaireService, applicantService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit questionnaire\n const submit = useCallback(\n async (input: FillQuestionnarieInput): Promise<FillQuestionnairesResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const result = await questionnaireService.fillQuestionnaire(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [questionnaireService]\n );\n\n return {\n questionnaire,\n initialAnswers,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { UploadDocumentOutputDto, FillUploadDocumentInput } from '../types';\n\n/**\n * Hook to manage upload document data and submission\n */\nexport function useUploadDocument(applicantId?: number) {\n const { uploadDocumentService } = useMetaKYC();\n const [uploadDocument, setUploadDocument] = useState<UploadDocumentOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load upload document requirements\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[UploadDocument] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await uploadDocumentService.getUploadDocument(applicantId);\n setUploadDocument(result);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, uploadDocumentService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit uploaded documents\n const submit = useCallback(\n async (input: FillUploadDocumentInput): Promise<void> => {\n setIsSubmitting(true);\n setUploadProgress(0);\n setError(null);\n\n try {\n await uploadDocumentService.fillUploadDocument(input);\n setUploadProgress(100);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [uploadDocumentService]\n );\n\n return {\n uploadDocument,\n isLoading,\n isSubmitting,\n uploadProgress,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n FillAppropriatenessTestResult,\n} from '../types';\n\n/**\n * Hook to manage appropriateness test data and submission\n */\nexport function useAppropriatenessTest(applicantId?: number) {\n const { appropriatenessTestService } = useMetaKYC();\n const [test, setTest] = useState<AppropriatenessTestOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<FillAppropriatenessTestResult | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load appropriateness test\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[AppropriatenessTest] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n setTest(data);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, appropriatenessTestService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit appropriateness test\n const submit = useCallback(\n async (input: FillAppropriatenessTestInput): Promise<FillAppropriatenessTestResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const submitResult = await appropriatenessTestService.fillAppropriatenessTest(input);\n setResult(submitResult);\n return submitResult;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [appropriatenessTestService]\n );\n\n return {\n test,\n result,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { OverviewDataDto } from '../types';\n\n/**\n * Hook to manage overview data and submission\n */\nexport function useOverview(applicantId?: number) {\n const { overviewService } = useMetaKYC();\n const [overview, setOverview] = useState<OverviewDataDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load overview data\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Overview] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await overviewService.getOverviewData(applicantId);\n setOverview(result);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, overviewService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Pass overview (confirm and continue)\n const passOverview = useCallback(async () => {\n if (!applicantId) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n await overviewService.passOverview(applicantId);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n }, [applicantId, overviewService]);\n\n return {\n overview,\n isLoading,\n isSubmitting,\n error,\n load,\n passOverview,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { ApplicantRegistrationRequestOutput, IdentityRequest } from '../types';\n\n/**\n * Hook to manage identity verification\n */\nexport function useIdentityVerification(applicantId?: number) {\n const { identityService } = useMetaKYC();\n const [identityData, setIdentityData] = useState<ApplicantRegistrationRequestOutput | null>(\n null\n );\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isRequestingRef = useRef(false);\n\n // Request identity verification (individual)\n const requestIdentity = useCallback(\n async (redirectUrl?: string, ttl?: number) => {\n if (!applicantId) return;\n \n // Prevent duplicate requests using ref\n if (isRequestingRef.current) {\n console.log('[Identity] Request already in progress, skipping...');\n return;\n }\n\n isRequestingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: false,\n redirectUrl: redirectUrl || '',\n ttl: ttl || 7 * 24 * 3600, // Default: 7 days\n };\n console.log('Identity request input:', input);\n const result = await identityService.identityRequest(input);\n console.log('Identity request result:', result);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isRequestingRef.current = false;\n }\n },\n [applicantId, identityService]\n );\n\n // Request company identity verification\n const requestCompanyIdentity = useCallback(\n async (redirectUrl?: string, ttl?: number) => {\n if (!applicantId) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: false,\n redirectUrl,\n ttl,\n };\n const result = await identityService.identityCompanyRequest(input);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantId, identityService]\n );\n\n // Restart identity verification\n const restartIdentity = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isRequestingRef.current) {\n console.log('[Identity] Restart already in progress, skipping...');\n return;\n }\n\n isRequestingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n console.log('Restarting identity with input:', input);\n const result = await identityService.identityRequest(input);\n console.log('Restart identity result:', result);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isRequestingRef.current = false;\n }\n }, [applicantId, identityService]);\n\n return {\n identityData,\n provider: identityData?.provider || null,\n token: identityData?.publicProviderTokenObject || null,\n isLoading,\n error,\n requestIdentity,\n requestCompanyIdentity,\n restartIdentity,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { RiskCriteriaDto, RiskCalculationInput, RiskScoringResult } from '../types';\n\ntype InitialAnswers = Record<number, string[]>;\n\n/**\n * Hook to manage risk scoring\n */\nexport function useRiskScoring(applicantId?: number) {\n const { riskScoringService, applicantService } = useMetaKYC();\n const [criteria, setCriteria] = useState<RiskCriteriaDto[] | null>(null);\n const [initialAnswers, setInitialAnswers] = useState<InitialAnswers>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<RiskScoringResult | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load risk criteria + existing answers\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[RiskScoring] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const [data, applicantData] = await Promise.all([\n riskScoringService.getRiskCriterias(applicantId),\n applicantService.getApplicantData(applicantId).catch(() => null),\n ]);\n setCriteria(data);\n\n // Build initial answers from the latest risk scoring result\n if (applicantData?.riskScoringResults?.length) {\n const latestResult = applicantData.riskScoringResults[0];\n const answers: InitialAnswers = {};\n for (const cr of latestResult.riskCriteriaResults ?? []) {\n if (cr.riskCriteriaId != null && cr.answer != null && cr.answer !== '') {\n // answer may be comma-separated for multi-value criteria — split, trim, and deduplicate\n const values = [...new Set(\n cr.answer.split(',').map((v: string) => v.trim()).filter((v: string) => v !== '')\n )];\n if (values.length > 0) {\n answers[cr.riskCriteriaId] = values;\n }\n }\n }\n setInitialAnswers(answers);\n }\n\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, riskScoringService, applicantService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit risk scoring\n const submit = useCallback(\n async (input: RiskCalculationInput): Promise<RiskScoringResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const submitResult = await riskScoringService.submitRiskScoring(input);\n setResult(submitResult);\n return submitResult;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [riskScoringService]\n );\n\n return {\n criteria,\n initialAnswers,\n result,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n ApplicantRegistrationRequestInput,\n CompanyApplicantRegistrationRequestInput,\n ProgressApplicantResult,\n ApplicantDataDto,\n} from '../types';\n\n/**\n * Hook to manage applicant operations\n */\nexport function useApplicant() {\n const { applicantService, config } = useMetaKYC();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isCreatingRef = useRef(false);\n const isLoadingDataRef = useRef(false);\n\n /**\n * Generate session key for SardinAI if configured\n */\n const generateSardinAISessionKey = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n };\n\n // Create individual applicant\n const createApplicant = useCallback(\n async (input: ApplicantRegistrationRequestInput): Promise<ProgressApplicantResult> => {\n // Prevent duplicate requests\n if (isCreatingRef.current) {\n console.log('[Applicant] Create already in progress, skipping...');\n throw new Error('Creation already in progress');\n }\n\n isCreatingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n // Ensure applicantAdditionalDatas is always initialized (even if empty)\n if (!input.applicantAdditionalDatas) {\n input.applicantAdditionalDatas = [];\n }\n\n // If SardinAI is configured, add session key to additional data\n if (config.identityProviders?.sardinai) {\n const sessionKey = generateSardinAISessionKey();\n console.log('[SardinAI] Generated session key:', sessionKey);\n \n input.applicantAdditionalDatas.push({\n paramName: 'sessionKey',\n value: sessionKey,\n });\n }\n\n const result = await applicantService.createApplicant(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isCreatingRef.current = false;\n }\n },\n [applicantService, config]\n );\n\n // Create company applicant\n const createCompanyApplicant = useCallback(\n async (\n input: CompanyApplicantRegistrationRequestInput\n ): Promise<ProgressApplicantResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await applicantService.createCompanyApplicant(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantService]\n );\n\n // Get applicant data\n const getApplicantData = useCallback(\n async (applicantId: number): Promise<ApplicantDataDto> => {\n // Prevent duplicate requests\n if (isLoadingDataRef.current) {\n console.log('[Applicant] Data load already in progress, skipping...');\n throw new Error('Data load already in progress');\n }\n\n isLoadingDataRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await applicantService.getApplicantData(applicantId);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isLoadingDataRef.current = false;\n }\n },\n [applicantService]\n );\n\n // Stop progress\n const stopProgress = useCallback(\n async (applicantId: number): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await applicantService.stopProgress(applicantId);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantService]\n );\n\n return {\n isLoading,\n error,\n createApplicant,\n createCompanyApplicant,\n getApplicantData,\n stopProgress,\n };\n}\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n isLoading?: boolean;\n}\n\n/**\n * Button component\n */\nexport const Button: React.FC<ButtonProps> = ({\n children,\n variant = 'primary',\n size = 'md',\n isLoading = false,\n disabled,\n className,\n ...props\n}) => {\n const baseStyles =\n 'inline-flex items-center justify-center rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';\n\n const variantStyles = {\n primary: 'bg-primary-500 text-white hover:bg-primary-600 focus:ring-primary-500',\n secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-400',\n outline:\n 'border-2 border-primary-500 text-primary-500 hover:bg-primary-50 focus:ring-primary-500',\n danger: 'bg-danger-500 text-white hover:bg-danger-600 focus:ring-danger-500',\n ghost: 'text-gray-700 hover:bg-gray-100 focus:ring-gray-400',\n };\n\n const sizeStyles = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n };\n\n return (\n <button\n className={cn(baseStyles, variantStyles[variant], sizeStyles[size], className)}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading && (\n <svg\n className=\"animate-spin -ml-1 mr-2 h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n {children}\n </button>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../../utils';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n helperText?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\n/**\n * Input component — uses CSS variables so it follows the SDK theme.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ label, error, helperText, leftIcon, rightIcon, className, style, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n {leftIcon}\n </div>\n )}\n\n <input\n ref={ref}\n className={cn(\n 'block w-full rounded-lg border px-3 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\n 'disabled:opacity-60 disabled:cursor-not-allowed',\n leftIcon ? 'pl-10' : '',\n rightIcon ? 'pr-10' : '',\n className\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n // placeholder and focus-ring are handled via global CSS in styles.css\n ...style,\n }}\n {...props}\n />\n\n {rightIcon && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none\">\n {rightIcon}\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-danger, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * Card component\n */\nexport const Card: React.FC<CardProps> = ({ children, className, ...props }) => {\n return (\n <div\n className={cn(\n 'metakyc-card rounded-xl shadow-sm border',\n className\n )}\n style={{\n backgroundColor: 'var(--metakyc-surface, #ffffff)',\n borderColor: 'var(--metakyc-border, #e5e7eb)'\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card header component\n */\nexport const CardHeader: React.FC<CardProps> = ({ children, className, ...props }) => {\n return (\n <div \n className={cn('px-6 py-4 border-b', className)} \n style={{\n borderColor: 'var(--metakyc-border, #e5e7eb)'\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card content component\n */\nexport const CardContent: React.FC<CardProps> = ({ children, className, ...props }) => {\n return (\n <div className={cn('px-6 py-4', className)} {...props}>\n {children}\n </div>\n );\n};\n\n/**\n * Card footer component\n */\nexport const CardFooter: React.FC<CardProps> = ({ children, className, ...props }) => {\n return (\n <div \n className={cn('px-6 py-4 border-t', className)} \n style={{\n borderColor: 'var(--metakyc-border, #e5e7eb)'\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'default' | 'success' | 'danger' | 'warning' | 'info';\n children: React.ReactNode;\n}\n\n/**\n * Badge component\n */\nexport const Badge: React.FC<BadgeProps> = ({ children, variant = 'default', className, ...props }) => {\n const variantStyles = {\n default: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300',\n success: 'bg-success-100 text-success-800 dark:bg-success-900 dark:text-success-300',\n danger: 'bg-danger-100 text-danger-800 dark:bg-danger-900 dark:text-danger-300',\n warning: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300',\n info: 'bg-primary-100 text-primary-800 dark:bg-primary-900 dark:text-primary-300',\n };\n\n return (\n <span\n className={cn(\n 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium',\n variantStyles[variant],\n className\n )}\n {...props}\n >\n {children}\n </span>\n );\n};\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * Spinner component\n */\nexport const Spinner: React.FC<SpinnerProps> = ({ size = 'md', className, ...props }) => {\n const sizeStyles = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n };\n\n return (\n <div className={cn('flex items-center justify-center', className)} {...props}>\n <svg\n className={cn('animate-spin text-primary-500', sizeStyles[size])}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../../utils';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n label?: string;\n error?: string;\n helperText?: string;\n options: SelectOption[];\n placeholder?: string;\n}\n\n/**\n * Select component — uses CSS variables so it follows the SDK theme.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ label, error, helperText, options, placeholder, className, style, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <select\n ref={ref}\n className={cn(\n 'block w-full rounded-lg border px-3 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\n 'disabled:opacity-60 disabled:cursor-not-allowed',\n error ? 'border-danger-500' : '',\n className\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n ...style,\n }}\n {...props}\n >\n {placeholder && (\n <option\n key=\"__placeholder__\"\n value=\"\"\n disabled\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n >\n {placeholder}\n </option>\n )}\n {options.map((option, idx) => (\n <option\n key={option.value || `option-${idx}`}\n value={option.value}\n disabled={option.disabled}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: option.disabled\n ? 'var(--metakyc-text-muted, #9ca3af)'\n : 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n }}\n >\n {option.label}\n </option>\n ))}\n </select>\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-error, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nSelect.displayName = 'Select';\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n}\n\nexport interface MultiSelectProps {\n label?: string;\n value: string[];\n onChange: (values: string[]) => void;\n options: MultiSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n required?: boolean;\n}\n\ninterface DropdownPos {\n top: number;\n left: number;\n width: number;\n openUp: boolean;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 280;\n\nexport const MultiSelect: React.FC<MultiSelectProps> = ({\n label,\n value,\n onChange,\n options,\n placeholder = 'Select...',\n disabled = false,\n required = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [pos, setPos] = useState<DropdownPos | null>(null);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const calcPos = useCallback((): DropdownPos | null => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const openUp = spaceBelow < DROPDOWN_MAX_HEIGHT && rect.top > DROPDOWN_MAX_HEIGHT;\n return { top: openUp ? rect.top : rect.bottom + 4, left: rect.left, width: rect.width, openUp };\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n const p = calcPos();\n if (p) setPos(p);\n setIsOpen(true);\n }, [disabled, calcPos]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (!containerRef.current?.contains(target) && !dropdownRef.current?.contains(target)) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n useEffect(() => {\n if (!isOpen) return;\n const update = () => { const p = calcPos(); if (p) setPos(p); };\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => { window.removeEventListener('scroll', update, true); window.removeEventListener('resize', update); };\n }, [isOpen, calcPos]);\n\n const filteredOptions = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase())\n );\n\n const toggleOption = (optionValue: string) => {\n if (disabled) return;\n onChange(value.includes(optionValue) ? value.filter(v => v !== optionValue) : [...value, optionValue]);\n };\n\n const removeValue = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) onChange(value.filter(v => v !== optionValue));\n };\n\n const getLabel = (val: string) => options.find(o => o.value === val)?.label || val;\n\n // Inherit CSS vars for portal theming\n const themeVars = triggerRef.current ? getComputedStyle(triggerRef.current) : null;\n const bg = themeVars?.getPropertyValue('--metakyc-input-bg').trim() || '#ffffff';\n const borderColor = themeVars?.getPropertyValue('--metakyc-input-border').trim()\n || themeVars?.getPropertyValue('--metakyc-border').trim() || '#d1d5db';\n const textPrimary = themeVars?.getPropertyValue('--metakyc-input-text').trim()\n || themeVars?.getPropertyValue('--metakyc-text-primary').trim() || '#111827';\n const textSecondary= themeVars?.getPropertyValue('--metakyc-text-secondary').trim() || '#6b7280';\n const primaryColor = themeVars?.getPropertyValue('--metakyc-primary').trim() || '#2563eb';\n const primaryLight = themeVars?.getPropertyValue('--metakyc-primary-light').trim() || '#eff6ff';\n const hoverBg = themeVars?.getPropertyValue('--metakyc-hover-bg').trim() || '#f9fafb';\n\n const dropdownPanel = isOpen && pos && (\n <div\n ref={dropdownRef}\n className=\"metakyc-multiselect-dropdown\"\n style={{\n position: 'fixed',\n top: pos.openUp ? undefined : pos.top,\n bottom: pos.openUp ? window.innerHeight - pos.top + 4 : undefined,\n left: pos.left,\n width: pos.width,\n zIndex: 99999,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n border: `1px solid ${borderColor}`,\n backgroundColor: bg,\n overflow: 'hidden',\n }}\n >\n {/* Search */}\n <div style={{ padding: '8px', borderBottom: `1px solid ${borderColor}` }}>\n <input\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search...\"\n autoFocus\n onClick={e => e.stopPropagation()}\n className=\"metakyc-multiselect-search w-full\"\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n fontSize: '13px',\n borderRadius: '6px',\n border: `1px solid ${borderColor}`,\n backgroundColor: bg,\n color: textPrimary,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n {/* Options */}\n <ul style={{ listStyle: 'none', margin: 0, padding: '4px 0', maxHeight: '192px', overflowY: 'auto' }}>\n {filteredOptions.length === 0 ? (\n <li style={{ padding: '8px 12px', fontSize: '13px', color: textSecondary }}>No results</li>\n ) : (\n filteredOptions.map(option => {\n const isSelected = value.includes(option.value);\n return (\n <li\n key={option.value}\n onClick={() => toggleOption(option.value)}\n className=\"metakyc-multiselect-option\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n fontSize: '13px',\n cursor: 'pointer',\n backgroundColor: isSelected ? primaryLight : 'transparent',\n color: isSelected ? primaryColor : textPrimary,\n userSelect: 'none',\n }}\n onMouseEnter={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.backgroundColor = hoverBg; }}\n onMouseLeave={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent'; }}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n readOnly\n style={{ accentColor: primaryColor, pointerEvents: 'none', flexShrink: 0 }}\n />\n <span>{option.label}</span>\n </li>\n );\n })\n )}\n </ul>\n\n {/* Clear all */}\n {value.length > 0 && (\n <div style={{ padding: '6px 12px', borderTop: `1px solid ${borderColor}` }}>\n <button\n type=\"button\"\n onClick={() => { onChange([]); setSearch(''); }}\n style={{ fontSize: '12px', color: '#ef4444', background: 'none', border: 'none', cursor: 'pointer', padding: 0 }}\n >\n Clear all ({value.length} selected)\n </button>\n </div>\n )}\n </div>\n );\n\n return (\n <div className=\"w-full metakyc-multiselect\" ref={containerRef}>\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {required && <span style={{ color: 'var(--metakyc-error, #ef4444)', marginLeft: '4px' }}>*</span>}\n </label>\n )}\n\n {/* Trigger */}\n <div\n ref={triggerRef}\n onClick={() => (isOpen ? close() : open())}\n className={cn(\n 'metakyc-multiselect-trigger',\n 'min-h-[42px] w-full px-3 py-2 rounded-lg border text-sm transition-colors relative',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n borderColor: isOpen\n ? 'var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n outline: isOpen ? '2px solid var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))' : 'none',\n outlineOffset: '-1px',\n }}\n >\n {value.length === 0 ? (\n <span\n className=\"metakyc-multiselect-placeholder leading-6\"\n style={{ color: 'var(--metakyc-text-secondary, #9ca3af)' }}\n >\n {placeholder}\n </span>\n ) : (\n <div className=\"flex flex-wrap gap-1 pr-6\">\n {value.map(v => (\n <span\n key={v}\n className=\"metakyc-multiselect-chip inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium\"\n style={{\n backgroundColor: 'var(--metakyc-primary-light, #eff6ff)',\n color: 'var(--metakyc-primary, #2563eb)',\n }}\n >\n {getLabel(v)}\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => removeValue(v, e)}\n className=\"metakyc-multiselect-chip-remove\"\n style={{\n background: 'transparent', border: 'none',\n padding: '0 0 0 2px', margin: 0,\n cursor: 'pointer', fontSize: '14px',\n lineHeight: 1, fontWeight: 'bold',\n display: 'inline-flex', alignItems: 'center',\n boxShadow: 'none', transform: 'none',\n minWidth: 0, width: 'auto', height: 'auto',\n letterSpacing: 'normal', textTransform: 'none',\n }}\n >\n ×\n </button>\n )}\n </span>\n ))}\n </div>\n )}\n <span\n className=\"metakyc-multiselect-arrow absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-xs\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {isOpen ? '▲' : '▼'}\n </span>\n </div>\n\n {typeof document !== 'undefined' && dropdownPanel\n ? createPortal(dropdownPanel, document.body)\n : null}\n </div>\n );\n};\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils';\n\nexport interface SearchableSelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SearchableSelectProps {\n label?: string;\n error?: string;\n helperText?: string;\n options: SearchableSelectOption[];\n placeholder?: string;\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n required?: boolean;\n className?: string;\n}\n\ninterface DropdownPos {\n top: number;\n left: number;\n width: number;\n openUp: boolean;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 260; // px — search (44) + list (max-h-52 = 208) + padding\n\n/**\n * Single-value searchable dropdown — follows SDK CSS variable theming.\n * The dropdown panel is rendered via a React portal at document.body level\n * so it is never clipped by overflow:hidden parents or stacking contexts.\n */\nexport const SearchableSelect: React.FC<SearchableSelectProps> = ({\n label,\n error,\n helperText,\n options,\n placeholder = 'Select...',\n value,\n onChange,\n disabled = false,\n required = false,\n className,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [pos, setPos] = useState<DropdownPos | null>(null);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n\n // ── Position calculation ──────────────────────────────────────────────────\n const calcPos = useCallback(() => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const openUp = spaceBelow < DROPDOWN_MAX_HEIGHT && rect.top > DROPDOWN_MAX_HEIGHT;\n return {\n top: openUp ? rect.top : rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n openUp,\n };\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n const p = calcPos();\n if (p) setPos(p);\n setIsOpen(true);\n }, [disabled, calcPos]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n const handleToggle = () => (isOpen ? close() : open());\n\n // ── Close on outside click ────────────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n !containerRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n // ── Reposition on scroll / resize ────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const update = () => {\n const p = calcPos();\n if (p) setPos(p);\n };\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [isOpen, calcPos]);\n\n // ── Focus search on open ──────────────────────────────────────────────────\n useEffect(() => {\n if (isOpen && searchRef.current) {\n setTimeout(() => searchRef.current?.focus(), 0);\n }\n }, [isOpen]);\n\n const filteredOptions = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase()) ||\n o.value.toLowerCase().includes(search.toLowerCase())\n );\n\n const selectedLabel = options.find(o => o.value === value)?.label;\n\n const handleSelect = (optValue: string, optDisabled?: boolean) => {\n if (disabled || optDisabled) return;\n onChange(optValue);\n close();\n };\n\n // ── Inherited CSS vars from the trigger node ──────────────────────────────\n // We pass them as inline styles on the portal so the theme follows the dropdown.\n const themeVars = triggerRef.current\n ? getComputedStyle(triggerRef.current)\n : null;\n const bg = themeVars?.getPropertyValue('--metakyc-input-bg').trim() || '#ffffff';\n const border = themeVars?.getPropertyValue('--metakyc-input-border').trim()\n || themeVars?.getPropertyValue('--metakyc-border').trim() || '#d1d5db';\n const textPrimary = themeVars?.getPropertyValue('--metakyc-input-text').trim()\n || themeVars?.getPropertyValue('--metakyc-text-primary').trim() || '#111827';\n const textSecondary = themeVars?.getPropertyValue('--metakyc-text-secondary').trim() || '#6b7280';\n const primary = themeVars?.getPropertyValue('--metakyc-primary').trim() || '#2563eb';\n const primaryLight = themeVars?.getPropertyValue('--metakyc-primary-light').trim() || '#eff6ff';\n const hoverBg = themeVars?.getPropertyValue('--metakyc-hover-bg').trim() || '#f9fafb';\n\n // ── Portal dropdown panel ─────────────────────────────────────────────────\n const dropdownPanel = isOpen && pos && (\n <div\n ref={dropdownRef}\n className=\"metakyc-searchable-select-dropdown\"\n style={{\n position: 'fixed',\n top: pos.openUp ? undefined : pos.top,\n bottom: pos.openUp ? window.innerHeight - pos.top + 4 : undefined,\n left: pos.left,\n width: pos.width,\n zIndex: 99999,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n border: `1px solid ${border}`,\n backgroundColor: bg,\n overflow: 'hidden',\n }}\n >\n {/* Search input */}\n <div style={{ padding: '8px', borderBottom: `1px solid ${border}` }}>\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search...\"\n onClick={e => e.stopPropagation()}\n className=\"metakyc-searchable-select-search w-full\"\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n fontSize: '13px',\n borderRadius: '6px',\n border: `1px solid ${border}`,\n backgroundColor: bg,\n color: textPrimary,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n {/* Options list */}\n <ul\n style={{\n listStyle: 'none',\n margin: 0,\n padding: '4px 0',\n maxHeight: '208px',\n overflowY: 'auto',\n }}\n >\n {filteredOptions.length === 0 ? (\n <li style={{ padding: '8px 12px', fontSize: '13px', color: textSecondary }}>\n No results\n </li>\n ) : (\n filteredOptions.map(option => {\n const isSelected = option.value === value;\n return (\n <li\n key={option.value}\n className=\"metakyc-searchable-select-option\"\n onClick={() => handleSelect(option.value, option.disabled)}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n opacity: option.disabled ? 0.4 : 1,\n backgroundColor: isSelected ? primaryLight : 'transparent',\n color: isSelected ? primary : textPrimary,\n userSelect: 'none',\n }}\n onMouseEnter={e => {\n if (!isSelected && !option.disabled)\n (e.currentTarget as HTMLElement).style.backgroundColor = hoverBg;\n }}\n onMouseLeave={e => {\n if (!isSelected)\n (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent';\n }}\n >\n {option.label}\n </li>\n );\n })\n )}\n </ul>\n </div>\n );\n\n return (\n <div\n className={cn('w-full metakyc-searchable-select', className)}\n ref={containerRef}\n >\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {required && (\n <span style={{ color: 'var(--metakyc-error, #ef4444)', marginLeft: '4px' }}>*</span>\n )}\n </label>\n )}\n\n {/* Trigger */}\n <div\n ref={triggerRef}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={handleToggle}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleToggle(); }\n if (e.key === 'Escape') close();\n }}\n className={cn(\n 'metakyc-searchable-select-trigger',\n 'w-full px-3 py-2 rounded-lg border text-sm transition-colors text-left',\n 'flex items-center justify-between gap-2',\n 'focus:outline-none',\n disabled ? 'opacity-60 cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: selectedLabel\n ? 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))'\n : 'var(--metakyc-input-placeholder, var(--metakyc-text-muted, #9ca3af))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : isOpen\n ? 'var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n minHeight: '42px',\n outline: isOpen ? '2px solid var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))' : 'none',\n outlineOffset: '-1px',\n }}\n >\n <span className=\"truncate flex-1\">{selectedLabel || placeholder}</span>\n <span\n className=\"flex-shrink-0 text-xs pointer-events-none\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {isOpen ? '▲' : '▼'}\n </span>\n </div>\n\n {/* Portal dropdown */}\n {typeof document !== 'undefined' && dropdownPanel\n ? createPortal(dropdownPanel, document.body)\n : null}\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-error, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n};\n\nSearchableSelect.displayName = 'SearchableSelect';\n","import React, { useRef, useState } from 'react';\nimport { cn, formatFileSize } from '../../utils';\n\nexport interface FileUploadProps {\n label?: string;\n error?: string;\n accept?: string;\n multiple?: boolean;\n maxSize?: number;\n onChange?: (files: File[]) => void;\n value?: File[];\n className?: string;\n}\n\n/**\n * File upload component with drag and drop\n */\nexport const FileUpload: React.FC<FileUploadProps> = ({\n label,\n error,\n accept,\n multiple = false,\n maxSize,\n onChange,\n value = [],\n className,\n}) => {\n const [isDragging, setIsDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFiles = (files: FileList | null) => {\n if (!files) return;\n\n const fileArray = Array.from(files);\n\n // Validate file size\n if (maxSize) {\n const oversizedFiles = fileArray.filter((file) => file.size > maxSize);\n if (oversizedFiles.length > 0) {\n const maxSizeFormatted = formatFileSize(maxSize);\n alert(`Some files exceed the maximum size of ${maxSizeFormatted}`);\n return;\n }\n }\n\n onChange?.(multiple ? [...value, ...fileArray] : [fileArray[0]]);\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n };\n\n const handleDragLeave = () => {\n setIsDragging(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n handleFiles(e.dataTransfer.files);\n };\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const removeFile = (index: number) => {\n const newFiles = value.filter((_, i) => i !== index);\n onChange?.(newFiles);\n };\n\n return (\n <div className={cn('w-full', className)}>\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n {label}\n </label>\n )}\n\n <div\n className={cn(\n 'border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors',\n isDragging\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-300 dark:border-gray-600 hover:border-primary-500',\n error && 'border-danger-500'\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"hidden\"\n accept={accept}\n multiple={multiple}\n onChange={(e) => handleFiles(e.target.files)}\n />\n\n <div className=\"space-y-2\">\n <svg\n className=\"mx-auto h-12 w-12 text-gray-400\"\n stroke=\"currentColor\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n >\n <path\n d=\"M28 8H12a4 4 0 00-4 4v20m32-12v8m0 0v8a4 4 0 01-4 4H12a4 4 0 01-4-4v-4m32-4l-3.172-3.172a4 4 0 00-5.656 0L28 28M8 32l9.172-9.172a4 4 0 015.656 0L28 28m0 0l4 4m4-24h8m-4-4v8m-12 4h.02\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n <span className=\"font-medium text-primary-500\">Click to upload</span> or drag and drop\n </div>\n {maxSize && (\n <p className=\"text-xs text-gray-500\">Maximum file size: {formatFileSize(maxSize)}</p>\n )}\n </div>\n </div>\n\n {/* File list */}\n {value.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {value.map((file, index) => (\n <div\n key={index}\n className=\"flex items-center justify-between px-3 py-2 bg-gray-50 dark:bg-gray-700 rounded-lg\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"h-5 w-5 text-gray-400 flex-shrink-0\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-sm text-gray-700 dark:text-gray-300 truncate\">\n {file.name}\n </span>\n <span className=\"text-xs text-gray-500\">({formatFileSize(file.size)})</span>\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className=\"ml-2 text-danger-500 hover:text-danger-700 focus:outline-none\"\n >\n <svg className=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n {error && <p className=\"mt-1 text-sm text-danger-500\">{error}</p>}\n </div>\n );\n};\n","import { forwardRef } from 'react';\nimport { cn } from '../../utils';\nimport { Input, InputProps } from './Input';\n\nexport interface PhoneInputProps extends Omit<InputProps, 'type' | 'leftIcon'> {\n countryCode?: string;\n onCountryCodeChange?: (code: string) => void;\n}\n\n/**\n * Phone input component with country code\n */\nexport const PhoneInput = forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ countryCode = '+1', onCountryCodeChange, className, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {props.label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {props.label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={countryCode}\n onChange={(e) => onCountryCodeChange?.(e.target.value)}\n className={cn(\n 'w-20 rounded-lg border px-3 py-2 text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0'\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-text-primary, #111827)',\n borderColor: 'var(--metakyc-border, #d1d5db)',\n }}\n placeholder=\"+1\"\n />\n <Input\n ref={ref}\n type=\"tel\"\n className={cn('flex-1', className)}\n {...props}\n label=\"\"\n />\n </div>\n\n {props.error && <p className=\"mt-1 text-sm text-danger-500\">{props.error}</p>}\n </div>\n );\n }\n);\n\nPhoneInput.displayName = 'PhoneInput';\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { useQuestionnaire } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Select, Spinner } from '../core';\nimport { FillQuestionnarieInput, QuestionDto, QuestionGroupDto } from '../../types';\nimport { ChevronRight, ChevronLeft } from 'lucide-react';\n\nexport interface QuestionnaireStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface PagedQuestion {\n question: QuestionDto;\n groupIndex: number;\n qIdx: number;\n}\n\ntype Answers = Record<number, string[]>; // questionId → values\ntype Errors = Record<number, string>; // questionId → error message\n\n// ── Validation ────────────────────────────────────────────────────────────\n\nfunction validateQuestion(question: QuestionDto, values: string[]): string | null {\n const isEmpty = !values || values.length === 0 || values.every(v => !v || !v.trim());\n\n if (question.isRequired && isEmpty) {\n return question.errorMessage || 'This field is required';\n }\n\n if (!isEmpty) {\n const first = values[0] ?? '';\n\n if (first && question.regex) {\n try {\n if (!new RegExp(question.regex).test(first)) {\n return question.errorMessage || 'Invalid format';\n }\n } catch { /* ignore invalid regex */ }\n }\n\n if (first !== '') {\n const num = Number(first);\n if (!isNaN(num) && first.trim() !== '') {\n if (question.min !== undefined && question.min !== null && num < question.min) {\n return `Minimum value is ${question.min}`;\n }\n if (question.max !== undefined && question.max !== null && num > question.max) {\n return `Maximum value is ${question.max}`;\n }\n } else {\n if (question.min !== undefined && question.min !== null && first.length < question.min) {\n return `Minimum length is ${question.min} characters`;\n }\n if (question.max !== undefined && question.max !== null && first.length > question.max) {\n return `Maximum length is ${question.max} characters`;\n }\n }\n }\n }\n\n return null;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction buildPages(groups: QuestionGroupDto[]): PagedQuestion[][] {\n const flat: PagedQuestion[] = groups.flatMap((g, gi) =>\n (g.questions ?? []).map((q, qi) => ({ question: q, groupIndex: gi, qIdx: qi }))\n );\n\n const map = new Map<number, PagedQuestion[]>();\n for (const pq of flat) {\n // pageNumber <= 0 or undefined means \"first page\" (no specific pagination)\n const p = (pq.question.pageNumber != null && pq.question.pageNumber > 0) ? pq.question.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push(pq);\n }\n\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, qs]) => qs);\n}\n\n// ── Component ─────────────────────────────────────────────────────────────\n\nexport const QuestionnaireStep: React.FC<QuestionnaireStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { questionnaire, initialAnswers, isLoading, isSubmitting, error, submit } = useQuestionnaire(applicantId);\n\n const [answers, setAnswers] = useState<Answers>({});\n const [fieldErrors, setFieldErrors] = useState<Errors>({});\n const [currentPage, setCurrentPage] = useState(0);\n\n // Seed answers with existing data when loaded (only if user hasn't entered anything yet)\n React.useEffect(() => {\n if (initialAnswers && Object.keys(initialAnswers).length > 0 && Object.keys(answers).length === 0) {\n setAnswers(initialAnswers);\n }\n }, [initialAnswers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const pages = useMemo(\n () => (questionnaire ? buildPages(questionnaire.questionGroups) : []),\n [questionnaire]\n );\n\n const isLastPage = currentPage === pages.length - 1;\n const currentQuestions = pages[currentPage] ?? [];\n\n const setAnswer = useCallback((questionId: number, values: string[]) => {\n setAnswers(prev => ({ ...prev, [questionId]: values }));\n setFieldErrors(prev => { const e = { ...prev }; delete e[questionId]; return e; });\n }, []);\n\n // Validate just the questions on the current page\n const validatePage = useCallback((): boolean => {\n const newErrors: Errors = {};\n for (const { question } of currentQuestions) {\n const err = validateQuestion(question, answers[question.id] ?? []);\n if (err) newErrors[question.id] = err;\n }\n setFieldErrors(prev => ({ ...prev, ...newErrors }));\n return Object.keys(newErrors).length === 0;\n }, [currentQuestions, answers]);\n\n const handleNext = () => {\n if (validatePage()) setCurrentPage(p => p + 1);\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage(p => p - 1);\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validatePage() || !questionnaire) return;\n\n try {\n const questionResults = questionnaire.questionGroups.flatMap(g =>\n (g.questions ?? []).map(q => ({\n questionId: q.id,\n values: answers[q.id] ?? [],\n }))\n );\n\n const input: FillQuestionnarieInput = {\n applicantId,\n questionnarieId: questionnaire.id,\n questionResults,\n };\n\n await submit(input);\n onComplete?.();\n } catch (e) {\n console.error('Questionnaire submit error:', e);\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading questionnaire: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!questionnaire) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{questionnaire.displayName}</h2>\n {questionnaire.subtitle && (\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {questionnaire.subtitle}\n </p>\n )}\n\n {/* Page indicator — only shown when there are multiple pages */}\n {pages.length > 1 && (\n <div className=\"flex items-center justify-between mt-3\">\n <span className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n Page {currentPage + 1} of {pages.length}\n </span>\n <div className=\"flex items-center gap-1.5\">\n {pages.map((_, i) => (\n <div\n key={i}\n className=\"rounded-full transition-all duration-200\"\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Questions for current page */}\n <CardContent className=\"space-y-6\">\n {currentQuestions.map(({ question }) => (\n <QuestionField\n key={question.id}\n question={question}\n value={answers[question.id] ?? []}\n error={fieldErrors[question.id]}\n onChange={vals => setAnswer(question.id, vals)}\n />\n ))}\n </CardContent>\n\n {/* Footer navigation */}\n <CardFooter className=\"flex items-center justify-between\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n <ChevronLeft size={14} />\n {currentPage > 0 ? 'Previous' : 'Back'}\n </Button>\n\n {isLastPage ? (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n onClick={handleSubmit}\n >\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n Next\n <ChevronRight size={14} />\n </Button>\n )}\n </CardFooter>\n\n {error && (\n <div className=\"mx-6 mb-4 p-3 bg-red-50 border border-red-200 rounded\">\n <p className=\"text-red-600 text-sm\">{(error as Error).message}</p>\n </div>\n )}\n </Card>\n );\n};\n\n// ── QuestionField ──────────────────────────────────────────────────────────\n\ninterface QuestionFieldProps {\n question: QuestionDto;\n value: string[];\n error?: string;\n onChange: (values: string[]) => void;\n}\n\nconst QuestionField: React.FC<QuestionFieldProps> = ({ question, value, error, onChange }) => {\n const hasDefaultAnswers = (question.defaultAnswers?.length ?? 0) > 0;\n\n const qType = !hasDefaultAnswers\n ? 'text'\n : question.showAsDropdown\n ? question.canMultipleAnswer ? 'multi-select' : 'single-select'\n : question.canMultipleAnswer ? 'checkbox' : 'radio';\n\n return (\n <div className=\"space-y-2\">\n {/* Question label */}\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {question.text}\n {question.isRequired && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n\n {/* Subtitle / description */}\n {question.subtitle && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {question.subtitle}\n </p>\n )}\n {question.description && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {question.description}\n </p>\n )}\n\n {/* Text input */}\n {qType === 'text' && (\n <Input\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n placeholder={question.subtitle ? undefined : 'Enter your answer…'}\n error={error}\n required={question.isRequired}\n />\n )}\n\n {/* Dropdown — single select */}\n {qType === 'single-select' && (\n <Select\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n options={(question.defaultAnswers ?? []).map(a => ({ value: a, label: a }))}\n placeholder=\"Select an option…\"\n error={error}\n required={question.isRequired}\n />\n )}\n\n {/* Radio buttons — single choice without dropdown */}\n {qType === 'radio' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(question.defaultAnswers ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={value[0] === answer}\n onChange={() => onChange([answer])}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {answer}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Checkboxes — multiple choice */}\n {(qType === 'checkbox' || qType === 'multi-select') && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(question.defaultAnswers ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={value.includes(answer)}\n onChange={e => {\n if (e.target.checked) {\n onChange([...value, answer]);\n } else {\n onChange(value.filter(v => v !== answer));\n }\n }}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {answer}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Inline error for input types (radio/checkbox handle their own) */}\n {error && qType === 'text' && null /* already shown in Input */}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useUploadDocument } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, FileUpload, Spinner } from '../core';\nimport { FillUploadDocumentInput } from '../../types';\nimport { fileToBase64 } from '../../utils';\n\nexport interface UploadDocumentStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Upload document step component\n */\nexport const UploadDocumentStep: React.FC<UploadDocumentStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { uploadDocument, isLoading, isSubmitting, error, submit } = useUploadDocument(applicantId);\n const [files, setFiles] = useState<Record<number, File[]>>({});\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!uploadDocument) return;\n\n const uploadDocumentResults = await Promise.all(\n uploadDocument.uploadDocumentFiles.map(async (docFile) => {\n const fileList = files[docFile.id] || [];\n const valueList = await Promise.all(\n fileList.map(async (file) => ({\n fileName: file.name,\n fileData: await fileToBase64(file),\n }))\n );\n\n return {\n uploadDocumentFileId: docFile.id,\n valueList,\n };\n })\n );\n\n const input: FillUploadDocumentInput = {\n applicantId,\n uploadDocumentId: uploadDocument.id,\n uploadDocumentResults,\n };\n\n await submit(input);\n onComplete?.();\n };\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading document requirements: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!uploadDocument) return null;\n\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{uploadDocument.displayName}</h2>\n {uploadDocument.subtitle && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">{uploadDocument.subtitle}</p>\n )}\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n {uploadDocument.uploadDocumentFiles.map((docFile) => (\n <FileUpload\n key={docFile.id}\n label={docFile.displayName}\n accept={docFile.allowedTypes}\n multiple={docFile.multipleFile}\n maxSize={docFile.maxEachFileSizeByte}\n value={files[docFile.id] || []}\n onChange={(newFiles) => {\n setFiles((prev) => ({ ...prev, [docFile.id]: newFiles }));\n }}\n />\n ))}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"submit\" isLoading={isSubmitting}>\n Continue\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React from 'react';\nimport { useOverview } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Spinner } from '../core';\n\nexport interface OverviewStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Overview step component\n */\nexport const OverviewStep: React.FC<OverviewStepProps> = ({ applicantId, onComplete, onBack }) => {\n const { overview, isLoading, isSubmitting, error, passOverview } = useOverview(applicantId);\n\n const handleConfirm = async () => {\n await passOverview();\n onComplete?.();\n };\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading overview: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!overview) return null;\n\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{overview.title || 'Overview'}</h2>\n {overview.description && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">{overview.description}</p>\n )}\n </CardHeader>\n\n <CardContent className=\"space-y-8\">\n {overview.steps && overview.steps.length > 0 ? (\n overview.steps\n .sort((a, b) => a.order - b.order)\n .map((step) => (\n <div key={step.order} className=\"metakyc-overview-step-item flex items-center space-x-3\">\n <div className=\"metakyc-step-icon flex-shrink-0\">\n <div className=\"w-8 h-8 rounded-full bg-primary-500 text-white flex items-center justify-center font-medium text-sm\">\n {step.order + 1}\n </div>\n </div>\n <div \n className=\"metakyc-step-content\"\n style={{\n flex: 1,\n border: 'none',\n height: 'auto',\n background: 'transparent',\n }}\n >\n <span className=\"metakyc-step-title text-sm font-semibold text-gray-900 dark:text-white\">\n {step.title}\n </span>\n {step.description && (\n <p className=\"metakyc-step-description text-sm text-gray-600 dark:text-gray-400\">\n {step.description}\n </p>\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-center py-8\">\n <p className=\"text-gray-600 dark:text-gray-400\">Loading overview data...</p>\n </div>\n )}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button onClick={handleConfirm} isLoading={isSubmitting}>\n Continue\n </Button>\n </CardFooter>\n </Card>\n );\n};\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { useRiskScoring } from '../../hooks';\nimport { useMetaKYC } from '../../context/useMetaKYC';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Select, Spinner } from '../core';\nimport { RiskCalculationInput, RiskCriteriaDto, ValueDataType } from '../../types';\nimport { ChevronRight, ChevronLeft } from 'lucide-react';\n\nexport interface RiskScoringStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n// ── Money formatting helpers ───────────────────────────────────────────────\n\n/**\n * Converts a locale string (e.g. \"de\", \"de-AT\", \"EN\") to a BCP-47 tag.\n * Falls back to 'en' if the tag is invalid.\n */\nfunction resolveLocale(locale: string | undefined): string {\n const tag = (locale ?? 'en').toLowerCase().replace('_', '-');\n try {\n Intl.NumberFormat.supportedLocalesOf([tag]);\n return tag;\n } catch {\n return 'en';\n }\n}\n\n/**\n * Returns true when the criterion uses Money / Decimal data type AND has\n * pre-defined string options (radio / checkbox) that may contain numbers.\n */\nfunction isMoneyWithOptions(criterion: RiskCriteriaDto): boolean {\n return (\n criterion.valueDataType === ValueDataType.Money &&\n Array.isArray(criterion.defaultValues) &&\n criterion.defaultValues.length > 0\n );\n}\n\n/**\n * Formats every standalone integer/decimal number inside a label string\n * according to the given locale.\n * Examples (locale = \"de\"):\n * \"5000 - 10000\" → \"5.000 – 10.000\"\n * \"up to 5000\" → \"up to 5.000\"\n * \"> 30000\" → \"> 30.000\"\n *\n * The regex matches numbers that are NOT already formatted with separators so\n * we only touch plain digits (possibly with a decimal dot, e.g. \"1234.56\").\n */\nfunction formatMoneyLabel(raw: string, locale: string): string {\n const fmt = new Intl.NumberFormat(resolveLocale(locale), {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n // Match bare numbers: optional leading sign, digits, optional decimal part.\n return raw.replace(/([\\d]+(?:\\.\\d+)?)/g, (match) => {\n const num = parseFloat(match);\n return isNaN(num) ? match : fmt.format(num);\n });\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface PagedCriterion {\n criterion: RiskCriteriaDto;\n idx: number;\n}\n\ntype Answers = Record<number, string[]>; // criteriaId → values\ntype Errors = Record<number, string>; // criteriaId → error message\n\n// ── Validation ────────────────────────────────────────────────────────────\n\nfunction validateCriterion(criterion: RiskCriteriaDto, values: string[]): string | null {\n const isEmpty = !values || values.length === 0 || values.every(v => !v || !v.trim());\n\n if (criterion.isRequired && isEmpty) {\n return criterion.errorMessage || `${criterion.displayName} is required`;\n }\n\n if (!isEmpty) {\n const first = values[0] ?? '';\n\n // Regex validation (string types)\n if (first && criterion.regex) {\n try {\n if (!new RegExp(criterion.regex).test(first)) {\n return criterion.errorMessage || 'Invalid format';\n }\n } catch { /* ignore invalid regex */ }\n }\n\n // Numeric min/max for Integer/Money/DigitOnly types\n const isNumeric =\n criterion.valueDataType === ValueDataType.Integer ||\n criterion.valueDataType === ValueDataType.Money ||\n criterion.valueDataType === ValueDataType.DigitOnly;\n\n if (isNumeric && first.trim() !== '') {\n const num = Number(first);\n if (!isNaN(num)) {\n if (criterion.min !== undefined && criterion.min !== null && num < criterion.min) {\n return `Minimum value is ${criterion.min}`;\n }\n if (criterion.max !== undefined && criterion.max !== null && num > criterion.max) {\n return `Maximum value is ${criterion.max}`;\n }\n }\n } else if (!isNumeric && first !== '') {\n // String length bounds for text types\n if (criterion.min !== undefined && criterion.min !== null && first.length < criterion.min) {\n return `Minimum length is ${criterion.min} characters`;\n }\n if (criterion.max !== undefined && criterion.max !== null && first.length > criterion.max) {\n return `Maximum length is ${criterion.max} characters`;\n }\n }\n }\n\n return null;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction buildPages(criteria: RiskCriteriaDto[]): PagedCriterion[][] {\n const map = new Map<number, PagedCriterion[]>();\n criteria.forEach((criterion, idx) => {\n // pageNumber <= 0 or undefined means \"first page\" (no specific pagination)\n const p = (criterion.pageNumber != null && criterion.pageNumber > 0) ? criterion.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push({ criterion, idx });\n });\n\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, cs]) => cs);\n}\n\nfunction getInputType(criterion: RiskCriteriaDto): 'text' | 'radio' | 'checkbox' | 'country' {\n if (criterion.builtInType === 1) return 'country';\n if (!criterion.defaultValues || criterion.defaultValues.length === 0) return 'text';\n return criterion.multipleValue ? 'checkbox' : 'radio';\n}\n\n// ── Component ─────────────────────────────────────────────────────────────\n\nexport const RiskScoringStep: React.FC<RiskScoringStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { config } = useMetaKYC();\n const locale = config.locale ?? 'en';\n const { criteria, initialAnswers, isLoading, isSubmitting, error, submit } = useRiskScoring(applicantId);\n\n const [answers, setAnswers] = useState<Answers>({});\n const [fieldErrors, setFieldErrors] = useState<Errors>({});\n const [currentPage, setCurrentPage] = useState(0);\n const [autoSubmitted, setAutoSubmitted] = useState(false);\n\n // Seed answers with existing data when loaded (only if user hasn't entered anything yet)\n React.useEffect(() => {\n if (initialAnswers && Object.keys(initialAnswers).length > 0 && Object.keys(answers).length === 0) {\n setAnswers(initialAnswers);\n }\n }, [initialAnswers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const pages = useMemo(\n () => (criteria && criteria.length > 0 ? buildPages(criteria) : []),\n [criteria]\n );\n\n const isLastPage = currentPage === pages.length - 1;\n const currentCriteria = pages[currentPage] ?? [];\n\n // Auto-submit when no criteria exist\n React.useEffect(() => {\n if (!isLoading && criteria && criteria.length === 0 && !autoSubmitted && !isSubmitting) {\n setAutoSubmitted(true);\n submit({ applicantId, criteriaValueInputs: [] })\n .then(() => onComplete?.())\n .catch(console.error);\n }\n }, [isLoading, criteria, autoSubmitted, isSubmitting, submit, applicantId, onComplete]);\n\n const setAnswer = useCallback((criteriaId: number, values: string[]) => {\n setAnswers(prev => ({ ...prev, [criteriaId]: values }));\n setFieldErrors(prev => { const e = { ...prev }; delete e[criteriaId]; return e; });\n }, []);\n\n const validatePage = useCallback((): boolean => {\n const newErrors: Errors = {};\n for (const { criterion } of currentCriteria) {\n const err = validateCriterion(criterion, answers[criterion.id] ?? []);\n if (err) newErrors[criterion.id] = err;\n }\n setFieldErrors(prev => ({ ...prev, ...newErrors }));\n return Object.keys(newErrors).length === 0;\n }, [currentCriteria, answers]);\n\n const handleNext = () => {\n if (validatePage()) setCurrentPage(p => p + 1);\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage(p => p - 1);\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validatePage() || !criteria) return;\n\n try {\n const criteriaValueInputs = criteria\n .map(c => {\n const vals = (answers[c.id] ?? []).filter(v => v && v.trim());\n return vals.length > 0 ? { riskCriteriaId: c.id, values: vals } : null;\n })\n .filter((x): x is NonNullable<typeof x> => x !== null);\n\n const input: RiskCalculationInput = { applicantId, criteriaValueInputs };\n await submit(input);\n onComplete?.();\n } catch (e) {\n console.error('Risk scoring submit error:', e);\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-sm mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Loading risk scoring criteria…\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (!isLoading && criteria && criteria.length === 0) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-sm mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n No criteria required. Moving to next step…\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading criteria: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!criteria) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 className=\"text-lg font-bold\">Risk Assessment</h2>\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Please answer the following questions for risk evaluation\n </p>\n\n {/* Page indicator — only when multiple pages */}\n {pages.length > 1 && (\n <div className=\"flex items-center justify-between mt-3\">\n <span className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n Page {currentPage + 1} of {pages.length}\n </span>\n <div className=\"flex items-center gap-1.5\">\n {pages.map((_, i) => (\n <div\n key={i}\n className=\"rounded-full transition-all duration-200\"\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Criteria for current page */}\n <CardContent className=\"space-y-6\">\n {currentCriteria.map(({ criterion }) => (\n <CriterionField\n key={criterion.id}\n criterion={criterion}\n value={answers[criterion.id] ?? []}\n error={fieldErrors[criterion.id]}\n locale={locale}\n onChange={vals => setAnswer(criterion.id, vals)}\n />\n ))}\n </CardContent>\n\n {/* Footer navigation */}\n <CardFooter className=\"flex items-center justify-between\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n <ChevronLeft size={14} />\n {currentPage > 0 ? 'Previous' : 'Back'}\n </Button>\n\n {isLastPage ? (\n <Button type=\"button\" isLoading={isSubmitting} onClick={handleSubmit}>\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n Next\n <ChevronRight size={14} />\n </Button>\n )}\n </CardFooter>\n\n {error && (\n <div className=\"mx-6 mb-4 p-3 bg-red-50 border border-red-200 rounded\">\n <p className=\"text-red-600 text-sm\">{(error as Error).message}</p>\n </div>\n )}\n </Card>\n );\n};\n\n// ── CriterionField ─────────────────────────────────────────────────────────\n\ninterface CriterionFieldProps {\n criterion: RiskCriteriaDto;\n value: string[];\n error?: string;\n locale: string;\n onChange: (values: string[]) => void;\n}\n\nconst CriterionField: React.FC<CriterionFieldProps> = ({ criterion, value, error, locale, onChange }) => {\n const inputType = getInputType(criterion);\n\n const isNumeric =\n criterion.valueDataType === ValueDataType.Integer ||\n criterion.valueDataType === ValueDataType.Money ||\n criterion.valueDataType === ValueDataType.DigitOnly;\n\n // When this criterion has Money type + predefined options, show locale-formatted\n // labels but keep the original API string as the stored/submitted value.\n const moneyOptions = isMoneyWithOptions(criterion);\n const getLabel = (raw: string) =>\n moneyOptions ? formatMoneyLabel(raw, locale) : raw;\n\n return (\n <div className=\"space-y-2\">\n {/* Label */}\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {criterion.displayName}\n {criterion.isRequired && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n\n {/* Description */}\n {criterion.description && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {criterion.description}\n </p>\n )}\n\n {/* min/max hint for numeric fields */}\n {isNumeric && (criterion.min !== undefined || criterion.max !== undefined) && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {criterion.min !== undefined && criterion.max !== undefined\n ? `Range: ${criterion.min} – ${criterion.max}`\n : criterion.min !== undefined\n ? `Minimum: ${criterion.min}`\n : `Maximum: ${criterion.max}`}\n </p>\n )}\n\n {/* Text / numeric input */}\n {inputType === 'text' && (\n <Input\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n type={isNumeric ? 'number' : 'text'}\n placeholder=\"Enter your answer…\"\n error={error}\n required={criterion.isRequired}\n min={criterion.min}\n max={criterion.max}\n onKeyDown={e => {\n if (criterion.valueDataType === ValueDataType.DigitOnly) {\n if (['e', 'E', '+', '-', '.'].includes(e.key)) e.preventDefault();\n }\n }}\n />\n )}\n\n {/* Radio buttons */}\n {inputType === 'radio' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(criterion.defaultValues ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={value[0] === answer}\n onChange={() => onChange([answer])}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {getLabel(answer)}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Checkboxes */}\n {inputType === 'checkbox' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(criterion.defaultValues ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={value.includes(answer)}\n onChange={e => {\n if (e.target.checked) {\n onChange([...value, answer]);\n } else {\n onChange(value.filter(v => v !== answer));\n }\n }}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {getLabel(answer)}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Country dropdown */}\n {inputType === 'country' && (\n <Select\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n options={[\n { value: 'US', label: 'United States' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'AE', label: 'United Arab Emirates' },\n ]}\n placeholder=\"Select a country…\"\n error={error}\n required={criterion.isRequired}\n />\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button } from '../core';\nimport { InvestorCategorizationType, InvestorCategorizationInput } from '../../types';\n\nexport interface InvestorCategorizationStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Investor Categorization step component\n * Static UI for selecting investor type\n */\nexport const InvestorCategorizationStep: React.FC<InvestorCategorizationStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { investorCategorizationService } = useMetaKYC();\n const [selectedType, setSelectedType] = useState<InvestorCategorizationType | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (selectedType === null) {\n setError('Please select an investor type');\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const input: InvestorCategorizationInput = {\n applicantId,\n investorType: selectedType,\n };\n\n console.log('Submitting investor categorization:', input);\n const result = await investorCategorizationService.setInvestorCategorization(input);\n console.log('Investor categorization result:', result);\n\n onComplete?.();\n } catch (err: any) {\n console.error('Error submitting investor categorization:', err);\n setError(err.message || 'Failed to submit investor categorization');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white\">\n Which statement best describes you?\n </h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\n All Tokenise clients are treated as Retail Investors under EU regulation, which gives you the \n highest level of investor protection. For our internal purposes, we ask you to select the \n description that best matches your situation\n </p>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300 mb-3\">\n Choose one\n </p>\n\n {/* Individual Investor */}\n <label\n className={`\n block p-4 border-2 rounded-lg cursor-pointer transition-all\n ${\n selectedType === InvestorCategorizationType.Individual\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }\n `}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.Individual}\n checked={selectedType === InvestorCategorizationType.Individual}\n onChange={() => setSelectedType(InvestorCategorizationType.Individual)}\n className=\"mt-1 h-4 w-4 text-primary-500 border-gray-300 focus:ring-primary-500\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold text-gray-900 dark:text-white\">\n Individual investor\n </div>\n <div className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n (Recommended) Most of our clients choose this option. Provides the strongest protection \n and aligns with our mission to make investing accessible to everyone.\n </div>\n </div>\n </div>\n </label>\n\n {/* Sophisticated Investor */}\n <label\n className={`\n block p-4 border-2 rounded-lg cursor-pointer transition-all\n ${\n selectedType === InvestorCategorizationType.Sophisticated\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }\n `}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.Sophisticated}\n checked={selectedType === InvestorCategorizationType.Sophisticated}\n onChange={() => setSelectedType(InvestorCategorizationType.Sophisticated)}\n className=\"mt-1 h-4 w-4 text-primary-500 border-gray-300 focus:ring-primary-500\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold text-gray-900 dark:text-white\">\n Sophisticated investor\n </div>\n <div className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n In the last 2 years, I have done one or more of the following:\n </div>\n <ul className=\"text-sm text-gray-600 dark:text-gray-400 mt-2 space-y-1 list-none\">\n <li>Worked in private equity or provided capital to small and medium enterprises, and/or</li>\n <li>Been the director of a company with an annual turnover of at least (USD) $2m million, and/or</li>\n <li>Invested directly in at least 2 private (not listed) companies.</li>\n </ul>\n </div>\n </div>\n </label>\n\n {/* High Networth Investor */}\n <label\n className={`\n block p-4 border-2 rounded-lg cursor-pointer transition-all\n ${\n selectedType === InvestorCategorizationType.HighNetWorth\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }\n `}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.HighNetWorth}\n checked={selectedType === InvestorCategorizationType.HighNetWorth}\n onChange={() => setSelectedType(InvestorCategorizationType.HighNetWorth)}\n className=\"mt-1 h-4 w-4 text-primary-500 border-gray-300 focus:ring-primary-500\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold text-gray-900 dark:text-white\">\n High networth investor\n </div>\n <div className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n I earn more than (USD/EUR) $150,000 per year, and/or<br />\n I have net assets (excluding my main property) of at least $/EUR 300,000\n </div>\n </div>\n </div>\n </label>\n\n {/* Error Display */}\n {error && (\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400 text-sm\">\n <strong>Error:</strong> {error}\n </p>\n </div>\n )}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button \n type=\"submit\" \n isLoading={isSubmitting}\n disabled={selectedType === null}\n >\n Submit\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Spinner, Badge } from '../core';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n AppropriatenessQuestionResult,\n} from '../../types';\n\nexport interface AppropriatenessTestStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Appropriateness Test step component\n * Quiz with timer and retry limit\n */\nexport const AppropriatenessTestStep: React.FC<AppropriatenessTestStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { appropriatenessTestService } = useMetaKYC();\n \n // State\n const [testData, setTestData] = useState<AppropriatenessTestOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [answers, setAnswers] = useState<Record<number, string>>({});\n const [timeRemaining, setTimeRemaining] = useState<number>(0);\n const [isTestStarted, setIsTestStarted] = useState(false);\n const [isTestExpired, setIsTestExpired] = useState(false);\n const [waitTimeRemaining, setWaitTimeRemaining] = useState<number>(0);\n\n // Load test data\n useEffect(() => {\n const loadTest = async () => {\n try {\n setIsLoading(true);\n setError(null);\n console.log('Loading appropriateness test for applicant:', applicantId);\n \n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n console.log('Appropriateness test data:', data);\n \n setTestData(data);\n \n // Parse wait time if needed\n if (data.waitTimeSpanForNextTry && data.waitTimeSpanForNextTry !== '00:00:00') {\n const waitSeconds = parseTimeSpan(data.waitTimeSpanForNextTry);\n if (waitSeconds > 0) {\n setWaitTimeRemaining(waitSeconds);\n }\n }\n } catch (err: any) {\n console.error('Error loading appropriateness test:', err);\n setError(err.message || 'Failed to load appropriateness test');\n } finally {\n setIsLoading(false);\n }\n };\n\n loadTest();\n }, [applicantId, appropriatenessTestService]);\n\n // Parse TimeSpan string (e.g., \"00:05:00\") to seconds\n const parseTimeSpan = (timeSpan: string): number => {\n const parts = timeSpan.split(':').map(Number);\n if (parts.length === 3) {\n const [hours, minutes, seconds] = parts;\n return hours * 3600 + minutes * 60 + seconds;\n }\n return 0;\n };\n\n // Format seconds to MM:SS\n const formatTime = (seconds: number): string => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n };\n\n // Timer countdown\n useEffect(() => {\n if (!isTestStarted || timeRemaining <= 0) return;\n\n const timer = setInterval(() => {\n setTimeRemaining((prev) => {\n if (prev <= 1) {\n setIsTestExpired(true);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [isTestStarted, timeRemaining]);\n\n // Wait time countdown\n useEffect(() => {\n if (waitTimeRemaining <= 0) return;\n\n const timer = setInterval(() => {\n setWaitTimeRemaining((prev) => {\n if (prev <= 1) {\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [waitTimeRemaining]);\n\n // Auto-submit when time expires\n useEffect(() => {\n if (isTestExpired && !isSubmitting) {\n handleSubmit();\n }\n }, [isTestExpired]);\n\n // Start test\n const handleStartTest = () => {\n if (!testData) return;\n setIsTestStarted(true);\n setTimeRemaining(testData.testDurationSec);\n };\n\n // Handle answer change\n const handleAnswerChange = (questionId: number, answer: string) => {\n setAnswers((prev) => ({\n ...prev,\n [questionId]: answer,\n }));\n };\n\n // Submit test\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n\n if (!testData) return;\n\n // Check if all questions are answered (unless time expired)\n if (!isTestExpired) {\n const unansweredCount = testData.appropriatenessQuestions.length - Object.keys(answers).length;\n if (unansweredCount > 0) {\n setError(`Please answer all questions. ${unansweredCount} question(s) remaining.`);\n return;\n }\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const questionResults: AppropriatenessQuestionResult[] = testData.appropriatenessQuestions.map(\n (q) => ({\n appropriatenessQuestionId: q.id,\n value: answers[q.id] || '', // Empty string if not answered\n })\n );\n\n const input: FillAppropriatenessTestInput = {\n applicantId,\n appropriatenessTestId: testData.id,\n appropriatenessQuestionResults: questionResults,\n };\n\n console.log('Submitting appropriateness test:', input);\n \n try {\n const result = await appropriatenessTestService.fillAppropriatenessTest(input);\n console.log('Appropriateness test result:', result);\n\n // Check if passed (success message contains \"pass\" or similar)\n if (result.message && (\n result.message.toLowerCase().includes('pass') ||\n result.message.toLowerCase().includes('success') ||\n result.message.toLowerCase().includes('congratulations')\n )) {\n // Test passed, proceed to next step\n onComplete?.();\n } else {\n // Unclear result, show message and reload\n setError(result.message || 'Test completed. Please check the result.');\n setIsTestStarted(false);\n setIsTestExpired(false);\n setAnswers({});\n \n // Reload test data\n setTimeout(() => reloadTestData(), 1000);\n }\n } catch (err: any) {\n // Handle 400 error (test failed)\n // The ErrorHandler already extracts the message from response.data.result.message\n if (err.code === 400 && err.message) {\n const failureMessage = err.message;\n console.log('Test failed:', failureMessage);\n \n // Show failure message\n setError(failureMessage);\n setIsTestStarted(false);\n setIsTestExpired(false);\n setAnswers({});\n \n // Reload test data to get updated retry count and wait time\n setTimeout(() => reloadTestData(), 1500);\n } else {\n // Other error, rethrow\n throw err;\n }\n }\n } catch (err: any) {\n console.error('Error submitting appropriateness test:', err);\n setError(err.message || 'Failed to submit test. Please try again.');\n setIsTestStarted(false);\n setIsTestExpired(false);\n setAnswers({});\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // Reload test data helper\n const reloadTestData = async () => {\n try {\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n console.log('Reloaded test data:', data);\n setTestData(data);\n \n // Parse wait time if needed\n if (data.waitTimeSpanForNextTry && data.waitTimeSpanForNextTry !== '00:00:00') {\n const waitSeconds = parseTimeSpan(data.waitTimeSpanForNextTry);\n if (waitSeconds > 0) {\n setWaitTimeRemaining(waitSeconds);\n }\n }\n } catch (err: any) {\n console.error('Error reloading test data:', err);\n setError((prev) => prev + '\\n\\nFailed to reload test data. Please refresh the page.');\n }\n };\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">\n Loading appropriateness test...\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (!testData) {\n return (\n <Card>\n <CardContent className=\"py-12 text-center\">\n <p className=\"text-danger-500 text-lg mb-4\">No test data available</p>\n {error && <p className=\"text-gray-600 dark:text-gray-400\">{error}</p>}\n </CardContent>\n </Card>\n );\n }\n\n // Show wait time screen if user needs to wait\n if (waitTimeRemaining > 0) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white\">\n {testData.displayName}\n </h2>\n {testData.subtitle && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">{testData.subtitle}</p>\n )}\n </CardHeader>\n <CardContent className=\"py-12 text-center\">\n <div className=\"mb-6\">\n <div className=\"text-6xl font-bold text-primary-500 mb-2\">\n {formatTime(waitTimeRemaining)}\n </div>\n <p className=\"text-gray-600 dark:text-gray-400\">\n Please wait before attempting the test again\n </p>\n </div>\n {error && (\n <div className=\"mt-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400 text-sm\">{error}</p>\n </div>\n )}\n </CardContent>\n </Card>\n );\n }\n\n // Calculate remaining attempts\n const attemptsRemaining = testData.testAllowedMaxTry - testData.totalFailedTries;\n\n // Show start screen if test hasn't started\n if (!isTestStarted) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white\">\n {testData.displayName}\n </h2>\n {testData.subtitle && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">{testData.subtitle}</p>\n )}\n </CardHeader>\n <CardContent>\n {testData.description && (\n <div className=\"mb-6 p-4 bg-gray-50 dark:bg-gray-800 rounded-lg\">\n <p className=\"text-gray-700 dark:text-gray-300\">{testData.description}</p>\n </div>\n )}\n\n <div className=\"space-y-4 mb-6\">\n <div className=\"flex items-center justify-between p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300 font-medium\">Total Questions:</span>\n <Badge variant=\"info\">{testData.totalQuestionCount}</Badge>\n </div>\n <div className=\"flex items-center justify-between p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300 font-medium\">Time Limit:</span>\n <Badge variant=\"info\">{formatTime(testData.testDurationSec)}</Badge>\n </div>\n <div className=\"flex items-center justify-between p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300 font-medium\">\n Correct Answers Required:\n </span>\n <Badge variant=\"info\">{testData.testCorrectAnswerPassLimit}</Badge>\n </div>\n <div className=\"flex items-center justify-between p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300 font-medium\">Attempts Remaining:</span>\n <Badge variant={attemptsRemaining > 1 ? 'success' : 'warning'}>\n {attemptsRemaining}\n </Badge>\n </div>\n </div>\n\n {error && (\n <div className=\"mb-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400 text-sm\">\n <strong>Previous Attempt:</strong> {error}\n </p>\n </div>\n )}\n\n {attemptsRemaining <= 0 && (\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400\">\n You have used all your attempts. Please contact support for assistance.\n </p>\n </div>\n )}\n </CardContent>\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button\n type=\"button\"\n onClick={handleStartTest}\n disabled={attemptsRemaining <= 0}\n >\n Start Test\n </Button>\n </CardFooter>\n </Card>\n );\n }\n\n // Show test questions\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white\">\n {testData.displayName}\n </h2>\n {testData.subtitle && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">{testData.subtitle}</p>\n )}\n </div>\n <div className=\"text-right\">\n <div\n className={`text-3xl font-bold ${\n timeRemaining <= 60 ? 'text-danger-500' : 'text-primary-500'\n }`}\n >\n {formatTime(timeRemaining)}\n </div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">Time Remaining</p>\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n {/* Progress indicator */}\n <div className=\"flex items-center justify-between mb-4\">\n <Badge variant=\"info\">\n Question {Object.keys(answers).length} of {testData.totalQuestionCount}\n </Badge>\n <Badge variant={attemptsRemaining > 1 ? 'success' : 'warning'}>\n {attemptsRemaining} attempt{attemptsRemaining !== 1 ? 's' : ''} remaining\n </Badge>\n </div>\n\n {/* Questions */}\n {testData.appropriatenessQuestions.map((question, index) => (\n <div\n key={question.id}\n className=\"p-4 border border-gray-200 dark:border-gray-700 rounded-lg\"\n >\n <div className=\"mb-4\">\n <span className=\"inline-block px-2 py-1 text-xs font-semibold text-primary-700 bg-primary-100 dark:text-primary-300 dark:bg-primary-900/30 rounded mb-2\">\n Question {index + 1}\n </span>\n {question.groupName && (\n <span className=\"ml-2 text-xs text-gray-500 dark:text-gray-400\">\n {question.groupName}\n </span>\n )}\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mt-2\">\n {question.question}\n </h3>\n </div>\n\n <div className=\"space-y-2\">\n {question.answers.map((answer, answerIndex) => (\n <label\n key={answerIndex}\n className={`\n flex items-center p-3 border-2 rounded-lg cursor-pointer transition-all\n ${\n answers[question.id] === answer\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }\n `}\n >\n <input\n type=\"radio\"\n name={`question-${question.id}`}\n value={answer}\n checked={answers[question.id] === answer}\n onChange={(e) => handleAnswerChange(question.id, e.target.value)}\n className=\"h-4 w-4 text-primary-500 border-gray-300 focus:ring-primary-500\"\n disabled={isSubmitting}\n />\n <span className=\"ml-3 text-gray-700 dark:text-gray-300\">{answer}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n\n {/* Error Display */}\n {error && !isTestExpired && (\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400 text-sm\">\n <strong>Error:</strong> {error}\n </p>\n </div>\n )}\n\n {isTestExpired && (\n <div className=\"p-4 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg\">\n <p className=\"text-yellow-700 dark:text-yellow-400 text-sm\">\n <strong>Time's up!</strong> Your answers are being submitted automatically.\n </p>\n </div>\n )}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onBack}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n isLoading={isSubmitting}\n disabled={Object.keys(answers).length < testData.totalQuestionCount}\n >\n {isTestExpired ? 'Submitting...' : 'Submit Test'}\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport { useForm, Controller } from 'react-hook-form';\nimport { useIdentityVerification } from '../../hooks';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Spinner } from '../core';\nimport { SearchableSelect } from '../core/SearchableSelect';\nimport { IdentityProviderManager } from '../../identity/provider-manager';\nimport { IdentityVerificationProvider, ApplicantDataDto } from '../../types';\nimport { FormPage, FormFieldEntry, FIELD_METADATA } from '../../types/form-config';\n\nexport interface IdentityVerificationStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Identity verification step component\n * Shows review/confirm form BEFORE calling identity request\n */\nexport const IdentityVerificationStep: React.FC<IdentityVerificationStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { applicantService, baseInformationService, config, currentTheme } = useMetaKYC();\n const { identityData, provider, token, isLoading: identityLoading, error, requestIdentity, restartIdentity } =\n useIdentityVerification(applicantId);\n const [providerInstance, setProviderInstance] = useState<any>(null);\n const [applicantData, setApplicantData] = useState<ApplicantDataDto | null>(null);\n const [countries, setCountries] = useState<Array<{ value: string; label: string }>>([]);\n // Phone-number country list (value = countryCode e.g. \"+43\", label = \"+43 – Austria\")\n const [phoneCountries, setPhoneCountries] = useState<Array<{ value: string; label: string }>>([]);\n const [isLoadingData, setIsLoadingData] = useState(true);\n const [showProvider, setShowProvider] = useState(false);\n const [providerError, setProviderError] = useState<string | null>(null);\n const [isExpired, setIsExpired] = useState(false);\n const hasAutoRequestedRef = React.useRef(false);\n\n // Dynamic review-form data (built-in editable field values)\n const [reviewData, setReviewData] = useState<Record<string, any>>({});\n // State for interactive custom fields on the review page (keyed by paramName)\n const [customData, setCustomData] = useState<Record<string, any>>({});\n\n // The configured review page (from theme) — first element is the single page\n const reviewPage: FormPage | null =\n (currentTheme?.reviewPageFields && currentTheme.reviewPageFields.length > 0)\n ? currentTheme.reviewPageFields[0]\n : null;\n\n // When review page is disabled: skip the review UI and auto-request identity\n const reviewPageDisabled = !!currentTheme?.reviewPageDisabled;\n // Keep a ref so async callbacks always read the latest value\n const reviewPageDisabledRef = useRef(false);\n reviewPageDisabledRef.current = reviewPageDisabled;\n\n const form = useForm({\n defaultValues: {\n street: '',\n streetNumber: '',\n city: '',\n zip: '',\n country: '',\n nationality: '',\n phonenumber: '',\n },\n });\n\n // Load applicant data and countries\n useEffect(() => {\n // ── Review page disabled: skip review UI, auto-request identity directly ──\n if (reviewPageDisabled) {\n if (!hasAutoRequestedRef.current) {\n hasAutoRequestedRef.current = true;\n requestIdentity()\n .then(() => setShowProvider(true))\n .catch(err => console.error('[Identity] Auto-request failed:', err))\n .finally(() => setIsLoadingData(false));\n }\n return;\n }\n\n const loadData = async () => {\n try {\n const [data, countriesData, phoneData] = await Promise.all([\n applicantService.getApplicantData(applicantId),\n baseInformationService.getCountries('', 'en'),\n baseInformationService.getCountries('', 'en', 40), // CountriesType.PhoneNumber\n ]);\n setApplicantData(data);\n \n // Build a deduplicated country option list (abbreviation3 as value)\n const seen = new Set<string>();\n const countryOptions = countriesData\n .map(c => ({ value: c.abbreviation3 || c.abbreviation, label: c.name }))\n .filter(c => {\n if (!c.value || seen.has(c.value)) return false;\n seen.add(c.value);\n return true;\n });\n setCountries(countryOptions);\n\n // Build phone-number country option list (countryCode as value, e.g. \"+43\")\n const phoneSeen = new Set<string>();\n const phoneOptions = phoneData\n .filter(c => c.countryCode)\n .map(c => ({ value: c.countryCode!, label: `${c.countryCode} – ${c.name}` }))\n .filter(c => {\n if (phoneSeen.has(c.value)) return false;\n phoneSeen.add(c.value);\n return true;\n });\n setPhoneCountries(phoneOptions);\n \n // Extract data from nested ApplicantRequestData\n const requestData = data.applicantRequestData;\n \n // Populate dynamic review-form data from applicant data\n setReviewData({\n firstName: requestData?.firstName || '',\n lastName: requestData?.lastName || '',\n email: requestData?.email || '',\n dateOfBirth: requestData?.dateOfBirth || '',\n title: requestData?.title || '',\n salutation: requestData?.salutation || '',\n phonenumber: requestData?.phonenumber || '',\n mobileCountryCode: requestData?.mobileCountryCode || '',\n street: requestData?.street || '',\n streetNumber: requestData?.streetNumber || '',\n city: requestData?.city || '',\n zip: requestData?.zip || '',\n country: requestData?.country || '',\n nationality: requestData?.nationality || '',\n taxCountry: requestData?.taxCountry || '',\n countryOfBirth: requestData?.countryOfBirth || '',\n placeOfBirth: requestData?.placeOfBirth || '',\n educationLevel: requestData?.educationLevel || '',\n occupation: requestData?.occupation || '',\n taxNumber: requestData?.taxNumber || '',\n defaultLanguage: requestData?.defaultLanguage || '',\n });\n\n // Set form default values from applicant request data (static fallback)\n form.reset({\n street: requestData?.street || '',\n streetNumber: requestData?.streetNumber || '',\n city: requestData?.city || '',\n zip: requestData?.zip || '',\n country: requestData?.country || '',\n nationality: requestData?.nationality || '',\n phonenumber: requestData?.phonenumber || '',\n });\n\n // Auto-skip to provider only when the review page is explicitly disabled\n // AND the applicant already has an active identity session.\n // When the review page is enabled (default), always show it first.\n const hasExistingIdentity =\n data.kycRecords &&\n data.kycRecords.length > 0 &&\n data.kycRecords[0].providerTokenObject !== null;\n\n if (hasExistingIdentity && !hasAutoRequestedRef.current && reviewPageDisabledRef.current) {\n console.log('[Identity] Review page disabled + existing identity — auto-requesting...');\n hasAutoRequestedRef.current = true;\n try {\n await requestIdentity();\n setShowProvider(true);\n } catch (err) {\n console.error('[Identity] Auto-request failed:', err);\n }\n }\n } catch (err) {\n console.error('Error loading applicant data:', err);\n } finally {\n setIsLoadingData(false);\n }\n };\n loadData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Only auto-show provider from cached hook state when the review page is disabled.\n // When review page is enabled the user must click Confirm to proceed.\n useEffect(() => {\n if (identityData && !showProvider && reviewPageDisabledRef.current) {\n console.log('[Identity] Review page disabled — showing cached provider');\n setShowProvider(true);\n }\n }, [identityData, showProvider]);\n\n // Check if token is expired or about to expire\n useEffect(() => {\n if (token) {\n // Check expiresAt field\n if (token.expiresAt) {\n const expirationTime = new Date(token.expiresAt).getTime();\n const now = Date.now();\n \n if (now >= expirationTime) {\n console.warn('[Identity] Token has expired (expiresAt)');\n setIsExpired(true);\n setProviderError('Your verification session has expired. Please restart.');\n return;\n }\n }\n\n // Check for expired token in URL or config\n if (token.url) {\n try {\n const url = new URL(token.url);\n // Check if URL contains expiration indicators\n const urlString = url.toString().toLowerCase();\n if (\n urlString.includes('expired') ||\n urlString.includes('invalid') ||\n urlString.includes('error')\n ) {\n console.warn('[Identity] Token URL indicates expiration');\n setIsExpired(true);\n setProviderError('Your verification link has expired. Please restart.');\n return;\n }\n } catch (err) {\n console.error('[Identity] Invalid token URL');\n }\n }\n\n // Check token object for expiration indicators\n if (\n token.status === 'expired' ||\n token.error === 'expired' ||\n token.expired === true\n ) {\n console.warn('[Identity] Token object indicates expiration');\n setIsExpired(true);\n setProviderError('Your verification session has expired. Please restart.');\n return;\n }\n }\n }, [token]);\n\n // Initialize identity provider when ready\n useEffect(() => {\n if (provider !== null && token && !providerInstance && showProvider && !isExpired) {\n const providerType = provider as number;\n\n // PRIORITY 1: Check if token contains a direct URL first (for web-based verification)\n // This applies to both Sumsub and SardinAI when a URL is provided\n if (token.url) {\n console.log('[Identity] Loading provider URL for user verification:', token.url);\n setProviderError(null);\n \n // Check if URL might be expired (basic check)\n try {\n new URL(token.url); // Validate URL format\n \n // For SardinAI: Also initialize Risk SDK in background while showing URL\n if (providerType === IdentityVerificationProvider.SardinAI) {\n console.log('[SardinAI] Initializing Risk SDK in background...');\n try {\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n \n instance.initialize()\n .then(() => {\n console.log('[SardinAI] Risk SDK initialized successfully in background');\n })\n .catch((err: Error) => {\n console.warn('[SardinAI] Risk SDK initialization failed (non-blocking):', err);\n });\n } catch (err: any) {\n console.warn('[SardinAI] Risk SDK setup failed (non-blocking):', err);\n }\n }\n \n // URL will be loaded in iframe - user completes verification there\n setProviderInstance({ type: 'url', url: token.url });\n } catch (err: any) {\n console.error('[Identity] Invalid URL:', err);\n setProviderError('Invalid verification URL. Please restart.');\n setIsExpired(true);\n }\n return;\n }\n\n // PRIORITY 2: For SardinAI without URL: Initialize Risk SDK only (no UI)\n if (providerType === IdentityVerificationProvider.SardinAI) {\n console.log('[SardinAI] No URL provided - initializing Risk SDK only...');\n setProviderError(null);\n \n try {\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n \n instance.initialize()\n .then(() => {\n console.log('[SardinAI] Risk SDK initialized successfully');\n setProviderInstance(instance);\n // Auto-complete after SDK initialization (no UI needed)\n setTimeout(() => {\n onComplete?.();\n }, 2000); // Give SDK time to collect initial data\n })\n .catch((err: Error) => {\n console.error('[SardinAI] Failed to initialize:', err);\n \n // Check for specific error messages that indicate expiration\n const errorMessage = err.message?.toLowerCase() || '';\n if (\n errorMessage.includes('expired') ||\n errorMessage.includes('invalid') ||\n errorMessage.includes('401') ||\n errorMessage.includes('400')\n ) {\n setIsExpired(true);\n setProviderError('Session expired or invalid. Please restart verification.');\n } else {\n setProviderError(`Failed to initialize: ${err.message}`);\n }\n });\n } catch (err: any) {\n console.error('[SardinAI] Error creating provider:', err);\n setProviderError(`Configuration error: ${err.message}`);\n }\n return;\n }\n\n // Otherwise, initialize JavaScript SDK\n try {\n setProviderError(null);\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n\n // Initialize based on provider type\n if (providerType === IdentityVerificationProvider.Sumsub) {\n instance.initialize('identity-container')\n .catch((err: Error) => {\n console.error('[Sumsub] Initialization error:', err);\n setProviderError(`Failed to initialize: ${err.message}`);\n \n // Check for expiration\n if (err.message?.toLowerCase().includes('expired')) {\n setIsExpired(true);\n }\n });\n if (instance.onComplete) {\n instance.onComplete(() => {\n onComplete?.();\n });\n }\n } else if (providerType === IdentityVerificationProvider.Onfido) {\n instance.initialize('identity-container')\n .catch((err: Error) => {\n console.error('[Onfido] Initialization error:', err);\n setProviderError(`Failed to initialize: ${err.message}`);\n });\n }\n\n setProviderInstance(instance);\n } catch (err: any) {\n console.error('[Identity] Provider setup error:', err);\n setProviderError(`Setup error: ${err.message}`);\n }\n }\n\n return () => {\n if (providerInstance && providerInstance.destroy) {\n try {\n providerInstance.destroy();\n } catch (err) {\n console.error('[Identity] Error destroying provider:', err);\n }\n }\n };\n }, [provider, token, providerInstance, showProvider, onComplete, isExpired]);\n\n // Handle confirm and start identity verification\n const handleConfirm = async () => {\n try {\n setProviderError(null);\n setIsExpired(false);\n // Request identity verification\n await requestIdentity();\n setShowProvider(true);\n } catch (err) {\n console.error('Error starting identity verification:', err);\n }\n };\n\n // Handle restart verification\n const handleRestart = async () => {\n try {\n setProviderError(null);\n setIsExpired(false);\n setProviderInstance(null);\n \n console.log('[Identity] Restarting verification...');\n \n // Call restart identity endpoint\n await restartIdentity();\n setShowProvider(true);\n } catch (err: any) {\n console.error('Error restarting identity verification:', err);\n setProviderError(err.message || 'Failed to restart verification');\n }\n };\n\n if (isLoadingData || identityLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">\n Loading identity verification...\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n // Show error/expired state with restart option\n if (showProvider && (providerError || isExpired)) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n Verification Session Issue\n </h2>\n </CardHeader>\n <CardContent>\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg mb-6\">\n <div className=\"flex items-start\">\n <svg\n className=\"h-6 w-6 text-red-600 dark:text-red-400 mr-3 mt-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <h3 className=\"font-semibold text-red-900 dark:text-red-100 mb-1\">\n {isExpired ? 'Session Expired' : 'Verification Error'}\n </h3>\n <p className=\"text-red-800 dark:text-red-200 text-sm\">\n {providerError || 'Your verification session has expired and needs to be restarted.'}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4\">\n <h3 className=\"font-semibold text-blue-900 dark:text-blue-100 mb-2\">\n What to do next:\n </h3>\n <ul className=\"text-blue-800 dark:text-blue-200 text-sm space-y-1 list-disc list-inside\">\n <li>Click \"Restart Verification\" below to generate a new session</li>\n <li>Complete the verification process without delays</li>\n <li>If issues persist, contact support</li>\n </ul>\n </div>\n </CardContent>\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"button\" onClick={handleRestart} disabled={identityLoading}>\n {identityLoading ? 'Restarting...' : 'Restart Verification'}\n </Button>\n </CardFooter>\n </Card>\n );\n }\n\n // Show identity provider if already requested\n if (showProvider && identityData) {\n const providerType = provider as number;\n\n // PRIORITY 1: If token has a direct URL, show it in an iframe (any provider)\n if (token?.url) {\n return (\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-2xl font-bold\">Identity Verification</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Please complete the identity verification process\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRestart}\n disabled={identityLoading}\n >\n Restart\n </Button>\n </div>\n </CardHeader>\n\n <CardContent>\n {/* Info box about expiration */}\n <div className=\"mb-4 p-3 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg\">\n <p className=\"text-yellow-800 dark:text-yellow-200 text-sm\">\n <strong>Important:</strong> If you see an \"expired\" or \"invalid link\" message below, \n click the \"Restart\" button above to generate a new verification session.\n </p>\n </div>\n\n <div className=\"w-full\" style={{ height: '600px' }}>\n <iframe\n src={token.url}\n className=\"w-full h-full border-0 rounded-lg\"\n allow=\"camera; microphone; geolocation\"\n title=\"Identity Verification\"\n onLoad={(e) => {\n console.log('[Identity] Iframe loaded');\n // Try to detect expiration from iframe content (limited by CORS)\n try {\n const iframe = e.target as HTMLIFrameElement;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (iframeDoc) {\n const text = iframeDoc.body?.textContent?.toLowerCase() || '';\n if (\n text.includes('expired') ||\n text.includes('invalid') ||\n text.includes('error')\n ) {\n console.warn('[Identity] Iframe shows expiration message');\n setIsExpired(true);\n setProviderError('Your verification link has expired.');\n }\n }\n } catch (err) {\n // CORS restriction - can't access iframe content\n console.log('[Identity] Cannot check iframe content (CORS)');\n }\n }}\n />\n </div>\n </CardContent>\n\n {onBack && (\n <CardFooter>\n <Button variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n </CardFooter>\n )}\n </Card>\n );\n }\n\n // For SardinAI without URL: Show loading indicator while SDK collects data\n if (providerType === IdentityVerificationProvider.SardinAI) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold\">Device Risk Assessment</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Analyzing device security and behavioral patterns...\n </p>\n </CardHeader>\n\n <CardContent>\n <div className=\"text-center py-12\">\n <Spinner className=\"mb-4\" />\n <p className=\"text-gray-600 dark:text-gray-400\">\n Please wait while we verify your device security\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-500 mt-2\">\n This process is automatic and will complete in a few seconds\n </p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // Otherwise, show SDK container (Onfido, etc.)\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold\">Identity Verification</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Please complete the identity verification process\n </p>\n </CardHeader>\n\n <CardContent>\n <div id=\"identity-container\" className=\"min-h-[400px]\"></div>\n </CardContent>\n\n {onBack && (\n <CardFooter>\n <Button variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n </CardFooter>\n )}\n </Card>\n );\n }\n\n // ── Helpers for the dynamic review page ───────────────────────────────────\n\n const COUNTRY_FIELD_META_TYPES = new Set(['country', 'nationality', 'taxCountry', 'countryOfBirth', 'mobileCountryCode', 'otherNationality']);\n\n const colClass = (span: number = 4) => {\n const map: Record<number, string> = { 1: 'col-span-1', 2: 'col-span-2', 3: 'col-span-3', 4: 'col-span-4' };\n return map[span] || 'col-span-4';\n };\n\n /** Format a raw field value for read-only display */\n const formatDisplayValue = (name: string, value: any): string => {\n if (!value && value !== 0) return '—';\n if (COUNTRY_FIELD_META_TYPES.has(name) && name !== 'mobileCountryCode') {\n const opt = countries.find(c => c.value === value);\n return opt ? opt.label : String(value);\n }\n return String(value);\n };\n\n // ── Help-text portal (inline ? button + modal) ────────────────────────────\n\n const ReviewHelpButton: React.FC<{ helpText: string }> = ({ helpText }) => {\n const [open, setOpen] = useState(false);\n const btnRef = useRef<HTMLButtonElement>(null);\n const [, setPos] = useState({ top: 0, left: 0 });\n\n const openModal = () => {\n if (btnRef.current) {\n const r = btnRef.current.getBoundingClientRect();\n setPos({ top: r.bottom + window.scrollY + 6, left: r.left + window.scrollX });\n }\n setOpen(true);\n };\n\n return (\n <>\n <button\n type=\"button\"\n ref={btnRef}\n onClick={openModal}\n style={{\n width: 18, height: 18, borderRadius: '50%',\n border: '1.5px solid var(--metakyc-primary, #6366f1)',\n background: 'transparent', color: 'var(--metakyc-primary, #6366f1)',\n fontSize: 11, fontWeight: 700, cursor: 'pointer',\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n flexShrink: 0, lineHeight: 1,\n }}\n >?</button>\n {open && ReactDOM.createPortal(\n <div\n style={{\n position: 'fixed', inset: 0, zIndex: 99999,\n background: 'rgba(0,0,0,0.25)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}\n onClick={() => setOpen(false)}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--metakyc-surface, #fff)',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: 'var(--metakyc-border-radius, 8px)',\n padding: '16px 20px', maxWidth: 400, width: '90%',\n boxShadow: '0 10px 30px rgba(0,0,0,0.15)',\n }}\n >\n <div dangerouslySetInnerHTML={{ __html: helpText }} style={{ fontSize: 13, color: 'var(--metakyc-text-primary, #111827)', lineHeight: 1.6 }} />\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n style={{\n marginTop: 12, padding: '4px 12px', fontSize: 12,\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: 'var(--metakyc-border-radius, 6px)',\n background: 'transparent', cursor: 'pointer',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n >Close</button>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n };\n\n /** Wrap any field content with optional help text */\n const withHelp = (content: React.ReactNode, helpText?: string) => {\n if (!helpText) return content;\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 5, flexWrap: 'nowrap' }}>\n <div style={{ flex: 1, minWidth: 0 }}>{content}</div>\n <div style={{ paddingTop: 24 }}>\n <ReviewHelpButton helpText={helpText} />\n </div>\n </div>\n );\n };\n\n // ── Interactive custom field renderer ─────────────────────────────────────\n\n const renderCustomField = (f: FormFieldEntry, idx: number): React.ReactNode => {\n const key = `cf-${idx}`;\n const pn = f.paramName ?? '';\n const val = customData[pn];\n\n if (f.customType === 'br') {\n return <div key={key} className={colClass(f.colSpan)} style={{ minHeight: '0.5rem' }} />;\n }\n\n if (f.customType === 'paragraph') {\n return (\n <div key={key} className={colClass(f.colSpan)}>\n <div\n className=\"text-sm\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n </div>\n );\n }\n\n if (f.customType === 'html') {\n return (\n <div key={key} className={colClass(f.colSpan)}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n );\n }\n\n if (f.customType === 'link') {\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <a\n href={f.linkUrl ?? '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm underline\"\n style={{ color: 'var(--metakyc-primary, #6366f1)' }}\n >\n {f.displayText || f.label || f.linkText || f.linkUrl}\n </a>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n const checked = val === 'true' || val === true;\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <label style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={!!checked}\n onChange={e => setCustomData(prev => ({ ...prev, [pn]: String(e.target.checked) }))}\n style={{\n width: 16, height: 16, flexShrink: 0, marginTop: 2,\n accentColor: 'var(--metakyc-primary, #6366f1)',\n }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {f.customType === 'link_checkbox' && f.linkUrl ? (\n <><a href={f.linkUrl} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--metakyc-primary, #6366f1)', textDecoration: 'underline' }}>{f.linkText || f.label}</a>{f.label && f.linkText ? ` ${f.label}` : ''}</>\n ) : (\n f.displayText || f.label\n )}\n </span>\n </label>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'group_checkbox') {\n const selected: string[] = Array.isArray(val) ? val : (val ? [val] : []);\n const toggleOpt = (v: string) => {\n if (f.singleSelect) {\n setCustomData(prev => ({ ...prev, [pn]: selected[0] === v ? [] : [v] }));\n } else {\n setCustomData(prev => ({\n ...prev,\n [pn]: selected.includes(v) ? selected.filter(x => x !== v) : [...selected, v],\n }));\n }\n };\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <div className=\"space-y-1.5\">\n {f.label && <p className=\"text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{f.displayText || f.label}</p>}\n {(f.options || []).map(opt => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={selected.includes(opt.value)}\n onChange={() => toggleOpt(opt.value)}\n style={{ width: 16, height: 16, flexShrink: 0, marginTop: 2, accentColor: 'var(--metakyc-primary, #6366f1)' }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{opt.label}</span>\n </label>\n ))}\n </div>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'radio_group') {\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <div className=\"space-y-1.5\">\n {f.label && <p className=\"text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{f.displayText || f.label}</p>}\n {(f.options || []).map(opt => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={`rg-${pn}`}\n value={opt.value}\n checked={val === opt.value}\n onChange={() => setCustomData(prev => ({ ...prev, [pn]: opt.value }))}\n style={{ width: 16, height: 16, flexShrink: 0, marginTop: 2, accentColor: 'var(--metakyc-primary, #6366f1)' }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{opt.label}</span>\n </label>\n ))}\n </div>,\n f.helpText\n )}\n </div>\n );\n }\n\n // text input custom field\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <Input\n label={f.displayText || f.label || pn}\n value={String(val ?? '')}\n onChange={e => setCustomData(prev => ({ ...prev, [pn]: e.target.value }))}\n />,\n f.helpText\n )}\n </div>\n );\n };\n\n // ── Full field renderer (built-in + custom) ────────────────────────────────\n\n const renderReviewField = (f: FormFieldEntry, idx: number): React.ReactNode => {\n // Route custom fields\n if (f.isCustom) return renderCustomField(f, idx);\n\n const name = f.name ?? '';\n const meta = FIELD_METADATA[name];\n const label = f.displayText || meta?.label || name;\n const value = reviewData[name] ?? '';\n const isPhoneCountry = name === 'mobileCountryCode';\n const isCountry = !!meta?.countriesType && !isPhoneCountry;\n\n if (!f.editable) {\n return (\n <div key={`ro-${idx}`} className={colClass(f.colSpan ?? 2)}>\n {withHelp(\n <>\n <label className=\"block text-sm font-medium mb-0.5\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{label}</label>\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)', minHeight: '1.5rem' }}>\n {formatDisplayValue(name, value)}\n </p>\n </>,\n f.helpText\n )}\n </div>\n );\n }\n\n // Mobile country code: searchable phone-number dropdown (value = \"+43\", label = \"+43 – Austria\")\n if (isPhoneCountry) {\n return (\n <div key={`epc-${idx}`} className={colClass(f.colSpan ?? 2)}>\n {withHelp(\n <SearchableSelect\n label={label}\n value={String(value)}\n onChange={v => setReviewData(prev => ({ ...prev, [name]: v }))}\n options={[{ value: '', label: 'Select country code…' }, ...phoneCountries]}\n />,\n f.helpText\n )}\n </div>\n );\n }\n\n if (isCountry) {\n return (\n <div key={`ec-${idx}`} className={colClass(f.colSpan ?? 2)}>\n {withHelp(\n <SearchableSelect\n label={label}\n value={String(value)}\n onChange={v => setReviewData(prev => ({ ...prev, [name]: v }))}\n options={[{ value: '', label: `Select ${label.toLowerCase()}…` }, ...countries]}\n />,\n f.helpText\n )}\n </div>\n );\n }\n\n return (\n <div key={`ei-${idx}`} className={colClass(f.colSpan ?? 2)}>\n {withHelp(\n <Input\n label={label}\n type={meta?.type === 'date' ? 'date' : meta?.type === 'email' ? 'email' : 'text'}\n value={String(value)}\n onChange={e => setReviewData(prev => ({ ...prev, [name]: e.target.value }))}\n />,\n f.helpText\n )}\n </div>\n );\n };\n\n // ── Dynamic review page ────────────────────────────────────────────────────\n\n if (reviewPage) {\n const pageTitle = reviewPage.title || 'Review Your Information';\n const pageSubtitle = reviewPage.subtitle || 'Please review and confirm your information before starting identity verification';\n return (\n <form onSubmit={e => { e.preventDefault(); handleConfirm(); }}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {pageTitle}\n </h2>\n {pageSubtitle && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {pageSubtitle}\n </p>\n )}\n </CardHeader>\n\n <CardContent>\n <div className=\"grid grid-cols-4 gap-4\">\n {reviewPage.fields.map((f, idx) => renderReviewField(f, idx))}\n </div>\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"submit\" isLoading={identityLoading}>\n Confirm and Start Verification\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n }\n\n // ── Static review page (fallback when no config) ────────────────────────\n\n return (\n <form onSubmit={form.handleSubmit(handleConfirm)}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Review Your Information\n </h2>\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Please review and confirm your information before starting identity verification\n </p>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n {/* Read-only section */}\n <div className=\"space-y-4 pb-4\" style={{ borderBottom: '1px solid var(--metakyc-border, #e5e7eb)' }}>\n {[\n { label: 'Name', value: `${applicantData?.applicantRequestData?.firstName || ''} ${applicantData?.applicantRequestData?.lastName || ''}`.trim() },\n { label: 'Email', value: applicantData?.applicantRequestData?.email },\n { label: 'Date of Birth', value: applicantData?.applicantRequestData?.dateOfBirth || 'Not provided' },\n ].map(({ label, value }) => (\n <div key={label}>\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {label}\n </label>\n <p className=\"mt-1 text-base\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{value}</p>\n </div>\n ))}\n </div>\n\n {/* Editable address fields */}\n <div className=\"space-y-4\">\n <h3 className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Address Information\n </h3>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller\n control={form.control}\n name=\"country\"\n render={({ field }) => (\n <SearchableSelect\n label=\"Country\"\n value={field.value}\n onChange={field.onChange}\n options={[{ value: '', label: 'Select country…' }, ...countries]}\n />\n )}\n />\n <Controller\n control={form.control}\n name=\"nationality\"\n render={({ field }) => (\n <SearchableSelect\n label=\"Nationality\"\n value={field.value}\n onChange={field.onChange}\n options={[{ value: '', label: 'Select nationality…' }, ...countries]}\n />\n )}\n />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller control={form.control} name=\"street\" render={({ field }) => <Input {...field} label=\"Street\" />} />\n <Controller control={form.control} name=\"streetNumber\" render={({ field }) => <Input {...field} label=\"Street Number\" />} />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller control={form.control} name=\"city\" render={({ field }) => <Input {...field} label=\"City\" />} />\n <Controller control={form.control} name=\"zip\" render={({ field }) => <Input {...field} label=\"ZIP / Postal Code\" />} />\n </div>\n\n <Controller control={form.control} name=\"phonenumber\" render={({ field }) => <Input {...field} label=\"Phone Number\" type=\"tel\" />} />\n </div>\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"submit\" isLoading={identityLoading}>\n Confirm and Start Verification\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React from 'react';\nimport { Card, CardContent, CardFooter, Button, Badge } from '../core';\nimport { KycStatus, ReviewStatus, WorkflowResultType } from '../../types';\n\nexport interface KycStatusDisplayProps {\n kycStatus: KycStatus | null;\n reviewStatus: ReviewStatus;\n workflowResult: WorkflowResultType | null;\n customMessage?: string;\n onContinue?: () => void;\n onContactSupport?: () => void;\n}\n\n/**\n * KYC Status Display Component\n * Shows appropriate UI based on KYC verification status\n */\nexport const KycStatusDisplay: React.FC<KycStatusDisplayProps> = ({\n kycStatus,\n reviewStatus,\n workflowResult,\n customMessage,\n onContinue,\n onContactSupport,\n}) => {\n // Determine the primary status to display\n const getStatusInfo = () => {\n // Check KYC status first\n if (kycStatus === KycStatus.Approved) {\n return {\n type: 'success' as const,\n title: 'Verification Approved',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your identity verification has been successfully approved.',\n };\n }\n\n if (kycStatus === KycStatus.Rejected) {\n return {\n type: 'error' as const,\n title: 'Verification Rejected',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'Unfortunately, your identity verification was not approved.',\n };\n }\n\n if (kycStatus === KycStatus.Pending || kycStatus === KycStatus.InProgress) {\n return {\n type: 'pending' as const,\n title: 'Verification Pending',\n icon: '⏱',\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n message: 'Your identity verification is currently being processed.',\n };\n }\n\n // Check review status\n if (reviewStatus === ReviewStatus.Approved) {\n return {\n type: 'success' as const,\n title: 'Application Approved',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your application has been approved.',\n };\n }\n\n if (reviewStatus === ReviewStatus.Reject) {\n return {\n type: 'error' as const,\n title: 'Application Rejected',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'Your application has been rejected.',\n };\n }\n\n if (reviewStatus === ReviewStatus.UnderReview || reviewStatus === ReviewStatus.AdminReview) {\n return {\n type: 'pending' as const,\n title: 'Under Review',\n icon: '📋',\n iconBg: 'bg-yellow-100 dark:bg-yellow-900/30',\n iconColor: 'text-yellow-700 dark:text-yellow-400',\n message: 'Your application is currently under manual review.',\n };\n }\n\n // Check workflow result\n if (workflowResult === WorkflowResultType.Success) {\n return {\n type: 'success' as const,\n title: 'Process Complete',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your verification process has been completed successfully.',\n };\n }\n\n if (workflowResult === WorkflowResultType.Failed) {\n return {\n type: 'error' as const,\n title: 'Process Failed',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'The verification process could not be completed.',\n };\n }\n\n if (workflowResult === WorkflowResultType.AdminReview) {\n return {\n type: 'pending' as const,\n title: 'Admin Review Required',\n icon: '📋',\n iconBg: 'bg-yellow-100 dark:bg-yellow-900/30',\n iconColor: 'text-yellow-700 dark:text-yellow-400',\n message: 'Your application requires administrator review.',\n };\n }\n\n // Default waiting state\n // Note: This should only show for non-workflow completion states\n return {\n type: 'pending' as const,\n title: 'Processing',\n icon: '⏱',\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n message: 'Your application is being reviewed.',\n };\n };\n\n const statusInfo = getStatusInfo();\n\n return (\n <Card>\n <CardContent className=\"py-12\">\n {/* Status Icon */}\n <div className=\"flex justify-center mb-6\">\n <div\n className={`w-24 h-24 rounded-full flex items-center justify-center ${statusInfo.iconBg}`}\n >\n <span className={`text-5xl ${statusInfo.iconColor}`}>{statusInfo.icon}</span>\n </div>\n </div>\n\n {/* Title */}\n <h2 className=\"text-3xl font-bold text-center text-gray-900 dark:text-white mb-4\">\n {statusInfo.title}\n </h2>\n\n {/* Status Badge */}\n <div className=\"flex justify-center mb-6\">\n <Badge\n variant={\n statusInfo.type === 'success'\n ? 'success'\n : statusInfo.type === 'error'\n ? 'danger'\n : statusInfo.type === 'pending'\n ? 'warning'\n : 'info'\n }\n >\n {kycStatus !== null && kycStatus !== undefined\n ? KycStatus[kycStatus]\n : ReviewStatus[reviewStatus]}\n </Badge>\n </div>\n\n {/* Message */}\n <p className=\"text-center text-gray-600 dark:text-gray-400 mb-6 max-w-md mx-auto\">\n {customMessage || statusInfo.message}\n </p>\n\n {/* Status-specific content */}\n {statusInfo.type === 'success' && (\n <div className=\"bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-green-900 dark:text-green-100 mb-2\">\n What's Next?\n </h3>\n <ul className=\"text-sm text-green-800 dark:text-green-200 space-y-1\">\n <li>✓ Your identity has been verified</li>\n <li>✓ You can now proceed with your application</li>\n <li>✓ All features are now accessible</li>\n </ul>\n </div>\n )}\n\n {statusInfo.type === 'error' && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-red-900 dark:text-red-100 mb-2\">\n What Can You Do?\n </h3>\n <ul className=\"text-sm text-red-800 dark:text-red-200 space-y-2\">\n <li>• Review the requirements and ensure all information is correct</li>\n <li>• Contact our support team for assistance</li>\n <li>• You may be able to resubmit your application</li>\n </ul>\n </div>\n )}\n\n {statusInfo.type === 'pending' && (\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-blue-900 dark:text-blue-100 mb-2\">\n What Happens Next?\n </h3>\n <ul className=\"text-sm text-blue-800 dark:text-blue-200 space-y-2\">\n <li>• Our team is reviewing your information</li>\n <li>• You will be notified via email once the review is complete</li>\n <li>• This typically takes 24-48 hours</li>\n <li>• No action is required from you at this time</li>\n </ul>\n </div>\n )}\n\n {/* Additional details */}\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">KYC Status:</span>\n <div className=\"font-medium text-gray-900 dark:text-white mt-1\">\n {kycStatus !== null && kycStatus !== undefined\n ? KycStatus[kycStatus]\n : 'Not Available'}\n </div>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">Review Status:</span>\n <div className=\"font-medium text-gray-900 dark:text-white mt-1\">\n {ReviewStatus[reviewStatus]}\n </div>\n </div>\n </div>\n </div>\n </CardContent>\n\n <CardFooter className=\"flex justify-center gap-4\">\n {statusInfo.type === 'success' && onContinue && (\n <Button onClick={onContinue} size=\"lg\">\n Continue\n </Button>\n )}\n\n {statusInfo.type === 'error' && (\n <>\n {onContactSupport && (\n <Button variant=\"outline\" onClick={onContactSupport}>\n Contact Support\n </Button>\n )}\n {onContinue && (\n <Button onClick={onContinue}>\n Try Again\n </Button>\n )}\n </>\n )}\n\n {statusInfo.type === 'pending' && (\n <div className=\"text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Please check back later or wait for our email notification\n </p>\n </div>\n )}\n </CardFooter>\n </Card>\n );\n};\n","import React from 'react';\nimport { LogoConfig } from '../types/theme';\n\nexport interface LogoProps {\n config?: LogoConfig;\n className?: string;\n}\n\n/**\n * Logo Component\n * Displays the configured logo in the top-left position\n */\nexport const Logo: React.FC<LogoProps> = ({ config, className = '' }) => {\n // Don't render if logo is not visible or no URL provided\n if (!config?.visible || !config?.url) {\n return null;\n }\n\n return (\n <div className={`metakyc-logo ${className}`}>\n <img\n src={config.url}\n alt={config.alt || 'Company Logo'}\n style={{\n width: config.width || 'auto',\n height: config.height || '40px',\n maxWidth: '100%',\n objectFit: 'contain',\n }}\n onError={(e) => {\n console.warn('[Logo] Failed to load logo:', config.url);\n // Hide on error\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n );\n};\n","import React from 'react';\nimport { Logo } from './Logo';\nimport { useMetaKYC } from '../context';\n\nexport interface HeaderProps {\n /** Override the default title from theme */\n title?: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Header Component\n * Displays logo and title inline, separated by | when both are present\n */\nexport const Header: React.FC<HeaderProps> = ({ \n title: titleProp, \n subtitle,\n className = '' \n}) => {\n const { currentTheme } = useMetaKYC();\n \n const title = titleProp || currentTheme?.title || '';\n const hasLogo = !!(currentTheme?.logo && currentTheme.logo.visible && currentTheme.logo.url);\n const hasTitle = !!title;\n\n if (!hasLogo && !hasTitle) return null;\n \n return (\n <div className={`metakyc-header ${className}`}>\n <div className=\"metakyc-header-title flex items-center text-xl font-bold text-gray-900 dark:text-white\">\n {hasLogo && (\n <Logo config={currentTheme!.logo} />\n )}\n {hasLogo && hasTitle && (\n <span \n className=\"text-gray-400 dark:text-gray-500 mx-3\"\n style={{ fontSize: '1.5rem', fontWeight: 300 }}\n >\n |\n </span>\n )}\n {hasTitle && (\n <span>{title}</span>\n )}\n </div>\n {subtitle && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n {subtitle}\n </p>\n )}\n </div>\n );\n};\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useMetaKYC } from '../context';\nimport { useApplicant } from '../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, MultiSelect, Spinner, SearchableSelect } from './core';\nimport { ApplicantRegistrationRequestInput, GenderType } from '../types';\nimport type { ApplicantFormField } from '../client/config';\nimport {\n FIELD_METADATA, DEFAULT_VISIBLE_FIELDS, ALLOWED_LANGUAGES,\n FormPage, FormFieldEntry,\n} from '../types/form-config';\nimport { Header } from './Header';\n\nexport interface CreateApplicantFormProps {\n workflowKey?: string;\n externalRefId?: string;\n onSuccess: (applicantId: number) => void;\n onCancel?: () => void;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nconst SYSTEM_REQUIRED: ApplicantFormField[] = ['firstName', 'lastName', 'email', 'phonenumber', 'dateOfBirth'];\n\nfunction isEmpty(val: unknown): boolean {\n return val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0);\n}\n\n// Shared option input style — matches QuestionnaireStep / RiskScoringStep\nconst OPTION_INPUT_STYLE: React.CSSProperties = {\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n};\n\n// ── Per-field help modal ──────────────────────────────────────────────────────\n\nconst FieldHelpWrapper: React.FC<{ helpText?: string; children: React.ReactNode }> = ({ helpText, children }) => {\n const [open, setOpen] = React.useState(false);\n if (!helpText) return <>{children}</>;\n\n const modal = open ? (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={() => setOpen(false)}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999999,\n background: 'rgba(0, 0, 0, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--metakyc-card-bg, #ffffff)',\n borderRadius: '12px',\n padding: '28px 24px 24px',\n maxWidth: '480px',\n width: '100%',\n maxHeight: '80vh',\n overflowY: 'auto',\n boxShadow: '0 24px 64px rgba(0,0,0,0.25)',\n position: 'relative',\n }}\n >\n {/* Close button */}\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n style={{\n position: 'absolute',\n top: '12px',\n right: '12px',\n width: '28px',\n height: '28px',\n borderRadius: '50%',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n background: 'var(--metakyc-input-bg, #f3f4f6)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n fontSize: '16px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n\n {/* HTML content */}\n <div\n style={{\n color: 'var(--metakyc-text-primary, #111827)',\n fontSize: '14px',\n lineHeight: 1.75,\n }}\n dangerouslySetInnerHTML={{ __html: helpText }}\n />\n </div>\n </div>\n ) : null;\n\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: '5px', flexWrap: 'nowrap' }}>\n {/* Field content — takes natural width so ? sits right next to short text */}\n {children}\n\n {/* Circular ? button — inline, immediately after the component */}\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n aria-label=\"Help\"\n style={{\n flexShrink: 0,\n marginTop: '2px',\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n border: '1.5px solid var(--metakyc-primary, #2563eb)',\n background: 'transparent',\n color: 'var(--metakyc-primary, #2563eb)',\n fontSize: '10px',\n fontWeight: '700',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n padding: 0,\n transition: 'background 0.15s, color 0.15s',\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'var(--metakyc-primary, #2563eb)';\n (e.currentTarget as HTMLButtonElement).style.color = '#fff';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'transparent';\n (e.currentTarget as HTMLButtonElement).style.color = 'var(--metakyc-primary, #2563eb)';\n }}\n >\n ?\n </button>\n\n {typeof document !== 'undefined' && modal ? createPortal(modal, document.body) : null}\n </div>\n );\n};\n\n// ── CreateApplicantForm ───────────────────────────────────────────────────────\n\nexport const CreateApplicantForm: React.FC<CreateApplicantFormProps> = ({\n workflowKey: workflowKeyProp,\n externalRefId: externalRefIdProp,\n onSuccess,\n onCancel,\n}) => {\n const { config, baseInformationService, currentTheme } = useMetaKYC();\n const { createApplicant, isLoading: isCreatingApplicant } = useApplicant();\n\n const workflowKey = workflowKeyProp || config.applicantForm?.workflowKey;\n if (!workflowKey) {\n throw new Error(\n 'workflowKey is required. Provide it either as a prop to CreateApplicantForm or set it in config.applicantForm.workflowKey'\n );\n }\n\n const initialExternalRefId = externalRefIdProp || config.applicantForm?.externalRefId || '';\n const initialEmail = config.applicantForm?.email || '';\n\n // ── Theme-derived config ───────────────────────────────────────────────────\n const formPages: FormPage[] | null = useMemo(\n () => (currentTheme?.applicantFormPages && currentTheme.applicantFormPages.length > 0\n ? currentTheme.applicantFormPages\n : null),\n [currentTheme?.applicantFormPages]\n );\n\n const requiredFields: ApplicantFormField[] = useMemo(() => {\n const set = new Set<ApplicantFormField>(SYSTEM_REQUIRED);\n const clientReq = currentTheme?.applicantFormRequiredFields;\n if (clientReq) for (const f of clientReq) set.add(f as ApplicantFormField);\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && f.required) set.add(f.name as ApplicantFormField);\n }\n }\n }\n return Array.from(set);\n }, [currentTheme?.applicantFormRequiredFields, formPages]);\n\n const flatVisibleFields: ApplicantFormField[] = useMemo(() => {\n if (formPages) {\n const fields = formPages\n .flatMap(p => p.fields)\n .filter(f => !f.isCustom && f.name)\n .map(f => f.name as ApplicantFormField);\n const set = new Set<ApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }\n let fields: ApplicantFormField[];\n if (config.applicantForm?.visibleFields) {\n fields = config.applicantForm.visibleFields;\n } else if (currentTheme?.applicantFormVisibleFields && currentTheme.applicantFormVisibleFields.length > 0) {\n fields = currentTheme.applicantFormVisibleFields as ApplicantFormField[];\n } else {\n fields = DEFAULT_VISIBLE_FIELDS;\n }\n const set = new Set<ApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }, [config.applicantForm?.visibleFields, currentTheme?.applicantFormVisibleFields, formPages]);\n\n // ── Countries (per-type map) ───────────────────────────────────────────────\n // Each country-type field passes its own CountriesType to the API.\n // We deduplicate by type and load all needed lists in parallel.\n\n const COUNTRY_FIELD_NAMES = new Set([\n 'country', 'nationality', 'taxCountry', 'countryOfBirth',\n 'mobileCountryCode', 'otherNationality',\n ]);\n\n /** Distinct CountriesType values needed for the current form configuration */\n const neededCountryTypes = useMemo((): Array<number | undefined> => {\n const types = new Set<number | undefined>();\n\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && COUNTRY_FIELD_NAMES.has(f.name)) {\n types.add(f.countriesType ?? FIELD_METADATA[f.name]?.countriesType);\n }\n }\n }\n } else {\n for (const field of flatVisibleFields) {\n if (COUNTRY_FIELD_NAMES.has(field)) {\n types.add(FIELD_METADATA[field]?.countriesType);\n }\n }\n }\n\n if (types.size === 0) types.add(undefined); // fallback: load all\n return Array.from(types);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [flatVisibleFields, formPages]);\n\n const [countriesMap, setCountriesMap] = useState<Record<string, Array<{ value: string; label: string }>>>({});\n const [isLoadingCountries, setIsLoadingCountries] = useState(true);\n // Track which types are currently in-flight (not yet resolved). Separate from\n // loadedTypesRef so concurrent loads of *different* types are all allowed.\n const loadingTypesRef = useRef(new Set<string>());\n const loadedTypesRef = useRef(new Set<string>());\n\n useEffect(() => {\n if (!currentTheme) return; // wait for theme before loading countries\n\n // Only queue types that are neither already loaded nor currently in-flight\n const typesToLoad = neededCountryTypes.filter(t => {\n const key = t != null ? String(t) : 'all';\n return !loadedTypesRef.current.has(key) && !loadingTypesRef.current.has(key);\n });\n\n if (typesToLoad.length === 0) {\n // All needed types are loaded (or in-flight) — check if we can clear the spinner\n const allReady = neededCountryTypes.every(t => {\n const key = t != null ? String(t) : 'all';\n return loadedTypesRef.current.has(key);\n });\n if (allReady) setIsLoadingCountries(false);\n return;\n }\n\n setIsLoadingCountries(true);\n const keys = typesToLoad.map(t => (t != null ? String(t) : 'all'));\n keys.forEach(k => loadingTypesRef.current.add(k));\n\n const load = async () => {\n try {\n const entries = await Promise.all(\n typesToLoad.map(async (type) => {\n const key = type != null ? String(type) : 'all';\n const data = await baseInformationService.getCountries('', config.locale || 'en', type);\n const isPhoneType = type === 40; // CountriesType.PhoneNumber\n const seen = new Set<string>();\n const list = data\n .map(c => {\n // For phone-number lists use countryCode (+43) as the stored value\n // and show it prominently in the label so the user can search by code.\n if (isPhoneType && c.countryCode) {\n return {\n value: c.countryCode,\n label: `${c.countryCode} – ${c.name}`,\n };\n }\n return { value: c.abbreviation3 || c.abbreviation, label: c.name };\n })\n .filter(c => {\n if (!c.value || seen.has(c.value)) return false;\n seen.add(c.value);\n return true;\n });\n loadedTypesRef.current.add(key);\n loadingTypesRef.current.delete(key);\n return [key, list] as const;\n })\n );\n setCountriesMap(prev => ({ ...prev, ...Object.fromEntries(entries) }));\n } catch (err) {\n keys.forEach(k => loadingTypesRef.current.delete(k));\n console.error('Failed to load countries:', err);\n } finally {\n // Clear spinner only when *all currently needed* types are fully loaded\n const allReady = neededCountryTypes.every(t => {\n const key = t != null ? String(t) : 'all';\n return loadedTypesRef.current.has(key);\n });\n if (allReady) setIsLoadingCountries(false);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [neededCountryTypes, currentTheme]);\n\n /** Get the countries list for a given field, respecting any per-entry type override. */\n const getCountriesForField = (field: string, override?: number): Array<{ value: string; label: string }> => {\n const type = override ?? FIELD_METADATA[field]?.countriesType;\n const key = type != null ? String(type) : 'all';\n return countriesMap[key] || [];\n };\n\n // ── Form state ─────────────────────────────────────────────────────────────\n const [formData, setFormData] = useState<Record<string, any>>({\n workflowKey,\n firstName: '', lastName: '', title: '', email: initialEmail, dateOfBirth: '',\n phonenumber: '', externalRefId: initialExternalRefId, mobileCountryCode: '',\n street: '', streetNumber: '', zip: '', city: '', country: '', nationality: '',\n otherNationality: [], defaultLanguage: 'EN', taxCountry: '', placeOfBirth: '',\n countryOfBirth: '', salutation: null, educationLevel: '', occupation: '', taxNumber: '',\n });\n\n // Custom field values — keyed by paramName\n const [customData, setCustomData] = useState<Record<string, string>>({});\n\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\n const [pageErrors, setPageErrors] = useState<Record<string, string>>({});\n const [globalError, setGlobalError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleChange = (field: string, value: any) =>\n setFormData(prev => ({ ...prev, [field]: value }));\n const handleCustomChange = (paramName: string, value: string) =>\n setCustomData(prev => ({ ...prev, [paramName]: value }));\n\n // Sequential navigation — every page is always reachable; conditional pages\n // show a gate checkbox at the top; if unchecked their fields are hidden and\n // the user can skip with \"Skip\" or fill in after checking.\n const isConditionMet = (page: FormPage): boolean =>\n !page.conditionalOn || customData[page.conditionalOn] === 'true';\n\n const nextPageIndex = formPages\n ? (currentPageIndex < formPages.length - 1 ? currentPageIndex + 1 : -1)\n : -1;\n\n const prevPageIndex = formPages\n ? (currentPageIndex > 0 ? currentPageIndex - 1 : -1)\n : -1;\n\n // ── Per-page validation ────────────────────────────────────────────────────\n const validatePage = (page: FormPage): Record<string, string> => {\n const errs: Record<string, string> = {};\n\n for (const f of page.fields) {\n if (f.isCustom) {\n // display-only types — skip validation\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n\n if (f.required && f.paramName) {\n const val = customData[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n if (val !== 'true') {\n errs[f.paramName] = `${displayLabel} is required.`;\n }\n } else if (!val || val.trim() === '') {\n errs[f.paramName] = `${displayLabel} is required.`;\n }\n }\n } else if (f.name) {\n const fieldName = f.name as ApplicantFormField;\n if (requiredFields.includes(fieldName)) {\n if (isEmpty(formData[fieldName])) {\n const label = f.displayText || FIELD_METADATA[fieldName]?.label || fieldName;\n errs[fieldName] = `${label} is required.`;\n }\n }\n }\n }\n\n return errs;\n };\n\n // ── Submit / navigate ──────────────────────────────────────────────────────\n const handleNext = async () => {\n if (!formPages) return;\n const page = formPages[currentPageIndex];\n\n // If this page is conditional and condition not met, skip validation (user is skipping)\n if (page.conditionalOn && !isConditionMet(page)) {\n setPageErrors({});\n if (nextPageIndex >= 0) {\n setCurrentPageIndex(nextPageIndex);\n } else {\n await doSubmit();\n }\n return;\n }\n\n const errs = validatePage(page);\n if (Object.keys(errs).length > 0) { setPageErrors(errs); return; }\n setPageErrors({});\n\n if (nextPageIndex >= 0) {\n setCurrentPageIndex(nextPageIndex);\n } else {\n await doSubmit();\n }\n };\n\n const doSubmit = async () => {\n // Final validation: only pages whose condition is met\n if (formPages) {\n let allErrs: Record<string, string> = {};\n for (const page of formPages) {\n if (isConditionMet(page)) {\n allErrs = { ...allErrs, ...validatePage(page) };\n }\n }\n if (Object.keys(allErrs).length > 0) { setPageErrors(allErrs); return; }\n }\n\n setIsSubmitting(true);\n setGlobalError(null);\n\n try {\n if (!formData.externalRefId || formData.externalRefId.trim() === '') {\n setGlobalError('External Reference ID is required. Please pass it via config.applicantForm.externalRefId.');\n return;\n }\n\n const requestData: Partial<ApplicantRegistrationRequestInput> = {\n workflowKey: formData.workflowKey,\n externalRefId: formData.externalRefId.trim(),\n };\n\n if (formPages) {\n // Page-based mode: collect fields from condition-met pages\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n if (!f.isCustom && f.name) {\n const field = f.name as ApplicantFormField;\n const value = formData[field];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n }\n }\n }\n // Always include pre-filled required fields even if not on any page\n // (e.g. email pre-filled via config.applicantForm.email)\n for (const field of SYSTEM_REQUIRED) {\n if ((requestData as any)[field] === undefined) {\n const value = formData[field as ApplicantFormField];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n }\n }\n } else {\n // Flat mode: use all visible fields\n flatVisibleFields.forEach(field => {\n if (field === 'externalRefId') return;\n const value = formData[field];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n });\n }\n\n // Merge custom field values from visible pages into applicantAdditionalDatas\n const additionalDatas: Array<{ paramName: string; value: string }> = [];\n if (formPages) {\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n // Skip display-only types\n if (!f.isCustom || !f.paramName) continue;\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n\n const raw = customData[f.paramName] ?? '';\n let value: string;\n\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n // Boolean checkbox → human-readable yes/no\n value = raw === 'true' ? 'yes' : 'no';\n } else {\n // text, group_checkbox, radio_group — pass the actual value\n value = raw;\n // Skip empty optional text fields instead of sending a blank value\n if (!value && !f.required) continue;\n }\n\n additionalDatas.push({ paramName: f.paramName, value });\n }\n }\n }\n if (additionalDatas.length > 0) {\n (requestData as any).applicantAdditionalDatas = additionalDatas;\n }\n\n const result = await createApplicant(requestData as ApplicantRegistrationRequestInput);\n onSuccess(result.applicantId);\n } catch (err: any) {\n console.error('Error creating applicant:', err);\n setGlobalError(err.message || 'Failed to create applicant');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // Flat mode submit handler\n const handleFlatSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Flat mode: validate all required fields\n for (const field of requiredFields) {\n if (isEmpty(formData[field])) {\n const label = FIELD_METADATA[field]?.label || field;\n setGlobalError(`${label} is required.`);\n return;\n }\n }\n\n await doSubmit();\n };\n\n // ── Built-in field renderer ────────────────────────────────────────────────\n const renderBuiltInField = (\n field: ApplicantFormField,\n key?: string,\n displayText?: string,\n countriesTypeOverride?: number,\n ) => {\n const metadata = FIELD_METADATA[field];\n if (!metadata) return null;\n const isRequired = requiredFields.includes(field);\n const fieldError = pageErrors[field];\n const labelText = displayText || metadata.label;\n\n const elementKey = key ?? field;\n const commonProps = { required: isRequired };\n\n switch (metadata.type) {\n case 'select':\n if (\n field === 'country' ||\n field === 'nationality' ||\n field === 'taxCountry' ||\n field === 'countryOfBirth' ||\n field === 'mobileCountryCode'\n ) {\n const countryList = getCountriesForField(field, countriesTypeOverride);\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelText}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: `Select ${labelText.toLowerCase()}...` }, ...countryList]}\n disabled={isLoadingCountries}\n error={fieldError}\n />\n );\n }\n if (field === 'salutation') {\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelText}\n value={formData[field]?.toString() || ''}\n onChange={val => handleChange(field, val ? Number(val) : null)}\n options={[\n { value: '', label: 'Select salutation...' },\n { value: GenderType.Male.toString(), label: 'Male' },\n { value: GenderType.Female.toString(), label: 'Female' },\n { value: GenderType.Other.toString(), label: 'Other' },\n ]}\n error={fieldError}\n />\n );\n }\n if (field === 'defaultLanguage') {\n const langOptions = currentTheme?.allowedLanguages && currentTheme.allowedLanguages.length > 0\n ? ALLOWED_LANGUAGES.filter(l => currentTheme.allowedLanguages!.includes(l.value))\n : ALLOWED_LANGUAGES;\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelText}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: 'Select language...' }, ...langOptions]}\n error={fieldError}\n />\n );\n }\n return null;\n\n case 'multiselect':\n if (field === 'otherNationality') {\n const nationalityList = getCountriesForField(field, countriesTypeOverride);\n return (\n <MultiSelect\n key={elementKey}\n {...commonProps}\n label={labelText}\n value={formData[field] || []}\n onChange={values => handleChange(field, values)}\n options={nationalityList}\n placeholder=\"Select other nationalities...\"\n disabled={isLoadingCountries}\n />\n );\n }\n return null;\n\n case 'date':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"date\"\n label={labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n error={fieldError}\n />\n );\n\n case 'email':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"email\"\n label={labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n error={fieldError}\n />\n );\n\n case 'tel':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"tel\"\n label={labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n error={fieldError}\n />\n );\n\n default:\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"text\"\n label={labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n error={fieldError}\n />\n );\n }\n };\n\n // ── Custom field renderer ──────────────────────────────────────────────────\n const renderCustomField = (f: FormFieldEntry, idx: number) => {\n // ── Paragraph (display-only text block) ──────────────────────────────────\n if (f.customType === 'paragraph') {\n const text = f.displayText || f.label || '';\n return (\n <p\n key={`custom-${idx}`}\n className=\"metakyc-paragraph\"\n style={{\n fontSize: '14px',\n lineHeight: '1.7',\n margin: 0,\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n dangerouslySetInnerHTML={{ __html: text }}\n />\n );\n }\n\n // ── Raw HTML block (no additional wrapper styling) ────────────────────────\n if (f.customType === 'html') {\n return (\n <div\n key={`custom-${idx}`}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n );\n }\n\n // ── Line break / spacer ──────────────────────────────────────────────────\n if (f.customType === 'br') {\n return <div key={`custom-${idx}`} style={{ height: '12px' }} />;\n }\n\n // ── Standalone hyperlink (display-only) ──────────────────────────────────\n if (f.customType === 'link') {\n const linkLabel = f.displayText || f.label || f.linkText || f.linkUrl || '';\n return (\n <div key={`custom-${idx}`} className=\"metakyc-link-field\">\n <a\n href={f.linkUrl || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: 'var(--metakyc-primary, #2563eb)',\n fontSize: '14px',\n textDecoration: 'underline',\n cursor: 'pointer',\n }}\n >\n {linkLabel}\n <span style={{ fontSize: '10px', opacity: 0.7 }}>↗</span>\n </a>\n </div>\n );\n }\n\n if (!f.paramName) return null;\n const err = pageErrors[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n\n // Single checkbox\n if (f.customType === 'checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={customData[f.paramName] === 'true'}\n onChange={e => handleCustomChange(f.paramName!, e.target.checked ? 'true' : 'false')}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n // Link + checkbox\n if (f.customType === 'link_checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={customData[f.paramName] === 'true'}\n onChange={e => handleCustomChange(f.paramName!, e.target.checked ? 'true' : 'false')}\n className=\"metakyc-option-input\"\n style={{ ...OPTION_INPUT_STYLE, alignSelf: 'flex-start', marginTop: '2px' }}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {displayLabel}{' '}\n {f.linkUrl && (\n <a\n href={f.linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline\"\n style={{ color: 'var(--metakyc-primary, #2563eb)' }}\n onClick={e => e.stopPropagation()}\n >\n {f.linkText || f.linkUrl}\n </a>\n )}\n {f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n // Checkbox group (multi-select OR single-select when f.singleSelect is true)\n if (f.customType === 'group_checkbox') {\n const selectedValues = (customData[f.paramName] || '').split(',').filter(Boolean);\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1.5\">\n <div\n className=\"text-sm font-medium\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </div>\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(f.options || []).map(opt => {\n const isChecked = f.singleSelect\n ? customData[f.paramName!] === opt.value\n : selectedValues.includes(opt.value);\n\n return (\n <label\n key={opt.value}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={e => {\n if (f.singleSelect) {\n // Single-select: set to this value, or clear if unchecking current\n handleCustomChange(f.paramName!, e.target.checked ? opt.value : '');\n } else {\n const next = e.target.checked\n ? [...selectedValues, opt.value]\n : selectedValues.filter(v => v !== opt.value);\n handleCustomChange(f.paramName!, next.join(','));\n }\n }}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {opt.label}\n </span>\n </label>\n );\n })}\n </div>\n {err && <p className=\"text-red-500 text-xs\">{err}</p>}\n </div>\n );\n }\n\n // Radio group (single-select)\n if (f.customType === 'radio_group') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1.5\">\n <div\n className=\"text-sm font-medium\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </div>\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(f.options || []).map(opt => (\n <label\n key={opt.value}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={customData[f.paramName!] === opt.value}\n onChange={() => handleCustomChange(f.paramName!, opt.value)}\n name={`radio-group-${f.paramName}-${idx}`}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {opt.label}\n </span>\n </label>\n ))}\n </div>\n {err && <p className=\"text-red-500 text-xs\">{err}</p>}\n </div>\n );\n }\n\n // Default: text input\n return (\n <Input\n key={`custom-${idx}`}\n type=\"text\"\n label={`${displayLabel}${f.required ? ' *' : ''}`}\n value={customData[f.paramName] || ''}\n onChange={e => handleCustomChange(f.paramName!, e.target.value)}\n required={f.required}\n error={err}\n />\n );\n };\n\n // ── Render a page's fields in a 2-col grid ────────────────────────────────\n // For conditional pages: shows the gate checkbox at the TOP of the page.\n // Fields are only revealed once the checkbox is checked.\n const renderPageFields = (page: FormPage, _pageIndex: number) => {\n const conditionMet = isConditionMet(page);\n\n return (\n <div className=\"space-y-4\">\n {/* Gate checkbox — shown at top when this page has a condition */}\n {page.conditionalOn && (\n <FieldHelpWrapper helpText={page.conditionalHelpText}>\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={conditionMet}\n onChange={e => handleCustomChange(page.conditionalOn!, e.target.checked ? 'true' : 'false')}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', fontWeight: 500 }}\n >\n {page.conditionalOn}\n </span>\n </label>\n </FieldHelpWrapper>\n )}\n\n {/* Fields — only shown when condition is met (or page has no condition) */}\n {conditionMet && (\n <div className=\"grid grid-cols-4 gap-4\">\n {page.fields.map((f, idx) => {\n const colClass =\n f.colSpan === 1 ? 'col-span-1'\n : f.colSpan === 2 ? 'col-span-2'\n : f.colSpan === 3 ? 'col-span-3'\n : 'col-span-4';\n const key = f.isCustom ? `custom-${idx}-${f.paramName}` : `builtin-${f.name}-${idx}`;\n return (\n <div key={key} className={colClass}>\n <FieldHelpWrapper helpText={f.helpText}>\n {f.isCustom\n ? renderCustomField(f, idx)\n : renderBuiltInField(f.name as ApplicantFormField, key, f.displayText, f.countriesType)}\n </FieldHelpWrapper>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n // ── Loading ────────────────────────────────────────────────────────────────\n // Wait for theme and countries before deciding which mode to render.\n // Without this guard the flat form could flash briefly while the paged\n // configuration is still arriving from the backend.\n if (!currentTheme || isLoadingCountries) {\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)', fontSize: '0.875rem' }}>\n Loading form…\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // ── PAGE-BASED MODE ────────────────────────────────────────────────────────\n if (formPages) {\n const page = formPages[currentPageIndex] ?? formPages[0];\n const isFirst = prevPageIndex === -1;\n const isLast = nextPageIndex === -1;\n const totalPages = formPages.length;\n const condMet = isConditionMet(page);\n\n const errorMessages = Object.values(pageErrors);\n\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n {/* SDK main title from theme config */}\n <CardHeader>\n <Header title={currentTheme?.title || 'Create Applicant'} />\n </CardHeader>\n\n <CardContent>\n {/* Per-page title / subtitle — compact, inside content area */}\n {(page.title || page.subtitle || page.description) && (\n <div className=\"mb-4\">\n {page.title && (\n <h3\n className=\"font-semibold text-base\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {page.title}\n </h3>\n )}\n {page.subtitle && (\n <p\n className=\"text-sm mt-0.5\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {page.subtitle}\n </p>\n )}\n {page.description && page.description !== page.subtitle && (\n <p\n className=\"text-xs mt-1\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {page.description}\n </p>\n )}\n </div>\n )}\n\n {/* Error summary */}\n {(globalError || errorMessages.length > 0) && (\n <div className=\"mb-4 p-3 bg-red-50 border border-red-200 rounded-lg\">\n {globalError && <p className=\"text-red-600 text-sm\"><strong>Error:</strong> {globalError}</p>}\n {errorMessages.map((msg, i) => (\n <p key={i} className=\"text-red-600 text-sm\">{msg}</p>\n ))}\n </div>\n )}\n\n {/* Page progress indicator (when multiple pages) */}\n {totalPages > 1 && (\n <div className=\"flex items-center gap-2 mb-4\">\n {formPages.map((_, idx) => (\n <div\n key={idx}\n className={`h-1.5 rounded-full transition-all ${idx === currentPageIndex ? 'flex-1' : 'w-8'}`}\n style={\n idx === currentPageIndex\n ? { backgroundColor: 'var(--metakyc-primary, #2563eb)' }\n : idx < currentPageIndex\n ? { backgroundColor: 'var(--metakyc-primary-light, #93c5fd)', opacity: 0.7 }\n : { backgroundColor: '#e5e7eb' }\n }\n />\n ))}\n <span className=\"text-xs text-gray-400 flex-shrink-0\">{currentPageIndex + 1} / {totalPages}</span>\n </div>\n )}\n\n {renderPageFields(page, currentPageIndex)}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n <div>\n {!isFirst && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => { setCurrentPageIndex(prevPageIndex); setPageErrors({}); }}\n disabled={isSubmitting || isCreatingApplicant}\n >\n Previous\n </Button>\n )}\n {isFirst && onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n </div>\n <Button\n type=\"button\"\n isLoading={isSubmitting || isCreatingApplicant}\n onClick={isLast ? doSubmit : handleNext}\n >\n {isLast\n ? (page.conditionalOn && !condMet ? 'Skip & Submit' : 'Submit')\n : (page.conditionalOn && !condMet ? 'Skip' : 'Next')}\n </Button>\n </CardFooter>\n </Card>\n </div>\n );\n }\n\n // ── FLAT (CLASSIC) MODE ────────────────────────────────────────────────────\n return (\n <div className=\"metakyc-sdk\">\n <form onSubmit={handleFlatSubmit}>\n <Card>\n <CardHeader>\n <Header title={currentTheme?.title || 'Create Applicant'} />\n </CardHeader>\n\n <CardContent>\n {globalError && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-600 text-sm\"><strong>Error:</strong> {globalError}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-4 gap-4\">\n {flatVisibleFields.map(field => (\n <div key={field} className=\"col-span-4\">\n {renderBuiltInField(field)}\n </div>\n ))}\n </div>\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n <Button type=\"submit\" isLoading={isSubmitting || isCreatingApplicant}>\n Create Applicant\n </Button>\n </CardFooter>\n </Card>\n </form>\n </div>\n );\n};\n","import React from 'react';\nimport { useKycWorkflow } from '../hooks';\nimport { WorkflowStepAction, WorkflowResultType, ApplicantProgressStatus } from '../types';\nimport { QuestionnaireStep, UploadDocumentStep, OverviewStep, RiskScoringStep, InvestorCategorizationStep, AppropriatenessTestStep } from './steps';\nimport { IdentityVerificationStep } from './identity';\nimport { KycStatusDisplay } from './status';\nimport { Card, CardContent, Spinner, Badge } from './core';\nimport { Header } from './Header';\n\nexport interface KycWorkflowProps {\n applicantId: number;\n onComplete?: (result: WorkflowResultType) => void;\n onError?: (error: Error) => void;\n theme?: 'light' | 'dark';\n locale?: string;\n className?: string;\n}\n\n/**\n * Main KYC workflow component\n * Automatically renders the current step and handles progression\n */\nexport const KycWorkflow: React.FC<KycWorkflowProps> = ({\n applicantId,\n onComplete,\n onError,\n theme = 'light',\n className,\n}) => {\n const { \n progress, \n currentStep, \n steps, \n workflowKey,\n nextWorkflowKey,\n hasWorkflowChanged,\n isLoading, \n error, \n moveBack, \n refreshProgress \n } = useKycWorkflow(applicantId);\n \n const [workflowChangeAcknowledged, setWorkflowChangeAcknowledged] = React.useState(false);\n\n // Handle errors\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Handle completion\n React.useEffect(() => {\n if (progress?.workflowResult && onComplete) {\n onComplete(progress.workflowResult);\n }\n }, [progress?.workflowResult, onComplete]);\n\n // Apply theme\n React.useEffect(() => {\n if (theme === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n }, [theme]);\n\n // Reset workflow change acknowledgment when workflow actually changes\n React.useEffect(() => {\n if (hasWorkflowChanged) {\n setWorkflowChangeAcknowledged(false);\n }\n }, [hasWorkflowChanged]);\n\n if (isLoading || !progress) {\n return (\n <div className={className}>\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">Loading workflow...</p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className}>\n <Card>\n <CardContent>\n <div className=\"text-center py-8\">\n <p className=\"text-danger-500 text-lg mb-4\">An error occurred</p>\n <p className=\"text-gray-600 dark:text-gray-400\">{error.message}</p>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Show workflow change notification if workflow has changed and not acknowledged\n if (hasWorkflowChanged && !workflowChangeAcknowledged) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <div className=\"text-center py-8\">\n <div className=\"mb-6\">\n <div className=\"inline-flex items-center justify-center w-16 h-16 rounded-full bg-blue-100 dark:bg-blue-900 mb-4\">\n <svg className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n </div>\n \n <h3 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\n Workflow Transition\n </h3>\n \n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\n Your application workflow has been updated based on your progress.\n </p>\n \n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 mb-6 max-w-md mx-auto\">\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"text-left\">\n <p className=\"text-gray-500 dark:text-gray-400 mb-1\">Previous Workflow</p>\n <p className=\"font-medium text-gray-900 dark:text-white\">{workflowKey}</p>\n </div>\n <svg className=\"w-6 h-6 text-gray-400 mx-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 7l5 5m0 0l-5 5m5-5H6\" />\n </svg>\n <div className=\"text-right\">\n <p className=\"text-gray-500 dark:text-gray-400 mb-1\">New Workflow</p>\n <p className=\"font-medium text-blue-600 dark:text-blue-400\">{nextWorkflowKey}</p>\n </div>\n </div>\n {progress.nextWorkflowName && (\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-2 text-xs\">\n {progress.nextWorkflowName}\n </p>\n )}\n </div>\n \n <button\n onClick={() => setWorkflowChangeAcknowledged(true)}\n className=\"px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transition-colors\"\n >\n Continue with New Workflow\n </button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Show status display ONLY for finished or on hold states\n // IdentityPending should show the identity verification step\n // InProgress should show the workflow steps\n if (\n progress.status === ApplicantProgressStatus.Finished ||\n progress.status === ApplicantProgressStatus.OnHold\n ) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <KycStatusDisplay\n kycStatus={progress.kycStatus}\n reviewStatus={progress.reviewStatus}\n workflowResult={progress.workflowResult}\n customMessage={progress.customMessage}\n onContinue={\n onComplete && progress.workflowResult\n ? () => onComplete(progress.workflowResult!)\n : undefined\n }\n onContactSupport={() => {\n // Could be configured via props\n if (typeof window !== 'undefined') {\n window.location.href = 'mailto:support@example.com';\n }\n }}\n />\n </div>\n );\n }\n\n // For InProgress and IdentityPending status, show the workflow steps\n if (!currentStep) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">\n {progress.status === ApplicantProgressStatus.IdentityPending\n ? 'Loading identity verification...'\n : 'Loading current step...'}\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Get a human-readable fallback name based on step action type\n const getStepFallbackName = (action: WorkflowStepAction): string => {\n switch (action) {\n case WorkflowStepAction.Overview: return 'Overview';\n case WorkflowStepAction.Questionaries: return 'Questionnaire';\n case WorkflowStepAction.UploadDocument: return 'Documents';\n case WorkflowStepAction.IdentitySdk: return 'Identity';\n case WorkflowStepAction.RiskScoring: return 'Risk Assessment';\n case WorkflowStepAction.InvestorCategorization: return 'Investor Categorization';\n case WorkflowStepAction.AppropriatenessTest: return 'Appropriateness Test';\n case WorkflowStepAction.AdditionalData: return 'Additional Data';\n case WorkflowStepAction.ManualReview: return 'Review';\n default: return '';\n }\n };\n\n // Render workflow progress\n const renderProgress = () => {\n // Filter only visible steps for display\n const visibleSteps = steps.filter(step => step.visibility !== false);\n \n // Calculate current step position among visible steps\n const currentVisibleStepIndex = visibleSteps.findIndex(s => s.order === currentStep.order);\n const currentStepNumber = currentVisibleStepIndex >= 0 ? currentVisibleStepIndex + 1 : 1;\n const totalVisibleSteps = visibleSteps.length;\n \n return (\n <div className=\"mb-6\">\n {/* Header with logo and title */}\n <div className=\"flex items-start justify-between mb-4\">\n <Header />\n <Badge variant={progress.status === 1 ? 'info' : 'success'}>\n Step {currentStepNumber} of {totalVisibleSteps}\n </Badge>\n </div>\n\n <div className=\"flex items-center\">\n {visibleSteps.map((step, index) => {\n const isCompleted = index < currentVisibleStepIndex;\n const isCurrent = step.order === currentStep.order;\n \n return (\n <React.Fragment key={step.order}>\n <div className=\"flex items-center\">\n <div\n className={`\n w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium\n ${\n isCompleted || isCurrent\n ? 'bg-primary-500 text-white'\n : 'bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-400'\n }\n `}\n >\n {index + 1}\n </div>\n <span\n className={`ml-2 text-sm ${\n isCurrent\n ? 'font-semibold text-gray-900 dark:text-white'\n : 'text-gray-600 dark:text-gray-400'\n }`}\n >\n {step.displayName || step.name || getStepFallbackName(step.action) || `Step ${index + 1}`}\n </span>\n </div>\n {index < visibleSteps.length - 1 && (\n <div\n className={`flex-1 h-0.5 mx-4 ${\n isCompleted\n ? 'bg-primary-500'\n : 'bg-gray-200 dark:bg-gray-700'\n }`}\n />\n )}\n </React.Fragment>\n );\n })}\n </div>\n </div>\n );\n };\n\n // Render current step\n const renderCurrentStep = () => {\n const stepProps = {\n applicantId,\n onComplete: async () => {\n // Refresh progress after each step completion\n await refreshProgress();\n },\n onBack: currentStep.order > 0 ? moveBack : undefined,\n };\n\n switch (currentStep.action) {\n case WorkflowStepAction.Questionaries:\n return <QuestionnaireStep {...stepProps} />;\n\n case WorkflowStepAction.UploadDocument:\n return <UploadDocumentStep {...stepProps} />;\n\n case WorkflowStepAction.Overview:\n return <OverviewStep {...stepProps} />;\n\n case WorkflowStepAction.IdentitySdk:\n return <IdentityVerificationStep {...stepProps} />;\n\n case WorkflowStepAction.RiskScoring:\n return <RiskScoringStep {...stepProps} />;\n\n case WorkflowStepAction.AdditionalData:\n case WorkflowStepAction.InvestorCategorization:\n return <InvestorCategorizationStep {...stepProps} />;\n\n case WorkflowStepAction.AppropriatenessTest:\n return <AppropriatenessTestStep {...stepProps} />;\n\n case WorkflowStepAction.ManualReview:\n // ManualReview shows status display\n return (\n <KycStatusDisplay\n kycStatus={progress.kycStatus}\n reviewStatus={progress.reviewStatus}\n workflowResult={progress.workflowResult}\n customMessage={progress.customMessage}\n />\n );\n\n default:\n // Unknown step - show message but don't show status display\n // This should be a workflow step, not a final status\n return (\n <Card>\n <CardContent className=\"py-12 text-center\">\n <div className=\"mb-4\">\n <Spinner />\n </div>\n <p className=\"text-gray-600 dark:text-gray-400 mb-2\">\n Processing step: {currentStep.title || currentStep.name}\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Action type: {WorkflowStepAction[currentStep.action]}\n </p>\n </CardContent>\n </Card>\n );\n }\n };\n\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n {renderProgress()}\n {renderCurrentStep()}\n </div>\n );\n};\n","import { z } from 'zod';\nimport { QuestionnaireOutput } from '../types';\n\n/**\n * Generate zod schema for question values (reserved for future use)\n */\n/* Commented out for future use\nfunction generateQuestionValuesSchema(question: QuestionDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.array(z.string());\n\n // Apply required validation\n if (question.isRequired) {\n schema = (schema as z.ZodArray<any>).min(1, question.errorMessage || 'This field is required');\n } else {\n schema = schema.optional();\n }\n\n // Apply regex validation for the first value (single answer)\n if (!question.canMultipleAnswer && question.regex) {\n const regex = new RegExp(question.regex);\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || regex.test(val[0]),\n { message: question.errorMessage || 'Invalid format' }\n );\n }\n\n // Apply min/max validation for string length\n if (!question.canMultipleAnswer) {\n if (question.min !== undefined && question.min !== null) {\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || val[0].length >= question.min!,\n { message: `Minimum length is ${question.min}` }\n );\n }\n if (question.max !== undefined && question.max !== null) {\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || val[0].length <= question.max!,\n { message: `Maximum length is ${question.max}` }\n );\n }\n }\n\n return schema;\n}\n*/\n\n/**\n * Generate zod schema from questionnaire with grouped questions support\n */\nexport function generateQuestionnaireSchema(_questionnaire: QuestionnaireOutput) {\n // Generate schema for grouped questions structure\n // questionResults: [[{questionId, values}], [{questionId, values}], ...]\n return z.object({\n questionResults: z.any(),\n }).passthrough(); // Allow extra fields\n}\n","import { z } from 'zod';\nimport { UploadDocumentOutputDto, UploadDocumentFileDto } from '../types';\n\n/**\n * Generate zod schema for a single upload document file\n */\nfunction generateUploadDocumentFileSchema(file: UploadDocumentFileDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.array(z.instanceof(File));\n\n if (file.isRequired) {\n schema = (schema as z.ZodArray<any>).min(\n 1,\n `${file.displayName} is required`\n );\n } else {\n schema = schema.optional();\n }\n\n // Validate multiple files\n if (!file.multipleFile) {\n schema = (schema as z.ZodArray<any> | z.ZodOptional<z.ZodArray<any>>).refine(\n (files) => !files || files.length <= 1,\n { message: 'Only one file is allowed' }\n );\n }\n\n // Validate file size\n if (file.maxEachFileSizeByte > 0) {\n schema = (schema as any).refine(\n (files: File[] | undefined) =>\n !files || files.every((f) => f.size <= file.maxEachFileSizeByte),\n { message: `File size must not exceed ${Math.round(file.maxEachFileSizeByte / 1024 / 1024)}MB` }\n );\n }\n\n // Validate file type\n if (file.allowedTypes) {\n const allowedMimeTypes = file.allowedTypes.split(',').map((t) => t.trim());\n schema = (schema as any).refine(\n (files: File[] | undefined) => {\n if (!files) return true;\n return files.every((f) =>\n allowedMimeTypes.some((type) => {\n if (type.endsWith('/*')) {\n return f.type.startsWith(type.slice(0, -2));\n }\n return f.type === type;\n })\n );\n },\n { message: 'Invalid file type' }\n );\n }\n\n return schema;\n}\n\n/**\n * Generate zod schema from upload document\n */\nexport function generateUploadDocumentSchema(uploadDocument: UploadDocumentOutputDto) {\n const schemaObject: Record<string, z.ZodTypeAny> = {};\n\n uploadDocument.uploadDocumentFiles.forEach((file) => {\n const fieldName = `file_${file.id}`;\n schemaObject[fieldName] = generateUploadDocumentFileSchema(file);\n });\n\n return z.object(schemaObject);\n}\n","import { z } from 'zod';\nimport { RiskCriteriaDto } from '../types';\n\n/**\n * Generate zod schema for a single risk criterion (reserved for future use)\n */\n/* Commented out for future use\nfunction generateCriterionSchema(criterion: RiskCriteriaDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny;\n\n // Base schema based on value data type\n switch (criterion.valueDataType) {\n case ValueDataType.Integer:\n schema = z.coerce.number().int();\n if (criterion.min !== undefined && criterion.min !== null) {\n schema = (schema as z.ZodNumber).min(criterion.min);\n }\n if (criterion.max !== undefined && criterion.max !== null) {\n schema = (schema as z.ZodNumber).max(criterion.max);\n }\n break;\n\n case ValueDataType.Money:\n schema = z.coerce.number();\n if (criterion.min !== undefined && criterion.min !== null) {\n schema = (schema as z.ZodNumber).min(criterion.min);\n }\n if (criterion.max !== undefined && criterion.max !== null) {\n schema = (schema as z.ZodNumber).max(criterion.max);\n }\n break;\n\n case ValueDataType.Boolean:\n schema = z.boolean();\n break;\n\n case ValueDataType.Date:\n schema = z.string();\n break;\n\n case ValueDataType.Country:\n case ValueDataType.String:\n default:\n schema = z.string();\n if (criterion.regex) {\n const regex = new RegExp(criterion.regex);\n schema = (schema as z.ZodString).regex(regex, 'Invalid format');\n }\n break;\n }\n\n // Apply required validation\n if (criterion.isRequired) {\n if (schema instanceof z.ZodString) {\n schema = schema.min(1, `${criterion.displayName} is required`);\n }\n } else {\n schema = schema.optional();\n }\n\n return schema;\n}\n*/\n\n/**\n * Generate zod schema from risk criteria\n * Only validates user inputs (values), not metadata (riskCriteriaId)\n */\nexport function generateRiskScoringSchema(_criteria: RiskCriteriaDto[]) {\n // Don't validate the structure - just allow any data\n // Individual field validation happens during rendering\n return z.any();\n}\n","import { z } from 'zod';\nimport { AppropriatenessTestOutputDto, AppropriatenessQuestionOutputDto } from '../types';\n\n/**\n * Generate zod schema for a single appropriateness question\n */\nfunction generateQuestionSchema(_question: AppropriatenessQuestionOutputDto): z.ZodTypeAny {\n // All questions are required in the appropriateness test\n return z.string().min(1, 'This question is required');\n}\n\n/**\n * Generate zod schema from appropriateness test\n */\nexport function generateAppropriatenessSchema(test: AppropriatenessTestOutputDto) {\n const schemaObject: Record<string, z.ZodTypeAny> = {};\n\n test.appropriatenessQuestions.forEach((question) => {\n const fieldName = `question_${question.id}`;\n schemaObject[fieldName] = generateQuestionSchema(question);\n });\n\n return z.object(schemaObject);\n}\n\n// Simple schema for compatibility\nexport const appropriatenessTestSchema = z.any();\n"],"names":["WorkflowStepAction","WorkflowResultType","ApplicantProgressStatus","ApplicantProgressOnHoldReason","RiskLevel","KycStatus","ReviewStatus","ApplicantStatus","KycProcessStatus","IdentityVerificationProvider","UserType","GenderType","FileType","DocumentReviewStatus","AppropriatenessQuestionType","ValueDataType","RiskCriteriaType","CriteriaBuiltInType","InvestorCategorizationType","InvestorCategoryType","CountriesType","FIELD_METADATA","DEFAULT_VISIBLE_FIELDS","ALLOWED_LANGUAGES","ThemePreset","defaultConfig","EndpointBuilder","config","controller","action","customKey","MetaKYCError","message","code","details","validationErrors","response","__publicField","ErrorHandler","error","data","HttpClient","axios","originalRequest","_a","resolve","params","url","ApplicantService","httpClient","input","applicantId","language","externalRefId","QuestionnaireService","UploadDocumentService","AppropriatenessTestService","OverviewService","RiskScoringService","IdentityService","BaseInformationService","filter","lng","type","InvestorCategorizationService","defaultTheme","corporateTheme","fintechTheme","healthcareTheme","modernTheme","minimalTheme","themePresets","getThemePreset","preset","ThemeService","theme","parsed","p","isOldFormat","f","overrides","baseTheme","EventEmitter","event","callback","callbacks","WorkflowState","progress","previousStep","_b","StepRouter","handler","WorkflowOrchestrator","applicantService","questionnaireService","uploadDocumentService","appropriatenessTestService","overviewService","riskScoringService","_identityService","investorCategorizationService","loadScript","src","id","reject","script","isScriptLoaded","removeScript","SumsubProvider","containerId","payload","OnfidoProvider","SardinAIProvider","c","r","environment","region","sardineHost","loader","firstScript","clientId","flow","enableBiometrics","enablePortScanning","noscript","img","options","IdentityProviderManager","provider","tokenObject","contextConfig","sardinConfig","buildInputCSS","colors","bg","text","border","focusBorder","placeholder","hoverBg","ThemeManager","container","colorMap","key","value","cssVar","typography","spacing","css","str","MetaKYCContext","createContext","MetaKYCProvider","children","currentTheme","setCurrentTheme","useState","isLoadingThemeRef","React","hasLoadedThemeRef","services","useMemo","identityService","baseInformationService","themeService","themeManager","useEffect","jsx","useMetaKYC","context","useContext","fileToBase64","file","reader","base64","validateFileSize","maxSizeBytes","validateFileType","allowedTypes","prefix","formatFileSize","bytes","k","sizes","i","getAcceptString","cn","classes","STORAGE_KEYS","saveApplicantId","getApplicantId","stored","clearApplicantId","saveWorkflowState","state","getWorkflowState","clearWorkflowState","clearAllStorage","useKycWorkflow","createOrchestrator","setProgress","isLoading","setIsLoading","setError","orchestratorRef","useRef","effectiveApplicantId","isLoadingRef","hasLoadedRef","loadProgress","useCallback","result","err","refreshProgress","moveToNext","moveBack","submitCurrentStep","sortedSteps","a","b","hasWorkflowChanged","useQuestionnaire","questionnaire","setQuestionnaire","initialAnswers","setInitialAnswers","isSubmitting","setIsSubmitting","load","applicantData","textToAnswers","qr","answers","allQuestions","g","q","submit","useUploadDocument","uploadDocument","setUploadDocument","uploadProgress","setUploadProgress","useAppropriatenessTest","test","setTest","setResult","submitResult","useOverview","overview","setOverview","passOverview","useIdentityVerification","identityData","setIdentityData","isRequestingRef","requestIdentity","redirectUrl","ttl","requestCompanyIdentity","restartIdentity","useRiskScoring","criteria","setCriteria","latestResult","cr","values","v","useApplicant","isCreatingRef","isLoadingDataRef","generateSardinAISessionKey","createApplicant","sessionKey","createCompanyApplicant","getApplicantData","stopProgress","Button","variant","size","disabled","className","props","baseStyles","variantStyles","sizeStyles","jsxs","Input","forwardRef","label","helperText","leftIcon","rightIcon","style","ref","Card","CardHeader","CardContent","CardFooter","Badge","Spinner","Select","option","idx","DROPDOWN_MAX_HEIGHT","MultiSelect","onChange","required","isOpen","setIsOpen","search","setSearch","pos","setPos","containerRef","triggerRef","dropdownRef","calcPos","rect","openUp","open","close","e","target","update","filteredOptions","o","toggleOption","optionValue","removeValue","getLabel","val","themeVars","borderColor","textPrimary","textSecondary","primaryColor","primaryLight","dropdownPanel","isSelected","createPortal","SearchableSelect","searchRef","handleToggle","selectedLabel","handleSelect","optValue","optDisabled","primary","FileUpload","accept","multiple","maxSize","isDragging","setIsDragging","inputRef","handleFiles","files","fileArray","maxSizeFormatted","handleDragOver","handleDragLeave","handleDrop","handleClick","removeFile","index","newFiles","_","PhoneInput","countryCode","onCountryCodeChange","mergeClasses","array","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","prop","Icon","color","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","ChevronLeft","ChevronRight","validateQuestion","question","isEmpty","first","num","buildPages","groups","flat","gi","qi","map","pq","qs","QuestionnaireStep","onComplete","onBack","setAnswers","fieldErrors","setFieldErrors","currentPage","setCurrentPage","pages","isLastPage","currentQuestions","setAnswer","questionId","prev","validatePage","newErrors","handleNext","handleBack","handleSubmit","questionResults","QuestionField","vals","qType","answer","UploadDocumentStep","setFiles","uploadDocumentResults","docFile","fileList","valueList","OverviewStep","handleConfirm","step","resolveLocale","locale","isMoneyWithOptions","criterion","formatMoneyLabel","raw","fmt","validateCriterion","isNumeric","cs","getInputType","RiskScoringStep","autoSubmitted","setAutoSubmitted","currentCriteria","criteriaId","criteriaValueInputs","x","CriterionField","inputType","moneyOptions","InvestorCategorizationStep","selectedType","setSelectedType","AppropriatenessTestStep","testData","setTestData","timeRemaining","setTimeRemaining","isTestStarted","setIsTestStarted","isTestExpired","setIsTestExpired","waitTimeRemaining","setWaitTimeRemaining","waitSeconds","parseTimeSpan","timeSpan","parts","hours","minutes","seconds","formatTime","mins","secs","timer","handleStartTest","handleAnswerChange","unansweredCount","reloadTestData","failureMessage","attemptsRemaining","answerIndex","IdentityVerificationStep","token","identityLoading","providerInstance","setProviderInstance","setApplicantData","countries","setCountries","phoneCountries","setPhoneCountries","isLoadingData","setIsLoadingData","showProvider","setShowProvider","providerError","setProviderError","isExpired","setIsExpired","hasAutoRequestedRef","reviewData","setReviewData","customData","setCustomData","reviewPage","reviewPageDisabled","reviewPageDisabledRef","form","useForm","countriesData","phoneData","seen","countryOptions","phoneSeen","phoneOptions","requestData","expirationTime","urlString","providerType","providerConfig","instance","errorMessage","handleRestart","iframe","iframeDoc","_c","COUNTRY_FIELD_META_TYPES","colClass","span","formatDisplayValue","name","opt","ReviewHelpButton","helpText","setOpen","btnRef","openModal","Fragment","ReactDOM","withHelp","content","renderCustomField","pn","checked","selected","toggleOpt","renderReviewField","meta","isPhoneCountry","isCountry","pageTitle","pageSubtitle","_d","Controller","field","KycStatusDisplay","kycStatus","reviewStatus","workflowResult","customMessage","onContinue","onContactSupport","statusInfo","Logo","Header","titleProp","subtitle","title","hasLogo","hasTitle","SYSTEM_REQUIRED","OPTION_INPUT_STYLE","FieldHelpWrapper","modal","CreateApplicantForm","workflowKeyProp","externalRefIdProp","onSuccess","onCancel","isCreatingApplicant","workflowKey","initialExternalRefId","initialEmail","formPages","requiredFields","set","clientReq","page","flatVisibleFields","fields","COUNTRY_FIELD_NAMES","neededCountryTypes","types","countriesMap","setCountriesMap","isLoadingCountries","setIsLoadingCountries","loadingTypesRef","loadedTypesRef","typesToLoad","t","keys","entries","isPhoneType","list","getCountriesForField","override","formData","setFormData","currentPageIndex","setCurrentPageIndex","pageErrors","setPageErrors","globalError","setGlobalError","handleChange","handleCustomChange","paramName","isConditionMet","nextPageIndex","prevPageIndex","errs","displayLabel","fieldName","doSubmit","allErrs","additionalDatas","handleFlatSubmit","renderBuiltInField","displayText","countriesTypeOverride","metadata","isRequired","fieldError","labelText","elementKey","commonProps","countryList","langOptions","l","nationalityList","linkLabel","selectedValues","isChecked","next","renderPageFields","_pageIndex","conditionMet","isFirst","isLast","totalPages","condMet","errorMessages","msg","KycWorkflow","onError","currentStep","steps","nextWorkflowKey","workflowChangeAcknowledged","setWorkflowChangeAcknowledged","getStepFallbackName","renderProgress","visibleSteps","currentVisibleStepIndex","s","currentStepNumber","totalVisibleSteps","isCompleted","isCurrent","renderCurrentStep","stepProps","generateQuestionnaireSchema","_questionnaire","z","generateUploadDocumentFileSchema","schema","allowedMimeTypes","generateUploadDocumentSchema","schemaObject","generateRiskScoringSchema","_criteria","generateQuestionSchema","_question","generateAppropriatenessSchema","appropriatenessTestSchema"],"mappings":"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","x_google_ignoreList":[57,58,59,60,61,62,63,64,65,66]}
1
+ {"version":3,"file":"index.cjs","sources":["../src/types/enums.ts","../src/types/applicant.ts","../src/types/upload-document.ts","../src/types/appropriateness-test.ts","../src/types/risk-scoring.ts","../src/types/investor-categorization.ts","../src/types/form-config.ts","../src/types/theme.ts","../src/client/config.ts","../src/client/endpoint-builder.ts","../src/client/error-handler.ts","../src/client/http-client.ts","../src/services/applicant.service.ts","../src/services/questionnaire.service.ts","../src/services/upload-document.service.ts","../src/services/appropriateness-test.service.ts","../src/services/overview.service.ts","../src/services/risk-scoring.service.ts","../src/services/identity.service.ts","../src/services/base-information.service.ts","../src/services/investor-categorization.service.ts","../src/theme/presets.ts","../src/services/theme.service.ts","../src/state/event-emitter.ts","../src/state/workflow-state.ts","../src/state/step-router.ts","../src/state/workflow-orchestrator.ts","../src/identity/load-script.ts","../src/identity/providers/sumsub.ts","../src/identity/providers/onfido.ts","../src/identity/providers/sardin-ai.ts","../src/identity/provider-manager.ts","../src/theme/theme-manager.ts","../src/context/MetaKYCContext.tsx","../src/context/MetaKYCProvider.tsx","../src/context/useMetaKYC.ts","../src/utils/file.ts","../src/utils/cn.ts","../src/utils/storage.ts","../src/hooks/useKycWorkflow.ts","../src/hooks/useQuestionnaire.ts","../src/hooks/useUploadDocument.ts","../src/hooks/useAppropriatenessTest.ts","../src/hooks/useOverview.ts","../src/hooks/useIdentityVerification.ts","../src/hooks/useRiskScoring.ts","../src/hooks/useApplicant.ts","../src/components/core/Button.tsx","../src/components/core/Input.tsx","../src/components/core/Card.tsx","../src/components/core/Badge.tsx","../src/components/core/Spinner.tsx","../src/components/core/Select.tsx","../src/components/core/MultiSelect.tsx","../src/components/core/SearchableSelect.tsx","../src/components/core/FileUpload.tsx","../src/components/core/PhoneInput.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/chevron-left.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../src/components/steps/QuestionnaireStep.tsx","../src/components/steps/UploadDocumentStep.tsx","../src/components/steps/OverviewStep.tsx","../src/components/steps/RiskScoringStep.tsx","../src/components/steps/InvestorCategorizationStep.tsx","../src/components/steps/AppropriatenessTestStep.tsx","../src/components/identity/IdentityVerificationStep.tsx","../src/components/status/KycStatusDisplay.tsx","../src/components/Logo.tsx","../src/components/Header.tsx","../src/components/CreateApplicantForm.tsx","../src/components/KycWorkflow.tsx","../src/validation/questionnaire-schema.ts","../src/validation/upload-document-schema.ts","../src/validation/risk-scoring-schema.ts","../src/validation/appropriateness-schema.ts"],"sourcesContent":["/**\n * Workflow step action types\n * Defines all possible workflow steps in the KYC process\n */\nexport enum WorkflowStepAction {\n IdentitySdk = 0,\n RiskScoring = 1,\n Questionaries = 2,\n AdditionalData = 3,\n AppropriatenessTest = 4,\n UploadDocument = 5,\n ManualReview = 6,\n Overview = 7,\n InvestorCategorization = 8,\n}\n\n/**\n * Workflow result types\n * Indicates the overall result/status of a workflow\n */\nexport enum WorkflowResultType {\n NotStarted = 0,\n InProgress = 1,\n Success = 2,\n PartialSuccess = 3,\n Failed = 4,\n Skipped = 5,\n AdminReview = 6,\n SkippedAndAdminReview = 7,\n}\n\n/**\n * Applicant progress status\n * Tracks the current status of an applicant's workflow progress\n */\nexport enum ApplicantProgressStatus {\n None = 0,\n InProgress = 1,\n Finished = 2,\n OnHold = 3,\n IdentityPending = 4,\n}\n\n/**\n * Reason for applicant progress being on hold\n */\nexport enum ApplicantProgressOnHoldReason {\n None = 0,\n RepresentativeKYC = 1,\n ManualRiskCriteria = 2,\n UploadDocumentReview = 3,\n AdminReview = 4,\n}\n\n/**\n * Risk level assessment\n */\nexport enum RiskLevel {\n LowRisk = 0,\n MediumRisk = 1,\n HighRisk = 2,\n Alert = 3,\n}\n\n/**\n * KYC status\n */\nexport enum KycStatus {\n None = 0,\n Pending = 1,\n Approved = 2,\n Rejected = 3,\n ResendRequested = 4,\n Unknown = 5,\n InProgress = 6,\n}\n\n/**\n * Review status\n */\nexport enum ReviewStatus {\n Approved = 0,\n Reject = 1,\n UnderReview = 2,\n Closed = 3,\n AdminReview = 4,\n New = 5,\n InProgress = 6,\n}\n\n/**\n * Applicant status\n */\nexport enum ApplicantStatus {\n ProviderResultPending = 0,\n ProviderResultReceived = 1,\n Canceled = 2,\n ExtendedToNewApplicant = 3,\n}\n\n/**\n * KYC process status\n */\nexport enum KycProcessStatus {\n None = 0,\n ProviderResultPending = 1,\n ProviderResultReceived = 2,\n Canceled = 3,\n}\n\n/**\n * Identity verification provider types\n * IMPORTANT: These values MUST match the backend enum exactly!\n */\nexport enum IdentityVerificationProvider {\n Onfido = 0,\n Sumsub = 2, // Backend uses 2, not 1!\n SardinAI = 3, // Backend uses 3, not 2!\n}\n\n/**\n * User type\n */\nexport enum UserType {\n Individual = 0,\n Company = 1,\n}\n","/**\n * Gender type\n */\nexport enum GenderType {\n Male = 0,\n Female = 1,\n Other = 2,\n}\n\n/**\n * Tax country information\n */\nexport interface TaxCountry {\n country: string;\n taxNumber: string;\n}\n\n/**\n * Additional data for applicant\n */\nexport interface ApplicantAdditionalData {\n paramName: string;\n value: string;\n}\n\n/**\n * Applicant registration request input (Individual)\n */\nexport interface ApplicantRegistrationRequestInput {\n applicantId?: number | null;\n ownerClientId?: number | null;\n workflowKey: string;\n firstName: string;\n lastName: string;\n title?: string;\n email: string;\n dateOfBirth?: string;\n phonenumber: string;\n externalRefId: string; // Required: must always be provided\n mobileCountryCode?: string;\n street?: string;\n streetNumber?: string;\n zip?: string;\n city?: string;\n country?: string;\n nationality?: string;\n otherNationality?: string[];\n defaultLanguage?: string;\n taxCountry?: string;\n placeOfBirth?: string;\n countryOfBirth?: string;\n salutation?: GenderType | null;\n educationLevel?: string;\n occupation?: string;\n taxNumber?: string;\n otherTaxCountries?: TaxCountry[];\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * Company applicant registration request input\n */\nexport interface CompanyApplicantRegistrationRequestInput {\n applicantId?: number | null;\n ownerClientId?: number | null;\n workflowKey: string;\n companyName: string;\n companyRegistrationNumber: string;\n companyEmail: string;\n companyPhone: string;\n companyCountry?: string;\n companyCity?: string;\n companyStreet?: string;\n companyZip?: string;\n legalForm?: string;\n industry?: string;\n externalRefId?: string;\n defaultLanguage?: string;\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * Applicant request data DTO (nested in ApplicantDataDto)\n */\nexport interface ApplicantRequestDataDto {\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n dateOfBirth?: string;\n salutation?: string;\n title?: string;\n phonenumber: string;\n mobileCountryCode?: string;\n street?: string;\n streetNumber?: string;\n zip?: string;\n city?: string;\n country?: string;\n nationality?: string;\n countryOfBirth?: string;\n placeOfBirth?: string;\n taxCountry?: string;\n taxNumber?: string;\n educationLevel?: string;\n occupation?: string;\n defaultLanguage?: string;\n isCompanyRepresentative: boolean;\n otherNationalities?: string[];\n otherTaxResidencies?: string[];\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * A single questionnaire question result (from GetApplicantData)\n */\nexport interface QuestionnaireResultItem {\n question: string;\n answers: string[];\n}\n\n/**\n * A single risk criterion result (from GetApplicantData)\n */\nexport interface RiskCriteriaResultItem {\n riskCriteriaId?: number;\n riskCriteria?: string;\n answer?: string;\n}\n\n/**\n * A risk scoring plan result (from GetApplicantData)\n */\nexport interface RiskScoringResultItem {\n riskScoringPlanId?: number;\n totalScore?: number;\n riskLevel?: number;\n riskCriteriaResults?: RiskCriteriaResultItem[];\n}\n\n/**\n * Applicant data DTO (full response from GetApplicantData)\n */\nexport interface ApplicantDataDto {\n id: number;\n providerTokenObject?: string;\n applicantStatus?: number;\n reviewStatus?: number;\n kycStatus?: number;\n storageStatus?: number;\n providerResult?: string;\n externalRefId?: string;\n workflowId: number;\n workflowName: string;\n workflowColor?: string;\n riskLevel?: number;\n relatedApplicantId?: number;\n applicantRequestData?: ApplicantRequestDataDto;\n companyApplicantRequestData?: any;\n applicantDocuments?: any[];\n riskScoringResults?: RiskScoringResultItem[];\n questionnaireResults?: QuestionnaireResultItem[];\n uploadDocumentResults?: any[];\n appropriatenessTestResults?: any[];\n kycRecords?: any[];\n progressStatus?: number;\n onHoldReason?: number;\n}\n\n/**\n * Duplicate applicant input\n */\nexport interface DuplicateApplicantInput {\n sourceApplicantId: number;\n newWorkflowKey: string;\n}\n","/**\n * File type enum\n */\nexport enum FileType {\n Image = 0,\n Video = 1,\n PDF = 2,\n OfficePDF = 3,\n Custom = 4,\n}\n\n/**\n * Document review status\n */\nexport enum DocumentReviewStatus {\n Pending = 0,\n Approved = 1,\n Rejected = 2,\n RequiresRevision = 3,\n}\n\n/**\n * Upload document file DTO\n */\nexport interface UploadDocumentFileDto {\n id: number;\n name: string;\n displayName: string;\n subtitle?: string;\n fileType: FileType;\n maxEachFileSizeByte: number;\n allowedTypes?: string;\n multipleFile: boolean;\n isRequired: boolean;\n order: number;\n}\n\n/**\n * Upload document output DTO\n */\nexport interface UploadDocumentOutputDto {\n id: number;\n name: string;\n displayName: string;\n subtitle: string;\n description: string;\n uploadDocumentFiles: UploadDocumentFileDto[];\n}\n\n/**\n * Upload document file result\n */\nexport interface UploadDocumentFileResult {\n fileName: string;\n fileData: string; // base64\n}\n\n/**\n * Upload document result\n */\nexport interface UploadDocumentResult {\n uploadDocumentFileId: number;\n valueList: UploadDocumentFileResult[];\n}\n\n/**\n * Fill upload document input\n */\nexport interface FillUploadDocumentInput {\n applicantId: number;\n uploadDocumentId: number;\n uploadDocumentResults: UploadDocumentResult[];\n}\n\n/**\n * Review upload document DTO\n */\nexport interface ReviewUploadDocumentDto {\n applicantId: number;\n uploadDocumentResultId: number;\n status: DocumentReviewStatus;\n reviewNotes?: string;\n}\n","/**\n * Appropriateness question output DTO (matches backend)\n */\nexport interface AppropriatenessQuestionOutputDto {\n id: number;\n name: string;\n groupName: string;\n question: string;\n answers: string[]; // Array of shuffled answers (correct + wrong answers)\n}\n\n/**\n * Appropriateness test output DTO (matches backend)\n */\nexport interface AppropriatenessTestOutputDto {\n id: number;\n applicantId: number;\n name: string;\n displayName: string;\n subtitle: string;\n description: string;\n testDurationSec: number;\n testAllowedMaxTry: number;\n testCorrectAnswerPassLimit: number;\n totalFailedTries: number;\n totalQuestionCount: number;\n waitTimeSpanForNextTry: string; // TimeSpan as ISO string (e.g., \"00:05:00\")\n appropriatenessQuestions: AppropriatenessQuestionOutputDto[];\n}\n\n/**\n * Appropriateness question result\n */\nexport interface AppropriatenessQuestionResult {\n appropriatenessQuestionId: number;\n value: string;\n}\n\n/**\n * Fill appropriateness test input\n */\nexport interface FillAppropriatenessTestInput {\n applicantId: number;\n appropriatenessTestId: number;\n appropriatenessQuestionResults: AppropriatenessQuestionResult[];\n}\n\n/**\n * Fill appropriateness test result\n */\nexport interface FillAppropriatenessTestResult {\n message: string;\n}\n\n// Legacy types (kept for compatibility)\nexport enum AppropriatenessQuestionType {\n SingleChoice = 0,\n MultipleChoice = 1,\n Text = 2,\n}\n\nexport interface AppropriatenessAnswerDto {\n id: number;\n text: string;\n value: string;\n order: number;\n score?: number;\n}\n\nexport interface AppropriatenessQuestionDto {\n id: number;\n text: string;\n questionType: AppropriatenessQuestionType;\n order: number;\n isRequired: boolean;\n answers: AppropriatenessAnswerDto[];\n}\n","import { RiskLevel } from './enums';\n\n/**\n * Value data type for risk criteria\n */\nexport enum ValueDataType {\n String = 0,\n Integer = 1,\n /** Backend value 2 — Money/currency type; triggers locale-aware number formatting in options */\n Money = 2,\n Boolean = 3,\n Date = 4,\n Country = 5,\n DigitOnly = 6,\n}\n\n/**\n * Risk criteria type\n */\nexport enum RiskCriteriaType {\n Text = 0,\n Radio = 1,\n Checkbox = 2,\n Dropdown = 3,\n Country = 4,\n}\n\n/**\n * Built-in criteria type enum\n */\nexport enum CriteriaBuiltInType {\n None = 0,\n Country = 1,\n // Add other built-in types as needed\n}\n\n/**\n * Risk criteria answer DTO (legacy - for full admin interface)\n */\nexport interface RiskCriteriaAnswerDto {\n id: number;\n text: string;\n value: string;\n score: number;\n order: number;\n}\n\n/**\n * Risk criteria DTO (light version from GetCriterias API)\n */\nexport interface RiskCriteriaDto {\n id: number;\n name: string;\n displayName: string;\n description?: string;\n builtInType?: CriteriaBuiltInType;\n valueDataType: ValueDataType;\n defaultValues?: string[]; // Simple string array from API\n multipleValue: boolean; // Can select multiple values\n hasCustomValue: boolean;\n hideCriteriaThresholds: boolean;\n isRequired: boolean;\n pageNumber?: number;\n // Legacy fields (kept for compatibility)\n criteriaType?: RiskCriteriaType;\n order?: number;\n answers?: RiskCriteriaAnswerDto[];\n min?: number;\n max?: number;\n regex?: string;\n errorMessage?: string;\n}\n\n/**\n * Criteria value input (matches C# DTO)\n */\nexport interface CriteriaValueInput {\n riskCriteriaId: number;\n values: string[]; // Array of strings, not single string\n}\n\n/**\n * Risk calculation input (matches C# DTO exactly)\n */\nexport interface RiskCalculationInput {\n applicantId?: number;\n riskPlanId?: number;\n criteriaValueInputs: CriteriaValueInput[];\n}\n\n// Legacy types (kept for compatibility)\nexport interface RiskCalculationItem {\n criteriaId: number;\n value: string;\n}\n\n/**\n * Risk scoring result\n */\nexport interface RiskScoringResult {\n success: boolean;\n riskLevel: RiskLevel;\n totalScore: number;\n message?: string;\n}\n\n/**\n * Risk scoring plan DTO\n */\nexport interface RiskScoringPlanDto {\n id: number;\n name: string;\n displayName: string;\n description?: string;\n lowRiskThreshold: number;\n mediumRiskThreshold: number;\n highRiskThreshold: number;\n}\n","/**\n * Investor categorization type (matches backend enum)\n */\nexport enum InvestorCategorizationType {\n Individual = 0,\n Sophisticated = 1,\n HighNetWorth = 2,\n Business = 3,\n}\n\n/**\n * Investor categorization input\n */\nexport interface InvestorCategorizationInput {\n applicantId: number;\n investorType: InvestorCategorizationType;\n}\n\n/**\n * Set investor categorization result\n */\nexport interface SetInvestorCategorizationResult {\n success: boolean;\n message?: string;\n}\n\n// Legacy types (kept for compatibility)\nexport enum InvestorCategoryType {\n Retail = 0,\n Professional = 1,\n EligibleCounterparty = 2,\n}\n\nexport interface InvestorCategorizationResult {\n success: boolean;\n category: InvestorCategoryType;\n message?: string;\n}\n","import type { ApplicantFormField } from '../client/config';\n\n// ── Countries type enum (mirrors backend CountiresType) ───────────────────────\n\nexport const CountriesType = {\n Nationality: 10,\n Address: 20,\n CountryOfBirth: 30,\n PhoneNumber: 40,\n UboAddress: 50,\n} as const;\n\nexport type CountriesTypeValue = typeof CountriesType[keyof typeof CountriesType];\n\n// ── Field metadata ────────────────────────────────────────────────────────────\n\nexport interface FieldMeta {\n label: string;\n type: 'text' | 'email' | 'tel' | 'date' | 'select' | 'multiselect';\n /** For select/multiselect country fields: the default CountriesType passed to the API */\n countriesType?: CountriesTypeValue;\n}\n\n// ── Review page field configuration ──────────────────────────────────────────\n\n/** A single field entry for the identity review page */\nexport interface ReviewFieldEntry {\n /** Built-in field name from FIELD_METADATA (e.g. 'firstName', 'country') */\n name: string;\n /** true = rendered as an editable input; false / absent = read-only display */\n editable?: boolean;\n /** Optional label override */\n displayText?: string;\n /** Column span in the 4-column grid (1=quarter, 2=half, 3=three-quarter, 4=full) */\n colSpan?: 1 | 2 | 3 | 4;\n}\n\nexport const FIELD_METADATA: Record<string, FieldMeta> = {\n firstName: { label: 'First Name', type: 'text' },\n lastName: { label: 'Last Name', type: 'text' },\n email: { label: 'Email', type: 'email' },\n phonenumber: { label: 'Phone Number', type: 'tel' },\n dateOfBirth: { label: 'Date of Birth', type: 'date' },\n salutation: { label: 'Salutation', type: 'select' },\n title: { label: 'Title', type: 'text' },\n mobileCountryCode: { label: 'Mobile Country Code', type: 'select', countriesType: CountriesType.PhoneNumber },\n street: { label: 'Street', type: 'text' },\n streetNumber: { label: 'Street Number', type: 'text' },\n zip: { label: 'ZIP / Postal Code', type: 'text' },\n city: { label: 'City', type: 'text' },\n country: { label: 'Country', type: 'select', countriesType: CountriesType.Address },\n nationality: { label: 'Nationality', type: 'select', countriesType: CountriesType.Nationality },\n otherNationality: { label: 'Other Nationalities', type: 'multiselect', countriesType: CountriesType.Nationality },\n countryOfBirth: { label: 'Country of Birth', type: 'select', countriesType: CountriesType.CountryOfBirth },\n placeOfBirth: { label: 'Place of Birth', type: 'text' },\n taxCountry: { label: 'Tax Country', type: 'select', countriesType: CountriesType.Address },\n taxNumber: { label: 'Tax Number', type: 'text' },\n defaultLanguage: { label: 'Default Language', type: 'select' },\n educationLevel: { label: 'Education Level', type: 'text' },\n occupation: { label: 'Occupation', type: 'text' },\n};\n\nexport const DEFAULT_VISIBLE_FIELDS: ApplicantFormField[] = [\n 'firstName',\n 'lastName',\n 'email',\n 'phonenumber',\n 'dateOfBirth',\n];\n\nexport const ALLOWED_LANGUAGES: Array<{ value: string; label: string }> = [\n { value: 'EN', label: 'English' },\n { value: 'DE', label: 'German' },\n { value: 'FR', label: 'French' },\n { value: 'ES', label: 'Spanish' },\n { value: 'IT', label: 'Italian' },\n { value: 'PT', label: 'Portuguese' },\n { value: 'NL', label: 'Dutch' },\n { value: 'PL', label: 'Polish' },\n { value: 'RU', label: 'Russian' },\n { value: 'ZH', label: 'Chinese' },\n { value: 'JA', label: 'Japanese' },\n { value: 'AR', label: 'Arabic' },\n { value: 'TR', label: 'Turkish' },\n { value: 'SV', label: 'Swedish' },\n { value: 'DA', label: 'Danish' },\n { value: 'FI', label: 'Finnish' },\n { value: 'NO', label: 'Norwegian' },\n];\n\n// ── Multi-page form configuration (set via Panel SDK Config) ──────────────────\n\n/**\n * A single field entry inside a form page.\n * Either refers to a built-in applicant field (name) or a custom field.\n */\nexport interface FormFieldEntry {\n /** Built-in field identifier: 'firstName', 'lastName', 'email', etc. Omit for custom fields. */\n name?: string;\n /** Column span in the 4-column grid. 1 = quarter, 2 = half, 3 = three-quarter, 4 = full. */\n colSpan: 1 | 2 | 3 | 4;\n /** Whether this is a custom out-of-scope field */\n isCustom?: boolean;\n /** Type of custom field */\n customType?: 'text' | 'checkbox' | 'link_checkbox' | 'link' | 'group_checkbox' | 'radio_group' | 'paragraph' | 'html' | 'br';\n /** Override the label shown to the user. If empty, falls back to the default field name/label. */\n displayText?: string;\n /** Display label for the custom field */\n label?: string;\n /** Key under which the value is stored in applicantAdditionalData.paramName */\n paramName?: string;\n /** Whether the field is mandatory */\n required?: boolean;\n /** For link_checkbox: URL the hyperlink points to */\n linkUrl?: string;\n /** For link_checkbox: text of the hyperlink (e.g. \"Terms & Conditions\") */\n linkText?: string;\n /** For group_checkbox / radio_group: the selectable options */\n options?: Array<{ value: string; label: string }>;\n /**\n * For group_checkbox: when true only one option can be checked at a time\n * (mutually exclusive checkboxes, distinct from radio_group in appearance).\n */\n singleSelect?: boolean;\n /**\n * For country-type built-in fields: overrides the default CountriesType used when fetching\n * the country list from the API (e.g. Nationality=10, Address=20, CountryOfBirth=30, PhoneNumber=40).\n * If omitted, the SDK uses the default from FIELD_METADATA for that field.\n */\n countriesType?: number;\n /**\n * Optional help/tooltip text shown next to the field as a clickable ? button.\n * Applies to both built-in and custom fields.\n */\n helpText?: string;\n /**\n * Review-page mode only.\n * true = field is rendered as an editable input; false / absent = rendered as read-only text.\n */\n editable?: boolean;\n}\n\n/**\n * A single page of the applicant form with optional header text and an ordered list of fields.\n */\nexport interface FormPage {\n title?: string;\n subtitle?: string;\n description?: string;\n fields: FormFieldEntry[];\n /**\n * If set, this page is only shown when the custom field with this paramName has value 'true'\n * (or any non-empty value for radio/text). Typically tied to a checkbox on a previous page.\n */\n conditionalOn?: string;\n /**\n * Optional help/tooltip text shown as a ? button next to the conditional gate checkbox.\n */\n conditionalHelpText?: string;\n}\n","/**\n * Logo configuration\n */\nexport interface LogoConfig {\n url?: string;\n width?: string;\n height?: string;\n alt?: string;\n visible?: boolean; // Show/hide logo\n}\n\n/**\n * Color palette configuration\n */\nexport interface ColorPalette {\n // Primary brand colors\n primary: string;\n primaryHover: string;\n primaryLight: string;\n primaryDark: string;\n \n // Secondary colors\n secondary: string;\n secondaryHover: string;\n \n // Semantic colors\n success: string;\n warning: string;\n danger: string;\n info: string;\n \n // UI colors\n background: string;\n surface: string;\n border: string;\n \n // Text colors\n textPrimary: string;\n textSecondary: string;\n textMuted: string;\n\n // Input-specific overrides (optional — fall back to general colors when absent)\n inputBg?: string; // input background (→ --metakyc-input-bg)\n inputText?: string; // input text color (→ --metakyc-input-text)\n inputBorder?: string; // input border (→ --metakyc-input-border)\n inputBorderFocus?: string; // focus ring/border (→ --metakyc-input-border-focus)\n inputPlaceholder?: string; // placeholder text (→ --metakyc-input-placeholder)\n}\n\n/**\n * Typography configuration\n */\nexport interface TypographyConfig {\n fontFamily: string;\n headingFont?: string;\n fontSize?: {\n xs: string;\n sm: string;\n base: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n };\n fontWeight?: {\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n };\n}\n\n/**\n * Spacing and layout configuration\n */\nexport interface SpacingConfig {\n borderRadius: string;\n cardPadding: string;\n inputHeight: string;\n}\n\n/**\n * Complete theme configuration\n */\nexport interface ThemeConfig {\n /** Theme name/identifier */\n name?: string;\n \n /** Title/heading for the SDK */\n title?: string;\n \n /** Logo configuration */\n logo?: LogoConfig;\n \n /** Color palette */\n colors: ColorPalette;\n \n /** Typography settings */\n typography?: TypographyConfig;\n \n /** Spacing and layout */\n spacing?: SpacingConfig;\n \n /** Custom CSS to inject */\n customCSS?: string;\n \n /** Dark mode color overrides */\n darkMode?: {\n colors: Partial<ColorPalette>;\n };\n\n /** Applicant form visible fields (ordered) from backend config */\n applicantFormVisibleFields?: string[];\n\n /** Applicant form client-required fields from backend config */\n applicantFormRequiredFields?: string[];\n\n /** Allowed language codes for the Default Language dropdown e.g. ['EN','DE'] */\n allowedLanguages?: string[];\n\n /** Multi-page applicant form layout configuration */\n applicantFormPages?: import('./form-config').FormPage[];\n\n /** Identity review page — single FormPage with fields + editable flags */\n reviewPageFields?: import('./form-config').FormPage[];\n\n /**\n * When true the identity review/confirmation page is skipped entirely.\n * The SDK auto-requests identity on mount and shows the provider UI directly.\n */\n reviewPageDisabled?: boolean;\n}\n\n\n/**\n * Predefined theme presets\n */\nexport enum ThemePreset {\n Default = 'default',\n Corporate = 'corporate',\n Fintech = 'fintech',\n Healthcare = 'healthcare',\n Modern = 'modern',\n Minimal = 'minimal',\n}\n\n/**\n * Theme configuration from backend\n */\nexport interface ThemeConfigurationDto {\n tenantId?: number;\n isEnabled: boolean;\n preset?: ThemePreset;\n title?: string;\n logo?: LogoConfig;\n colors?: Partial<ColorPalette>;\n typography?: TypographyConfig;\n spacing?: SpacingConfig;\n customCSS?: string;\n darkMode?: {\n colors: Partial<ColorPalette>;\n };\n applicantFormVisibleFields?: string[];\n applicantFormRequiredFields?: string[];\n allowedLanguages?: string[];\n applicantFormPages?: import('./form-config').FormPage[];\n reviewPageFields?: import('./form-config').FormPage[];\n reviewPageDisabled?: boolean;\n}\n\n","/**\n * Endpoint pattern types\n * - host-controller: /api/[Controller]/[Action]\n * - application-service: /services/app/[Service]/[Method]\n */\nexport type EndpointPattern = 'host-controller' | 'application-service' | 'custom';\n\n/**\n * Custom endpoint paths configuration\n */\nexport interface CustomEndpointPaths {\n [key: string]: string;\n}\n\n/**\n * Endpoint configuration\n */\nexport interface EndpointConfig {\n pattern: EndpointPattern;\n customPaths?: CustomEndpointPaths;\n}\n\n/**\n * SardinAI provider configuration\n */\nexport interface SardinAIProviderConfig {\n clientId: string;\n clientSecret?: string;\n environment: 'sandbox' | 'production';\n region?: 'us' | 'eu' | 'ca' | 'au';\n enableBiometrics?: boolean;\n enablePortScanning?: boolean;\n flow?: string;\n}\n\n/**\n * Identity provider configurations\n */\nexport interface IdentityProviderConfigs {\n sardinai?: SardinAIProviderConfig;\n sumsub?: Record<string, any>;\n onfido?: Record<string, any>;\n}\n\n/**\n * Applicant form field name type\n */\nexport type ApplicantFormField =\n | 'firstName'\n | 'lastName'\n | 'title'\n | 'email'\n | 'dateOfBirth'\n | 'phonenumber'\n | 'mobileCountryCode'\n | 'street'\n | 'streetNumber'\n | 'zip'\n | 'city'\n | 'country'\n | 'nationality'\n | 'otherNationality'\n | 'defaultLanguage'\n | 'taxCountry'\n | 'placeOfBirth'\n | 'countryOfBirth'\n | 'salutation'\n | 'educationLevel'\n | 'occupation'\n | 'taxNumber'\n | 'externalRefId';\n\n/**\n * Applicant form configuration\n */\nexport interface ApplicantFormConfig {\n /** List of fields to show in the form. If not specified, shows default fields */\n visibleFields?: ApplicantFormField[];\n \n /** Default workflow key for applicant creation. Can be overridden per component instance */\n workflowKey?: string;\n \n /** Default external reference ID. Required if not shown in visible fields. */\n externalRefId?: string;\n\n /** Pre-fill the email field in the applicant form (e.g. for testing or SSO flows). */\n email?: string;\n}\n\n/**\n * MetaKYC client configuration\n */\nexport interface MetaKYCClientConfig {\n /** API key for authentication */\n apiKey: string;\n\n /** Tenant ID */\n tenantId: number;\n\n /** Base URL of the MetaKYC API */\n baseUrl: string;\n\n /** Endpoint configuration */\n endpoints?: EndpointConfig;\n\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n\n /** Number of retry attempts for failed requests (default: 3) */\n retries?: number;\n\n /** Locale/language code (default: 'en') */\n locale?: string;\n\n /** Identity provider configurations */\n identityProviders?: IdentityProviderConfigs;\n\n /** Applicant form configuration */\n applicantForm?: ApplicantFormConfig;\n\n /** Theme configuration (optional - will fetch from backend if not provided) */\n theme?: any; // Imported dynamically to avoid circular dependency\n}\n\n/**\n * Default configuration values\n */\nexport const defaultConfig: Partial<MetaKYCClientConfig> = {\n timeout: 30000,\n retries: 3,\n locale: 'en',\n endpoints: {\n pattern: 'host-controller',\n },\n};\n","import { EndpointConfig } from './config';\n\n/**\n * Builds API endpoint URLs based on the configured pattern\n */\nexport class EndpointBuilder {\n constructor(private config: EndpointConfig) {}\n\n /**\n * Build an endpoint URL\n * @param controller - Controller name (e.g., 'Applicant')\n * @param action - Action/method name (e.g., 'GetApplicantProgress')\n * @returns The full endpoint path\n */\n build(controller: string, action: string): string {\n // Check for custom path first\n const customKey = `${controller}.${action}`;\n if (this.config.customPaths && this.config.customPaths[customKey]) {\n return this.config.customPaths[customKey];\n }\n\n // Build based on pattern\n switch (this.config.pattern) {\n case 'host-controller':\n return `/api/${controller}/${action}`;\n\n case 'application-service':\n // For application service pattern, convert controller/action to service/method\n const serviceName = this.getServiceName(controller);\n return `/services/app/${serviceName}/${action}`;\n\n case 'custom':\n throw new Error(\n `Custom endpoint path not found for ${customKey}. Please provide it in customPaths.`\n );\n\n default:\n throw new Error(`Unknown endpoint pattern: ${this.config.pattern}`);\n }\n }\n\n /**\n * Convert controller name to service name for application-service pattern\n */\n private getServiceName(controller: string): string {\n // Map controller names to service names\n const serviceMap: Record<string, string> = {\n Applicant: 'MetaKYCVerification',\n Questionnaire: 'MetaKYCVerification',\n UploadDocument: 'MetaKYCVerification',\n AppropriatenessTest: 'MetaKYCVerification',\n BaseInformation: 'MetaKYCVerification',\n };\n\n return serviceMap[controller] || controller;\n }\n}\n","import { ApiError } from '../types';\n\n/**\n * Custom error class for MetaKYC API errors\n */\nexport class MetaKYCError extends Error {\n public response?: any;\n \n constructor(\n message: string,\n public code?: number,\n public details?: string,\n public validationErrors?: Array<{ message: string; members: string[] }>,\n response?: any\n ) {\n super(message);\n this.name = 'MetaKYCError';\n this.response = response;\n Object.setPrototypeOf(this, MetaKYCError.prototype);\n }\n}\n\n/**\n * Handles API errors and converts them to MetaKYCError\n */\nexport class ErrorHandler {\n /**\n * Process an error from the API response\n */\n static handleApiError(error: ApiError): MetaKYCError {\n return new MetaKYCError(\n error.message || 'An unknown error occurred',\n error.code,\n error.details || undefined,\n error.validationErrors || undefined\n );\n }\n\n /**\n * Process an Axios error\n */\n static handleAxiosError(error: any): MetaKYCError {\n if (error.response) {\n // Server responded with error status\n const data = error.response.data;\n\n if (data && data.error) {\n return new MetaKYCError(\n data.error.message || 'An unknown error occurred',\n data.error.code,\n data.error.details || undefined,\n data.error.validationErrors || undefined,\n error.response\n );\n }\n\n // Check for result.message (common in ABP framework)\n if (data && data.result && data.result.message) {\n return new MetaKYCError(\n data.result.message,\n error.response.status,\n `HTTP ${error.response.status}: ${error.response.statusText}`,\n undefined,\n error.response\n );\n }\n\n return new MetaKYCError(\n data?.message || error.message || 'Request failed',\n error.response.status,\n `HTTP ${error.response.status}: ${error.response.statusText}`,\n undefined,\n error.response\n );\n } else if (error.request) {\n // Request was made but no response\n return new MetaKYCError(\n 'No response from server',\n 0,\n 'The request was made but no response was received. Please check your network connection.'\n );\n } else {\n // Something else happened\n return new MetaKYCError(error.message || 'An unexpected error occurred', 0, error.toString());\n }\n }\n\n /**\n * Check if an error is a MetaKYCError\n */\n static isMetaKYCError(error: any): error is MetaKYCError {\n return error instanceof MetaKYCError;\n }\n}\n","import axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport { MetaKYCClientConfig, defaultConfig } from './config';\nimport { EndpointBuilder } from './endpoint-builder';\nimport { ErrorHandler } from './error-handler';\nimport { ApiResponse } from '../types';\n\n/**\n * HTTP client for MetaKYC API\n * Handles all HTTP communication with configurable endpoints\n */\nexport class HttpClient {\n private axiosInstance: AxiosInstance;\n private endpointBuilder: EndpointBuilder;\n private config: MetaKYCClientConfig;\n\n constructor(config: MetaKYCClientConfig) {\n this.config = { ...defaultConfig, ...config };\n\n // Initialize endpoint builder\n this.endpointBuilder = new EndpointBuilder(this.config.endpoints!);\n\n // Create axios instance\n this.axiosInstance = axios.create({\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor\n this.axiosInstance.interceptors.request.use(\n (config) => {\n // Add required headers\n config.headers['Abp-TenantId'] = this.config.tenantId.toString();\n config.headers['ApiKey'] = this.config.apiKey;\n config.headers['X-API-KEY'] = this.config.apiKey;\n\n // Add locale if provided\n if (this.config.locale) {\n config.headers['Accept-Language'] = this.config.locale;\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n // Add response interceptor\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n // Retry logic for failed requests\n if (error.response?.status >= 500 && !originalRequest._retry) {\n originalRequest._retry = true;\n originalRequest._retryCount = (originalRequest._retryCount || 0) + 1;\n\n if (originalRequest._retryCount < (this.config.retries || 3)) {\n // Wait before retrying (exponential backoff)\n await new Promise((resolve) =>\n setTimeout(resolve, 1000 * originalRequest._retryCount)\n );\n return this.axiosInstance(originalRequest);\n }\n }\n\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Build endpoint URL\n */\n buildEndpoint(controller: string, action: string): string {\n return this.endpointBuilder.build(controller, action);\n }\n\n /**\n * Make a GET request\n */\n async get<T>(controller: string, action: string, params?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.get(url, {\n params,\n });\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a POST request\n */\n async post<T>(controller: string, action: string, data?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.post(url, data);\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a PUT request\n */\n async put<T>(controller: string, action: string, data?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.put(url, data);\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a DELETE request\n */\n async delete<T>(controller: string, action: string, params?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.delete(url, {\n params,\n });\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Handle API response\n */\n private handleResponse<T>(response: AxiosResponse<ApiResponse<T>>): ApiResponse<T> {\n const data = response.data;\n\n // Check if response indicates an error\n if (!data.success && data.error) {\n throw ErrorHandler.handleApiError(data.error);\n }\n\n return data;\n }\n\n /**\n * Get the underlying axios instance for advanced usage\n */\n getAxiosInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n ApplicantRegistrationRequestInput,\n CompanyApplicantRegistrationRequestInput,\n ProgressApplicantResult,\n ProgressApplicantStatusResult,\n ApplicantDataDto,\n DuplicateApplicantInput,\n} from '../types';\n\n/**\n * Applicant service\n * Handles all applicant-related API calls\n */\nexport class ApplicantService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Create a new individual applicant\n */\n async createApplicant(input: ApplicantRegistrationRequestInput): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'ApplicantRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Create a new company applicant\n */\n async createCompanyApplicant(\n input: CompanyApplicantRegistrationRequestInput\n ): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'ApplicantCompanyRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Duplicate an existing applicant with a new workflow\n */\n async duplicateApplicant(input: DuplicateApplicantInput): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'DuplicateApplicantRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Get applicant progress\n */\n async getProgress(applicantId: number): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.get<ProgressApplicantResult>(\n 'Applicant',\n 'GetApplicantProgress',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant progress status (simplified)\n */\n async getProgressStatus(applicantId: number): Promise<ProgressApplicantStatusResult> {\n const response = await this.httpClient.get<ProgressApplicantStatusResult>(\n 'Applicant',\n 'GetApplicantProgressStaus', // Note: typo in API endpoint name\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant data\n */\n async getApplicantData(applicantId: number): Promise<ApplicantDataDto> {\n const response = await this.httpClient.get<ApplicantDataDto>(\n 'Applicant',\n 'GetApplicantData',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant status\n */\n async getApplicantStatus(applicantId: number): Promise<any> {\n const response = await this.httpClient.get(\n 'Applicant',\n 'GetApplicantStatus',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Stop applicant progress\n */\n async stopProgress(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'StopProgress', { applicantId });\n }\n\n /**\n * Move back one step in the workflow\n */\n async progressStepBack(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'ProgressStepBack', { applicantId });\n }\n\n /**\n * Set applicant language\n */\n async setLanguage(applicantId: number, language: string): Promise<void> {\n await this.httpClient.post('Applicant', 'SetApplicantLng', {\n applicantId,\n language,\n });\n }\n\n /**\n * Activate applicant\n */\n async activateApplicant(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'ActivateApplicant', { applicantId });\n }\n\n /**\n * Delete applicant\n */\n async deleteApplicant(applicantId: number): Promise<void> {\n await this.httpClient.delete('Applicant', 'DeleteApplicant', { applicantId });\n }\n\n /**\n * Check if applicant exists by external reference ID\n */\n async checkApplicantExists(externalRefId: string): Promise<boolean> {\n const response = await this.httpClient.get<boolean>(\n 'Applicant',\n 'CheckApplicantIfExists',\n { externalRefId }\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n QuestionnaireOutput,\n FillQuestionnarieInput,\n FillQuestionnairesResult,\n} from '../types';\n\n/**\n * Questionnaire service\n * Handles questionnaire-related API calls\n */\nexport class QuestionnaireService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get questionnaire for an applicant\n */\n async getQuestionnaire(applicantId: number): Promise<QuestionnaireOutput> {\n const response = await this.httpClient.get<QuestionnaireOutput>(\n 'Questionnaire',\n 'GetQuestionnaire',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit questionnaire answers\n */\n async fillQuestionnaire(input: FillQuestionnarieInput): Promise<FillQuestionnairesResult> {\n const response = await this.httpClient.post<FillQuestionnairesResult>(\n 'Applicant',\n 'FillQuestionnarie', // Note: typo in API endpoint name\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n UploadDocumentOutputDto,\n FillUploadDocumentInput,\n ReviewUploadDocumentDto,\n} from '../types';\n\n/**\n * Upload document service\n * Handles document upload-related API calls\n */\nexport class UploadDocumentService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get upload document requirements for an applicant\n */\n async getUploadDocument(applicantId: number): Promise<UploadDocumentOutputDto> {\n const response = await this.httpClient.get<UploadDocumentOutputDto>(\n 'UploadDocument',\n 'GetUploadDocument',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit uploaded documents\n */\n async fillUploadDocument(input: FillUploadDocumentInput): Promise<void> {\n await this.httpClient.post('Applicant', 'FillUploadDocument', input);\n }\n\n /**\n * Review uploaded documents (admin function)\n */\n async reviewUploadDocument(input: ReviewUploadDocumentDto): Promise<void> {\n await this.httpClient.post('UploadDocument', 'ReviewUploadDocument', input);\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n FillAppropriatenessTestResult,\n} from '../types';\n\n/**\n * Appropriateness test service\n * Handles appropriateness test-related API calls\n */\nexport class AppropriatenessTestService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get appropriateness test for an applicant\n */\n async getAppropriatenessTest(applicantId: number): Promise<AppropriatenessTestOutputDto> {\n const response = await this.httpClient.get<AppropriatenessTestOutputDto>(\n 'AppropriatenessTest',\n 'GetAppropriatenessTest',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit appropriateness test answers\n */\n async fillAppropriatenessTest(\n input: FillAppropriatenessTestInput\n ): Promise<FillAppropriatenessTestResult> {\n const response = await this.httpClient.post<FillAppropriatenessTestResult>(\n 'Applicant',\n 'FillAppropriatenessTest',\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { OverviewDataDto } from '../types';\n\n/**\n * Overview service\n * Handles overview step-related API calls\n */\nexport class OverviewService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get overview data for an applicant\n */\n async getOverviewData(applicantId: number): Promise<OverviewDataDto> {\n const response = await this.httpClient.get<OverviewDataDto>(\n 'Applicant',\n 'GetOverviewData',\n { ApplicantId: applicantId } // Note: capital 'A' in API\n );\n return response.result;\n }\n\n /**\n * Pass the overview step\n */\n async passOverview(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'PassOverview', { applicantId });\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n RiskCriteriaDto,\n RiskCalculationInput,\n RiskScoringResult,\n RiskScoringPlanDto,\n} from '../types';\n\n/**\n * Risk scoring service\n * Handles risk scoring-related API calls\n */\nexport class RiskScoringService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get risk scoring plan information\n */\n async getRiskScoringPlan(): Promise<RiskScoringPlanDto> {\n const response = await this.httpClient.get<RiskScoringPlanDto>(\n 'Applicant',\n 'GetRiskScoringPlanInfo'\n );\n return response.result;\n }\n\n /**\n * Get risk criteria for scoring\n * Note: Requires applicantId as query parameter\n */\n async getRiskCriterias(applicantId: number): Promise<RiskCriteriaDto[]> {\n const response = await this.httpClient.get<RiskCriteriaDto[]>(\n 'Risk',\n 'GetCriterias',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Submit risk scoring calculation\n */\n async submitRiskScoring(input: RiskCalculationInput): Promise<RiskScoringResult> {\n const response = await this.httpClient.post<RiskScoringResult>(\n 'Applicant',\n 'RiskScoringRequest',\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { IdentityRequest, ApplicantRegistrationRequestOutput } from '../types';\n\n/**\n * Identity service\n * Handles identity verification-related API calls\n */\nexport class IdentityService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Request identity verification for individual applicant\n */\n async identityRequest(input: IdentityRequest): Promise<ApplicantRegistrationRequestOutput> {\n console.log('[IdentityService] Calling IdentityRequest with input:', input);\n const response = await this.httpClient.post<ApplicantRegistrationRequestOutput>(\n 'Applicant',\n 'IdentityRequest',\n input\n );\n console.log('[IdentityService] IdentityRequest response:', response);\n return response.result;\n }\n\n /**\n * Request identity verification for company applicant\n */\n async identityCompanyRequest(input: IdentityRequest): Promise<ApplicantRegistrationRequestOutput> {\n const response = await this.httpClient.post<ApplicantRegistrationRequestOutput>(\n 'Applicant',\n 'IdentityCompanyRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Restart identity verification (individual)\n * Uses IdentityRequest with restart flag\n */\n async restartIdentityRequest(applicantId: number): Promise<ApplicantRegistrationRequestOutput> {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n console.log('[IdentityService] Restarting identity with restart=true:', input);\n return this.identityRequest(input);\n }\n\n /**\n * Restart identity verification (company)\n * Uses IdentityCompanyRequest with restart flag\n */\n async restartIdentityCompanyRequest(applicantId: number): Promise<ApplicantRegistrationRequestOutput> {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n return this.identityCompanyRequest(input);\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { CountryDto, BranchDto, LegalEntityDto } from '../types';\n\n/**\n * Base information service\n * Handles reference data API calls (countries, branches, legal entities)\n */\nexport class BaseInformationService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get all countries\n * @param filter - Optional filter string\n * @param lng - Language code (e.g., 'en', 'de')\n * @param type - Optional country type filter\n */\n async getCountries(filter?: string, lng?: string, type?: number): Promise<CountryDto[]> {\n const response = await this.httpClient.get<CountryDto[]>(\n 'BaseInformation',\n 'GetAllCountries',\n { filter: filter || '', lng: lng || 'en', type }\n );\n return response.result;\n }\n\n /**\n * Get all branches\n */\n async getBranches(): Promise<BranchDto[]> {\n const response = await this.httpClient.get<BranchDto[]>(\n 'BaseInformation',\n 'GetBranches'\n );\n return response.result;\n }\n\n /**\n * Get all legal entities\n */\n async getLegalEntities(): Promise<LegalEntityDto[]> {\n const response = await this.httpClient.get<LegalEntityDto[]>(\n 'BaseInformation',\n 'GetLegalEntities'\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n InvestorCategorizationInput,\n SetInvestorCategorizationResult,\n} from '../types';\n\n/**\n * Investor categorization service\n * Handles investor categorization-related API calls\n */\nexport class InvestorCategorizationService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Set investor categorization\n */\n async setInvestorCategorization(\n input: InvestorCategorizationInput\n ): Promise<SetInvestorCategorizationResult> {\n const response = await this.httpClient.post<SetInvestorCategorizationResult>(\n 'Applicant',\n 'SetInvestorCategorization',\n input\n );\n return response.result;\n }\n\n /**\n * Get investor categorization\n */\n async getInvestorCategorization(applicantId: number): Promise<InvestorCategorizationInput> {\n const response = await this.httpClient.get<InvestorCategorizationInput>(\n 'Applicant',\n 'GetInvestorCategorisation', // Note: British spelling in API\n { applicantId }\n );\n return response.result;\n }\n}\n","import { ThemeConfig, ThemePreset } from '../types/theme';\n\n/**\n * Default theme preset\n */\nexport const defaultTheme: ThemeConfig = {\n name: 'Default',\n title: 'KYC Verification',\n logo: {\n url: '',\n height: '40px',\n visible: true,\n },\n colors: {\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n primaryLight: '#dbeafe',\n primaryDark: '#1e40af',\n \n secondary: '#64748b',\n secondaryHover: '#475569',\n \n success: '#10b981',\n warning: '#f59e0b',\n danger: '#ef4444',\n info: '#3b82f6',\n \n background: '#ffffff',\n surface: '#f9fafb',\n border: '#e5e7eb',\n \n textPrimary: '#111827',\n textSecondary: '#6b7280',\n textMuted: '#9ca3af',\n },\n typography: {\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n },\n fontWeight: {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n },\n spacing: {\n borderRadius: '0.5rem',\n cardPadding: '1.5rem',\n inputHeight: '2.5rem',\n },\n darkMode: {\n colors: {\n background: '#111827',\n surface: '#1f2937',\n border: '#374151',\n textPrimary: '#f9fafb',\n textSecondary: '#d1d5db',\n textMuted: '#9ca3af',\n },\n },\n};\n\n/**\n * Corporate blue theme preset\n */\nexport const corporateTheme: ThemeConfig = {\n name: 'Corporate',\n logo: {\n url: '',\n height: '40px',\n visible: true,\n },\n colors: {\n primary: '#0052CC',\n primaryHover: '#0747A6',\n primaryLight: '#DEEBFF',\n primaryDark: '#0747A6',\n \n secondary: '#6B778C',\n secondaryHover: '#5E6C84',\n \n success: '#00875A',\n warning: '#FF991F',\n danger: '#DE350B',\n info: '#0065FF',\n \n background: '#ffffff',\n surface: '#F4F5F7',\n border: '#DFE1E6',\n \n textPrimary: '#172B4D',\n textSecondary: '#5E6C84',\n textMuted: '#97A0AF',\n },\n typography: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n spacing: {\n borderRadius: '0.25rem',\n cardPadding: '1.5rem',\n inputHeight: '2.5rem',\n },\n};\n\n/**\n * Fintech green theme preset\n */\nexport const fintechTheme: ThemeConfig = {\n name: 'Fintech',\n logo: {\n url: '',\n height: '36px',\n visible: true,\n },\n colors: {\n primary: '#00B386',\n primaryHover: '#009973',\n primaryLight: '#D1FAE5',\n primaryDark: '#047857',\n \n secondary: '#7C3AED',\n secondaryHover: '#6D28D9',\n \n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#F9FAFB',\n border: '#E5E7EB',\n \n textPrimary: '#111827',\n textSecondary: '#6B7280',\n textMuted: '#9CA3AF',\n },\n typography: {\n fontFamily: 'Montserrat, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '0.75rem',\n cardPadding: '2rem',\n inputHeight: '3rem',\n },\n};\n\n/**\n * Healthcare theme preset\n */\nexport const healthcareTheme: ThemeConfig = {\n name: 'Healthcare',\n logo: {\n url: '',\n height: '44px',\n visible: true,\n },\n colors: {\n primary: '#06B6D4',\n primaryHover: '#0891B2',\n primaryLight: '#CFFAFE',\n primaryDark: '#0E7490',\n \n secondary: '#8B5CF6',\n secondaryHover: '#7C3AED',\n \n success: '#059669',\n warning: '#D97706',\n danger: '#DC2626',\n info: '#0284C7',\n \n background: '#ffffff',\n surface: '#F0F9FF',\n border: '#E0F2FE',\n \n textPrimary: '#0F172A',\n textSecondary: '#475569',\n textMuted: '#94A3B8',\n },\n typography: {\n fontFamily: 'Lato, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '0.5rem',\n cardPadding: '1.75rem',\n inputHeight: '2.75rem',\n },\n darkMode: {\n colors: {\n background: '#0F172A',\n surface: '#1E293B',\n border: '#334155',\n textPrimary: '#F1F5F9',\n textSecondary: '#CBD5E1',\n },\n },\n};\n\n/**\n * Modern theme preset\n */\nexport const modernTheme: ThemeConfig = {\n name: 'Modern',\n logo: {\n url: '',\n height: '38px',\n visible: true,\n },\n colors: {\n primary: '#8B5CF6',\n primaryHover: '#7C3AED',\n primaryLight: '#EDE9FE',\n primaryDark: '#6D28D9',\n \n secondary: '#EC4899',\n secondaryHover: '#DB2777',\n \n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#FAFAFA',\n border: '#E5E5E5',\n \n textPrimary: '#171717',\n textSecondary: '#737373',\n textMuted: '#A3A3A3',\n },\n typography: {\n fontFamily: 'Poppins, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '1rem',\n cardPadding: '2rem',\n inputHeight: '3rem',\n },\n};\n\n/**\n * Minimal theme preset\n */\nexport const minimalTheme: ThemeConfig = {\n name: 'Minimal',\n logo: {\n url: '',\n height: '32px',\n visible: true,\n },\n colors: {\n primary: '#000000',\n primaryHover: '#18181B',\n primaryLight: '#F4F4F5',\n primaryDark: '#000000',\n \n secondary: '#71717A',\n secondaryHover: '#52525B',\n \n success: '#22C55E',\n warning: '#EAB308',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#FAFAFA',\n border: '#E4E4E7',\n \n textPrimary: '#09090B',\n textSecondary: '#71717A',\n textMuted: '#A1A1AA',\n },\n typography: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n spacing: {\n borderRadius: '0.25rem',\n cardPadding: '1.25rem',\n inputHeight: '2.25rem',\n },\n};\n\n/**\n * Map of all theme presets\n */\nexport const themePresets: Record<ThemePreset, ThemeConfig> = {\n [ThemePreset.Default]: defaultTheme,\n [ThemePreset.Corporate]: corporateTheme,\n [ThemePreset.Fintech]: fintechTheme,\n [ThemePreset.Healthcare]: healthcareTheme,\n [ThemePreset.Modern]: modernTheme,\n [ThemePreset.Minimal]: minimalTheme,\n};\n\n/**\n * Get theme preset by name\n */\nexport function getThemePreset(preset: ThemePreset): ThemeConfig {\n return themePresets[preset] || defaultTheme;\n}\n","import { HttpClient } from '../client';\nimport { ThemeConfigurationDto, ThemeConfig, ThemePreset } from '../types/theme';\nimport { getThemePreset } from '../theme/presets';\n\n/**\n * Theme Service\n * Handles backend communication for theme configuration\n */\nexport class ThemeService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get theme configuration from backend\n */\n async getThemeConfiguration(): Promise<ThemeConfig> {\n try {\n const response = await this.httpClient.get<ThemeConfigurationDto>(\n 'Tenant',\n 'GetThemeConfiguration'\n );\n\n // If theme is disabled or not configured, return default\n if (!response.result.isEnabled) {\n return getThemePreset(ThemePreset.Default);\n }\n\n // Start with preset if specified\n let theme: ThemeConfig = response.result.preset \n ? getThemePreset(response.result.preset)\n : getThemePreset(ThemePreset.Default);\n\n // Apply custom overrides\n if (response.result.title) {\n theme.title = response.result.title;\n }\n\n if (response.result.logo) {\n theme.logo = { ...theme.logo, ...response.result.logo };\n }\n\n if (response.result.colors) {\n theme.colors = { ...theme.colors, ...response.result.colors };\n }\n\n if (response.result.typography) {\n theme.typography = { ...theme.typography, ...response.result.typography };\n }\n\n if (response.result.spacing) {\n theme.spacing = { ...theme.spacing, ...response.result.spacing };\n }\n\n if (response.result.customCSS) {\n theme.customCSS = response.result.customCSS;\n }\n\n if (response.result.darkMode) {\n theme.darkMode = {\n colors: {\n ...theme.darkMode?.colors,\n ...response.result.darkMode.colors,\n },\n };\n }\n\n if (response.result.applicantFormVisibleFields && response.result.applicantFormVisibleFields.length > 0) {\n theme.applicantFormVisibleFields = response.result.applicantFormVisibleFields;\n }\n\n if (response.result.applicantFormRequiredFields && response.result.applicantFormRequiredFields.length > 0) {\n theme.applicantFormRequiredFields = response.result.applicantFormRequiredFields;\n }\n\n if (response.result.allowedLanguages && response.result.allowedLanguages.length > 0) {\n theme.allowedLanguages = response.result.allowedLanguages;\n }\n\n if (response.result.applicantFormPages) {\n try {\n const parsed = typeof response.result.applicantFormPages === 'string'\n ? JSON.parse(response.result.applicantFormPages)\n : response.result.applicantFormPages;\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Migrate old 2-column format (_v < 4): colSpan 1→2, 2→4\n theme.applicantFormPages = parsed.map((p: any) => {\n const isOldFormat = !p._v || p._v < 4;\n return {\n ...p,\n fields: (p.fields || []).map((f: any) => ({\n ...f,\n colSpan: isOldFormat\n ? (f.colSpan === 1 ? 2 : 4)\n : Math.min(4, Math.max(1, f.colSpan ?? 4)),\n })),\n };\n });\n }\n } catch {\n // malformed JSON — fall back to flat layout\n }\n }\n\n if (response.result.reviewPageFields) {\n try {\n const parsed = typeof response.result.reviewPageFields === 'string'\n ? JSON.parse(response.result.reviewPageFields)\n : response.result.reviewPageFields;\n if (Array.isArray(parsed) && parsed.length > 0) {\n theme.reviewPageFields = parsed;\n }\n } catch {\n // malformed JSON — fall back to static layout\n }\n }\n\n if (response.result.reviewPageDisabled) {\n theme.reviewPageDisabled = true;\n }\n\n return theme;\n } catch (error) {\n console.warn('[ThemeService] Failed to fetch theme configuration:', error);\n // Return default theme on error\n return getThemePreset(ThemePreset.Default);\n }\n }\n\n /**\n * Save theme configuration (for Panel use)\n */\n async saveThemeConfiguration(config: ThemeConfigurationDto): Promise<void> {\n await this.httpClient.post<void>('Tenant', 'SaveThemeConfiguration', config);\n }\n\n /**\n * Get available theme presets\n */\n getAvailablePresets(): Array<{ id: ThemePreset; name: string }> {\n return [\n { id: ThemePreset.Default, name: 'Default' },\n { id: ThemePreset.Corporate, name: 'Corporate' },\n { id: ThemePreset.Fintech, name: 'Fintech' },\n { id: ThemePreset.Healthcare, name: 'Healthcare' },\n { id: ThemePreset.Modern, name: 'Modern' },\n { id: ThemePreset.Minimal, name: 'Minimal' },\n ];\n }\n\n /**\n * Preview theme (doesn't save)\n */\n getPreviewTheme(preset: ThemePreset, overrides?: Partial<ThemeConfig>): ThemeConfig {\n const baseTheme = getThemePreset(preset);\n \n if (!overrides) {\n return baseTheme;\n }\n\n return {\n ...baseTheme,\n ...overrides,\n logo: { ...baseTheme.logo, ...overrides.logo },\n colors: { ...baseTheme.colors, ...overrides.colors },\n typography: overrides.typography ? \n { ...baseTheme.typography, ...overrides.typography } : \n baseTheme.typography,\n spacing: overrides.spacing ? \n { ...baseTheme.spacing, ...overrides.spacing } : \n baseTheme.spacing,\n };\n }\n}\n","/**\n * Simple event emitter for state changes\n */\nexport class EventEmitter<T = any> {\n private listeners: Map<string, Set<(data: T) => void>> = new Map();\n\n /**\n * Subscribe to an event\n */\n on(event: string, callback: (data: T) => void): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n\n this.listeners.get(event)!.add(callback);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: string, callback: (data: T) => void): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n }\n }\n\n /**\n * Emit an event\n */\n emit(event: string, data: T): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for \"${event}\":`, error);\n }\n });\n }\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Remove all listeners for a specific event\n */\n clearEvent(event: string): void {\n this.listeners.delete(event);\n }\n}\n","import {\n ProgressApplicantResult,\n FlowStep,\n StepInfo,\n ApplicantProgressStatus,\n WorkflowResultType,\n} from '../types';\nimport { EventEmitter } from './event-emitter';\n\n/**\n * Workflow state events\n */\nexport interface WorkflowStateEvents {\n progressUpdated: ProgressApplicantResult;\n stepChanged: FlowStep | null;\n statusChanged: ApplicantProgressStatus;\n error: Error;\n completed: WorkflowResultType;\n}\n\n/**\n * Workflow state manager\n * Manages the current state of a workflow execution\n */\nexport class WorkflowState {\n private events = new EventEmitter<any>();\n private _applicantId: number | null = null;\n private _progress: ProgressApplicantResult | null = null;\n private _error: Error | null = null;\n\n constructor() {}\n\n /**\n * Get current applicant ID\n */\n get applicantId(): number | null {\n return this._applicantId;\n }\n\n /**\n * Get current progress\n */\n get progress(): ProgressApplicantResult | null {\n return this._progress;\n }\n\n /**\n * Get current step\n */\n get currentStep(): FlowStep | null {\n return this._progress?.currentStep || null;\n }\n\n /**\n * Get all workflow steps\n */\n get steps(): StepInfo[] {\n return this._progress?.stepInfoList || [];\n }\n\n /**\n * Get current status\n */\n get status(): ApplicantProgressStatus {\n return this._progress?.status || ApplicantProgressStatus.None;\n }\n\n /**\n * Get workflow result\n */\n get workflowResult(): WorkflowResultType | null {\n return this._progress?.workflowResult || null;\n }\n\n /**\n * Get current error\n */\n get error(): Error | null {\n return this._error;\n }\n\n /**\n * Check if workflow is complete\n */\n get isComplete(): boolean {\n return this.status === ApplicantProgressStatus.Finished;\n }\n\n /**\n * Check if workflow is on hold\n */\n get isOnHold(): boolean {\n return this.status === ApplicantProgressStatus.OnHold;\n }\n\n /**\n * Check if workflow is in progress\n */\n get isInProgress(): boolean {\n return this.status === ApplicantProgressStatus.InProgress;\n }\n\n /**\n * Set applicant ID\n */\n setApplicantId(applicantId: number): void {\n this._applicantId = applicantId;\n }\n\n /**\n * Update progress\n */\n updateProgress(progress: ProgressApplicantResult): void {\n const previousStep = this._progress?.currentStep;\n this._progress = progress;\n this._applicantId = progress.applicantId;\n this._error = null;\n\n // Emit progress updated event\n this.events.emit('progressUpdated', progress);\n\n // Emit step changed event if step changed\n if (previousStep?.order !== progress.currentStep?.order) {\n this.events.emit('stepChanged', progress.currentStep);\n }\n\n // Emit status changed event\n this.events.emit('statusChanged', progress.status);\n\n // Emit completed event if workflow is finished\n if (progress.status === ApplicantProgressStatus.Finished && progress.workflowResult) {\n this.events.emit('completed', progress.workflowResult);\n }\n }\n\n /**\n * Set error\n */\n setError(error: Error): void {\n this._error = error;\n this.events.emit('error', error);\n }\n\n /**\n * Clear error\n */\n clearError(): void {\n this._error = null;\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this._applicantId = null;\n this._progress = null;\n this._error = null;\n }\n\n /**\n * Subscribe to progress updates\n */\n onProgressUpdated(callback: (progress: ProgressApplicantResult) => void): () => void {\n return this.events.on('progressUpdated', callback);\n }\n\n /**\n * Subscribe to step changes\n */\n onStepChanged(callback: (step: FlowStep | null) => void): () => void {\n return this.events.on('stepChanged', callback);\n }\n\n /**\n * Subscribe to status changes\n */\n onStatusChanged(callback: (status: ApplicantProgressStatus) => void): () => void {\n return this.events.on('statusChanged', callback);\n }\n\n /**\n * Subscribe to errors\n */\n onError(callback: (error: Error) => void): () => void {\n return this.events.on('error', callback);\n }\n\n /**\n * Subscribe to completion\n */\n onCompleted(callback: (result: WorkflowResultType) => void): () => void {\n return this.events.on('completed', callback);\n }\n\n /**\n * Clear all event listeners\n */\n clearListeners(): void {\n this.events.clear();\n }\n}\n","import { WorkflowStepAction } from '../types';\n\n/**\n * Step data loader function type\n */\nexport type StepDataLoader<T> = (applicantId: number) => Promise<T>;\n\n/**\n * Step data submitter function type\n */\nexport type StepDataSubmitter<T> = (data: T) => Promise<void>;\n\n/**\n * Step handler configuration\n */\nexport interface StepHandler<TData = any, TSubmit = any> {\n loadData: StepDataLoader<TData>;\n submitData: StepDataSubmitter<TSubmit>;\n}\n\n/**\n * Step router\n * Routes workflow steps to appropriate data loaders and submitters\n */\nexport class StepRouter {\n private handlers = new Map<WorkflowStepAction, StepHandler>();\n\n /**\n * Register a step handler\n */\n registerHandler(action: WorkflowStepAction, handler: StepHandler): void {\n this.handlers.set(action, handler);\n }\n\n /**\n * Get handler for a step action\n */\n getHandler(action: WorkflowStepAction): StepHandler | undefined {\n return this.handlers.get(action);\n }\n\n /**\n * Check if a step has a handler\n */\n hasHandler(action: WorkflowStepAction): boolean {\n return this.handlers.has(action);\n }\n\n /**\n * Load data for a step\n */\n async loadStepData<T>(action: WorkflowStepAction, applicantId: number): Promise<T> {\n const handler = this.getHandler(action);\n if (!handler) {\n throw new Error(`No handler registered for step action: ${WorkflowStepAction[action]}`);\n }\n return handler.loadData(applicantId) as Promise<T>;\n }\n\n /**\n * Submit data for a step\n */\n async submitStepData<T>(action: WorkflowStepAction, data: T): Promise<void> {\n const handler = this.getHandler(action);\n if (!handler) {\n throw new Error(`No handler registered for step action: ${WorkflowStepAction[action]}`);\n }\n return handler.submitData(data);\n }\n}\n","import { WorkflowState } from './workflow-state';\nimport { StepRouter } from './step-router';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n InvestorCategorizationService,\n} from '../services';\nimport { WorkflowStepAction, ProgressApplicantResult } from '../types';\n\n/**\n * Workflow orchestrator\n * Manages workflow execution and step progression\n */\nexport class WorkflowOrchestrator {\n private state: WorkflowState;\n private stepRouter: StepRouter;\n\n constructor(\n private applicantService: ApplicantService,\n private questionnaireService: QuestionnaireService,\n private uploadDocumentService: UploadDocumentService,\n private appropriatenessTestService: AppropriatenessTestService,\n private overviewService: OverviewService,\n private riskScoringService: RiskScoringService,\n _identityService: IdentityService,\n private investorCategorizationService: InvestorCategorizationService\n ) {\n this.state = new WorkflowState();\n this.stepRouter = new StepRouter();\n this.registerStepHandlers();\n }\n\n /**\n * Register all step handlers\n */\n private registerStepHandlers(): void {\n // Questionnaire handler\n this.stepRouter.registerHandler(WorkflowStepAction.Questionaries, {\n loadData: (applicantId) => this.questionnaireService.getQuestionnaire(applicantId),\n submitData: async (data) => {\n await this.questionnaireService.fillQuestionnaire(data);\n },\n });\n\n // Upload document handler\n this.stepRouter.registerHandler(WorkflowStepAction.UploadDocument, {\n loadData: (applicantId) => this.uploadDocumentService.getUploadDocument(applicantId),\n submitData: (data) => this.uploadDocumentService.fillUploadDocument(data),\n });\n\n // Appropriateness test handler\n this.stepRouter.registerHandler(WorkflowStepAction.AppropriatenessTest, {\n loadData: (applicantId) =>\n this.appropriatenessTestService.getAppropriatenessTest(applicantId),\n submitData: async (data) => {\n await this.appropriatenessTestService.fillAppropriatenessTest(data);\n },\n });\n\n // Overview handler\n this.stepRouter.registerHandler(WorkflowStepAction.Overview, {\n loadData: (applicantId) => this.overviewService.getOverviewData(applicantId),\n submitData: (data: { applicantId: number }) =>\n this.overviewService.passOverview(data.applicantId),\n });\n\n // Risk scoring handler\n this.stepRouter.registerHandler(WorkflowStepAction.RiskScoring, {\n loadData: (applicantId) => this.riskScoringService.getRiskCriterias(applicantId),\n submitData: async (data) => {\n await this.riskScoringService.submitRiskScoring(data);\n },\n });\n\n // Identity SDK handler (no data loading, handled by identity service)\n this.stepRouter.registerHandler(WorkflowStepAction.IdentitySdk, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Identity verification required',\n }),\n submitData: async () => {\n // Identity verification is handled externally by provider SDKs\n // Just refresh progress after completion\n },\n });\n\n // Investor categorization handler\n this.stepRouter.registerHandler(WorkflowStepAction.InvestorCategorization, {\n loadData: (applicantId) =>\n this.investorCategorizationService.getInvestorCategorization(applicantId),\n submitData: async (data) => {\n await this.investorCategorizationService.setInvestorCategorization(data);\n },\n });\n\n // Manual review handler (no action needed from user)\n this.stepRouter.registerHandler(WorkflowStepAction.ManualReview, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Your application is under manual review',\n }),\n submitData: async () => {\n // Manual review is done by admin, no user action\n },\n });\n\n // Additional data handler (generic data collection)\n this.stepRouter.registerHandler(WorkflowStepAction.AdditionalData, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Additional data required',\n }),\n submitData: async () => {\n // Additional data submission handled separately\n },\n });\n }\n\n /**\n * Initialize workflow with applicant ID\n */\n async initialize(applicantId: number): Promise<ProgressApplicantResult> {\n try {\n this.state.setApplicantId(applicantId);\n const progress = await this.applicantService.getProgress(applicantId);\n this.state.updateProgress(progress);\n return progress;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Refresh applicant progress\n */\n async refreshProgress(): Promise<ProgressApplicantResult> {\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized. Call initialize() first.');\n }\n\n try {\n const progress = await this.applicantService.getProgress(this.state.applicantId);\n this.state.updateProgress(progress);\n return progress;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Get data for current step\n */\n async getCurrentStepData<T>(): Promise<T> {\n if (!this.state.currentStep) {\n throw new Error('No current step available');\n }\n\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized');\n }\n\n try {\n const data = await this.stepRouter.loadStepData<T>(\n this.state.currentStep.action,\n this.state.applicantId\n );\n return data;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Submit data for current step\n */\n async submitCurrentStep(data: any): Promise<void> {\n if (!this.state.currentStep) {\n throw new Error('No current step available');\n }\n\n try {\n await this.stepRouter.submitStepData(this.state.currentStep.action, data);\n // Refresh progress after submission\n await this.refreshProgress();\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Move to next step (if possible)\n */\n async moveToNextStep(): Promise<ProgressApplicantResult> {\n // Refresh progress to move to next step\n return this.refreshProgress();\n }\n\n /**\n * Move back to previous step\n */\n async moveToPreviousStep(): Promise<ProgressApplicantResult> {\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized');\n }\n\n try {\n await this.applicantService.progressStepBack(this.state.applicantId);\n return await this.refreshProgress();\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Get workflow state\n */\n getState(): WorkflowState {\n return this.state;\n }\n\n /**\n * Get step router\n */\n getStepRouter(): StepRouter {\n return this.stepRouter;\n }\n}\n","/**\n * Dynamically load external scripts\n */\nexport function loadScript(src: string, id?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script already loaded\n if (id && document.getElementById(id)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n if (id) {\n script.id = id;\n }\n script.async = true;\n\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load script: ${src}`));\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * Check if a script is already loaded\n */\nexport function isScriptLoaded(id: string): boolean {\n return !!document.getElementById(id);\n}\n\n/**\n * Remove a loaded script\n */\nexport function removeScript(id: string): void {\n const script = document.getElementById(id);\n if (script) {\n script.remove();\n }\n}\n","import { loadScript } from '../load-script';\nimport { SumsubConfig } from '../../types';\n\ndeclare global {\n interface Window {\n snsWebSdk?: any;\n }\n}\n\n/**\n * Sumsub provider integration\n */\nexport class SumsubProvider {\n private sdk: any = null;\n private config: SumsubConfig;\n\n constructor(config: SumsubConfig) {\n this.config = config;\n }\n\n /**\n * Load Sumsub SDK\n */\n async loadSDK(): Promise<void> {\n await loadScript(\n 'https://cdn.sumsub.com/websdk/v2/production/websdk.js',\n 'sumsub-sdk'\n );\n }\n\n /**\n * Initialize Sumsub SDK\n */\n async initialize(containerId: string): Promise<void> {\n if (!window.snsWebSdk) {\n await this.loadSDK();\n }\n\n if (!window.snsWebSdk) {\n throw new Error('Sumsub SDK failed to load');\n }\n\n this.sdk = window.snsWebSdk\n .init(this.config.accessToken, () => this.config.accessToken)\n .withConf({\n lang: this.config.lang || 'en',\n email: this.config.applicantEmail,\n phone: this.config.applicantPhone,\n i18n: {\n // Customization options\n },\n })\n .on('idCheck.onStepCompleted', (payload: any) => {\n console.log('Sumsub step completed:', payload);\n })\n .on('idCheck.onError', (error: any) => {\n console.error('Sumsub error:', error);\n })\n .build();\n\n this.sdk.launch(`#${containerId}`);\n }\n\n /**\n * Destroy Sumsub SDK\n */\n destroy(): void {\n if (this.sdk) {\n this.sdk.destroy();\n this.sdk = null;\n }\n }\n\n /**\n * Subscribe to completion event\n */\n onComplete(callback: (payload: any) => void): void {\n if (this.sdk) {\n this.sdk.on('idCheck.applicantStatus', (payload: any) => {\n if (payload.applicantStatus === 'completed') {\n callback(payload);\n }\n });\n }\n }\n\n /**\n * Subscribe to error event\n */\n onError(callback: (error: any) => void): void {\n if (this.sdk) {\n this.sdk.on('idCheck.onError', callback);\n }\n }\n}\n","import { loadScript } from '../load-script';\nimport { OnfidoConfig } from '../../types';\n\ndeclare global {\n interface Window {\n Onfido?: any;\n }\n}\n\n/**\n * Onfido provider integration\n */\nexport class OnfidoProvider {\n private sdk: any = null;\n private config: OnfidoConfig;\n\n constructor(config: OnfidoConfig) {\n this.config = config;\n }\n\n /**\n * Load Onfido SDK\n */\n async loadSDK(): Promise<void> {\n await loadScript(\n 'https://sdk.onfido.com/v12.0.0/onfido.min.js',\n 'onfido-sdk'\n );\n }\n\n /**\n * Initialize Onfido SDK\n */\n async initialize(containerId: string): Promise<void> {\n if (!window.Onfido) {\n await this.loadSDK();\n }\n\n if (!window.Onfido) {\n throw new Error('Onfido SDK failed to load');\n }\n\n this.sdk = window.Onfido.init({\n token: this.config.token,\n containerId: containerId,\n steps: this.config.steps || [\n {\n type: 'welcome',\n options: {\n title: 'Identity Verification',\n },\n },\n {\n type: 'document',\n options: {\n documentTypes: {\n passport: true,\n driving_licence: true,\n national_identity_card: true,\n },\n },\n },\n {\n type: 'face',\n options: {\n requestedVariant: 'standard',\n },\n },\n {\n type: 'complete',\n },\n ],\n onComplete: () => {\n if (this.config.onComplete) {\n this.config.onComplete();\n }\n },\n onError: (error: any) => {\n if (this.config.onError) {\n this.config.onError(error);\n }\n },\n });\n }\n\n /**\n * Destroy Onfido SDK\n */\n destroy(): void {\n if (this.sdk) {\n this.sdk.tearDown();\n this.sdk = null;\n }\n }\n}\n","import { SardinAIConfig } from '../../types';\n\ndeclare global {\n interface Window {\n _Sardine?: {\n createContext: (config: any) => any;\n };\n }\n}\n\n/**\n * SardinAI Risk SDK provider integration\n * Implements Sardine's JavaScript SDK for device risk detection\n */\nexport class SardinAIProvider {\n private sardineContext: any = null;\n private config: SardinAIConfig;\n private sessionKey: string;\n\n constructor(config: SardinAIConfig) {\n this.config = config;\n this.sessionKey = config.sessionKey || this.generateSessionKey();\n }\n\n /**\n * Generate a UUID for session key\n */\n private generateSessionKey(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n /**\n * Get Sardine host based on environment and region\n */\n private getSardineHost(): string {\n const { environment, region } = this.config;\n const isSandbox = environment === 'sandbox';\n \n if (isSandbox) {\n return 'api.sandbox.sardine.ai';\n }\n \n switch (region) {\n case 'eu':\n return 'api.eu.sardine.ai';\n case 'ca':\n return 'api.ca.sardine.ai';\n case 'au':\n return 'api.au.sardine.ai';\n default:\n return 'api.sardine.ai';\n }\n }\n\n /**\n * Load SardinAI Risk SDK script\n */\n async loadSDK(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if already loaded\n if (window._Sardine) {\n resolve();\n return;\n }\n\n const sardineHost = this.getSardineHost();\n const loader = document.createElement('script');\n loader.type = 'text/javascript';\n loader.async = true;\n loader.src = `https://${sardineHost}/assets/loader.min.js`;\n \n loader.onload = () => {\n console.log('[SardinAI] SDK loaded successfully');\n resolve();\n };\n \n loader.onerror = () => {\n reject(new Error('Failed to load SardinAI SDK'));\n };\n\n const firstScript = document.getElementsByTagName('script')[0];\n if (firstScript && firstScript.parentNode) {\n firstScript.parentNode.insertBefore(loader, firstScript);\n } else {\n document.head.appendChild(loader);\n }\n });\n }\n\n /**\n * Initialize SardinAI Risk SDK\n */\n async initialize(): Promise<void> {\n try {\n await this.loadSDK();\n\n if (!window._Sardine) {\n throw new Error('SardinAI SDK not available after loading');\n }\n\n const sardineHost = this.getSardineHost();\n const { clientId, environment, flow, enableBiometrics, enablePortScanning } = this.config;\n\n this.sardineContext = window._Sardine.createContext({\n clientId,\n sessionKey: this.sessionKey,\n userIdHash: undefined, // Will be set later via updateConfig\n flow: flow || window.location.pathname,\n environment: environment || 'production',\n parentElement: document.body,\n enableBiometrics: enableBiometrics !== false, // Default true\n enablePortScanning: enablePortScanning === true, // Default false\n region: this.config.region,\n \n // Callback for device response (deprecated but kept for compatibility)\n onDeviceResponse: (data: any) => {\n console.log(`[SardinAI] Device ID: ${data.deviceId}`);\n },\n \n // New callback for session updates\n onConfigUpdate: (event: string, data: any, error: any) => {\n switch (event) {\n case 'SESSION_UPDATE_FAILED':\n console.error('[SardinAI] Session update failed:', error);\n break;\n case 'SESSION_UPDATED':\n console.log('[SardinAI] Session updated:', data);\n break;\n case 'SESSION_NO_UPDATE':\n console.log('[SardinAI] No session update');\n break;\n default:\n console.warn('[SardinAI] Unknown event:', event);\n }\n }\n });\n\n // Add noscript fallback image\n this.addNoScriptFallback(sardineHost);\n\n console.log('[SardinAI] SDK initialized with sessionKey:', this.sessionKey);\n } catch (error) {\n console.error('[SardinAI] Initialization failed:', error);\n throw error;\n }\n }\n\n /**\n * Add noscript fallback for cases where JS is disabled\n */\n private addNoScriptFallback(sardineHost: string): void {\n const noscript = document.createElement('noscript');\n const img = document.createElement('img');\n const { clientId, flow } = this.config;\n \n img.src = `https://${sardineHost}/v1/a.png?clientId=${clientId}&sessionKey=${this.sessionKey}&flow=${flow || 'kyc'}&ns=1`;\n img.style.display = 'none';\n \n noscript.appendChild(img);\n document.body.appendChild(noscript);\n }\n\n /**\n * Update configuration (e.g., set userIdHash after login)\n */\n updateConfig(options: { flow?: string; userIdHash?: string | null; sessionKey?: string }): void {\n if (!this.sardineContext) {\n console.warn('[SardinAI] Cannot update config - SDK not initialized');\n return;\n }\n\n if (options.sessionKey) {\n this.sessionKey = options.sessionKey;\n }\n\n this.sardineContext.updateConfig({\n ...options,\n onConfigUpdate: (event: string, data: any, error: any) => {\n switch (event) {\n case 'SESSION_UPDATE_FAILED':\n console.error('[SardinAI] Config update failed:', error);\n break;\n case 'SESSION_UPDATED':\n console.log('[SardinAI] Config updated:', data);\n break;\n case 'SESSION_NO_UPDATE':\n console.log('[SardinAI] No config update needed');\n break;\n }\n }\n });\n }\n\n /**\n * Get current session key\n */\n getSessionKey(): string {\n return this.sessionKey;\n }\n\n /**\n * Destroy SardinAI SDK instance\n */\n destroy(): void {\n if (this.sardineContext) {\n // SardinAI SDK cleanup if needed\n this.sardineContext = null;\n }\n }\n}\n","import { IdentityVerificationProvider } from '../types';\nimport { SumsubProvider } from './providers/sumsub';\nimport { OnfidoProvider } from './providers/onfido';\nimport { SardinAIProvider } from './providers/sardin-ai';\n\n/**\n * Identity provider manager\n * Factory for creating and managing identity verification providers\n */\nexport class IdentityProviderManager {\n /**\n * Create a provider instance\n */\n static createProvider(\n provider: IdentityVerificationProvider,\n config: any\n ): SumsubProvider | OnfidoProvider | SardinAIProvider {\n switch (provider) {\n case IdentityVerificationProvider.Sumsub:\n return new SumsubProvider(config);\n\n case IdentityVerificationProvider.Onfido:\n return new OnfidoProvider(config);\n\n case IdentityVerificationProvider.SardinAI:\n return new SardinAIProvider(config);\n\n default:\n throw new Error(`Unsupported identity provider: ${provider}`);\n }\n }\n\n /**\n * Get provider configuration from API token object\n */\n static parseProviderConfig(\n provider: IdentityVerificationProvider,\n tokenObject: Record<string, any>,\n contextConfig?: any\n ): any {\n switch (provider) {\n case IdentityVerificationProvider.Sumsub:\n return {\n accessToken: tokenObject.accessToken || tokenObject.token,\n applicantEmail: tokenObject.email,\n applicantPhone: tokenObject.phone,\n externalUserId: tokenObject.externalUserId,\n lang: tokenObject.lang || 'en',\n };\n\n case IdentityVerificationProvider.Onfido:\n return {\n token: tokenObject.token || tokenObject.sdkToken,\n };\n\n case IdentityVerificationProvider.SardinAI:\n // Prioritize context config over backend response\n const sardinConfig = contextConfig?.identityProviders?.sardinai || {};\n return {\n clientId: sardinConfig.clientId || tokenObject.clientId,\n sessionKey: sardinConfig.sessionKey || tokenObject.sessionKey,\n environment: sardinConfig.environment || tokenObject.environment || 'production',\n flow: sardinConfig.flow || tokenObject.flow,\n region: sardinConfig.region,\n enableBiometrics: sardinConfig.enableBiometrics,\n enablePortScanning: sardinConfig.enablePortScanning,\n };\n\n default:\n throw new Error(`Unsupported identity provider: ${provider}`);\n }\n }\n}\n","import { ThemeConfig, ColorPalette } from '../types/theme';\nimport { defaultTheme } from './presets';\n\n/** Injects a late-loaded style tag that re-asserts the CSS variable rules AFTER\n * any panel HMR or dynamic CSS injection, acting as a failsafe for the compiled globals.css. */\nfunction buildInputCSS(): string {\n return `\n/* ── metakyc-input-colors (ThemeManager failsafe — same rules as globals.css) ── */\n.metakyc-sdk input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"]):not([type=\"range\"]),\n.metakyc-sdk select,\n.metakyc-sdk textarea,\n.metakyc-sdk .metakyc-searchable-select-trigger,\n.metakyc-sdk .metakyc-multiselect-trigger {\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n color: var(--metakyc-input-text, var(--metakyc-text-primary, #111827)) !important;\n border-color: var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n}\n.metakyc-sdk input[type=\"checkbox\"],\n.metakyc-sdk input[type=\"radio\"] {\n appearance: none !important;\n -webkit-appearance: none !important;\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n border: 1.5px solid var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n accent-color: var(--metakyc-primary, #2563eb) !important;\n}\n.metakyc-sdk input[type=\"checkbox\"]:checked,\n.metakyc-sdk input[type=\"radio\"]:checked {\n background-color: var(--metakyc-primary, #2563eb) !important;\n border-color: var(--metakyc-primary, #2563eb) !important;\n}\n.metakyc-sdk .metakyc-help-btn {\n color: var(--metakyc-primary, #2563eb) !important;\n border-color: var(--metakyc-primary, #2563eb) !important;\n background: transparent !important;\n position: relative !important;\n z-index: 2 !important;\n}\n`;\n}\n\n/**\n * Theme Manager\n * Handles theme application and CSS variable management\n */\nexport class ThemeManager {\n private currentTheme: ThemeConfig = defaultTheme;\n private customStyleElement: HTMLStyleElement | null = null;\n private inputStyleElement: HTMLStyleElement | null = null;\n private container: HTMLElement;\n\n constructor(container?: HTMLElement) {\n this.container = container || document.documentElement;\n }\n\n /**\n * Apply theme configuration\n */\n applyTheme(theme: Partial<ThemeConfig>): void {\n // Merge with default theme\n this.currentTheme = this.mergeWithDefault(theme);\n \n // Apply colors\n this.applyColors(this.currentTheme.colors);\n \n // Apply typography\n if (this.currentTheme.typography) {\n this.applyTypography(this.currentTheme.typography);\n }\n \n // Apply spacing\n if (this.currentTheme.spacing) {\n this.applySpacing(this.currentTheme.spacing);\n }\n \n // Apply custom CSS\n if (this.currentTheme.customCSS) {\n this.injectCustomCSS(this.currentTheme.customCSS);\n }\n \n console.log('[ThemeManager] Theme applied:', this.currentTheme.name || 'Custom');\n }\n\n /**\n * Apply color palette as CSS variables\n */\n private applyColors(colors: ColorPalette): void {\n const colorMap: Record<string, string> = {\n primary: colors.primary,\n 'primary-hover': colors.primaryHover,\n 'primary-light': colors.primaryLight,\n 'primary-dark': colors.primaryDark,\n\n secondary: colors.secondary,\n 'secondary-hover': colors.secondaryHover,\n\n success: colors.success,\n warning: colors.warning,\n danger: colors.danger,\n info: colors.info,\n\n background: colors.background,\n surface: colors.surface,\n border: colors.border,\n\n 'text-primary': colors.textPrimary,\n 'text-secondary': colors.textSecondary,\n 'text-muted': colors.textMuted,\n\n // Input-specific — fall back to general colors when not explicitly set.\n // Use || (not ??) so empty string '' also triggers the fallback.\n 'input-bg': colors.inputBg || colors.background,\n 'input-text': colors.inputText || colors.textPrimary,\n 'input-border': colors.inputBorder || colors.border,\n 'input-border-focus': colors.inputBorderFocus || colors.primary,\n 'input-placeholder': colors.inputPlaceholder || colors.textMuted,\n };\n\n Object.entries(colorMap).forEach(([key, value]) => {\n if (value) this.container.style.setProperty(`--metakyc-${key}`, value);\n });\n\n // Inject CSS rules for inputs/portals — uses var() refs so they always track live variables\n this.injectInputColors();\n\n // Apply dark mode colors if present\n if (this.currentTheme.darkMode?.colors) {\n this.applyDarkModeColors(this.currentTheme.darkMode.colors);\n }\n }\n\n /**\n * Apply dark mode color overrides\n */\n private applyDarkModeColors(colors: Partial<ColorPalette>): void {\n Object.entries(colors).forEach(([key, value]) => {\n if (value) {\n const cssVar = `--metakyc-dark-${this.kebabCase(key)}`;\n this.container.style.setProperty(cssVar, value);\n }\n });\n }\n\n /**\n * Apply typography settings\n */\n private applyTypography(typography: ThemeConfig['typography']): void {\n if (!typography) return;\n\n if (typography.fontFamily) {\n this.container.style.setProperty('--metakyc-font-family', typography.fontFamily);\n }\n\n if (typography.headingFont) {\n this.container.style.setProperty('--metakyc-heading-font', typography.headingFont);\n }\n\n if (typography.fontSize) {\n Object.entries(typography.fontSize).forEach(([key, value]) => {\n this.container.style.setProperty(`--metakyc-font-size-${key}`, value);\n });\n }\n\n if (typography.fontWeight) {\n Object.entries(typography.fontWeight).forEach(([key, value]) => {\n this.container.style.setProperty(`--metakyc-font-weight-${key}`, value.toString());\n });\n }\n }\n\n /**\n * Apply spacing settings\n */\n private applySpacing(spacing: ThemeConfig['spacing']): void {\n if (!spacing) return;\n\n Object.entries(spacing).forEach(([key, value]) => {\n const cssVar = `--metakyc-${this.kebabCase(key)}`;\n this.container.style.setProperty(cssVar, value);\n });\n }\n\n /**\n * Inject hard-coded CSS rules for inputs so the host/panel CSS cannot override them.\n * These rules are placed BEFORE any custom CSS so that custom CSS can still override them.\n */\n private injectInputColors(): void {\n if (this.inputStyleElement) {\n this.inputStyleElement.remove();\n }\n this.inputStyleElement = document.createElement('style');\n this.inputStyleElement.id = 'metakyc-input-colors';\n this.inputStyleElement.textContent = buildInputCSS();\n // Insert before customStyleElement (or at the end of head)\n if (this.customStyleElement && this.customStyleElement.parentNode) {\n document.head.insertBefore(this.inputStyleElement, this.customStyleElement);\n } else {\n document.head.appendChild(this.inputStyleElement);\n }\n }\n\n /**\n * Inject custom CSS into document\n */\n private injectCustomCSS(css: string): void {\n if (this.customStyleElement) {\n this.customStyleElement.remove();\n }\n this.customStyleElement = document.createElement('style');\n this.customStyleElement.id = 'metakyc-custom-css';\n this.customStyleElement.textContent = css;\n document.head.appendChild(this.customStyleElement);\n }\n\n /**\n * Merge partial theme with default theme\n */\n private mergeWithDefault(theme: Partial<ThemeConfig>): ThemeConfig {\n return {\n name: theme.name || defaultTheme.name,\n title: theme.title || defaultTheme.title,\n logo: { ...defaultTheme.logo, ...theme.logo },\n colors: { ...defaultTheme.colors, ...theme.colors },\n typography: theme.typography ? \n { ...defaultTheme.typography, ...theme.typography } : \n defaultTheme.typography,\n spacing: theme.spacing ? \n { ...defaultTheme.spacing, ...theme.spacing } : \n defaultTheme.spacing,\n customCSS: theme.customCSS,\n darkMode: theme.darkMode ? {\n colors: { \n ...defaultTheme.darkMode?.colors, \n ...theme.darkMode.colors \n }\n } : defaultTheme.darkMode,\n applicantFormVisibleFields: theme.applicantFormVisibleFields,\n applicantFormRequiredFields: theme.applicantFormRequiredFields,\n allowedLanguages: theme.allowedLanguages,\n applicantFormPages: theme.applicantFormPages,\n reviewPageFields: theme.reviewPageFields,\n reviewPageDisabled: theme.reviewPageDisabled,\n };\n }\n\n /**\n * Get current theme configuration\n */\n getCurrentTheme(): ThemeConfig {\n return this.currentTheme;\n }\n\n /**\n * Reset to default theme\n */\n resetTheme(): void {\n this.applyTheme(defaultTheme);\n }\n\n /**\n * Remove all custom styles\n */\n cleanup(): void {\n if (this.inputStyleElement) {\n this.inputStyleElement.remove();\n this.inputStyleElement = null;\n }\n if (this.customStyleElement) {\n this.customStyleElement.remove();\n this.customStyleElement = null;\n }\n }\n\n /**\n * Convert camelCase to kebab-case\n */\n private kebabCase(str: string): string {\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n }\n}\n","import { createContext } from 'react';\nimport { HttpClient } from '../client/http-client';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n BaseInformationService,\n InvestorCategorizationService,\n ThemeService,\n} from '../services';\nimport { WorkflowOrchestrator } from '../state';\nimport { MetaKYCClientConfig } from '../client/config';\nimport { ThemeManager } from '../theme/theme-manager';\nimport { ThemeConfig } from '../types/theme';\n\n/**\n * MetaKYC context value\n */\nexport interface MetaKYCContextValue {\n config: MetaKYCClientConfig;\n httpClient: HttpClient;\n applicantService: ApplicantService;\n questionnaireService: QuestionnaireService;\n uploadDocumentService: UploadDocumentService;\n appropriatenessTestService: AppropriatenessTestService;\n overviewService: OverviewService;\n riskScoringService: RiskScoringService;\n identityService: IdentityService;\n baseInformationService: BaseInformationService;\n investorCategorizationService: InvestorCategorizationService;\n themeService: ThemeService;\n themeManager: ThemeManager;\n currentTheme: ThemeConfig | null;\n createOrchestrator: () => WorkflowOrchestrator;\n}\n\n/**\n * MetaKYC context\n */\nexport const MetaKYCContext = createContext<MetaKYCContextValue | null>(null);\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { MetaKYCContext, MetaKYCContextValue } from './MetaKYCContext';\nimport { HttpClient } from '../client/http-client';\nimport { MetaKYCClientConfig } from '../client/config';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n BaseInformationService,\n InvestorCategorizationService,\n ThemeService,\n} from '../services';\nimport { WorkflowOrchestrator } from '../state';\nimport { ThemeManager } from '../theme/theme-manager';\nimport { ThemeConfig } from '../types/theme';\n\n/**\n * Props for MetaKYCProvider\n */\nexport interface MetaKYCProviderProps {\n config: MetaKYCClientConfig;\n children: React.ReactNode;\n}\n\n/**\n * MetaKYC Provider Component\n * Provides MetaKYC client and services to all child components\n */\nexport const MetaKYCProvider: React.FC<MetaKYCProviderProps> = ({ config, children }) => {\n const [currentTheme, setCurrentTheme] = useState<ThemeConfig | null>(null);\n const isLoadingThemeRef = React.useRef(false);\n const hasLoadedThemeRef = React.useRef(false);\n \n // Initialize services once - don't recreate on theme changes\n const services = useMemo(() => {\n const httpClient = new HttpClient(config);\n\n // Initialize all services\n const applicantService = new ApplicantService(httpClient);\n const questionnaireService = new QuestionnaireService(httpClient);\n const uploadDocumentService = new UploadDocumentService(httpClient);\n const appropriatenessTestService = new AppropriatenessTestService(httpClient);\n const overviewService = new OverviewService(httpClient);\n const riskScoringService = new RiskScoringService(httpClient);\n const identityService = new IdentityService(httpClient);\n const baseInformationService = new BaseInformationService(httpClient);\n const investorCategorizationService = new InvestorCategorizationService(httpClient);\n const themeService = new ThemeService(httpClient);\n\n // Initialize theme manager\n const themeManager = new ThemeManager();\n\n return {\n httpClient,\n applicantService,\n questionnaireService,\n uploadDocumentService,\n appropriatenessTestService,\n overviewService,\n riskScoringService,\n identityService,\n baseInformationService,\n investorCategorizationService,\n themeService,\n themeManager,\n };\n }, [config]);\n\n // Create context value with current theme\n const value = useMemo<MetaKYCContextValue>(() => {\n return {\n config,\n ...services,\n currentTheme,\n createOrchestrator: () =>\n new WorkflowOrchestrator(\n services.applicantService,\n services.questionnaireService,\n services.uploadDocumentService,\n services.appropriatenessTestService,\n services.overviewService,\n services.riskScoringService,\n services.identityService,\n services.investorCategorizationService\n ),\n };\n }, [config, services, currentTheme]);\n\n // Load and apply theme on mount (only once)\n useEffect(() => {\n const loadTheme = async () => {\n // Prevent duplicate theme loading\n if (isLoadingThemeRef.current || hasLoadedThemeRef.current) {\n console.log('[MetaKYC] Theme already loading or loaded, skipping...');\n return;\n }\n \n isLoadingThemeRef.current = true;\n \n try {\n // If static theme provided in config, use it\n if (config.theme) {\n console.log('[MetaKYC] Applying static theme from config');\n services.themeManager.applyTheme(config.theme);\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n return;\n }\n\n // Otherwise, fetch from backend (default behavior)\n console.log('[MetaKYC] Fetching theme from backend...');\n const theme = await services.themeService.getThemeConfiguration();\n services.themeManager.applyTheme(theme);\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n console.log('[MetaKYC] Theme loaded and applied', theme);\n } catch (error) {\n console.warn('[MetaKYC] Failed to load theme, using default:', error);\n // Set default theme\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n } finally {\n isLoadingThemeRef.current = false;\n }\n };\n\n loadTheme();\n\n // Cleanup on unmount\n return () => {\n services.themeManager.cleanup();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return <MetaKYCContext.Provider value={value}>{children}</MetaKYCContext.Provider>;\n};\n","import { useContext } from 'react';\nimport { MetaKYCContext, MetaKYCContextValue } from './MetaKYCContext';\n\n/**\n * Hook to access MetaKYC context\n * @throws Error if used outside MetaKYCProvider\n */\nexport function useMetaKYC(): MetaKYCContextValue {\n const context = useContext(MetaKYCContext);\n\n if (!context) {\n throw new Error('useMetaKYC must be used within a MetaKYCProvider');\n }\n\n return context;\n}\n","/**\n * Convert file to base64 string\n */\nexport async function fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n const result = reader.result as string;\n // Remove the data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1];\n resolve(base64);\n };\n reader.onerror = (error) => reject(error);\n });\n}\n\n/**\n * Validate file size\n */\nexport function validateFileSize(file: File, maxSizeBytes: number): boolean {\n return file.size <= maxSizeBytes;\n}\n\n/**\n * Validate file type\n */\nexport function validateFileType(file: File, allowedTypes: string): boolean {\n const mimeTypes = allowedTypes.split(',').map((type) => type.trim());\n return mimeTypes.some((type) => {\n if (type.endsWith('/*')) {\n // Wildcard type (e.g., image/*)\n const prefix = type.slice(0, -2);\n return file.type.startsWith(prefix);\n }\n return file.type === type;\n });\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n}\n\n/**\n * Get accept attribute string for file input\n */\nexport function getAcceptString(allowedTypes: string): string {\n return allowedTypes;\n}\n","/**\n * Simple class name utility\n * Combines class names and filters out falsy values\n */\nexport function cn(...classes: (string | boolean | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Local storage utilities for persisting workflow state\n */\n\nconst STORAGE_KEYS = {\n APPLICANT_ID: 'metakyc_applicant_id',\n WORKFLOW_STATE: 'metakyc_workflow_state',\n} as const;\n\n/**\n * Save applicant ID to local storage\n */\nexport function saveApplicantId(applicantId: number): void {\n try {\n localStorage.setItem(STORAGE_KEYS.APPLICANT_ID, applicantId.toString());\n } catch (error) {\n console.warn('Failed to save applicant ID to storage:', error);\n }\n}\n\n/**\n * Get applicant ID from local storage\n */\nexport function getApplicantId(): number | null {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.APPLICANT_ID);\n return stored ? parseInt(stored, 10) : null;\n } catch (error) {\n console.warn('Failed to retrieve applicant ID from storage:', error);\n return null;\n }\n}\n\n/**\n * Clear applicant ID from local storage\n */\nexport function clearApplicantId(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.APPLICANT_ID);\n } catch (error) {\n console.warn('Failed to clear applicant ID from storage:', error);\n }\n}\n\n/**\n * Persisted workflow state interface\n */\nexport interface PersistedWorkflowState {\n applicantId: number;\n currentStepOrder?: number;\n status: number;\n lastUpdated: string;\n workflowKey?: string;\n nextWorkflowKey?: string;\n}\n\n/**\n * Save workflow state to local storage\n */\nexport function saveWorkflowState(state: PersistedWorkflowState): void {\n try {\n localStorage.setItem(STORAGE_KEYS.WORKFLOW_STATE, JSON.stringify(state));\n } catch (error) {\n console.warn('Failed to save workflow state to storage:', error);\n }\n}\n\n/**\n * Get workflow state from local storage\n */\nexport function getWorkflowState(): PersistedWorkflowState | null {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.WORKFLOW_STATE);\n return stored ? JSON.parse(stored) : null;\n } catch (error) {\n console.warn('Failed to retrieve workflow state from storage:', error);\n return null;\n }\n}\n\n/**\n * Clear workflow state from local storage\n */\nexport function clearWorkflowState(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.WORKFLOW_STATE);\n } catch (error) {\n console.warn('Failed to clear workflow state from storage:', error);\n }\n}\n\n/**\n * Clear all MetaKYC data from local storage\n */\nexport function clearAllStorage(): void {\n clearApplicantId();\n clearWorkflowState();\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport * as React from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n ProgressApplicantResult,\n ApplicantProgressStatus,\n} from '../types';\nimport { WorkflowOrchestrator } from '../state';\nimport { saveApplicantId, getApplicantId, saveWorkflowState } from '../utils';\n\n/**\n * Hook to manage KYC workflow state and progression with automatic persistence\n */\nexport function useKycWorkflow(applicantId?: number) {\n const { createOrchestrator } = useMetaKYC();\n const [progress, setProgress] = useState<ProgressApplicantResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const orchestratorRef = useRef<WorkflowOrchestrator | null>(null);\n \n // Get persisted applicant ID if not provided\n const effectiveApplicantId = applicantId || getApplicantId();\n\n // Initialize orchestrator\n useEffect(() => {\n if (!orchestratorRef.current) {\n orchestratorRef.current = createOrchestrator();\n }\n }, [createOrchestrator]);\n\n // Save progress to localStorage whenever it changes\n useEffect(() => {\n if (progress && effectiveApplicantId) {\n saveApplicantId(effectiveApplicantId);\n saveWorkflowState({\n applicantId: effectiveApplicantId,\n currentStepOrder: progress.currentStep?.order,\n status: progress.status,\n lastUpdated: new Date().toISOString(),\n workflowKey: progress.workFlowKey,\n nextWorkflowKey: progress.nextWorkflowKey,\n });\n }\n }, [progress, effectiveApplicantId]);\n\n // Track if we're currently loading to prevent duplicate requests\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef(false);\n\n // Load progress\n const loadProgress = useCallback(async () => {\n if (!effectiveApplicantId || !orchestratorRef.current) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Workflow] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.initialize(effectiveApplicantId);\n setProgress(result);\n hasLoadedRef.current = true;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [effectiveApplicantId]);\n\n // Load progress on mount or when applicantId changes\n useEffect(() => {\n if (effectiveApplicantId && !hasLoadedRef.current) {\n loadProgress();\n }\n }, [effectiveApplicantId, loadProgress]);\n\n // Refresh progress\n const refreshProgress = useCallback(async () => {\n if (!orchestratorRef.current) return;\n \n // Prevent duplicate refresh requests\n if (isLoadingRef.current) {\n console.log('[Workflow] Refresh already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.refreshProgress();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, []);\n\n // Move to next step\n const moveToNext = useCallback(async () => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.moveToNextStep();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Move to previous step\n const moveBack = useCallback(async () => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.moveToPreviousStep();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Submit current step data\n const submitCurrentStep = useCallback(async (data: any) => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n await orchestratorRef.current.submitCurrentStep(data);\n const result = await orchestratorRef.current.refreshProgress();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Sort steps by order\n const sortedSteps = React.useMemo(() => {\n if (!progress?.stepInfoList) return [];\n return [...progress.stepInfoList].sort((a, b) => a.order - b.order);\n }, [progress?.stepInfoList]);\n\n // Check if workflow has changed\n const hasWorkflowChanged = React.useMemo(() => {\n if (!progress) return false;\n return progress.nextWorkflowKey && progress.nextWorkflowKey !== progress.workFlowKey;\n }, [progress]);\n\n return {\n progress,\n applicantId: effectiveApplicantId,\n currentStep: progress?.currentStep || null,\n steps: sortedSteps,\n status: progress?.status || ApplicantProgressStatus.None,\n workflowResult: progress?.workflowResult || null,\n workflowKey: progress?.workFlowKey,\n nextWorkflowKey: progress?.nextWorkflowKey,\n hasWorkflowChanged,\n isLoading,\n error,\n isComplete: progress?.status === ApplicantProgressStatus.Finished,\n isOnHold: progress?.status === ApplicantProgressStatus.OnHold,\n refreshProgress,\n moveToNext,\n moveBack,\n submitCurrentStep,\n orchestrator: orchestratorRef.current,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { QuestionnaireOutput, FillQuestionnarieInput, FillQuestionnairesResult } from '../types';\n\ntype InitialAnswers = Record<number, string[]>;\n\n/**\n * Hook to manage questionnaire data and submission\n */\nexport function useQuestionnaire(applicantId?: number) {\n const { questionnaireService, applicantService } = useMetaKYC();\n const [questionnaire, setQuestionnaire] = useState<QuestionnaireOutput | null>(null);\n const [initialAnswers, setInitialAnswers] = useState<InitialAnswers>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load questionnaire + existing answers\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Questionnaire] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const [result, applicantData] = await Promise.all([\n questionnaireService.getQuestionnaire(applicantId),\n applicantService.getApplicantData(applicantId).catch(() => null),\n ]);\n setQuestionnaire(result);\n\n // Build initial answers by matching question text to existing results\n if (applicantData?.questionnaireResults?.length && result) {\n const textToAnswers = new Map<string, string[]>();\n for (const qr of applicantData.questionnaireResults) {\n if (qr.question && qr.answers?.length) {\n textToAnswers.set(qr.question.trim().toLowerCase(), qr.answers);\n }\n }\n\n const answers: InitialAnswers = {};\n const allQuestions = result.questionGroups.flatMap(g => g.questions ?? []);\n for (const q of allQuestions) {\n const key = q.text.trim().toLowerCase();\n if (textToAnswers.has(key)) {\n answers[q.id] = textToAnswers.get(key)!;\n }\n }\n setInitialAnswers(answers);\n }\n\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, questionnaireService, applicantService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit questionnaire\n const submit = useCallback(\n async (input: FillQuestionnarieInput): Promise<FillQuestionnairesResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const result = await questionnaireService.fillQuestionnaire(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [questionnaireService]\n );\n\n return {\n questionnaire,\n initialAnswers,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { UploadDocumentOutputDto, FillUploadDocumentInput } from '../types';\n\n/**\n * Hook to manage upload document data and submission\n */\nexport function useUploadDocument(applicantId?: number) {\n const { uploadDocumentService } = useMetaKYC();\n const [uploadDocument, setUploadDocument] = useState<UploadDocumentOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load upload document requirements\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[UploadDocument] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await uploadDocumentService.getUploadDocument(applicantId);\n setUploadDocument(result);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, uploadDocumentService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit uploaded documents\n const submit = useCallback(\n async (input: FillUploadDocumentInput): Promise<void> => {\n setIsSubmitting(true);\n setUploadProgress(0);\n setError(null);\n\n try {\n await uploadDocumentService.fillUploadDocument(input);\n setUploadProgress(100);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [uploadDocumentService]\n );\n\n return {\n uploadDocument,\n isLoading,\n isSubmitting,\n uploadProgress,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n FillAppropriatenessTestResult,\n} from '../types';\n\n/**\n * Hook to manage appropriateness test data and submission\n */\nexport function useAppropriatenessTest(applicantId?: number) {\n const { appropriatenessTestService } = useMetaKYC();\n const [test, setTest] = useState<AppropriatenessTestOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<FillAppropriatenessTestResult | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load appropriateness test\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[AppropriatenessTest] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n setTest(data);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, appropriatenessTestService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit appropriateness test\n const submit = useCallback(\n async (input: FillAppropriatenessTestInput): Promise<FillAppropriatenessTestResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const submitResult = await appropriatenessTestService.fillAppropriatenessTest(input);\n setResult(submitResult);\n return submitResult;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [appropriatenessTestService]\n );\n\n return {\n test,\n result,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { OverviewDataDto } from '../types';\n\n/**\n * Hook to manage overview data and submission\n */\nexport function useOverview(applicantId?: number) {\n const { overviewService } = useMetaKYC();\n const [overview, setOverview] = useState<OverviewDataDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load overview data\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Overview] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await overviewService.getOverviewData(applicantId);\n setOverview(result);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, overviewService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Pass overview (confirm and continue)\n const passOverview = useCallback(async () => {\n if (!applicantId) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n await overviewService.passOverview(applicantId);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n }, [applicantId, overviewService]);\n\n return {\n overview,\n isLoading,\n isSubmitting,\n error,\n load,\n passOverview,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { ApplicantRegistrationRequestOutput, IdentityRequest } from '../types';\n\n/**\n * Hook to manage identity verification\n */\nexport function useIdentityVerification(applicantId?: number) {\n const { identityService } = useMetaKYC();\n const [identityData, setIdentityData] = useState<ApplicantRegistrationRequestOutput | null>(\n null\n );\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isRequestingRef = useRef(false);\n\n // Request identity verification (individual)\n const requestIdentity = useCallback(\n async (redirectUrl?: string, ttl?: number) => {\n if (!applicantId) return;\n \n // Prevent duplicate requests using ref\n if (isRequestingRef.current) {\n console.log('[Identity] Request already in progress, skipping...');\n return;\n }\n\n isRequestingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: false,\n redirectUrl: redirectUrl || '',\n ttl: ttl || 7 * 24 * 3600, // Default: 7 days\n };\n console.log('Identity request input:', input);\n const result = await identityService.identityRequest(input);\n console.log('Identity request result:', result);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isRequestingRef.current = false;\n }\n },\n [applicantId, identityService]\n );\n\n // Request company identity verification\n const requestCompanyIdentity = useCallback(\n async (redirectUrl?: string, ttl?: number) => {\n if (!applicantId) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: false,\n redirectUrl,\n ttl,\n };\n const result = await identityService.identityCompanyRequest(input);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantId, identityService]\n );\n\n // Restart identity verification\n const restartIdentity = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isRequestingRef.current) {\n console.log('[Identity] Restart already in progress, skipping...');\n return;\n }\n\n isRequestingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n console.log('Restarting identity with input:', input);\n const result = await identityService.identityRequest(input);\n console.log('Restart identity result:', result);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isRequestingRef.current = false;\n }\n }, [applicantId, identityService]);\n\n return {\n identityData,\n provider: identityData?.provider || null,\n token: identityData?.publicProviderTokenObject || null,\n isLoading,\n error,\n requestIdentity,\n requestCompanyIdentity,\n restartIdentity,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { RiskCriteriaDto, RiskCalculationInput, RiskScoringResult } from '../types';\n\ntype InitialAnswers = Record<number, string[]>;\n\n/**\n * Hook to manage risk scoring\n */\nexport function useRiskScoring(applicantId?: number) {\n const { riskScoringService, applicantService } = useMetaKYC();\n const [criteria, setCriteria] = useState<RiskCriteriaDto[] | null>(null);\n const [initialAnswers, setInitialAnswers] = useState<InitialAnswers>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<RiskScoringResult | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load risk criteria + existing answers\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[RiskScoring] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const [data, applicantData] = await Promise.all([\n riskScoringService.getRiskCriterias(applicantId),\n applicantService.getApplicantData(applicantId).catch(() => null),\n ]);\n setCriteria(data);\n\n // Build initial answers from the latest risk scoring result\n if (applicantData?.riskScoringResults?.length) {\n const latestResult = applicantData.riskScoringResults[0];\n const answers: InitialAnswers = {};\n for (const cr of latestResult.riskCriteriaResults ?? []) {\n if (cr.riskCriteriaId != null && cr.answer != null && cr.answer !== '') {\n // answer may be comma-separated for multi-value criteria — split, trim, and deduplicate\n const values = [...new Set(\n cr.answer.split(',').map((v: string) => v.trim()).filter((v: string) => v !== '')\n )];\n if (values.length > 0) {\n answers[cr.riskCriteriaId] = values;\n }\n }\n }\n setInitialAnswers(answers);\n }\n\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, riskScoringService, applicantService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit risk scoring\n const submit = useCallback(\n async (input: RiskCalculationInput): Promise<RiskScoringResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const submitResult = await riskScoringService.submitRiskScoring(input);\n setResult(submitResult);\n return submitResult;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [riskScoringService]\n );\n\n return {\n criteria,\n initialAnswers,\n result,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n ApplicantRegistrationRequestInput,\n CompanyApplicantRegistrationRequestInput,\n ProgressApplicantResult,\n ApplicantDataDto,\n} from '../types';\n\n/**\n * Hook to manage applicant operations\n */\nexport function useApplicant() {\n const { applicantService, config } = useMetaKYC();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isCreatingRef = useRef(false);\n const isLoadingDataRef = useRef(false);\n\n /**\n * Generate session key for SardinAI if configured\n */\n const generateSardinAISessionKey = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n };\n\n // Create individual applicant\n const createApplicant = useCallback(\n async (input: ApplicantRegistrationRequestInput): Promise<ProgressApplicantResult> => {\n // Prevent duplicate requests\n if (isCreatingRef.current) {\n console.log('[Applicant] Create already in progress, skipping...');\n throw new Error('Creation already in progress');\n }\n\n isCreatingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n // Ensure applicantAdditionalDatas is always initialized (even if empty)\n if (!input.applicantAdditionalDatas) {\n input.applicantAdditionalDatas = [];\n }\n\n // If SardinAI is configured, add session key to additional data\n if (config.identityProviders?.sardinai) {\n const sessionKey = generateSardinAISessionKey();\n console.log('[SardinAI] Generated session key:', sessionKey);\n \n input.applicantAdditionalDatas.push({\n paramName: 'sessionKey',\n value: sessionKey,\n });\n }\n\n const result = await applicantService.createApplicant(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isCreatingRef.current = false;\n }\n },\n [applicantService, config]\n );\n\n // Create company applicant\n const createCompanyApplicant = useCallback(\n async (\n input: CompanyApplicantRegistrationRequestInput\n ): Promise<ProgressApplicantResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await applicantService.createCompanyApplicant(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantService]\n );\n\n // Get applicant data\n const getApplicantData = useCallback(\n async (applicantId: number): Promise<ApplicantDataDto> => {\n // Prevent duplicate requests\n if (isLoadingDataRef.current) {\n console.log('[Applicant] Data load already in progress, skipping...');\n throw new Error('Data load already in progress');\n }\n\n isLoadingDataRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await applicantService.getApplicantData(applicantId);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isLoadingDataRef.current = false;\n }\n },\n [applicantService]\n );\n\n // Stop progress\n const stopProgress = useCallback(\n async (applicantId: number): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await applicantService.stopProgress(applicantId);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantService]\n );\n\n return {\n isLoading,\n error,\n createApplicant,\n createCompanyApplicant,\n getApplicantData,\n stopProgress,\n };\n}\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n isLoading?: boolean;\n}\n\n/**\n * Button component\n */\nexport const Button: React.FC<ButtonProps> = ({\n children,\n variant = 'primary',\n size = 'md',\n isLoading = false,\n disabled,\n className,\n ...props\n}) => {\n const baseStyles =\n 'inline-flex items-center justify-center rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';\n\n const variantStyles = {\n primary: 'bg-primary-500 text-white hover:bg-primary-600 focus:ring-primary-500',\n secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-400',\n outline:\n 'border-2 border-primary-500 text-primary-500 hover:bg-primary-50 focus:ring-primary-500',\n danger: 'bg-danger-500 text-white hover:bg-danger-600 focus:ring-danger-500',\n ghost: 'text-gray-700 hover:bg-gray-100 focus:ring-gray-400',\n };\n\n const sizeStyles = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n };\n\n return (\n <button\n className={cn(baseStyles, variantStyles[variant], sizeStyles[size], className)}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading && (\n <svg\n className=\"animate-spin -ml-1 mr-2 h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n {children}\n </button>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../../utils';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n helperText?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\n/**\n * Input component — uses CSS variables so it follows the SDK theme.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ label, error, helperText, leftIcon, rightIcon, className, style, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n {leftIcon}\n </div>\n )}\n\n <input\n ref={ref}\n className={cn(\n 'block w-full rounded-lg border px-3 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\n 'disabled:opacity-60 disabled:cursor-not-allowed',\n leftIcon ? 'pl-10' : '',\n rightIcon ? 'pr-10' : '',\n className\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n // placeholder and focus-ring are handled via global CSS in styles.css\n ...style,\n }}\n {...props}\n />\n\n {rightIcon && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none\">\n {rightIcon}\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-danger, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * Card component\n */\nexport const Card: React.FC<CardProps> = ({ children, className, ...props }) => {\n return (\n <div\n className={cn(\n 'metakyc-card rounded-xl shadow-sm border',\n className\n )}\n style={{\n backgroundColor: 'var(--metakyc-surface, #ffffff)',\n borderColor: 'var(--metakyc-border, #e5e7eb)'\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card header component\n */\nexport const CardHeader: React.FC<CardProps> = ({ children, className, ...props }) => {\n return (\n <div \n className={cn('px-6 py-4 border-b', className)} \n style={{\n borderColor: 'var(--metakyc-border, #e5e7eb)'\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card content component\n */\nexport const CardContent: React.FC<CardProps> = ({ children, className, ...props }) => {\n return (\n <div className={cn('px-6 py-4', className)} {...props}>\n {children}\n </div>\n );\n};\n\n/**\n * Card footer component\n */\nexport const CardFooter: React.FC<CardProps> = ({ children, className, ...props }) => {\n return (\n <div \n className={cn('px-6 py-4 border-t', className)} \n style={{\n borderColor: 'var(--metakyc-border, #e5e7eb)'\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'default' | 'success' | 'danger' | 'warning' | 'info';\n children: React.ReactNode;\n}\n\n/**\n * Badge component\n */\nexport const Badge: React.FC<BadgeProps> = ({ children, variant = 'default', className, ...props }) => {\n const variantStyles = {\n default: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300',\n success: 'bg-success-100 text-success-800 dark:bg-success-900 dark:text-success-300',\n danger: 'bg-danger-100 text-danger-800 dark:bg-danger-900 dark:text-danger-300',\n warning: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300',\n info: 'bg-primary-100 text-primary-800 dark:bg-primary-900 dark:text-primary-300',\n };\n\n return (\n <span\n className={cn(\n 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium',\n variantStyles[variant],\n className\n )}\n {...props}\n >\n {children}\n </span>\n );\n};\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * Spinner component\n */\nexport const Spinner: React.FC<SpinnerProps> = ({ size = 'md', className, ...props }) => {\n const sizeStyles = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n };\n\n return (\n <div className={cn('flex items-center justify-center', className)} {...props}>\n <svg\n className={cn('animate-spin text-primary-500', sizeStyles[size])}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../../utils';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n label?: string;\n error?: string;\n helperText?: string;\n options: SelectOption[];\n placeholder?: string;\n}\n\n/**\n * Select component — uses CSS variables so it follows the SDK theme.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ label, error, helperText, options, placeholder, className, style, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <select\n ref={ref}\n className={cn(\n 'block w-full rounded-lg border px-3 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\n 'disabled:opacity-60 disabled:cursor-not-allowed',\n error ? 'border-danger-500' : '',\n className\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n ...style,\n }}\n {...props}\n >\n {placeholder && (\n <option\n key=\"__placeholder__\"\n value=\"\"\n disabled\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n >\n {placeholder}\n </option>\n )}\n {options.map((option, idx) => (\n <option\n key={option.value || `option-${idx}`}\n value={option.value}\n disabled={option.disabled}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: option.disabled\n ? 'var(--metakyc-text-muted, #9ca3af)'\n : 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n }}\n >\n {option.label}\n </option>\n ))}\n </select>\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-error, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nSelect.displayName = 'Select';\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n}\n\nexport interface MultiSelectProps {\n label?: string;\n value: string[];\n onChange: (values: string[]) => void;\n options: MultiSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n required?: boolean;\n}\n\ninterface DropdownPos {\n top: number;\n left: number;\n width: number;\n openUp: boolean;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 280;\n\nexport const MultiSelect: React.FC<MultiSelectProps> = ({\n label,\n value,\n onChange,\n options,\n placeholder = 'Select...',\n disabled = false,\n required = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [pos, setPos] = useState<DropdownPos | null>(null);\n const [portalColors, setPortalColors] = useState({\n bg: '#ffffff', borderColor: '#d1d5db', textPrimary: '#111827',\n textSecondary: '#6b7280', primaryColor: '#2563eb',\n primaryLight: '#eff6ff', hoverBg: '#f9fafb',\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const calcPos = useCallback((): DropdownPos | null => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const openUp = spaceBelow < DROPDOWN_MAX_HEIGHT && rect.top > DROPDOWN_MAX_HEIGHT;\n return { top: openUp ? rect.top : rect.bottom + 4, left: rect.left, width: rect.width, openUp };\n }, []);\n\n const snapPortalColors = useCallback(() => {\n const s = getComputedStyle(document.documentElement);\n const v = (name: string, fallback: string) => s.getPropertyValue(name).trim() || fallback;\n const bg = v('--metakyc-input-bg', v('--metakyc-background', '#ffffff'));\n setPortalColors({\n bg,\n borderColor: v('--metakyc-input-border', v('--metakyc-border', '#d1d5db')),\n textPrimary: v('--metakyc-input-text', v('--metakyc-text-primary', '#111827')),\n textSecondary: v('--metakyc-text-secondary', '#6b7280'),\n primaryColor: v('--metakyc-primary', '#2563eb'),\n primaryLight: v('--metakyc-primary-light', '#eff6ff'),\n hoverBg: v('--metakyc-surface', bg),\n });\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n snapPortalColors();\n const p = calcPos();\n if (p) setPos(p);\n setIsOpen(true);\n }, [disabled, calcPos, snapPortalColors]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (!containerRef.current?.contains(target) && !dropdownRef.current?.contains(target)) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n useEffect(() => {\n if (!isOpen) return;\n const update = () => { const p = calcPos(); if (p) setPos(p); };\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => { window.removeEventListener('scroll', update, true); window.removeEventListener('resize', update); };\n }, [isOpen, calcPos]);\n\n const filteredOptions = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase())\n );\n\n const toggleOption = (optionValue: string) => {\n if (disabled) return;\n onChange(value.includes(optionValue) ? value.filter(v => v !== optionValue) : [...value, optionValue]);\n };\n\n const removeValue = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) onChange(value.filter(v => v !== optionValue));\n };\n\n const getLabel = (val: string) => options.find(o => o.value === val)?.label || val;\n\n const { bg, borderColor, textPrimary, textSecondary, primaryColor, primaryLight, hoverBg } = portalColors;\n\n const dropdownPanel = isOpen && pos && (\n <div\n ref={dropdownRef}\n className=\"metakyc-multiselect-dropdown\"\n style={{\n position: 'fixed',\n top: pos.openUp ? undefined : pos.top,\n bottom: pos.openUp ? window.innerHeight - pos.top + 4 : undefined,\n left: pos.left,\n width: pos.width,\n zIndex: 99999,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n border: `1px solid ${borderColor}`,\n backgroundColor: bg,\n overflow: 'hidden',\n }}\n >\n {/* Search */}\n <div style={{ padding: '8px', borderBottom: `1px solid ${borderColor}` }}>\n <input\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search...\"\n autoFocus\n onClick={e => e.stopPropagation()}\n className=\"metakyc-multiselect-search w-full\"\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n fontSize: '13px',\n borderRadius: '6px',\n border: `1px solid ${borderColor}`,\n backgroundColor: bg,\n color: textPrimary,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n {/* Options */}\n <ul style={{ listStyle: 'none', margin: 0, padding: '4px 0', maxHeight: '192px', overflowY: 'auto' }}>\n {filteredOptions.length === 0 ? (\n <li style={{ padding: '8px 12px', fontSize: '13px', color: textSecondary }}>No results</li>\n ) : (\n filteredOptions.map(option => {\n const isSelected = value.includes(option.value);\n return (\n <li\n key={option.value}\n onClick={() => toggleOption(option.value)}\n className=\"metakyc-multiselect-option\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n fontSize: '13px',\n cursor: 'pointer',\n backgroundColor: isSelected ? primaryLight : 'transparent',\n color: isSelected ? primaryColor : textPrimary,\n userSelect: 'none',\n }}\n onMouseEnter={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.backgroundColor = hoverBg; }}\n onMouseLeave={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent'; }}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n readOnly\n style={{ accentColor: primaryColor, pointerEvents: 'none', flexShrink: 0 }}\n />\n <span>{option.label}</span>\n </li>\n );\n })\n )}\n </ul>\n\n {/* Clear all */}\n {value.length > 0 && (\n <div style={{ padding: '6px 12px', borderTop: `1px solid ${borderColor}` }}>\n <button\n type=\"button\"\n onClick={() => { onChange([]); setSearch(''); }}\n style={{ fontSize: '12px', color: '#ef4444', background: 'none', border: 'none', cursor: 'pointer', padding: 0 }}\n >\n Clear all ({value.length} selected)\n </button>\n </div>\n )}\n </div>\n );\n\n return (\n <div className=\"w-full metakyc-multiselect\" ref={containerRef}>\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {required && <span style={{ color: 'var(--metakyc-error, #ef4444)', marginLeft: '4px' }}>*</span>}\n </label>\n )}\n\n {/* Trigger */}\n <div\n ref={triggerRef}\n onClick={() => (isOpen ? close() : open())}\n className={cn(\n 'metakyc-multiselect-trigger',\n 'min-h-[42px] w-full px-3 py-2 rounded-lg border text-sm transition-colors relative',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n borderColor: isOpen\n ? 'var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n outline: isOpen ? '2px solid var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))' : 'none',\n outlineOffset: '-1px',\n }}\n >\n {value.length === 0 ? (\n <span\n className=\"metakyc-multiselect-placeholder leading-6\"\n style={{ color: 'var(--metakyc-text-secondary, #9ca3af)' }}\n >\n {placeholder}\n </span>\n ) : (\n <div className=\"flex flex-wrap gap-1 pr-6\">\n {value.map(v => (\n <span\n key={v}\n className=\"metakyc-multiselect-chip inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium\"\n style={{\n backgroundColor: 'var(--metakyc-primary-light, #eff6ff)',\n color: 'var(--metakyc-primary, #2563eb)',\n }}\n >\n {getLabel(v)}\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => removeValue(v, e)}\n className=\"metakyc-multiselect-chip-remove\"\n style={{\n background: 'transparent', border: 'none',\n padding: '0 0 0 2px', margin: 0,\n cursor: 'pointer', fontSize: '14px',\n lineHeight: 1, fontWeight: 'bold',\n display: 'inline-flex', alignItems: 'center',\n boxShadow: 'none', transform: 'none',\n minWidth: 0, width: 'auto', height: 'auto',\n letterSpacing: 'normal', textTransform: 'none',\n }}\n >\n ×\n </button>\n )}\n </span>\n ))}\n </div>\n )}\n <span\n className=\"metakyc-multiselect-arrow absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-xs\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {isOpen ? '▲' : '▼'}\n </span>\n </div>\n\n {typeof document !== 'undefined' && dropdownPanel\n ? createPortal(dropdownPanel, document.body)\n : null}\n </div>\n );\n};\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils';\n\nexport interface SearchableSelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SearchableSelectProps {\n label?: string;\n error?: string;\n helperText?: string;\n options: SearchableSelectOption[];\n placeholder?: string;\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n required?: boolean;\n className?: string;\n}\n\ninterface DropdownPos {\n top: number;\n left: number;\n width: number;\n openUp: boolean;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 260; // px — search (44) + list (max-h-52 = 208) + padding\n\n/**\n * Single-value searchable dropdown — follows SDK CSS variable theming.\n * The dropdown panel is rendered via a React portal at document.body level\n * so it is never clipped by overflow:hidden parents or stacking contexts.\n */\nexport const SearchableSelect: React.FC<SearchableSelectProps> = ({\n label,\n error,\n helperText,\n options,\n placeholder = 'Select...',\n value,\n onChange,\n disabled = false,\n required = false,\n className,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [pos, setPos] = useState<DropdownPos | null>(null);\n\n // Concrete color values snapped from CSS variables when the dropdown opens.\n // Reading from document.documentElement guarantees we get the ThemeManager's values\n // even though the portal renders outside .metakyc-sdk.\n const [portalColors, setPortalColors] = useState({\n bg: '#ffffff',\n border: '#d1d5db',\n text: '#111827',\n textSecondary: '#6b7280',\n primary: '#2563eb',\n primaryLight: '#eff6ff',\n hoverBg: '#f9fafb',\n });\n\n const snapPortalColors = useCallback(() => {\n const s = getComputedStyle(document.documentElement);\n const v = (name: string, fallback: string) =>\n s.getPropertyValue(name).trim() || fallback;\n const bg = v('--metakyc-input-bg', v('--metakyc-background', '#ffffff'));\n setPortalColors({\n bg,\n border: v('--metakyc-input-border', v('--metakyc-border', '#d1d5db')),\n text: v('--metakyc-input-text', v('--metakyc-text-primary', '#111827')),\n textSecondary: v('--metakyc-text-secondary', '#6b7280'),\n primary: v('--metakyc-primary', '#2563eb'),\n primaryLight: v('--metakyc-primary-light', '#eff6ff'),\n hoverBg: v('--metakyc-surface', bg),\n });\n }, []);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n\n // ── Position calculation ──────────────────────────────────────────────────\n const calcPos = useCallback(() => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const openUp = spaceBelow < DROPDOWN_MAX_HEIGHT && rect.top > DROPDOWN_MAX_HEIGHT;\n return {\n top: openUp ? rect.top : rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n openUp,\n };\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n snapPortalColors();\n const p = calcPos();\n if (p) setPos(p);\n setIsOpen(true);\n }, [disabled, calcPos, snapPortalColors]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n const handleToggle = () => (isOpen ? close() : open());\n\n // ── Close on outside click ────────────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n !containerRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n // ── Reposition on scroll / resize ────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const update = () => {\n const p = calcPos();\n if (p) setPos(p);\n };\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [isOpen, calcPos]);\n\n // ── Focus search on open ──────────────────────────────────────────────────\n useEffect(() => {\n if (isOpen && searchRef.current) {\n setTimeout(() => searchRef.current?.focus(), 0);\n }\n }, [isOpen]);\n\n const filteredOptions = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase()) ||\n o.value.toLowerCase().includes(search.toLowerCase())\n );\n\n const selectedLabel = options.find(o => o.value === value)?.label;\n\n const handleSelect = (optValue: string, optDisabled?: boolean) => {\n if (disabled || optDisabled) return;\n onChange(optValue);\n close();\n };\n\n // Destructure snapped concrete values for the portal\n const { bg, border, text: textPrimary, textSecondary, primary, primaryLight, hoverBg } = portalColors;\n\n // ── Portal dropdown panel ─────────────────────────────────────────────────\n const dropdownPanel = isOpen && pos && (\n <div\n ref={dropdownRef}\n className=\"metakyc-searchable-select-dropdown\"\n style={{\n position: 'fixed',\n top: pos.openUp ? undefined : pos.top,\n bottom: pos.openUp ? window.innerHeight - pos.top + 4 : undefined,\n left: pos.left,\n width: pos.width,\n zIndex: 99999,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n border: `1px solid ${border}`,\n backgroundColor: bg,\n overflow: 'hidden',\n }}\n >\n {/* Search input */}\n <div style={{ padding: '8px', borderBottom: `1px solid ${border}` }}>\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search...\"\n onClick={e => e.stopPropagation()}\n className=\"metakyc-searchable-select-search w-full\"\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n fontSize: '13px',\n borderRadius: '6px',\n border: `1px solid ${border}`,\n backgroundColor: bg,\n color: textPrimary,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n {/* Options list */}\n <ul\n style={{\n listStyle: 'none',\n margin: 0,\n padding: '4px 0',\n maxHeight: '208px',\n overflowY: 'auto',\n }}\n >\n {filteredOptions.length === 0 ? (\n <li style={{ padding: '8px 12px', fontSize: '13px', color: textSecondary }}>\n No results\n </li>\n ) : (\n filteredOptions.map(option => {\n const isSelected = option.value === value;\n return (\n <li\n key={option.value}\n className=\"metakyc-searchable-select-option\"\n onClick={() => handleSelect(option.value, option.disabled)}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n opacity: option.disabled ? 0.4 : 1,\n backgroundColor: isSelected ? primaryLight : 'transparent',\n color: isSelected ? primary : textPrimary,\n userSelect: 'none',\n }}\n onMouseEnter={e => {\n if (!isSelected && !option.disabled)\n (e.currentTarget as HTMLElement).style.backgroundColor = hoverBg;\n }}\n onMouseLeave={e => {\n if (!isSelected)\n (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent';\n }}\n >\n {option.label}\n </li>\n );\n })\n )}\n </ul>\n </div>\n );\n\n return (\n <div\n className={cn('w-full metakyc-searchable-select', className)}\n ref={containerRef}\n >\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {required && (\n <span style={{ color: 'var(--metakyc-error, #ef4444)', marginLeft: '4px' }}>*</span>\n )}\n </label>\n )}\n\n {/* Trigger */}\n <div\n ref={triggerRef}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={handleToggle}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleToggle(); }\n if (e.key === 'Escape') close();\n }}\n className={cn(\n 'metakyc-searchable-select-trigger',\n 'w-full px-3 py-2 rounded-lg border text-sm transition-colors text-left',\n 'flex items-center justify-between gap-2',\n 'focus:outline-none',\n disabled ? 'opacity-60 cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: selectedLabel\n ? 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))'\n : 'var(--metakyc-input-placeholder, var(--metakyc-text-muted, #9ca3af))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : isOpen\n ? 'var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n minHeight: '42px',\n outline: isOpen ? '2px solid var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))' : 'none',\n outlineOffset: '-1px',\n }}\n >\n <span className=\"truncate flex-1\">{selectedLabel || placeholder}</span>\n <span\n className=\"flex-shrink-0 text-xs pointer-events-none\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {isOpen ? '▲' : '▼'}\n </span>\n </div>\n\n {/* Portal dropdown */}\n {typeof document !== 'undefined' && dropdownPanel\n ? createPortal(dropdownPanel, document.body)\n : null}\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-error, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n};\n\nSearchableSelect.displayName = 'SearchableSelect';\n","import React, { useRef, useState } from 'react';\nimport { cn, formatFileSize } from '../../utils';\n\nexport interface FileUploadProps {\n label?: string;\n error?: string;\n accept?: string;\n multiple?: boolean;\n maxSize?: number;\n onChange?: (files: File[]) => void;\n value?: File[];\n className?: string;\n}\n\n/**\n * File upload component with drag and drop\n */\nexport const FileUpload: React.FC<FileUploadProps> = ({\n label,\n error,\n accept,\n multiple = false,\n maxSize,\n onChange,\n value = [],\n className,\n}) => {\n const [isDragging, setIsDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFiles = (files: FileList | null) => {\n if (!files) return;\n\n const fileArray = Array.from(files);\n\n // Validate file size\n if (maxSize) {\n const oversizedFiles = fileArray.filter((file) => file.size > maxSize);\n if (oversizedFiles.length > 0) {\n const maxSizeFormatted = formatFileSize(maxSize);\n alert(`Some files exceed the maximum size of ${maxSizeFormatted}`);\n return;\n }\n }\n\n onChange?.(multiple ? [...value, ...fileArray] : [fileArray[0]]);\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n };\n\n const handleDragLeave = () => {\n setIsDragging(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n handleFiles(e.dataTransfer.files);\n };\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const removeFile = (index: number) => {\n const newFiles = value.filter((_, i) => i !== index);\n onChange?.(newFiles);\n };\n\n return (\n <div className={cn('w-full', className)}>\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n {label}\n </label>\n )}\n\n <div\n className={cn(\n 'border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors',\n isDragging\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-300 dark:border-gray-600 hover:border-primary-500',\n error && 'border-danger-500'\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"hidden\"\n accept={accept}\n multiple={multiple}\n onChange={(e) => handleFiles(e.target.files)}\n />\n\n <div className=\"space-y-2\">\n <svg\n className=\"mx-auto h-12 w-12 text-gray-400\"\n stroke=\"currentColor\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n >\n <path\n d=\"M28 8H12a4 4 0 00-4 4v20m32-12v8m0 0v8a4 4 0 01-4 4H12a4 4 0 01-4-4v-4m32-4l-3.172-3.172a4 4 0 00-5.656 0L28 28M8 32l9.172-9.172a4 4 0 015.656 0L28 28m0 0l4 4m4-24h8m-4-4v8m-12 4h.02\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n <span className=\"font-medium text-primary-500\">Click to upload</span> or drag and drop\n </div>\n {maxSize && (\n <p className=\"text-xs text-gray-500\">Maximum file size: {formatFileSize(maxSize)}</p>\n )}\n </div>\n </div>\n\n {/* File list */}\n {value.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {value.map((file, index) => (\n <div\n key={index}\n className=\"flex items-center justify-between px-3 py-2 bg-gray-50 dark:bg-gray-700 rounded-lg\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"h-5 w-5 text-gray-400 flex-shrink-0\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-sm text-gray-700 dark:text-gray-300 truncate\">\n {file.name}\n </span>\n <span className=\"text-xs text-gray-500\">({formatFileSize(file.size)})</span>\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className=\"ml-2 text-danger-500 hover:text-danger-700 focus:outline-none\"\n >\n <svg className=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n {error && <p className=\"mt-1 text-sm text-danger-500\">{error}</p>}\n </div>\n );\n};\n","import { forwardRef } from 'react';\nimport { cn } from '../../utils';\nimport { Input, InputProps } from './Input';\n\nexport interface PhoneInputProps extends Omit<InputProps, 'type' | 'leftIcon'> {\n countryCode?: string;\n onCountryCodeChange?: (code: string) => void;\n}\n\n/**\n * Phone input component with country code\n */\nexport const PhoneInput = forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ countryCode = '+1', onCountryCodeChange, className, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {props.label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {props.label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={countryCode}\n onChange={(e) => onCountryCodeChange?.(e.target.value)}\n className={cn(\n 'w-20 rounded-lg border px-3 py-2 text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0'\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-text-primary, #111827)',\n borderColor: 'var(--metakyc-border, #d1d5db)',\n }}\n placeholder=\"+1\"\n />\n <Input\n ref={ref}\n type=\"tel\"\n className={cn('flex-1', className)}\n {...props}\n label=\"\"\n />\n </div>\n\n {props.error && <p className=\"mt-1 text-sm text-danger-500\">{props.error}</p>}\n </div>\n );\n }\n);\n\nPhoneInput.displayName = 'PhoneInput';\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { useQuestionnaire } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Select, Spinner } from '../core';\nimport { FillQuestionnarieInput, QuestionDto, QuestionGroupDto } from '../../types';\nimport { ChevronRight, ChevronLeft } from 'lucide-react';\n\nexport interface QuestionnaireStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface PagedQuestion {\n question: QuestionDto;\n groupIndex: number;\n qIdx: number;\n}\n\ntype Answers = Record<number, string[]>; // questionId → values\ntype Errors = Record<number, string>; // questionId → error message\n\n// ── Validation ────────────────────────────────────────────────────────────\n\nfunction validateQuestion(question: QuestionDto, values: string[]): string | null {\n const isEmpty = !values || values.length === 0 || values.every(v => !v || !v.trim());\n\n if (question.isRequired && isEmpty) {\n return question.errorMessage || 'This field is required';\n }\n\n if (!isEmpty) {\n const first = values[0] ?? '';\n\n if (first && question.regex) {\n try {\n if (!new RegExp(question.regex).test(first)) {\n return question.errorMessage || 'Invalid format';\n }\n } catch { /* ignore invalid regex */ }\n }\n\n if (first !== '') {\n const num = Number(first);\n if (!isNaN(num) && first.trim() !== '') {\n if (question.min !== undefined && question.min !== null && num < question.min) {\n return `Minimum value is ${question.min}`;\n }\n if (question.max !== undefined && question.max !== null && num > question.max) {\n return `Maximum value is ${question.max}`;\n }\n } else {\n if (question.min !== undefined && question.min !== null && first.length < question.min) {\n return `Minimum length is ${question.min} characters`;\n }\n if (question.max !== undefined && question.max !== null && first.length > question.max) {\n return `Maximum length is ${question.max} characters`;\n }\n }\n }\n }\n\n return null;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction buildPages(groups: QuestionGroupDto[]): PagedQuestion[][] {\n const flat: PagedQuestion[] = groups.flatMap((g, gi) =>\n (g.questions ?? []).map((q, qi) => ({ question: q, groupIndex: gi, qIdx: qi }))\n );\n\n const map = new Map<number, PagedQuestion[]>();\n for (const pq of flat) {\n // pageNumber <= 0 or undefined means \"first page\" (no specific pagination)\n const p = (pq.question.pageNumber != null && pq.question.pageNumber > 0) ? pq.question.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push(pq);\n }\n\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, qs]) => qs);\n}\n\n// ── Component ─────────────────────────────────────────────────────────────\n\nexport const QuestionnaireStep: React.FC<QuestionnaireStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { questionnaire, initialAnswers, isLoading, isSubmitting, error, submit } = useQuestionnaire(applicantId);\n\n const [answers, setAnswers] = useState<Answers>({});\n const [fieldErrors, setFieldErrors] = useState<Errors>({});\n const [currentPage, setCurrentPage] = useState(0);\n\n // Seed answers with existing data when loaded (only if user hasn't entered anything yet)\n React.useEffect(() => {\n if (initialAnswers && Object.keys(initialAnswers).length > 0 && Object.keys(answers).length === 0) {\n setAnswers(initialAnswers);\n }\n }, [initialAnswers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const pages = useMemo(\n () => (questionnaire ? buildPages(questionnaire.questionGroups) : []),\n [questionnaire]\n );\n\n const isLastPage = currentPage === pages.length - 1;\n const currentQuestions = pages[currentPage] ?? [];\n\n const setAnswer = useCallback((questionId: number, values: string[]) => {\n setAnswers(prev => ({ ...prev, [questionId]: values }));\n setFieldErrors(prev => { const e = { ...prev }; delete e[questionId]; return e; });\n }, []);\n\n // Validate just the questions on the current page\n const validatePage = useCallback((): boolean => {\n const newErrors: Errors = {};\n for (const { question } of currentQuestions) {\n const err = validateQuestion(question, answers[question.id] ?? []);\n if (err) newErrors[question.id] = err;\n }\n setFieldErrors(prev => ({ ...prev, ...newErrors }));\n return Object.keys(newErrors).length === 0;\n }, [currentQuestions, answers]);\n\n const handleNext = () => {\n if (validatePage()) setCurrentPage(p => p + 1);\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage(p => p - 1);\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validatePage() || !questionnaire) return;\n\n try {\n const questionResults = questionnaire.questionGroups.flatMap(g =>\n (g.questions ?? []).map(q => ({\n questionId: q.id,\n values: answers[q.id] ?? [],\n }))\n );\n\n const input: FillQuestionnarieInput = {\n applicantId,\n questionnarieId: questionnaire.id,\n questionResults,\n };\n\n await submit(input);\n onComplete?.();\n } catch (e) {\n console.error('Questionnaire submit error:', e);\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading questionnaire: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!questionnaire) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{questionnaire.displayName}</h2>\n {questionnaire.subtitle && (\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {questionnaire.subtitle}\n </p>\n )}\n\n {/* Page indicator — only shown when there are multiple pages */}\n {pages.length > 1 && (\n <div className=\"flex items-center justify-between mt-3\">\n <span className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n Page {currentPage + 1} of {pages.length}\n </span>\n <div className=\"flex items-center gap-1.5\">\n {pages.map((_, i) => (\n <div\n key={i}\n className=\"rounded-full transition-all duration-200\"\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Questions for current page */}\n <CardContent className=\"space-y-6\">\n {currentQuestions.map(({ question }) => (\n <QuestionField\n key={question.id}\n question={question}\n value={answers[question.id] ?? []}\n error={fieldErrors[question.id]}\n onChange={vals => setAnswer(question.id, vals)}\n />\n ))}\n </CardContent>\n\n {/* Footer navigation */}\n <CardFooter className=\"flex items-center justify-between\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n <ChevronLeft size={14} />\n {currentPage > 0 ? 'Previous' : 'Back'}\n </Button>\n\n {isLastPage ? (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n onClick={handleSubmit}\n >\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n Next\n <ChevronRight size={14} />\n </Button>\n )}\n </CardFooter>\n\n {error && (\n <div className=\"mx-6 mb-4 p-3 bg-red-50 border border-red-200 rounded\">\n <p className=\"text-red-600 text-sm\">{(error as Error).message}</p>\n </div>\n )}\n </Card>\n );\n};\n\n// ── QuestionField ──────────────────────────────────────────────────────────\n\ninterface QuestionFieldProps {\n question: QuestionDto;\n value: string[];\n error?: string;\n onChange: (values: string[]) => void;\n}\n\nconst QuestionField: React.FC<QuestionFieldProps> = ({ question, value, error, onChange }) => {\n const hasDefaultAnswers = (question.defaultAnswers?.length ?? 0) > 0;\n\n const qType = !hasDefaultAnswers\n ? 'text'\n : question.showAsDropdown\n ? question.canMultipleAnswer ? 'multi-select' : 'single-select'\n : question.canMultipleAnswer ? 'checkbox' : 'radio';\n\n return (\n <div className=\"space-y-2\">\n {/* Question label */}\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {question.text}\n {question.isRequired && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n\n {/* Subtitle / description */}\n {question.subtitle && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {question.subtitle}\n </p>\n )}\n {question.description && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {question.description}\n </p>\n )}\n\n {/* Text input */}\n {qType === 'text' && (\n <Input\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n placeholder={question.subtitle ? undefined : 'Enter your answer…'}\n error={error}\n required={question.isRequired}\n />\n )}\n\n {/* Dropdown — single select */}\n {qType === 'single-select' && (\n <Select\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n options={(question.defaultAnswers ?? []).map(a => ({ value: a, label: a }))}\n placeholder=\"Select an option…\"\n error={error}\n required={question.isRequired}\n />\n )}\n\n {/* Radio buttons — single choice without dropdown */}\n {qType === 'radio' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(question.defaultAnswers ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={value[0] === answer}\n onChange={() => onChange([answer])}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {answer}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Checkboxes — multiple choice */}\n {(qType === 'checkbox' || qType === 'multi-select') && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(question.defaultAnswers ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={value.includes(answer)}\n onChange={e => {\n if (e.target.checked) {\n onChange([...value, answer]);\n } else {\n onChange(value.filter(v => v !== answer));\n }\n }}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {answer}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Inline error for input types (radio/checkbox handle their own) */}\n {error && qType === 'text' && null /* already shown in Input */}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useUploadDocument } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, FileUpload, Spinner } from '../core';\nimport { FillUploadDocumentInput } from '../../types';\nimport { fileToBase64 } from '../../utils';\n\nexport interface UploadDocumentStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Upload document step component\n */\nexport const UploadDocumentStep: React.FC<UploadDocumentStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { uploadDocument, isLoading, isSubmitting, error, submit } = useUploadDocument(applicantId);\n const [files, setFiles] = useState<Record<number, File[]>>({});\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!uploadDocument) return;\n\n const uploadDocumentResults = await Promise.all(\n uploadDocument.uploadDocumentFiles.map(async (docFile) => {\n const fileList = files[docFile.id] || [];\n const valueList = await Promise.all(\n fileList.map(async (file) => ({\n fileName: file.name,\n fileData: await fileToBase64(file),\n }))\n );\n\n return {\n uploadDocumentFileId: docFile.id,\n valueList,\n };\n })\n );\n\n const input: FillUploadDocumentInput = {\n applicantId,\n uploadDocumentId: uploadDocument.id,\n uploadDocumentResults,\n };\n\n await submit(input);\n onComplete?.();\n };\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading document requirements: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!uploadDocument) return null;\n\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{uploadDocument.displayName}</h2>\n {uploadDocument.subtitle && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">{uploadDocument.subtitle}</p>\n )}\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n {uploadDocument.uploadDocumentFiles.map((docFile) => (\n <FileUpload\n key={docFile.id}\n label={docFile.displayName}\n accept={docFile.allowedTypes}\n multiple={docFile.multipleFile}\n maxSize={docFile.maxEachFileSizeByte}\n value={files[docFile.id] || []}\n onChange={(newFiles) => {\n setFiles((prev) => ({ ...prev, [docFile.id]: newFiles }));\n }}\n />\n ))}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"submit\" isLoading={isSubmitting}>\n Continue\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React from 'react';\nimport { useOverview } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Spinner } from '../core';\n\nexport interface OverviewStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Overview step component\n */\nexport const OverviewStep: React.FC<OverviewStepProps> = ({ applicantId, onComplete, onBack }) => {\n const { overview, isLoading, isSubmitting, error, passOverview } = useOverview(applicantId);\n\n const handleConfirm = async () => {\n await passOverview();\n onComplete?.();\n };\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading overview: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!overview) return null;\n\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{overview.title || 'Overview'}</h2>\n {overview.description && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">{overview.description}</p>\n )}\n </CardHeader>\n\n <CardContent className=\"space-y-8\">\n {overview.steps && overview.steps.length > 0 ? (\n overview.steps\n .sort((a, b) => a.order - b.order)\n .map((step) => (\n <div key={step.order} className=\"metakyc-overview-step-item flex items-center space-x-3\">\n <div className=\"metakyc-step-icon flex-shrink-0\">\n <div className=\"w-8 h-8 rounded-full bg-primary-500 text-white flex items-center justify-center font-medium text-sm\">\n {step.order + 1}\n </div>\n </div>\n <div \n className=\"metakyc-step-content\"\n style={{\n flex: 1,\n border: 'none',\n height: 'auto',\n background: 'transparent',\n }}\n >\n <span className=\"metakyc-step-title text-sm font-semibold text-gray-900 dark:text-white\">\n {step.title}\n </span>\n {step.description && (\n <p className=\"metakyc-step-description text-sm text-gray-600 dark:text-gray-400\">\n {step.description}\n </p>\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-center py-8\">\n <p className=\"text-gray-600 dark:text-gray-400\">Loading overview data...</p>\n </div>\n )}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button onClick={handleConfirm} isLoading={isSubmitting}>\n Continue\n </Button>\n </CardFooter>\n </Card>\n );\n};\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { useRiskScoring } from '../../hooks';\nimport { useMetaKYC } from '../../context/useMetaKYC';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Select, Spinner } from '../core';\nimport { RiskCalculationInput, RiskCriteriaDto, ValueDataType } from '../../types';\nimport { ChevronRight, ChevronLeft } from 'lucide-react';\n\nexport interface RiskScoringStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n// ── Money formatting helpers ───────────────────────────────────────────────\n\n/**\n * Converts a locale string (e.g. \"de\", \"de-AT\", \"EN\") to a BCP-47 tag.\n * Falls back to 'en' if the tag is invalid.\n */\nfunction resolveLocale(locale: string | undefined): string {\n const tag = (locale ?? 'en').toLowerCase().replace('_', '-');\n try {\n Intl.NumberFormat.supportedLocalesOf([tag]);\n return tag;\n } catch {\n return 'en';\n }\n}\n\n/**\n * Returns true when the criterion uses Money / Decimal data type AND has\n * pre-defined string options (radio / checkbox) that may contain numbers.\n */\nfunction isMoneyWithOptions(criterion: RiskCriteriaDto): boolean {\n return (\n criterion.valueDataType === ValueDataType.Money &&\n Array.isArray(criterion.defaultValues) &&\n criterion.defaultValues.length > 0\n );\n}\n\n/**\n * Formats every standalone integer/decimal number inside a label string\n * according to the given locale.\n * Examples (locale = \"de\"):\n * \"5000 - 10000\" → \"5.000 – 10.000\"\n * \"up to 5000\" → \"up to 5.000\"\n * \"> 30000\" → \"> 30.000\"\n *\n * The regex matches numbers that are NOT already formatted with separators so\n * we only touch plain digits (possibly with a decimal dot, e.g. \"1234.56\").\n */\nfunction formatMoneyLabel(raw: string, locale: string): string {\n const fmt = new Intl.NumberFormat(resolveLocale(locale), {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n // Match bare numbers: optional leading sign, digits, optional decimal part.\n return raw.replace(/([\\d]+(?:\\.\\d+)?)/g, (match) => {\n const num = parseFloat(match);\n return isNaN(num) ? match : fmt.format(num);\n });\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface PagedCriterion {\n criterion: RiskCriteriaDto;\n idx: number;\n}\n\ntype Answers = Record<number, string[]>; // criteriaId → values\ntype Errors = Record<number, string>; // criteriaId → error message\n\n// ── Validation ────────────────────────────────────────────────────────────\n\nfunction validateCriterion(criterion: RiskCriteriaDto, values: string[]): string | null {\n const isEmpty = !values || values.length === 0 || values.every(v => !v || !v.trim());\n\n if (criterion.isRequired && isEmpty) {\n return criterion.errorMessage || `${criterion.displayName} is required`;\n }\n\n if (!isEmpty) {\n const first = values[0] ?? '';\n\n // Regex validation (string types)\n if (first && criterion.regex) {\n try {\n if (!new RegExp(criterion.regex).test(first)) {\n return criterion.errorMessage || 'Invalid format';\n }\n } catch { /* ignore invalid regex */ }\n }\n\n // Numeric min/max for Integer/Money/DigitOnly types\n const isNumeric =\n criterion.valueDataType === ValueDataType.Integer ||\n criterion.valueDataType === ValueDataType.Money ||\n criterion.valueDataType === ValueDataType.DigitOnly;\n\n if (isNumeric && first.trim() !== '') {\n const num = Number(first);\n if (!isNaN(num)) {\n if (criterion.min !== undefined && criterion.min !== null && num < criterion.min) {\n return `Minimum value is ${criterion.min}`;\n }\n if (criterion.max !== undefined && criterion.max !== null && num > criterion.max) {\n return `Maximum value is ${criterion.max}`;\n }\n }\n } else if (!isNumeric && first !== '') {\n // String length bounds for text types\n if (criterion.min !== undefined && criterion.min !== null && first.length < criterion.min) {\n return `Minimum length is ${criterion.min} characters`;\n }\n if (criterion.max !== undefined && criterion.max !== null && first.length > criterion.max) {\n return `Maximum length is ${criterion.max} characters`;\n }\n }\n }\n\n return null;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction buildPages(criteria: RiskCriteriaDto[]): PagedCriterion[][] {\n const map = new Map<number, PagedCriterion[]>();\n criteria.forEach((criterion, idx) => {\n // pageNumber <= 0 or undefined means \"first page\" (no specific pagination)\n const p = (criterion.pageNumber != null && criterion.pageNumber > 0) ? criterion.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push({ criterion, idx });\n });\n\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, cs]) => cs);\n}\n\nfunction getInputType(criterion: RiskCriteriaDto): 'text' | 'radio' | 'checkbox' | 'country' {\n if (criterion.builtInType === 1) return 'country';\n if (!criterion.defaultValues || criterion.defaultValues.length === 0) return 'text';\n return criterion.multipleValue ? 'checkbox' : 'radio';\n}\n\n// ── Component ─────────────────────────────────────────────────────────────\n\nexport const RiskScoringStep: React.FC<RiskScoringStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { config } = useMetaKYC();\n const locale = config.locale ?? 'en';\n const { criteria, initialAnswers, isLoading, isSubmitting, error, submit } = useRiskScoring(applicantId);\n\n const [answers, setAnswers] = useState<Answers>({});\n const [fieldErrors, setFieldErrors] = useState<Errors>({});\n const [currentPage, setCurrentPage] = useState(0);\n const [autoSubmitted, setAutoSubmitted] = useState(false);\n\n // Seed answers with existing data when loaded (only if user hasn't entered anything yet)\n React.useEffect(() => {\n if (initialAnswers && Object.keys(initialAnswers).length > 0 && Object.keys(answers).length === 0) {\n setAnswers(initialAnswers);\n }\n }, [initialAnswers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const pages = useMemo(\n () => (criteria && criteria.length > 0 ? buildPages(criteria) : []),\n [criteria]\n );\n\n const isLastPage = currentPage === pages.length - 1;\n const currentCriteria = pages[currentPage] ?? [];\n\n // Auto-submit when no criteria exist\n React.useEffect(() => {\n if (!isLoading && criteria && criteria.length === 0 && !autoSubmitted && !isSubmitting) {\n setAutoSubmitted(true);\n submit({ applicantId, criteriaValueInputs: [] })\n .then(() => onComplete?.())\n .catch(console.error);\n }\n }, [isLoading, criteria, autoSubmitted, isSubmitting, submit, applicantId, onComplete]);\n\n const setAnswer = useCallback((criteriaId: number, values: string[]) => {\n setAnswers(prev => ({ ...prev, [criteriaId]: values }));\n setFieldErrors(prev => { const e = { ...prev }; delete e[criteriaId]; return e; });\n }, []);\n\n const validatePage = useCallback((): boolean => {\n const newErrors: Errors = {};\n for (const { criterion } of currentCriteria) {\n const err = validateCriterion(criterion, answers[criterion.id] ?? []);\n if (err) newErrors[criterion.id] = err;\n }\n setFieldErrors(prev => ({ ...prev, ...newErrors }));\n return Object.keys(newErrors).length === 0;\n }, [currentCriteria, answers]);\n\n const handleNext = () => {\n if (validatePage()) setCurrentPage(p => p + 1);\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage(p => p - 1);\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validatePage() || !criteria) return;\n\n try {\n const criteriaValueInputs = criteria\n .map(c => {\n const vals = (answers[c.id] ?? []).filter(v => v && v.trim());\n return vals.length > 0 ? { riskCriteriaId: c.id, values: vals } : null;\n })\n .filter((x): x is NonNullable<typeof x> => x !== null);\n\n const input: RiskCalculationInput = { applicantId, criteriaValueInputs };\n await submit(input);\n onComplete?.();\n } catch (e) {\n console.error('Risk scoring submit error:', e);\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-sm mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Loading risk scoring criteria…\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (!isLoading && criteria && criteria.length === 0) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-sm mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n No criteria required. Moving to next step…\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading criteria: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!criteria) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 className=\"text-lg font-bold\">Risk Assessment</h2>\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Please answer the following questions for risk evaluation\n </p>\n\n {/* Page indicator — only when multiple pages */}\n {pages.length > 1 && (\n <div className=\"flex items-center justify-between mt-3\">\n <span className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n Page {currentPage + 1} of {pages.length}\n </span>\n <div className=\"flex items-center gap-1.5\">\n {pages.map((_, i) => (\n <div\n key={i}\n className=\"rounded-full transition-all duration-200\"\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Criteria for current page */}\n <CardContent className=\"space-y-6\">\n {currentCriteria.map(({ criterion }) => (\n <CriterionField\n key={criterion.id}\n criterion={criterion}\n value={answers[criterion.id] ?? []}\n error={fieldErrors[criterion.id]}\n locale={locale}\n onChange={vals => setAnswer(criterion.id, vals)}\n />\n ))}\n </CardContent>\n\n {/* Footer navigation */}\n <CardFooter className=\"flex items-center justify-between\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n <ChevronLeft size={14} />\n {currentPage > 0 ? 'Previous' : 'Back'}\n </Button>\n\n {isLastPage ? (\n <Button type=\"button\" isLoading={isSubmitting} onClick={handleSubmit}>\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n Next\n <ChevronRight size={14} />\n </Button>\n )}\n </CardFooter>\n\n {error && (\n <div className=\"mx-6 mb-4 p-3 bg-red-50 border border-red-200 rounded\">\n <p className=\"text-red-600 text-sm\">{(error as Error).message}</p>\n </div>\n )}\n </Card>\n );\n};\n\n// ── CriterionField ─────────────────────────────────────────────────────────\n\ninterface CriterionFieldProps {\n criterion: RiskCriteriaDto;\n value: string[];\n error?: string;\n locale: string;\n onChange: (values: string[]) => void;\n}\n\nconst CriterionField: React.FC<CriterionFieldProps> = ({ criterion, value, error, locale, onChange }) => {\n const inputType = getInputType(criterion);\n\n const isNumeric =\n criterion.valueDataType === ValueDataType.Integer ||\n criterion.valueDataType === ValueDataType.Money ||\n criterion.valueDataType === ValueDataType.DigitOnly;\n\n // When this criterion has Money type + predefined options, show locale-formatted\n // labels but keep the original API string as the stored/submitted value.\n const moneyOptions = isMoneyWithOptions(criterion);\n const getLabel = (raw: string) =>\n moneyOptions ? formatMoneyLabel(raw, locale) : raw;\n\n return (\n <div className=\"space-y-2\">\n {/* Label */}\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {criterion.displayName}\n {criterion.isRequired && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n\n {/* Description */}\n {criterion.description && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {criterion.description}\n </p>\n )}\n\n {/* min/max hint for numeric fields */}\n {isNumeric && (criterion.min !== undefined || criterion.max !== undefined) && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {criterion.min !== undefined && criterion.max !== undefined\n ? `Range: ${criterion.min} – ${criterion.max}`\n : criterion.min !== undefined\n ? `Minimum: ${criterion.min}`\n : `Maximum: ${criterion.max}`}\n </p>\n )}\n\n {/* Text / numeric input */}\n {inputType === 'text' && (\n <Input\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n type={isNumeric ? 'number' : 'text'}\n placeholder=\"Enter your answer…\"\n error={error}\n required={criterion.isRequired}\n min={criterion.min}\n max={criterion.max}\n onKeyDown={e => {\n if (criterion.valueDataType === ValueDataType.DigitOnly) {\n if (['e', 'E', '+', '-', '.'].includes(e.key)) e.preventDefault();\n }\n }}\n />\n )}\n\n {/* Radio buttons */}\n {inputType === 'radio' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(criterion.defaultValues ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={value[0] === answer}\n onChange={() => onChange([answer])}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {getLabel(answer)}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Checkboxes */}\n {inputType === 'checkbox' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(criterion.defaultValues ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={value.includes(answer)}\n onChange={e => {\n if (e.target.checked) {\n onChange([...value, answer]);\n } else {\n onChange(value.filter(v => v !== answer));\n }\n }}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {getLabel(answer)}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Country dropdown */}\n {inputType === 'country' && (\n <Select\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n options={[\n { value: 'US', label: 'United States' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'AE', label: 'United Arab Emirates' },\n ]}\n placeholder=\"Select a country…\"\n error={error}\n required={criterion.isRequired}\n />\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button } from '../core';\nimport { InvestorCategorizationType, InvestorCategorizationInput } from '../../types';\n\nexport interface InvestorCategorizationStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Investor Categorization step component\n * Static UI for selecting investor type\n */\nexport const InvestorCategorizationStep: React.FC<InvestorCategorizationStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { investorCategorizationService } = useMetaKYC();\n const [selectedType, setSelectedType] = useState<InvestorCategorizationType | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (selectedType === null) {\n setError('Please select an investor type');\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const input: InvestorCategorizationInput = {\n applicantId,\n investorType: selectedType,\n };\n\n console.log('Submitting investor categorization:', input);\n const result = await investorCategorizationService.setInvestorCategorization(input);\n console.log('Investor categorization result:', result);\n\n onComplete?.();\n } catch (err: any) {\n console.error('Error submitting investor categorization:', err);\n setError(err.message || 'Failed to submit investor categorization');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white\">\n Which statement best describes you?\n </h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\n All Tokenise clients are treated as Retail Investors under EU regulation, which gives you the \n highest level of investor protection. For our internal purposes, we ask you to select the \n description that best matches your situation\n </p>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300 mb-3\">\n Choose one\n </p>\n\n {/* Individual Investor */}\n <label\n className={`\n block p-4 border-2 rounded-lg cursor-pointer transition-all\n ${\n selectedType === InvestorCategorizationType.Individual\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }\n `}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.Individual}\n checked={selectedType === InvestorCategorizationType.Individual}\n onChange={() => setSelectedType(InvestorCategorizationType.Individual)}\n className=\"mt-1 h-4 w-4 text-primary-500 border-gray-300 focus:ring-primary-500\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold text-gray-900 dark:text-white\">\n Individual investor\n </div>\n <div className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n (Recommended) Most of our clients choose this option. Provides the strongest protection \n and aligns with our mission to make investing accessible to everyone.\n </div>\n </div>\n </div>\n </label>\n\n {/* Sophisticated Investor */}\n <label\n className={`\n block p-4 border-2 rounded-lg cursor-pointer transition-all\n ${\n selectedType === InvestorCategorizationType.Sophisticated\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }\n `}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.Sophisticated}\n checked={selectedType === InvestorCategorizationType.Sophisticated}\n onChange={() => setSelectedType(InvestorCategorizationType.Sophisticated)}\n className=\"mt-1 h-4 w-4 text-primary-500 border-gray-300 focus:ring-primary-500\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold text-gray-900 dark:text-white\">\n Sophisticated investor\n </div>\n <div className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n In the last 2 years, I have done one or more of the following:\n </div>\n <ul className=\"text-sm text-gray-600 dark:text-gray-400 mt-2 space-y-1 list-none\">\n <li>Worked in private equity or provided capital to small and medium enterprises, and/or</li>\n <li>Been the director of a company with an annual turnover of at least (USD) $2m million, and/or</li>\n <li>Invested directly in at least 2 private (not listed) companies.</li>\n </ul>\n </div>\n </div>\n </label>\n\n {/* High Networth Investor */}\n <label\n className={`\n block p-4 border-2 rounded-lg cursor-pointer transition-all\n ${\n selectedType === InvestorCategorizationType.HighNetWorth\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }\n `}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.HighNetWorth}\n checked={selectedType === InvestorCategorizationType.HighNetWorth}\n onChange={() => setSelectedType(InvestorCategorizationType.HighNetWorth)}\n className=\"mt-1 h-4 w-4 text-primary-500 border-gray-300 focus:ring-primary-500\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold text-gray-900 dark:text-white\">\n High networth investor\n </div>\n <div className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n I earn more than (USD/EUR) $150,000 per year, and/or<br />\n I have net assets (excluding my main property) of at least $/EUR 300,000\n </div>\n </div>\n </div>\n </label>\n\n {/* Error Display */}\n {error && (\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400 text-sm\">\n <strong>Error:</strong> {error}\n </p>\n </div>\n )}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button \n type=\"submit\" \n isLoading={isSubmitting}\n disabled={selectedType === null}\n >\n Submit\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Spinner, Badge } from '../core';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n AppropriatenessQuestionResult,\n} from '../../types';\n\nexport interface AppropriatenessTestStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Appropriateness Test step component\n * Quiz with timer and retry limit\n */\nexport const AppropriatenessTestStep: React.FC<AppropriatenessTestStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { appropriatenessTestService } = useMetaKYC();\n \n // State\n const [testData, setTestData] = useState<AppropriatenessTestOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [answers, setAnswers] = useState<Record<number, string>>({});\n const [timeRemaining, setTimeRemaining] = useState<number>(0);\n const [isTestStarted, setIsTestStarted] = useState(false);\n const [isTestExpired, setIsTestExpired] = useState(false);\n const [waitTimeRemaining, setWaitTimeRemaining] = useState<number>(0);\n\n // Load test data\n useEffect(() => {\n const loadTest = async () => {\n try {\n setIsLoading(true);\n setError(null);\n console.log('Loading appropriateness test for applicant:', applicantId);\n \n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n console.log('Appropriateness test data:', data);\n \n setTestData(data);\n \n // Parse wait time if needed\n if (data.waitTimeSpanForNextTry && data.waitTimeSpanForNextTry !== '00:00:00') {\n const waitSeconds = parseTimeSpan(data.waitTimeSpanForNextTry);\n if (waitSeconds > 0) {\n setWaitTimeRemaining(waitSeconds);\n }\n }\n } catch (err: any) {\n console.error('Error loading appropriateness test:', err);\n setError(err.message || 'Failed to load appropriateness test');\n } finally {\n setIsLoading(false);\n }\n };\n\n loadTest();\n }, [applicantId, appropriatenessTestService]);\n\n // Parse TimeSpan string (e.g., \"00:05:00\") to seconds\n const parseTimeSpan = (timeSpan: string): number => {\n const parts = timeSpan.split(':').map(Number);\n if (parts.length === 3) {\n const [hours, minutes, seconds] = parts;\n return hours * 3600 + minutes * 60 + seconds;\n }\n return 0;\n };\n\n // Format seconds to MM:SS\n const formatTime = (seconds: number): string => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n };\n\n // Timer countdown\n useEffect(() => {\n if (!isTestStarted || timeRemaining <= 0) return;\n\n const timer = setInterval(() => {\n setTimeRemaining((prev) => {\n if (prev <= 1) {\n setIsTestExpired(true);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [isTestStarted, timeRemaining]);\n\n // Wait time countdown\n useEffect(() => {\n if (waitTimeRemaining <= 0) return;\n\n const timer = setInterval(() => {\n setWaitTimeRemaining((prev) => {\n if (prev <= 1) {\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [waitTimeRemaining]);\n\n // Auto-submit when time expires\n useEffect(() => {\n if (isTestExpired && !isSubmitting) {\n handleSubmit();\n }\n }, [isTestExpired]);\n\n // Start test\n const handleStartTest = () => {\n if (!testData) return;\n setIsTestStarted(true);\n setTimeRemaining(testData.testDurationSec);\n };\n\n // Handle answer change\n const handleAnswerChange = (questionId: number, answer: string) => {\n setAnswers((prev) => ({\n ...prev,\n [questionId]: answer,\n }));\n };\n\n // Submit test\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n\n if (!testData) return;\n\n // Check if all questions are answered (unless time expired)\n if (!isTestExpired) {\n const unansweredCount = testData.appropriatenessQuestions.length - Object.keys(answers).length;\n if (unansweredCount > 0) {\n setError(`Please answer all questions. ${unansweredCount} question(s) remaining.`);\n return;\n }\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const questionResults: AppropriatenessQuestionResult[] = testData.appropriatenessQuestions.map(\n (q) => ({\n appropriatenessQuestionId: q.id,\n value: answers[q.id] || '', // Empty string if not answered\n })\n );\n\n const input: FillAppropriatenessTestInput = {\n applicantId,\n appropriatenessTestId: testData.id,\n appropriatenessQuestionResults: questionResults,\n };\n\n console.log('Submitting appropriateness test:', input);\n \n try {\n const result = await appropriatenessTestService.fillAppropriatenessTest(input);\n console.log('Appropriateness test result:', result);\n\n // Check if passed (success message contains \"pass\" or similar)\n if (result.message && (\n result.message.toLowerCase().includes('pass') ||\n result.message.toLowerCase().includes('success') ||\n result.message.toLowerCase().includes('congratulations')\n )) {\n // Test passed, proceed to next step\n onComplete?.();\n } else {\n // Unclear result, show message and reload\n setError(result.message || 'Test completed. Please check the result.');\n setIsTestStarted(false);\n setIsTestExpired(false);\n setAnswers({});\n \n // Reload test data\n setTimeout(() => reloadTestData(), 1000);\n }\n } catch (err: any) {\n // Handle 400 error (test failed)\n // The ErrorHandler already extracts the message from response.data.result.message\n if (err.code === 400 && err.message) {\n const failureMessage = err.message;\n console.log('Test failed:', failureMessage);\n \n // Show failure message\n setError(failureMessage);\n setIsTestStarted(false);\n setIsTestExpired(false);\n setAnswers({});\n \n // Reload test data to get updated retry count and wait time\n setTimeout(() => reloadTestData(), 1500);\n } else {\n // Other error, rethrow\n throw err;\n }\n }\n } catch (err: any) {\n console.error('Error submitting appropriateness test:', err);\n setError(err.message || 'Failed to submit test. Please try again.');\n setIsTestStarted(false);\n setIsTestExpired(false);\n setAnswers({});\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // Reload test data helper\n const reloadTestData = async () => {\n try {\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n console.log('Reloaded test data:', data);\n setTestData(data);\n \n // Parse wait time if needed\n if (data.waitTimeSpanForNextTry && data.waitTimeSpanForNextTry !== '00:00:00') {\n const waitSeconds = parseTimeSpan(data.waitTimeSpanForNextTry);\n if (waitSeconds > 0) {\n setWaitTimeRemaining(waitSeconds);\n }\n }\n } catch (err: any) {\n console.error('Error reloading test data:', err);\n setError((prev) => prev + '\\n\\nFailed to reload test data. Please refresh the page.');\n }\n };\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">\n Loading appropriateness test...\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (!testData) {\n return (\n <Card>\n <CardContent className=\"py-12 text-center\">\n <p className=\"text-danger-500 text-lg mb-4\">No test data available</p>\n {error && <p className=\"text-gray-600 dark:text-gray-400\">{error}</p>}\n </CardContent>\n </Card>\n );\n }\n\n // Show wait time screen if user needs to wait\n if (waitTimeRemaining > 0) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white\">\n {testData.displayName}\n </h2>\n {testData.subtitle && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">{testData.subtitle}</p>\n )}\n </CardHeader>\n <CardContent className=\"py-12 text-center\">\n <div className=\"mb-6\">\n <div className=\"text-6xl font-bold text-primary-500 mb-2\">\n {formatTime(waitTimeRemaining)}\n </div>\n <p className=\"text-gray-600 dark:text-gray-400\">\n Please wait before attempting the test again\n </p>\n </div>\n {error && (\n <div className=\"mt-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400 text-sm\">{error}</p>\n </div>\n )}\n </CardContent>\n </Card>\n );\n }\n\n // Calculate remaining attempts\n const attemptsRemaining = testData.testAllowedMaxTry - testData.totalFailedTries;\n\n // Show start screen if test hasn't started\n if (!isTestStarted) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white\">\n {testData.displayName}\n </h2>\n {testData.subtitle && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">{testData.subtitle}</p>\n )}\n </CardHeader>\n <CardContent>\n {testData.description && (\n <div className=\"mb-6 p-4 bg-gray-50 dark:bg-gray-800 rounded-lg\">\n <p className=\"text-gray-700 dark:text-gray-300\">{testData.description}</p>\n </div>\n )}\n\n <div className=\"space-y-4 mb-6\">\n <div className=\"flex items-center justify-between p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300 font-medium\">Total Questions:</span>\n <Badge variant=\"info\">{testData.totalQuestionCount}</Badge>\n </div>\n <div className=\"flex items-center justify-between p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300 font-medium\">Time Limit:</span>\n <Badge variant=\"info\">{formatTime(testData.testDurationSec)}</Badge>\n </div>\n <div className=\"flex items-center justify-between p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300 font-medium\">\n Correct Answers Required:\n </span>\n <Badge variant=\"info\">{testData.testCorrectAnswerPassLimit}</Badge>\n </div>\n <div className=\"flex items-center justify-between p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300 font-medium\">Attempts Remaining:</span>\n <Badge variant={attemptsRemaining > 1 ? 'success' : 'warning'}>\n {attemptsRemaining}\n </Badge>\n </div>\n </div>\n\n {error && (\n <div className=\"mb-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400 text-sm\">\n <strong>Previous Attempt:</strong> {error}\n </p>\n </div>\n )}\n\n {attemptsRemaining <= 0 && (\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400\">\n You have used all your attempts. Please contact support for assistance.\n </p>\n </div>\n )}\n </CardContent>\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button\n type=\"button\"\n onClick={handleStartTest}\n disabled={attemptsRemaining <= 0}\n >\n Start Test\n </Button>\n </CardFooter>\n </Card>\n );\n }\n\n // Show test questions\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white\">\n {testData.displayName}\n </h2>\n {testData.subtitle && (\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">{testData.subtitle}</p>\n )}\n </div>\n <div className=\"text-right\">\n <div\n className={`text-3xl font-bold ${\n timeRemaining <= 60 ? 'text-danger-500' : 'text-primary-500'\n }`}\n >\n {formatTime(timeRemaining)}\n </div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">Time Remaining</p>\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n {/* Progress indicator */}\n <div className=\"flex items-center justify-between mb-4\">\n <Badge variant=\"info\">\n Question {Object.keys(answers).length} of {testData.totalQuestionCount}\n </Badge>\n <Badge variant={attemptsRemaining > 1 ? 'success' : 'warning'}>\n {attemptsRemaining} attempt{attemptsRemaining !== 1 ? 's' : ''} remaining\n </Badge>\n </div>\n\n {/* Questions */}\n {testData.appropriatenessQuestions.map((question, index) => (\n <div\n key={question.id}\n className=\"p-4 border border-gray-200 dark:border-gray-700 rounded-lg\"\n >\n <div className=\"mb-4\">\n <span className=\"inline-block px-2 py-1 text-xs font-semibold text-primary-700 bg-primary-100 dark:text-primary-300 dark:bg-primary-900/30 rounded mb-2\">\n Question {index + 1}\n </span>\n {question.groupName && (\n <span className=\"ml-2 text-xs text-gray-500 dark:text-gray-400\">\n {question.groupName}\n </span>\n )}\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mt-2\">\n {question.question}\n </h3>\n </div>\n\n <div className=\"space-y-2\">\n {question.answers.map((answer, answerIndex) => (\n <label\n key={answerIndex}\n className={`\n flex items-center p-3 border-2 rounded-lg cursor-pointer transition-all\n ${\n answers[question.id] === answer\n ? 'border-primary-500 bg-primary-50 dark:bg-primary-900/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }\n `}\n >\n <input\n type=\"radio\"\n name={`question-${question.id}`}\n value={answer}\n checked={answers[question.id] === answer}\n onChange={(e) => handleAnswerChange(question.id, e.target.value)}\n className=\"h-4 w-4 text-primary-500 border-gray-300 focus:ring-primary-500\"\n disabled={isSubmitting}\n />\n <span className=\"ml-3 text-gray-700 dark:text-gray-300\">{answer}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n\n {/* Error Display */}\n {error && !isTestExpired && (\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-600 dark:text-red-400 text-sm\">\n <strong>Error:</strong> {error}\n </p>\n </div>\n )}\n\n {isTestExpired && (\n <div className=\"p-4 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg\">\n <p className=\"text-yellow-700 dark:text-yellow-400 text-sm\">\n <strong>Time's up!</strong> Your answers are being submitted automatically.\n </p>\n </div>\n )}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onBack}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n isLoading={isSubmitting}\n disabled={Object.keys(answers).length < testData.totalQuestionCount}\n >\n {isTestExpired ? 'Submitting...' : 'Submit Test'}\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport { useForm, Controller } from 'react-hook-form';\nimport { useIdentityVerification } from '../../hooks';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Spinner } from '../core';\nimport { SearchableSelect } from '../core/SearchableSelect';\nimport { IdentityProviderManager } from '../../identity/provider-manager';\nimport { IdentityVerificationProvider, ApplicantDataDto } from '../../types';\nimport { FormPage, FormFieldEntry, FIELD_METADATA } from '../../types/form-config';\n\nexport interface IdentityVerificationStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Identity verification step component\n * Shows review/confirm form BEFORE calling identity request\n */\nexport const IdentityVerificationStep: React.FC<IdentityVerificationStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { applicantService, baseInformationService, config, currentTheme } = useMetaKYC();\n const { identityData, provider, token, isLoading: identityLoading, error, requestIdentity, restartIdentity } =\n useIdentityVerification(applicantId);\n const [providerInstance, setProviderInstance] = useState<any>(null);\n const [applicantData, setApplicantData] = useState<ApplicantDataDto | null>(null);\n const [countries, setCountries] = useState<Array<{ value: string; label: string }>>([]);\n // Phone-number country list (value = countryCode e.g. \"+43\", label = \"+43 – Austria\")\n const [phoneCountries, setPhoneCountries] = useState<Array<{ value: string; label: string }>>([]);\n const [isLoadingData, setIsLoadingData] = useState(true);\n const [showProvider, setShowProvider] = useState(false);\n const [providerError, setProviderError] = useState<string | null>(null);\n const [isExpired, setIsExpired] = useState(false);\n const hasAutoRequestedRef = React.useRef(false);\n\n // Dynamic review-form data (built-in editable field values)\n const [reviewData, setReviewData] = useState<Record<string, any>>({});\n // State for interactive custom fields on the review page (keyed by paramName)\n const [customData, setCustomData] = useState<Record<string, any>>({});\n\n // The configured review page (from theme) — first element is the single page\n const reviewPage: FormPage | null =\n (currentTheme?.reviewPageFields && currentTheme.reviewPageFields.length > 0)\n ? currentTheme.reviewPageFields[0]\n : null;\n\n // When review page is disabled: skip the review UI and auto-request identity\n const reviewPageDisabled = !!currentTheme?.reviewPageDisabled;\n // Keep a ref so async callbacks always read the latest value\n const reviewPageDisabledRef = useRef(false);\n reviewPageDisabledRef.current = reviewPageDisabled;\n\n const form = useForm({\n defaultValues: {\n street: '',\n streetNumber: '',\n city: '',\n zip: '',\n country: '',\n nationality: '',\n phonenumber: '',\n },\n });\n\n // Load applicant data and countries\n useEffect(() => {\n // ── Review page disabled: skip review UI, auto-request identity directly ──\n if (reviewPageDisabled) {\n if (!hasAutoRequestedRef.current) {\n hasAutoRequestedRef.current = true;\n requestIdentity()\n .then(() => setShowProvider(true))\n .catch(err => console.error('[Identity] Auto-request failed:', err))\n .finally(() => setIsLoadingData(false));\n }\n return;\n }\n\n const loadData = async () => {\n try {\n const [data, countriesData, phoneData] = await Promise.all([\n applicantService.getApplicantData(applicantId),\n baseInformationService.getCountries('', 'en'),\n baseInformationService.getCountries('', 'en', 40), // CountriesType.PhoneNumber\n ]);\n setApplicantData(data);\n \n // Build a deduplicated country option list (abbreviation3 as value)\n const seen = new Set<string>();\n const countryOptions = countriesData\n .map(c => ({ value: c.abbreviation3 || c.abbreviation, label: c.name }))\n .filter(c => {\n if (!c.value || seen.has(c.value)) return false;\n seen.add(c.value);\n return true;\n });\n setCountries(countryOptions);\n\n // Build phone-number country option list (countryCode as value, e.g. \"+43\")\n const phoneSeen = new Set<string>();\n const phoneOptions = phoneData\n .filter(c => c.countryCode)\n .map(c => ({ value: c.countryCode!, label: `${c.countryCode} – ${c.name}` }))\n .filter(c => {\n if (phoneSeen.has(c.value)) return false;\n phoneSeen.add(c.value);\n return true;\n });\n setPhoneCountries(phoneOptions);\n \n // Extract data from nested ApplicantRequestData\n const requestData = data.applicantRequestData;\n \n // Populate dynamic review-form data from applicant data\n setReviewData({\n firstName: requestData?.firstName || '',\n lastName: requestData?.lastName || '',\n email: requestData?.email || '',\n dateOfBirth: requestData?.dateOfBirth || '',\n title: requestData?.title || '',\n salutation: requestData?.salutation || '',\n phonenumber: requestData?.phonenumber || '',\n mobileCountryCode: requestData?.mobileCountryCode || '',\n street: requestData?.street || '',\n streetNumber: requestData?.streetNumber || '',\n city: requestData?.city || '',\n zip: requestData?.zip || '',\n country: requestData?.country || '',\n nationality: requestData?.nationality || '',\n taxCountry: requestData?.taxCountry || '',\n countryOfBirth: requestData?.countryOfBirth || '',\n placeOfBirth: requestData?.placeOfBirth || '',\n educationLevel: requestData?.educationLevel || '',\n occupation: requestData?.occupation || '',\n taxNumber: requestData?.taxNumber || '',\n defaultLanguage: requestData?.defaultLanguage || '',\n });\n\n // Set form default values from applicant request data (static fallback)\n form.reset({\n street: requestData?.street || '',\n streetNumber: requestData?.streetNumber || '',\n city: requestData?.city || '',\n zip: requestData?.zip || '',\n country: requestData?.country || '',\n nationality: requestData?.nationality || '',\n phonenumber: requestData?.phonenumber || '',\n });\n\n // Auto-skip to provider only when the review page is explicitly disabled\n // AND the applicant already has an active identity session.\n // When the review page is enabled (default), always show it first.\n const hasExistingIdentity =\n data.kycRecords &&\n data.kycRecords.length > 0 &&\n data.kycRecords[0].providerTokenObject !== null;\n\n if (hasExistingIdentity && !hasAutoRequestedRef.current && reviewPageDisabledRef.current) {\n console.log('[Identity] Review page disabled + existing identity — auto-requesting...');\n hasAutoRequestedRef.current = true;\n try {\n await requestIdentity();\n setShowProvider(true);\n } catch (err) {\n console.error('[Identity] Auto-request failed:', err);\n }\n }\n } catch (err) {\n console.error('Error loading applicant data:', err);\n } finally {\n setIsLoadingData(false);\n }\n };\n loadData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Only auto-show provider from cached hook state when the review page is disabled.\n // When review page is enabled the user must click Confirm to proceed.\n useEffect(() => {\n if (identityData && !showProvider && reviewPageDisabledRef.current) {\n console.log('[Identity] Review page disabled — showing cached provider');\n setShowProvider(true);\n }\n }, [identityData, showProvider]);\n\n // Check if token is expired or about to expire\n useEffect(() => {\n if (token) {\n // Check expiresAt field\n if (token.expiresAt) {\n const expirationTime = new Date(token.expiresAt).getTime();\n const now = Date.now();\n \n if (now >= expirationTime) {\n console.warn('[Identity] Token has expired (expiresAt)');\n setIsExpired(true);\n setProviderError('Your verification session has expired. Please restart.');\n return;\n }\n }\n\n // Check for expired token in URL or config\n if (token.url) {\n try {\n const url = new URL(token.url);\n // Check if URL contains expiration indicators\n const urlString = url.toString().toLowerCase();\n if (\n urlString.includes('expired') ||\n urlString.includes('invalid') ||\n urlString.includes('error')\n ) {\n console.warn('[Identity] Token URL indicates expiration');\n setIsExpired(true);\n setProviderError('Your verification link has expired. Please restart.');\n return;\n }\n } catch (err) {\n console.error('[Identity] Invalid token URL');\n }\n }\n\n // Check token object for expiration indicators\n if (\n token.status === 'expired' ||\n token.error === 'expired' ||\n token.expired === true\n ) {\n console.warn('[Identity] Token object indicates expiration');\n setIsExpired(true);\n setProviderError('Your verification session has expired. Please restart.');\n return;\n }\n }\n }, [token]);\n\n // Initialize identity provider when ready\n useEffect(() => {\n if (provider !== null && token && !providerInstance && showProvider && !isExpired) {\n const providerType = provider as number;\n\n // PRIORITY 1: Check if token contains a direct URL first (for web-based verification)\n // This applies to both Sumsub and SardinAI when a URL is provided\n if (token.url) {\n console.log('[Identity] Loading provider URL for user verification:', token.url);\n setProviderError(null);\n \n // Check if URL might be expired (basic check)\n try {\n new URL(token.url); // Validate URL format\n \n // For SardinAI: Also initialize Risk SDK in background while showing URL\n if (providerType === IdentityVerificationProvider.SardinAI) {\n console.log('[SardinAI] Initializing Risk SDK in background...');\n try {\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n \n instance.initialize()\n .then(() => {\n console.log('[SardinAI] Risk SDK initialized successfully in background');\n })\n .catch((err: Error) => {\n console.warn('[SardinAI] Risk SDK initialization failed (non-blocking):', err);\n });\n } catch (err: any) {\n console.warn('[SardinAI] Risk SDK setup failed (non-blocking):', err);\n }\n }\n \n // URL will be loaded in iframe - user completes verification there\n setProviderInstance({ type: 'url', url: token.url });\n } catch (err: any) {\n console.error('[Identity] Invalid URL:', err);\n setProviderError('Invalid verification URL. Please restart.');\n setIsExpired(true);\n }\n return;\n }\n\n // PRIORITY 2: For SardinAI without URL: Initialize Risk SDK only (no UI)\n if (providerType === IdentityVerificationProvider.SardinAI) {\n console.log('[SardinAI] No URL provided - initializing Risk SDK only...');\n setProviderError(null);\n \n try {\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n \n instance.initialize()\n .then(() => {\n console.log('[SardinAI] Risk SDK initialized successfully');\n setProviderInstance(instance);\n // Auto-complete after SDK initialization (no UI needed)\n setTimeout(() => {\n onComplete?.();\n }, 2000); // Give SDK time to collect initial data\n })\n .catch((err: Error) => {\n console.error('[SardinAI] Failed to initialize:', err);\n \n // Check for specific error messages that indicate expiration\n const errorMessage = err.message?.toLowerCase() || '';\n if (\n errorMessage.includes('expired') ||\n errorMessage.includes('invalid') ||\n errorMessage.includes('401') ||\n errorMessage.includes('400')\n ) {\n setIsExpired(true);\n setProviderError('Session expired or invalid. Please restart verification.');\n } else {\n setProviderError(`Failed to initialize: ${err.message}`);\n }\n });\n } catch (err: any) {\n console.error('[SardinAI] Error creating provider:', err);\n setProviderError(`Configuration error: ${err.message}`);\n }\n return;\n }\n\n // Otherwise, initialize JavaScript SDK\n try {\n setProviderError(null);\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n\n // Initialize based on provider type\n if (providerType === IdentityVerificationProvider.Sumsub) {\n instance.initialize('identity-container')\n .catch((err: Error) => {\n console.error('[Sumsub] Initialization error:', err);\n setProviderError(`Failed to initialize: ${err.message}`);\n \n // Check for expiration\n if (err.message?.toLowerCase().includes('expired')) {\n setIsExpired(true);\n }\n });\n if (instance.onComplete) {\n instance.onComplete(() => {\n onComplete?.();\n });\n }\n } else if (providerType === IdentityVerificationProvider.Onfido) {\n instance.initialize('identity-container')\n .catch((err: Error) => {\n console.error('[Onfido] Initialization error:', err);\n setProviderError(`Failed to initialize: ${err.message}`);\n });\n }\n\n setProviderInstance(instance);\n } catch (err: any) {\n console.error('[Identity] Provider setup error:', err);\n setProviderError(`Setup error: ${err.message}`);\n }\n }\n\n return () => {\n if (providerInstance && providerInstance.destroy) {\n try {\n providerInstance.destroy();\n } catch (err) {\n console.error('[Identity] Error destroying provider:', err);\n }\n }\n };\n }, [provider, token, providerInstance, showProvider, onComplete, isExpired]);\n\n // Handle confirm and start identity verification\n const handleConfirm = async () => {\n try {\n setProviderError(null);\n setIsExpired(false);\n // Request identity verification\n await requestIdentity();\n setShowProvider(true);\n } catch (err) {\n console.error('Error starting identity verification:', err);\n }\n };\n\n // Handle restart verification\n const handleRestart = async () => {\n try {\n setProviderError(null);\n setIsExpired(false);\n setProviderInstance(null);\n \n console.log('[Identity] Restarting verification...');\n \n // Call restart identity endpoint\n await restartIdentity();\n setShowProvider(true);\n } catch (err: any) {\n console.error('Error restarting identity verification:', err);\n setProviderError(err.message || 'Failed to restart verification');\n }\n };\n\n if (isLoadingData || identityLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">\n Loading identity verification...\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n // Show error/expired state with restart option\n if (showProvider && (providerError || isExpired)) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n Verification Session Issue\n </h2>\n </CardHeader>\n <CardContent>\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg mb-6\">\n <div className=\"flex items-start\">\n <svg\n className=\"h-6 w-6 text-red-600 dark:text-red-400 mr-3 mt-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <h3 className=\"font-semibold text-red-900 dark:text-red-100 mb-1\">\n {isExpired ? 'Session Expired' : 'Verification Error'}\n </h3>\n <p className=\"text-red-800 dark:text-red-200 text-sm\">\n {providerError || 'Your verification session has expired and needs to be restarted.'}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4\">\n <h3 className=\"font-semibold text-blue-900 dark:text-blue-100 mb-2\">\n What to do next:\n </h3>\n <ul className=\"text-blue-800 dark:text-blue-200 text-sm space-y-1 list-disc list-inside\">\n <li>Click \"Restart Verification\" below to generate a new session</li>\n <li>Complete the verification process without delays</li>\n <li>If issues persist, contact support</li>\n </ul>\n </div>\n </CardContent>\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"button\" onClick={handleRestart} disabled={identityLoading}>\n {identityLoading ? 'Restarting...' : 'Restart Verification'}\n </Button>\n </CardFooter>\n </Card>\n );\n }\n\n // Show identity provider if already requested\n if (showProvider && identityData) {\n const providerType = provider as number;\n\n // PRIORITY 1: If token has a direct URL, show it in an iframe (any provider)\n if (token?.url) {\n return (\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-2xl font-bold\">Identity Verification</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Please complete the identity verification process\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRestart}\n disabled={identityLoading}\n >\n Restart\n </Button>\n </div>\n </CardHeader>\n\n <CardContent>\n {/* Info box about expiration */}\n <div className=\"mb-4 p-3 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg\">\n <p className=\"text-yellow-800 dark:text-yellow-200 text-sm\">\n <strong>Important:</strong> If you see an \"expired\" or \"invalid link\" message below, \n click the \"Restart\" button above to generate a new verification session.\n </p>\n </div>\n\n <div className=\"w-full\" style={{ height: '600px' }}>\n <iframe\n src={token.url}\n className=\"w-full h-full border-0 rounded-lg\"\n allow=\"camera; microphone; geolocation\"\n title=\"Identity Verification\"\n onLoad={(e) => {\n console.log('[Identity] Iframe loaded');\n // Try to detect expiration from iframe content (limited by CORS)\n try {\n const iframe = e.target as HTMLIFrameElement;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (iframeDoc) {\n const text = iframeDoc.body?.textContent?.toLowerCase() || '';\n if (\n text.includes('expired') ||\n text.includes('invalid') ||\n text.includes('error')\n ) {\n console.warn('[Identity] Iframe shows expiration message');\n setIsExpired(true);\n setProviderError('Your verification link has expired.');\n }\n }\n } catch (err) {\n // CORS restriction - can't access iframe content\n console.log('[Identity] Cannot check iframe content (CORS)');\n }\n }}\n />\n </div>\n </CardContent>\n\n {onBack && (\n <CardFooter>\n <Button variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n </CardFooter>\n )}\n </Card>\n );\n }\n\n // For SardinAI without URL: Show loading indicator while SDK collects data\n if (providerType === IdentityVerificationProvider.SardinAI) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold\">Device Risk Assessment</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Analyzing device security and behavioral patterns...\n </p>\n </CardHeader>\n\n <CardContent>\n <div className=\"text-center py-12\">\n <Spinner className=\"mb-4\" />\n <p className=\"text-gray-600 dark:text-gray-400\">\n Please wait while we verify your device security\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-500 mt-2\">\n This process is automatic and will complete in a few seconds\n </p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // Otherwise, show SDK container (Onfido, etc.)\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold\">Identity Verification</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Please complete the identity verification process\n </p>\n </CardHeader>\n\n <CardContent>\n <div id=\"identity-container\" className=\"min-h-[400px]\"></div>\n </CardContent>\n\n {onBack && (\n <CardFooter>\n <Button variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n </CardFooter>\n )}\n </Card>\n );\n }\n\n // ── Helpers for the dynamic review page ───────────────────────────────────\n\n const COUNTRY_FIELD_META_TYPES = new Set(['country', 'nationality', 'taxCountry', 'countryOfBirth', 'mobileCountryCode', 'otherNationality']);\n\n const colClass = (span: number = 4) => {\n const map: Record<number, string> = { 1: 'col-span-1', 2: 'col-span-2', 3: 'col-span-3', 4: 'col-span-4' };\n return map[span] || 'col-span-4';\n };\n\n /** Format a raw field value for read-only display */\n const formatDisplayValue = (name: string, value: any): string => {\n if (!value && value !== 0) return '—';\n if (COUNTRY_FIELD_META_TYPES.has(name) && name !== 'mobileCountryCode') {\n const opt = countries.find(c => c.value === value);\n return opt ? opt.label : String(value);\n }\n return String(value);\n };\n\n // ── Help-text portal (inline ? button + modal) ────────────────────────────\n\n const ReviewHelpButton: React.FC<{ helpText: string }> = ({ helpText }) => {\n const [open, setOpen] = useState(false);\n const btnRef = useRef<HTMLButtonElement>(null);\n const [, setPos] = useState({ top: 0, left: 0 });\n\n const openModal = () => {\n if (btnRef.current) {\n const r = btnRef.current.getBoundingClientRect();\n setPos({ top: r.bottom + window.scrollY + 6, left: r.left + window.scrollX });\n }\n setOpen(true);\n };\n\n return (\n <>\n <button\n type=\"button\"\n className=\"metakyc-help-btn\"\n ref={btnRef}\n onClick={openModal}\n style={{\n width: 18, height: 18, borderRadius: '50%',\n border: '1.5px solid var(--metakyc-primary, #2563eb)',\n background: 'transparent', color: 'var(--metakyc-primary, #2563eb)',\n fontSize: 11, fontWeight: 700, cursor: 'pointer',\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n flexShrink: 0, lineHeight: 1,\n position: 'relative', zIndex: 2,\n }}\n >?</button>\n {open && ReactDOM.createPortal(\n <div\n style={{\n position: 'fixed', inset: 0, zIndex: 99999,\n background: 'rgba(0,0,0,0.25)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}\n onClick={() => setOpen(false)}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--metakyc-surface, #fff)',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: 'var(--metakyc-border-radius, 8px)',\n padding: '16px 20px', maxWidth: 400, width: '90%',\n boxShadow: '0 10px 30px rgba(0,0,0,0.15)',\n }}\n >\n <div dangerouslySetInnerHTML={{ __html: helpText }} style={{ fontSize: 13, color: 'var(--metakyc-text-primary, #111827)', lineHeight: 1.6 }} />\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n style={{\n marginTop: 12, padding: '4px 12px', fontSize: 12,\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: 'var(--metakyc-border-radius, 6px)',\n background: 'transparent', cursor: 'pointer',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n >Close</button>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n };\n\n /** Wrap any field content with optional help text */\n const withHelp = (content: React.ReactNode, helpText?: string) => {\n if (!helpText) return content;\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 5, flexWrap: 'nowrap' }}>\n <div style={{ flex: 1, minWidth: 0 }}>{content}</div>\n <div style={{ paddingTop: 24 }}>\n <ReviewHelpButton helpText={helpText} />\n </div>\n </div>\n );\n };\n\n // ── Interactive custom field renderer ─────────────────────────────────────\n\n const renderCustomField = (f: FormFieldEntry, idx: number): React.ReactNode => {\n const key = `cf-${idx}`;\n const pn = f.paramName ?? '';\n const val = customData[pn];\n\n if (f.customType === 'br') {\n return <div key={key} className={colClass(f.colSpan)} style={{ minHeight: '0.5rem' }} />;\n }\n\n if (f.customType === 'paragraph') {\n return (\n <div key={key} className={colClass(f.colSpan)}>\n <div\n className=\"text-sm\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n </div>\n );\n }\n\n if (f.customType === 'html') {\n return (\n <div key={key} className={colClass(f.colSpan)}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n );\n }\n\n if (f.customType === 'link') {\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <a\n href={f.linkUrl ?? '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm underline\"\n style={{ color: 'var(--metakyc-primary, #6366f1)' }}\n >\n {f.displayText || f.label || f.linkText || f.linkUrl}\n </a>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n const checked = val === 'true' || val === true;\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <label style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={!!checked}\n onChange={e => setCustomData(prev => ({ ...prev, [pn]: String(e.target.checked) }))}\n style={{\n width: 16, height: 16, flexShrink: 0, marginTop: 2,\n accentColor: 'var(--metakyc-primary, #6366f1)',\n }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {f.customType === 'link_checkbox' && f.linkUrl ? (\n <><a href={f.linkUrl} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--metakyc-primary, #6366f1)', textDecoration: 'underline' }}>{f.linkText || f.label}</a>{f.label && f.linkText ? ` ${f.label}` : ''}</>\n ) : (\n f.displayText || f.label\n )}\n </span>\n </label>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'group_checkbox') {\n const selected: string[] = Array.isArray(val) ? val : (val ? [val] : []);\n const toggleOpt = (v: string) => {\n if (f.singleSelect) {\n setCustomData(prev => ({ ...prev, [pn]: selected[0] === v ? [] : [v] }));\n } else {\n setCustomData(prev => ({\n ...prev,\n [pn]: selected.includes(v) ? selected.filter(x => x !== v) : [...selected, v],\n }));\n }\n };\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <div className=\"space-y-1.5\">\n {f.label && <p className=\"text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{f.displayText || f.label}</p>}\n {(f.options || []).map(opt => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={selected.includes(opt.value)}\n onChange={() => toggleOpt(opt.value)}\n style={{ width: 16, height: 16, flexShrink: 0, marginTop: 2, accentColor: 'var(--metakyc-primary, #6366f1)' }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{opt.label}</span>\n </label>\n ))}\n </div>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'radio_group') {\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <div className=\"space-y-1.5\">\n {f.label && <p className=\"text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{f.displayText || f.label}</p>}\n {(f.options || []).map(opt => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={`rg-${pn}`}\n value={opt.value}\n checked={val === opt.value}\n onChange={() => setCustomData(prev => ({ ...prev, [pn]: opt.value }))}\n style={{ width: 16, height: 16, flexShrink: 0, marginTop: 2, accentColor: 'var(--metakyc-primary, #6366f1)' }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{opt.label}</span>\n </label>\n ))}\n </div>,\n f.helpText\n )}\n </div>\n );\n }\n\n // text input custom field\n return (\n <div key={key} className={colClass(f.colSpan)}>\n {withHelp(\n <Input\n label={f.displayText || f.label || pn}\n value={String(val ?? '')}\n onChange={e => setCustomData(prev => ({ ...prev, [pn]: e.target.value }))}\n />,\n f.helpText\n )}\n </div>\n );\n };\n\n // ── Full field renderer (built-in + custom) ────────────────────────────────\n\n const renderReviewField = (f: FormFieldEntry, idx: number): React.ReactNode => {\n // Route custom fields\n if (f.isCustom) return renderCustomField(f, idx);\n\n const name = f.name ?? '';\n const meta = FIELD_METADATA[name];\n const label = f.displayText || meta?.label || name;\n const value = reviewData[name] ?? '';\n const isPhoneCountry = name === 'mobileCountryCode';\n const isCountry = !!meta?.countriesType && !isPhoneCountry;\n\n if (!f.editable) {\n return (\n <div key={`ro-${idx}`} className={colClass(f.colSpan ?? 2)}>\n {withHelp(\n <>\n <label className=\"block text-sm font-medium mb-0.5\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{label}</label>\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)', minHeight: '1.5rem' }}>\n {formatDisplayValue(name, value)}\n </p>\n </>,\n f.helpText\n )}\n </div>\n );\n }\n\n // Mobile country code: searchable phone-number dropdown (value = \"+43\", label = \"+43 – Austria\")\n if (isPhoneCountry) {\n return (\n <div key={`epc-${idx}`} className={colClass(f.colSpan ?? 2)}>\n {withHelp(\n <SearchableSelect\n label={label}\n value={String(value)}\n onChange={v => setReviewData(prev => ({ ...prev, [name]: v }))}\n options={[{ value: '', label: 'Select country code…' }, ...phoneCountries]}\n />,\n f.helpText\n )}\n </div>\n );\n }\n\n if (isCountry) {\n return (\n <div key={`ec-${idx}`} className={colClass(f.colSpan ?? 2)}>\n {withHelp(\n <SearchableSelect\n label={label}\n value={String(value)}\n onChange={v => setReviewData(prev => ({ ...prev, [name]: v }))}\n options={[{ value: '', label: `Select ${label.toLowerCase()}…` }, ...countries]}\n />,\n f.helpText\n )}\n </div>\n );\n }\n\n return (\n <div key={`ei-${idx}`} className={colClass(f.colSpan ?? 2)}>\n {withHelp(\n <Input\n label={label}\n type={meta?.type === 'date' ? 'date' : meta?.type === 'email' ? 'email' : 'text'}\n value={String(value)}\n onChange={e => setReviewData(prev => ({ ...prev, [name]: e.target.value }))}\n />,\n f.helpText\n )}\n </div>\n );\n };\n\n // ── Dynamic review page ────────────────────────────────────────────────────\n\n if (reviewPage) {\n const pageTitle = reviewPage.title || 'Review Your Information';\n const pageSubtitle = reviewPage.subtitle || 'Please review and confirm your information before starting identity verification';\n return (\n <form onSubmit={e => { e.preventDefault(); handleConfirm(); }}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {pageTitle}\n </h2>\n {pageSubtitle && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {pageSubtitle}\n </p>\n )}\n </CardHeader>\n\n <CardContent>\n <div className=\"grid grid-cols-4 gap-4\">\n {reviewPage.fields.map((f, idx) => renderReviewField(f, idx))}\n </div>\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"submit\" isLoading={identityLoading}>\n Confirm and Start Verification\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n }\n\n // ── Static review page (fallback when no config) ────────────────────────\n\n return (\n <form onSubmit={form.handleSubmit(handleConfirm)}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Review Your Information\n </h2>\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Please review and confirm your information before starting identity verification\n </p>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n {/* Read-only section */}\n <div className=\"space-y-4 pb-4\" style={{ borderBottom: '1px solid var(--metakyc-border, #e5e7eb)' }}>\n {[\n { label: 'Name', value: `${applicantData?.applicantRequestData?.firstName || ''} ${applicantData?.applicantRequestData?.lastName || ''}`.trim() },\n { label: 'Email', value: applicantData?.applicantRequestData?.email },\n { label: 'Date of Birth', value: applicantData?.applicantRequestData?.dateOfBirth || 'Not provided' },\n ].map(({ label, value }) => (\n <div key={label}>\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {label}\n </label>\n <p className=\"mt-1 text-base\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{value}</p>\n </div>\n ))}\n </div>\n\n {/* Editable address fields */}\n <div className=\"space-y-4\">\n <h3 className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Address Information\n </h3>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller\n control={form.control}\n name=\"country\"\n render={({ field }) => (\n <SearchableSelect\n label=\"Country\"\n value={field.value}\n onChange={field.onChange}\n options={[{ value: '', label: 'Select country…' }, ...countries]}\n />\n )}\n />\n <Controller\n control={form.control}\n name=\"nationality\"\n render={({ field }) => (\n <SearchableSelect\n label=\"Nationality\"\n value={field.value}\n onChange={field.onChange}\n options={[{ value: '', label: 'Select nationality…' }, ...countries]}\n />\n )}\n />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller control={form.control} name=\"street\" render={({ field }) => <Input {...field} label=\"Street\" />} />\n <Controller control={form.control} name=\"streetNumber\" render={({ field }) => <Input {...field} label=\"Street Number\" />} />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller control={form.control} name=\"city\" render={({ field }) => <Input {...field} label=\"City\" />} />\n <Controller control={form.control} name=\"zip\" render={({ field }) => <Input {...field} label=\"ZIP / Postal Code\" />} />\n </div>\n\n <Controller control={form.control} name=\"phonenumber\" render={({ field }) => <Input {...field} label=\"Phone Number\" type=\"tel\" />} />\n </div>\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"submit\" isLoading={identityLoading}>\n Confirm and Start Verification\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React from 'react';\nimport { Card, CardContent, CardFooter, Button, Badge } from '../core';\nimport { KycStatus, ReviewStatus, WorkflowResultType } from '../../types';\n\nexport interface KycStatusDisplayProps {\n kycStatus: KycStatus | null;\n reviewStatus: ReviewStatus;\n workflowResult: WorkflowResultType | null;\n customMessage?: string;\n onContinue?: () => void;\n onContactSupport?: () => void;\n}\n\n/**\n * KYC Status Display Component\n * Shows appropriate UI based on KYC verification status\n */\nexport const KycStatusDisplay: React.FC<KycStatusDisplayProps> = ({\n kycStatus,\n reviewStatus,\n workflowResult,\n customMessage,\n onContinue,\n onContactSupport,\n}) => {\n // Determine the primary status to display\n const getStatusInfo = () => {\n // Check KYC status first\n if (kycStatus === KycStatus.Approved) {\n return {\n type: 'success' as const,\n title: 'Verification Approved',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your identity verification has been successfully approved.',\n };\n }\n\n if (kycStatus === KycStatus.Rejected) {\n return {\n type: 'error' as const,\n title: 'Verification Rejected',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'Unfortunately, your identity verification was not approved.',\n };\n }\n\n if (kycStatus === KycStatus.Pending || kycStatus === KycStatus.InProgress) {\n return {\n type: 'pending' as const,\n title: 'Verification Pending',\n icon: '⏱',\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n message: 'Your identity verification is currently being processed.',\n };\n }\n\n // Check review status\n if (reviewStatus === ReviewStatus.Approved) {\n return {\n type: 'success' as const,\n title: 'Application Approved',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your application has been approved.',\n };\n }\n\n if (reviewStatus === ReviewStatus.Reject) {\n return {\n type: 'error' as const,\n title: 'Application Rejected',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'Your application has been rejected.',\n };\n }\n\n if (reviewStatus === ReviewStatus.UnderReview || reviewStatus === ReviewStatus.AdminReview) {\n return {\n type: 'pending' as const,\n title: 'Under Review',\n icon: '📋',\n iconBg: 'bg-yellow-100 dark:bg-yellow-900/30',\n iconColor: 'text-yellow-700 dark:text-yellow-400',\n message: 'Your application is currently under manual review.',\n };\n }\n\n // Check workflow result\n if (workflowResult === WorkflowResultType.Success) {\n return {\n type: 'success' as const,\n title: 'Process Complete',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your verification process has been completed successfully.',\n };\n }\n\n if (workflowResult === WorkflowResultType.Failed) {\n return {\n type: 'error' as const,\n title: 'Process Failed',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'The verification process could not be completed.',\n };\n }\n\n if (workflowResult === WorkflowResultType.AdminReview) {\n return {\n type: 'pending' as const,\n title: 'Admin Review Required',\n icon: '📋',\n iconBg: 'bg-yellow-100 dark:bg-yellow-900/30',\n iconColor: 'text-yellow-700 dark:text-yellow-400',\n message: 'Your application requires administrator review.',\n };\n }\n\n // Default waiting state\n // Note: This should only show for non-workflow completion states\n return {\n type: 'pending' as const,\n title: 'Processing',\n icon: '⏱',\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n message: 'Your application is being reviewed.',\n };\n };\n\n const statusInfo = getStatusInfo();\n\n return (\n <Card>\n <CardContent className=\"py-12\">\n {/* Status Icon */}\n <div className=\"flex justify-center mb-6\">\n <div\n className={`w-24 h-24 rounded-full flex items-center justify-center ${statusInfo.iconBg}`}\n >\n <span className={`text-5xl ${statusInfo.iconColor}`}>{statusInfo.icon}</span>\n </div>\n </div>\n\n {/* Title */}\n <h2 className=\"text-3xl font-bold text-center text-gray-900 dark:text-white mb-4\">\n {statusInfo.title}\n </h2>\n\n {/* Status Badge */}\n <div className=\"flex justify-center mb-6\">\n <Badge\n variant={\n statusInfo.type === 'success'\n ? 'success'\n : statusInfo.type === 'error'\n ? 'danger'\n : statusInfo.type === 'pending'\n ? 'warning'\n : 'info'\n }\n >\n {kycStatus !== null && kycStatus !== undefined\n ? KycStatus[kycStatus]\n : ReviewStatus[reviewStatus]}\n </Badge>\n </div>\n\n {/* Message */}\n <p className=\"text-center text-gray-600 dark:text-gray-400 mb-6 max-w-md mx-auto\">\n {customMessage || statusInfo.message}\n </p>\n\n {/* Status-specific content */}\n {statusInfo.type === 'success' && (\n <div className=\"bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-green-900 dark:text-green-100 mb-2\">\n What's Next?\n </h3>\n <ul className=\"text-sm text-green-800 dark:text-green-200 space-y-1\">\n <li>✓ Your identity has been verified</li>\n <li>✓ You can now proceed with your application</li>\n <li>✓ All features are now accessible</li>\n </ul>\n </div>\n )}\n\n {statusInfo.type === 'error' && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-red-900 dark:text-red-100 mb-2\">\n What Can You Do?\n </h3>\n <ul className=\"text-sm text-red-800 dark:text-red-200 space-y-2\">\n <li>• Review the requirements and ensure all information is correct</li>\n <li>• Contact our support team for assistance</li>\n <li>• You may be able to resubmit your application</li>\n </ul>\n </div>\n )}\n\n {statusInfo.type === 'pending' && (\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-blue-900 dark:text-blue-100 mb-2\">\n What Happens Next?\n </h3>\n <ul className=\"text-sm text-blue-800 dark:text-blue-200 space-y-2\">\n <li>• Our team is reviewing your information</li>\n <li>• You will be notified via email once the review is complete</li>\n <li>• This typically takes 24-48 hours</li>\n <li>• No action is required from you at this time</li>\n </ul>\n </div>\n )}\n\n {/* Additional details */}\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">KYC Status:</span>\n <div className=\"font-medium text-gray-900 dark:text-white mt-1\">\n {kycStatus !== null && kycStatus !== undefined\n ? KycStatus[kycStatus]\n : 'Not Available'}\n </div>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">Review Status:</span>\n <div className=\"font-medium text-gray-900 dark:text-white mt-1\">\n {ReviewStatus[reviewStatus]}\n </div>\n </div>\n </div>\n </div>\n </CardContent>\n\n <CardFooter className=\"flex justify-center gap-4\">\n {statusInfo.type === 'success' && onContinue && (\n <Button onClick={onContinue} size=\"lg\">\n Continue\n </Button>\n )}\n\n {statusInfo.type === 'error' && (\n <>\n {onContactSupport && (\n <Button variant=\"outline\" onClick={onContactSupport}>\n Contact Support\n </Button>\n )}\n {onContinue && (\n <Button onClick={onContinue}>\n Try Again\n </Button>\n )}\n </>\n )}\n\n {statusInfo.type === 'pending' && (\n <div className=\"text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Please check back later or wait for our email notification\n </p>\n </div>\n )}\n </CardFooter>\n </Card>\n );\n};\n","import React from 'react';\nimport { LogoConfig } from '../types/theme';\n\nexport interface LogoProps {\n config?: LogoConfig;\n className?: string;\n}\n\n/**\n * Logo Component\n * Displays the configured logo in the top-left position\n */\nexport const Logo: React.FC<LogoProps> = ({ config, className = '' }) => {\n // Don't render if logo is not visible or no URL provided\n if (!config?.visible || !config?.url) {\n return null;\n }\n\n return (\n <div className={`metakyc-logo ${className}`}>\n <img\n src={config.url}\n alt={config.alt || 'Company Logo'}\n style={{\n width: config.width || 'auto',\n height: config.height || '40px',\n maxWidth: '100%',\n objectFit: 'contain',\n }}\n onError={(e) => {\n console.warn('[Logo] Failed to load logo:', config.url);\n // Hide on error\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n );\n};\n","import React from 'react';\nimport { Logo } from './Logo';\nimport { useMetaKYC } from '../context';\n\nexport interface HeaderProps {\n /** Override the default title from theme */\n title?: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Header Component\n * Displays logo and title inline, separated by | when both are present\n */\nexport const Header: React.FC<HeaderProps> = ({ \n title: titleProp, \n subtitle,\n className = '' \n}) => {\n const { currentTheme } = useMetaKYC();\n \n const title = titleProp || currentTheme?.title || '';\n const hasLogo = !!(currentTheme?.logo && currentTheme.logo.visible && currentTheme.logo.url);\n const hasTitle = !!title;\n\n if (!hasLogo && !hasTitle) return null;\n \n return (\n <div className={`metakyc-header ${className}`}>\n <div className=\"metakyc-header-title flex items-center text-xl font-bold text-gray-900 dark:text-white\">\n {hasLogo && (\n <Logo config={currentTheme!.logo} />\n )}\n {hasLogo && hasTitle && (\n <span \n className=\"text-gray-400 dark:text-gray-500 mx-3\"\n style={{ fontSize: '1.5rem', fontWeight: 300 }}\n >\n |\n </span>\n )}\n {hasTitle && (\n <span>{title}</span>\n )}\n </div>\n {subtitle && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n {subtitle}\n </p>\n )}\n </div>\n );\n};\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useMetaKYC } from '../context';\nimport { useApplicant } from '../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, MultiSelect, Spinner, SearchableSelect } from './core';\nimport { ApplicantRegistrationRequestInput, GenderType } from '../types';\nimport type { ApplicantFormField } from '../client/config';\nimport {\n FIELD_METADATA, DEFAULT_VISIBLE_FIELDS, ALLOWED_LANGUAGES,\n FormPage, FormFieldEntry,\n} from '../types/form-config';\nimport { Header } from './Header';\n\nexport interface CreateApplicantFormProps {\n workflowKey?: string;\n externalRefId?: string;\n onSuccess: (applicantId: number) => void;\n onCancel?: () => void;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nconst SYSTEM_REQUIRED: ApplicantFormField[] = ['firstName', 'lastName', 'email', 'phonenumber', 'dateOfBirth'];\n\nfunction isEmpty(val: unknown): boolean {\n return val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0);\n}\n\n// Shared option input style — matches QuestionnaireStep / RiskScoringStep\nconst OPTION_INPUT_STYLE: React.CSSProperties = {\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n};\n\n// ── Per-field help modal ──────────────────────────────────────────────────────\n\nconst FieldHelpWrapper: React.FC<{ helpText?: string; children: React.ReactNode }> = ({ helpText, children }) => {\n const [open, setOpen] = React.useState(false);\n if (!helpText) return <>{children}</>;\n\n const modal = open ? (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={() => setOpen(false)}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999999,\n background: 'rgba(0, 0, 0, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--metakyc-card-bg, #ffffff)',\n borderRadius: '12px',\n padding: '28px 24px 24px',\n maxWidth: '480px',\n width: '100%',\n maxHeight: '80vh',\n overflowY: 'auto',\n boxShadow: '0 24px 64px rgba(0,0,0,0.25)',\n position: 'relative',\n }}\n >\n {/* Close button */}\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n style={{\n position: 'absolute',\n top: '12px',\n right: '12px',\n width: '28px',\n height: '28px',\n borderRadius: '50%',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n background: 'var(--metakyc-input-bg, #f3f4f6)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n fontSize: '16px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n\n {/* HTML content */}\n <div\n style={{\n color: 'var(--metakyc-text-primary, #111827)',\n fontSize: '14px',\n lineHeight: 1.75,\n }}\n dangerouslySetInnerHTML={{ __html: helpText }}\n />\n </div>\n </div>\n ) : null;\n\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: '5px', flexWrap: 'nowrap' }}>\n {/* Field content — takes natural width so ? sits right next to short text */}\n {children}\n\n {/* Circular ? button — inline, immediately after the component */}\n <button\n type=\"button\"\n className=\"metakyc-help-btn\"\n onClick={() => setOpen(true)}\n aria-label=\"Help\"\n style={{\n flexShrink: 0,\n marginTop: '2px',\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n border: '1.5px solid var(--metakyc-primary, #2563eb)',\n background: 'transparent',\n color: 'var(--metakyc-primary, #2563eb)',\n fontSize: '10px',\n fontWeight: '700',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n padding: 0,\n position: 'relative',\n zIndex: 2,\n transition: 'background 0.15s, color 0.15s',\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'var(--metakyc-primary, #2563eb)';\n (e.currentTarget as HTMLButtonElement).style.color = '#ffffff';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'transparent';\n (e.currentTarget as HTMLButtonElement).style.color = 'var(--metakyc-primary, #2563eb)';\n }}\n >\n ?\n </button>\n\n {typeof document !== 'undefined' && modal ? createPortal(modal, document.body) : null}\n </div>\n );\n};\n\n// ── CreateApplicantForm ───────────────────────────────────────────────────────\n\nexport const CreateApplicantForm: React.FC<CreateApplicantFormProps> = ({\n workflowKey: workflowKeyProp,\n externalRefId: externalRefIdProp,\n onSuccess,\n onCancel,\n}) => {\n const { config, baseInformationService, currentTheme } = useMetaKYC();\n const { createApplicant, isLoading: isCreatingApplicant } = useApplicant();\n\n const workflowKey = workflowKeyProp || config.applicantForm?.workflowKey;\n if (!workflowKey) {\n throw new Error(\n 'workflowKey is required. Provide it either as a prop to CreateApplicantForm or set it in config.applicantForm.workflowKey'\n );\n }\n\n const initialExternalRefId = externalRefIdProp || config.applicantForm?.externalRefId || '';\n const initialEmail = config.applicantForm?.email || '';\n\n // ── Theme-derived config ───────────────────────────────────────────────────\n const formPages: FormPage[] | null = useMemo(\n () => (currentTheme?.applicantFormPages && currentTheme.applicantFormPages.length > 0\n ? currentTheme.applicantFormPages\n : null),\n [currentTheme?.applicantFormPages]\n );\n\n const requiredFields: ApplicantFormField[] = useMemo(() => {\n const set = new Set<ApplicantFormField>(SYSTEM_REQUIRED);\n const clientReq = currentTheme?.applicantFormRequiredFields;\n if (clientReq) for (const f of clientReq) set.add(f as ApplicantFormField);\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && f.required) set.add(f.name as ApplicantFormField);\n }\n }\n }\n return Array.from(set);\n }, [currentTheme?.applicantFormRequiredFields, formPages]);\n\n const flatVisibleFields: ApplicantFormField[] = useMemo(() => {\n if (formPages) {\n const fields = formPages\n .flatMap(p => p.fields)\n .filter(f => !f.isCustom && f.name)\n .map(f => f.name as ApplicantFormField);\n const set = new Set<ApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }\n let fields: ApplicantFormField[];\n if (config.applicantForm?.visibleFields) {\n fields = config.applicantForm.visibleFields;\n } else if (currentTheme?.applicantFormVisibleFields && currentTheme.applicantFormVisibleFields.length > 0) {\n fields = currentTheme.applicantFormVisibleFields as ApplicantFormField[];\n } else {\n fields = DEFAULT_VISIBLE_FIELDS;\n }\n const set = new Set<ApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }, [config.applicantForm?.visibleFields, currentTheme?.applicantFormVisibleFields, formPages]);\n\n // ── Countries (per-type map) ───────────────────────────────────────────────\n // Each country-type field passes its own CountriesType to the API.\n // We deduplicate by type and load all needed lists in parallel.\n\n const COUNTRY_FIELD_NAMES = new Set([\n 'country', 'nationality', 'taxCountry', 'countryOfBirth',\n 'mobileCountryCode', 'otherNationality',\n ]);\n\n /** Distinct CountriesType values needed for the current form configuration */\n const neededCountryTypes = useMemo((): Array<number | undefined> => {\n const types = new Set<number | undefined>();\n\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && COUNTRY_FIELD_NAMES.has(f.name)) {\n types.add(f.countriesType ?? FIELD_METADATA[f.name]?.countriesType);\n }\n }\n }\n } else {\n for (const field of flatVisibleFields) {\n if (COUNTRY_FIELD_NAMES.has(field)) {\n types.add(FIELD_METADATA[field]?.countriesType);\n }\n }\n }\n\n if (types.size === 0) types.add(undefined); // fallback: load all\n return Array.from(types);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [flatVisibleFields, formPages]);\n\n const [countriesMap, setCountriesMap] = useState<Record<string, Array<{ value: string; label: string }>>>({});\n const [isLoadingCountries, setIsLoadingCountries] = useState(true);\n // Track which types are currently in-flight (not yet resolved). Separate from\n // loadedTypesRef so concurrent loads of *different* types are all allowed.\n const loadingTypesRef = useRef(new Set<string>());\n const loadedTypesRef = useRef(new Set<string>());\n\n useEffect(() => {\n if (!currentTheme) return; // wait for theme before loading countries\n\n // Only queue types that are neither already loaded nor currently in-flight\n const typesToLoad = neededCountryTypes.filter(t => {\n const key = t != null ? String(t) : 'all';\n return !loadedTypesRef.current.has(key) && !loadingTypesRef.current.has(key);\n });\n\n if (typesToLoad.length === 0) {\n // All needed types are loaded (or in-flight) — check if we can clear the spinner\n const allReady = neededCountryTypes.every(t => {\n const key = t != null ? String(t) : 'all';\n return loadedTypesRef.current.has(key);\n });\n if (allReady) setIsLoadingCountries(false);\n return;\n }\n\n setIsLoadingCountries(true);\n const keys = typesToLoad.map(t => (t != null ? String(t) : 'all'));\n keys.forEach(k => loadingTypesRef.current.add(k));\n\n const load = async () => {\n try {\n const entries = await Promise.all(\n typesToLoad.map(async (type) => {\n const key = type != null ? String(type) : 'all';\n const data = await baseInformationService.getCountries('', config.locale || 'en', type);\n const isPhoneType = type === 40; // CountriesType.PhoneNumber\n const seen = new Set<string>();\n const list = data\n .map(c => {\n // For phone-number lists use countryCode (+43) as the stored value\n // and show it prominently in the label so the user can search by code.\n if (isPhoneType && c.countryCode) {\n return {\n value: c.countryCode,\n label: `${c.countryCode} – ${c.name}`,\n };\n }\n return { value: c.abbreviation3 || c.abbreviation, label: c.name };\n })\n .filter(c => {\n if (!c.value || seen.has(c.value)) return false;\n seen.add(c.value);\n return true;\n });\n loadedTypesRef.current.add(key);\n loadingTypesRef.current.delete(key);\n return [key, list] as const;\n })\n );\n setCountriesMap(prev => ({ ...prev, ...Object.fromEntries(entries) }));\n } catch (err) {\n keys.forEach(k => loadingTypesRef.current.delete(k));\n console.error('Failed to load countries:', err);\n } finally {\n // Clear spinner only when *all currently needed* types are fully loaded\n const allReady = neededCountryTypes.every(t => {\n const key = t != null ? String(t) : 'all';\n return loadedTypesRef.current.has(key);\n });\n if (allReady) setIsLoadingCountries(false);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [neededCountryTypes, currentTheme]);\n\n /** Get the countries list for a given field, respecting any per-entry type override. */\n const getCountriesForField = (field: string, override?: number): Array<{ value: string; label: string }> => {\n const type = override ?? FIELD_METADATA[field]?.countriesType;\n const key = type != null ? String(type) : 'all';\n return countriesMap[key] || [];\n };\n\n // ── Form state ─────────────────────────────────────────────────────────────\n const [formData, setFormData] = useState<Record<string, any>>({\n workflowKey,\n firstName: '', lastName: '', title: '', email: initialEmail, dateOfBirth: '',\n phonenumber: '', externalRefId: initialExternalRefId, mobileCountryCode: '',\n street: '', streetNumber: '', zip: '', city: '', country: '', nationality: '',\n otherNationality: [], defaultLanguage: 'EN', taxCountry: '', placeOfBirth: '',\n countryOfBirth: '', salutation: null, educationLevel: '', occupation: '', taxNumber: '',\n });\n\n // Custom field values — keyed by paramName\n const [customData, setCustomData] = useState<Record<string, string>>({});\n\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\n const [pageErrors, setPageErrors] = useState<Record<string, string>>({});\n const [globalError, setGlobalError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleChange = (field: string, value: any) =>\n setFormData(prev => ({ ...prev, [field]: value }));\n const handleCustomChange = (paramName: string, value: string) =>\n setCustomData(prev => ({ ...prev, [paramName]: value }));\n\n // Sequential navigation — every page is always reachable; conditional pages\n // show a gate checkbox at the top; if unchecked their fields are hidden and\n // the user can skip with \"Skip\" or fill in after checking.\n const isConditionMet = (page: FormPage): boolean =>\n !page.conditionalOn || customData[page.conditionalOn] === 'true';\n\n const nextPageIndex = formPages\n ? (currentPageIndex < formPages.length - 1 ? currentPageIndex + 1 : -1)\n : -1;\n\n const prevPageIndex = formPages\n ? (currentPageIndex > 0 ? currentPageIndex - 1 : -1)\n : -1;\n\n // ── Per-page validation ────────────────────────────────────────────────────\n const validatePage = (page: FormPage): Record<string, string> => {\n const errs: Record<string, string> = {};\n\n for (const f of page.fields) {\n if (f.isCustom) {\n // display-only types — skip validation\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n\n if (f.required && f.paramName) {\n const val = customData[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n if (val !== 'true') {\n errs[f.paramName] = `${displayLabel} is required.`;\n }\n } else if (!val || val.trim() === '') {\n errs[f.paramName] = `${displayLabel} is required.`;\n }\n }\n } else if (f.name) {\n const fieldName = f.name as ApplicantFormField;\n if (requiredFields.includes(fieldName)) {\n if (isEmpty(formData[fieldName])) {\n const label = f.displayText || FIELD_METADATA[fieldName]?.label || fieldName;\n errs[fieldName] = `${label} is required.`;\n }\n }\n }\n }\n\n return errs;\n };\n\n // ── Submit / navigate ──────────────────────────────────────────────────────\n const handleNext = async () => {\n if (!formPages) return;\n const page = formPages[currentPageIndex];\n\n // If this page is conditional and condition not met, skip validation (user is skipping)\n if (page.conditionalOn && !isConditionMet(page)) {\n setPageErrors({});\n if (nextPageIndex >= 0) {\n setCurrentPageIndex(nextPageIndex);\n } else {\n await doSubmit();\n }\n return;\n }\n\n const errs = validatePage(page);\n if (Object.keys(errs).length > 0) { setPageErrors(errs); return; }\n setPageErrors({});\n\n if (nextPageIndex >= 0) {\n setCurrentPageIndex(nextPageIndex);\n } else {\n await doSubmit();\n }\n };\n\n const doSubmit = async () => {\n // Final validation: only pages whose condition is met\n if (formPages) {\n let allErrs: Record<string, string> = {};\n for (const page of formPages) {\n if (isConditionMet(page)) {\n allErrs = { ...allErrs, ...validatePage(page) };\n }\n }\n if (Object.keys(allErrs).length > 0) { setPageErrors(allErrs); return; }\n }\n\n setIsSubmitting(true);\n setGlobalError(null);\n\n try {\n if (!formData.externalRefId || formData.externalRefId.trim() === '') {\n setGlobalError('External Reference ID is required. Please pass it via config.applicantForm.externalRefId.');\n return;\n }\n\n const requestData: Partial<ApplicantRegistrationRequestInput> = {\n workflowKey: formData.workflowKey,\n externalRefId: formData.externalRefId.trim(),\n };\n\n if (formPages) {\n // Page-based mode: collect fields from condition-met pages\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n if (!f.isCustom && f.name) {\n const field = f.name as ApplicantFormField;\n const value = formData[field];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n }\n }\n }\n // Always include pre-filled required fields even if not on any page\n // (e.g. email pre-filled via config.applicantForm.email)\n for (const field of SYSTEM_REQUIRED) {\n if ((requestData as any)[field] === undefined) {\n const value = formData[field as ApplicantFormField];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n }\n }\n } else {\n // Flat mode: use all visible fields\n flatVisibleFields.forEach(field => {\n if (field === 'externalRefId') return;\n const value = formData[field];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n });\n }\n\n // Merge custom field values from visible pages into applicantAdditionalDatas\n const additionalDatas: Array<{ paramName: string; value: string }> = [];\n if (formPages) {\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n // Skip display-only types\n if (!f.isCustom || !f.paramName) continue;\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n\n const raw = customData[f.paramName] ?? '';\n let value: string;\n\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n // Boolean checkbox → human-readable yes/no\n value = raw === 'true' ? 'yes' : 'no';\n } else {\n // text, group_checkbox, radio_group — pass the actual value\n value = raw;\n // Skip empty optional text fields instead of sending a blank value\n if (!value && !f.required) continue;\n }\n\n additionalDatas.push({ paramName: f.paramName, value });\n }\n }\n }\n if (additionalDatas.length > 0) {\n (requestData as any).applicantAdditionalDatas = additionalDatas;\n }\n\n const result = await createApplicant(requestData as ApplicantRegistrationRequestInput);\n onSuccess(result.applicantId);\n } catch (err: any) {\n console.error('Error creating applicant:', err);\n setGlobalError(err.message || 'Failed to create applicant');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // Flat mode submit handler\n const handleFlatSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Flat mode: validate all required fields\n for (const field of requiredFields) {\n if (isEmpty(formData[field])) {\n const label = FIELD_METADATA[field]?.label || field;\n setGlobalError(`${label} is required.`);\n return;\n }\n }\n\n await doSubmit();\n };\n\n // ── Built-in field renderer ────────────────────────────────────────────────\n const renderBuiltInField = (\n field: ApplicantFormField,\n key?: string,\n displayText?: string,\n countriesTypeOverride?: number,\n ) => {\n const metadata = FIELD_METADATA[field];\n if (!metadata) return null;\n const isRequired = requiredFields.includes(field);\n const fieldError = pageErrors[field];\n const labelText = displayText || metadata.label;\n\n const elementKey = key ?? field;\n const commonProps = { required: isRequired };\n\n switch (metadata.type) {\n case 'select':\n if (\n field === 'country' ||\n field === 'nationality' ||\n field === 'taxCountry' ||\n field === 'countryOfBirth' ||\n field === 'mobileCountryCode'\n ) {\n const countryList = getCountriesForField(field, countriesTypeOverride);\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelText}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: `Select ${labelText.toLowerCase()}...` }, ...countryList]}\n disabled={isLoadingCountries}\n error={fieldError}\n />\n );\n }\n if (field === 'salutation') {\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelText}\n value={formData[field]?.toString() || ''}\n onChange={val => handleChange(field, val ? Number(val) : null)}\n options={[\n { value: '', label: 'Select salutation...' },\n { value: GenderType.Male.toString(), label: 'Male' },\n { value: GenderType.Female.toString(), label: 'Female' },\n { value: GenderType.Other.toString(), label: 'Other' },\n ]}\n error={fieldError}\n />\n );\n }\n if (field === 'defaultLanguage') {\n const langOptions = currentTheme?.allowedLanguages && currentTheme.allowedLanguages.length > 0\n ? ALLOWED_LANGUAGES.filter(l => currentTheme.allowedLanguages!.includes(l.value))\n : ALLOWED_LANGUAGES;\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelText}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: 'Select language...' }, ...langOptions]}\n error={fieldError}\n />\n );\n }\n return null;\n\n case 'multiselect':\n if (field === 'otherNationality') {\n const nationalityList = getCountriesForField(field, countriesTypeOverride);\n return (\n <MultiSelect\n key={elementKey}\n {...commonProps}\n label={labelText}\n value={formData[field] || []}\n onChange={values => handleChange(field, values)}\n options={nationalityList}\n placeholder=\"Select other nationalities...\"\n disabled={isLoadingCountries}\n />\n );\n }\n return null;\n\n case 'date':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"date\"\n label={labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n error={fieldError}\n />\n );\n\n case 'email':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"email\"\n label={labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n error={fieldError}\n />\n );\n\n case 'tel':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"tel\"\n label={labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n error={fieldError}\n />\n );\n\n default:\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"text\"\n label={labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n error={fieldError}\n />\n );\n }\n };\n\n // ── Custom field renderer ──────────────────────────────────────────────────\n const renderCustomField = (f: FormFieldEntry, idx: number) => {\n // ── Paragraph (display-only text block) ──────────────────────────────────\n if (f.customType === 'paragraph') {\n const text = f.displayText || f.label || '';\n return (\n <p\n key={`custom-${idx}`}\n className=\"metakyc-paragraph\"\n style={{\n fontSize: '14px',\n lineHeight: '1.7',\n margin: 0,\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n dangerouslySetInnerHTML={{ __html: text }}\n />\n );\n }\n\n // ── Raw HTML block (no additional wrapper styling) ────────────────────────\n if (f.customType === 'html') {\n return (\n <div\n key={`custom-${idx}`}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n );\n }\n\n // ── Line break / spacer ──────────────────────────────────────────────────\n if (f.customType === 'br') {\n return <div key={`custom-${idx}`} style={{ height: '12px' }} />;\n }\n\n // ── Standalone hyperlink (display-only) ──────────────────────────────────\n if (f.customType === 'link') {\n const linkLabel = f.displayText || f.label || f.linkText || f.linkUrl || '';\n return (\n <div key={`custom-${idx}`} className=\"metakyc-link-field\">\n <a\n href={f.linkUrl || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: 'var(--metakyc-primary, #2563eb)',\n fontSize: '14px',\n textDecoration: 'underline',\n cursor: 'pointer',\n }}\n >\n {linkLabel}\n <span style={{ fontSize: '10px', opacity: 0.7 }}>↗</span>\n </a>\n </div>\n );\n }\n\n if (!f.paramName) return null;\n const err = pageErrors[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n\n // Single checkbox\n if (f.customType === 'checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={customData[f.paramName] === 'true'}\n onChange={e => handleCustomChange(f.paramName!, e.target.checked ? 'true' : 'false')}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n // Link + checkbox\n if (f.customType === 'link_checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={customData[f.paramName] === 'true'}\n onChange={e => handleCustomChange(f.paramName!, e.target.checked ? 'true' : 'false')}\n className=\"metakyc-option-input\"\n style={{ ...OPTION_INPUT_STYLE, alignSelf: 'flex-start', marginTop: '2px' }}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {displayLabel}{' '}\n {f.linkUrl && (\n <a\n href={f.linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline\"\n style={{ color: 'var(--metakyc-primary, #2563eb)' }}\n onClick={e => e.stopPropagation()}\n >\n {f.linkText || f.linkUrl}\n </a>\n )}\n {f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n // Checkbox group (multi-select OR single-select when f.singleSelect is true)\n if (f.customType === 'group_checkbox') {\n const selectedValues = (customData[f.paramName] || '').split(',').filter(Boolean);\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1.5\">\n <div\n className=\"text-sm font-medium\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </div>\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(f.options || []).map(opt => {\n const isChecked = f.singleSelect\n ? customData[f.paramName!] === opt.value\n : selectedValues.includes(opt.value);\n\n return (\n <label\n key={opt.value}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={e => {\n if (f.singleSelect) {\n // Single-select: set to this value, or clear if unchecking current\n handleCustomChange(f.paramName!, e.target.checked ? opt.value : '');\n } else {\n const next = e.target.checked\n ? [...selectedValues, opt.value]\n : selectedValues.filter(v => v !== opt.value);\n handleCustomChange(f.paramName!, next.join(','));\n }\n }}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {opt.label}\n </span>\n </label>\n );\n })}\n </div>\n {err && <p className=\"text-red-500 text-xs\">{err}</p>}\n </div>\n );\n }\n\n // Radio group (single-select)\n if (f.customType === 'radio_group') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1.5\">\n <div\n className=\"text-sm font-medium\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </div>\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(f.options || []).map(opt => (\n <label\n key={opt.value}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={customData[f.paramName!] === opt.value}\n onChange={() => handleCustomChange(f.paramName!, opt.value)}\n name={`radio-group-${f.paramName}-${idx}`}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {opt.label}\n </span>\n </label>\n ))}\n </div>\n {err && <p className=\"text-red-500 text-xs\">{err}</p>}\n </div>\n );\n }\n\n // Default: text input\n return (\n <Input\n key={`custom-${idx}`}\n type=\"text\"\n label={`${displayLabel}${f.required ? ' *' : ''}`}\n value={customData[f.paramName] || ''}\n onChange={e => handleCustomChange(f.paramName!, e.target.value)}\n required={f.required}\n error={err}\n />\n );\n };\n\n // ── Render a page's fields in a 2-col grid ────────────────────────────────\n // For conditional pages: shows the gate checkbox at the TOP of the page.\n // Fields are only revealed once the checkbox is checked.\n const renderPageFields = (page: FormPage, _pageIndex: number) => {\n const conditionMet = isConditionMet(page);\n\n return (\n <div className=\"space-y-4\">\n {/* Gate checkbox — shown at top when this page has a condition */}\n {page.conditionalOn && (\n <FieldHelpWrapper helpText={page.conditionalHelpText}>\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"checkbox\"\n checked={conditionMet}\n onChange={e => handleCustomChange(page.conditionalOn!, e.target.checked ? 'true' : 'false')}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', fontWeight: 500 }}\n >\n {page.conditionalOn}\n </span>\n </label>\n </FieldHelpWrapper>\n )}\n\n {/* Fields — only shown when condition is met (or page has no condition) */}\n {conditionMet && (\n <div className=\"grid grid-cols-4 gap-4\">\n {page.fields.map((f, idx) => {\n const colClass =\n f.colSpan === 1 ? 'col-span-1'\n : f.colSpan === 2 ? 'col-span-2'\n : f.colSpan === 3 ? 'col-span-3'\n : 'col-span-4';\n const key = f.isCustom ? `custom-${idx}-${f.paramName}` : `builtin-${f.name}-${idx}`;\n return (\n <div key={key} className={colClass}>\n <FieldHelpWrapper helpText={f.helpText}>\n {f.isCustom\n ? renderCustomField(f, idx)\n : renderBuiltInField(f.name as ApplicantFormField, key, f.displayText, f.countriesType)}\n </FieldHelpWrapper>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n // ── Loading ────────────────────────────────────────────────────────────────\n // Wait for theme and countries before deciding which mode to render.\n // Without this guard the flat form could flash briefly while the paged\n // configuration is still arriving from the backend.\n if (!currentTheme || isLoadingCountries) {\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)', fontSize: '0.875rem' }}>\n Loading form…\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // ── PAGE-BASED MODE ────────────────────────────────────────────────────────\n if (formPages) {\n const page = formPages[currentPageIndex] ?? formPages[0];\n const isFirst = prevPageIndex === -1;\n const isLast = nextPageIndex === -1;\n const totalPages = formPages.length;\n const condMet = isConditionMet(page);\n\n const errorMessages = Object.values(pageErrors);\n\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n {/* SDK main title from theme config */}\n <CardHeader>\n <Header title={currentTheme?.title || 'Create Applicant'} />\n </CardHeader>\n\n <CardContent>\n {/* Per-page title / subtitle — compact, inside content area */}\n {(page.title || page.subtitle || page.description) && (\n <div className=\"mb-4\">\n {page.title && (\n <h3\n className=\"font-semibold text-base\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {page.title}\n </h3>\n )}\n {page.subtitle && (\n <p\n className=\"text-sm mt-0.5\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {page.subtitle}\n </p>\n )}\n {page.description && page.description !== page.subtitle && (\n <p\n className=\"text-xs mt-1\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {page.description}\n </p>\n )}\n </div>\n )}\n\n {/* Error summary */}\n {(globalError || errorMessages.length > 0) && (\n <div className=\"mb-4 p-3 bg-red-50 border border-red-200 rounded-lg\">\n {globalError && <p className=\"text-red-600 text-sm\"><strong>Error:</strong> {globalError}</p>}\n {errorMessages.map((msg, i) => (\n <p key={i} className=\"text-red-600 text-sm\">{msg}</p>\n ))}\n </div>\n )}\n\n {/* Page progress indicator (when multiple pages) */}\n {totalPages > 1 && (\n <div className=\"flex items-center gap-2 mb-4\">\n {formPages.map((_, idx) => (\n <div\n key={idx}\n className={`h-1.5 rounded-full transition-all ${idx === currentPageIndex ? 'flex-1' : 'w-8'}`}\n style={\n idx === currentPageIndex\n ? { backgroundColor: 'var(--metakyc-primary, #2563eb)' }\n : idx < currentPageIndex\n ? { backgroundColor: 'var(--metakyc-primary-light, #93c5fd)', opacity: 0.7 }\n : { backgroundColor: '#e5e7eb' }\n }\n />\n ))}\n <span className=\"text-xs text-gray-400 flex-shrink-0\">{currentPageIndex + 1} / {totalPages}</span>\n </div>\n )}\n\n {renderPageFields(page, currentPageIndex)}\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n <div>\n {!isFirst && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => { setCurrentPageIndex(prevPageIndex); setPageErrors({}); }}\n disabled={isSubmitting || isCreatingApplicant}\n >\n Previous\n </Button>\n )}\n {isFirst && onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n </div>\n <Button\n type=\"button\"\n isLoading={isSubmitting || isCreatingApplicant}\n onClick={isLast ? doSubmit : handleNext}\n >\n {isLast\n ? (page.conditionalOn && !condMet ? 'Skip & Submit' : 'Submit')\n : (page.conditionalOn && !condMet ? 'Skip' : 'Next')}\n </Button>\n </CardFooter>\n </Card>\n </div>\n );\n }\n\n // ── FLAT (CLASSIC) MODE ────────────────────────────────────────────────────\n return (\n <div className=\"metakyc-sdk\">\n <form onSubmit={handleFlatSubmit}>\n <Card>\n <CardHeader>\n <Header title={currentTheme?.title || 'Create Applicant'} />\n </CardHeader>\n\n <CardContent>\n {globalError && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-600 text-sm\"><strong>Error:</strong> {globalError}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-4 gap-4\">\n {flatVisibleFields.map(field => (\n <div key={field} className=\"col-span-4\">\n {renderBuiltInField(field)}\n </div>\n ))}\n </div>\n </CardContent>\n\n <CardFooter className=\"flex justify-between\">\n {onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n <Button type=\"submit\" isLoading={isSubmitting || isCreatingApplicant}>\n Create Applicant\n </Button>\n </CardFooter>\n </Card>\n </form>\n </div>\n );\n};\n","import React from 'react';\nimport { useKycWorkflow } from '../hooks';\nimport { WorkflowStepAction, WorkflowResultType, ApplicantProgressStatus } from '../types';\nimport { QuestionnaireStep, UploadDocumentStep, OverviewStep, RiskScoringStep, InvestorCategorizationStep, AppropriatenessTestStep } from './steps';\nimport { IdentityVerificationStep } from './identity';\nimport { KycStatusDisplay } from './status';\nimport { Card, CardContent, Spinner, Badge } from './core';\nimport { Header } from './Header';\n\nexport interface KycWorkflowProps {\n applicantId: number;\n onComplete?: (result: WorkflowResultType) => void;\n onError?: (error: Error) => void;\n theme?: 'light' | 'dark';\n locale?: string;\n className?: string;\n}\n\n/**\n * Main KYC workflow component\n * Automatically renders the current step and handles progression\n */\nexport const KycWorkflow: React.FC<KycWorkflowProps> = ({\n applicantId,\n onComplete,\n onError,\n theme = 'light',\n className,\n}) => {\n const { \n progress, \n currentStep, \n steps, \n workflowKey,\n nextWorkflowKey,\n hasWorkflowChanged,\n isLoading, \n error, \n moveBack, \n refreshProgress \n } = useKycWorkflow(applicantId);\n \n const [workflowChangeAcknowledged, setWorkflowChangeAcknowledged] = React.useState(false);\n\n // Handle errors\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Handle completion\n React.useEffect(() => {\n if (progress?.workflowResult && onComplete) {\n onComplete(progress.workflowResult);\n }\n }, [progress?.workflowResult, onComplete]);\n\n // Apply theme\n React.useEffect(() => {\n if (theme === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n }, [theme]);\n\n // Reset workflow change acknowledgment when workflow actually changes\n React.useEffect(() => {\n if (hasWorkflowChanged) {\n setWorkflowChangeAcknowledged(false);\n }\n }, [hasWorkflowChanged]);\n\n if (isLoading || !progress) {\n return (\n <div className={className}>\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">Loading workflow...</p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className}>\n <Card>\n <CardContent>\n <div className=\"text-center py-8\">\n <p className=\"text-danger-500 text-lg mb-4\">An error occurred</p>\n <p className=\"text-gray-600 dark:text-gray-400\">{error.message}</p>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Show workflow change notification if workflow has changed and not acknowledged\n if (hasWorkflowChanged && !workflowChangeAcknowledged) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <div className=\"text-center py-8\">\n <div className=\"mb-6\">\n <div className=\"inline-flex items-center justify-center w-16 h-16 rounded-full bg-blue-100 dark:bg-blue-900 mb-4\">\n <svg className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n </div>\n \n <h3 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\n Workflow Transition\n </h3>\n \n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\n Your application workflow has been updated based on your progress.\n </p>\n \n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 mb-6 max-w-md mx-auto\">\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"text-left\">\n <p className=\"text-gray-500 dark:text-gray-400 mb-1\">Previous Workflow</p>\n <p className=\"font-medium text-gray-900 dark:text-white\">{workflowKey}</p>\n </div>\n <svg className=\"w-6 h-6 text-gray-400 mx-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 7l5 5m0 0l-5 5m5-5H6\" />\n </svg>\n <div className=\"text-right\">\n <p className=\"text-gray-500 dark:text-gray-400 mb-1\">New Workflow</p>\n <p className=\"font-medium text-blue-600 dark:text-blue-400\">{nextWorkflowKey}</p>\n </div>\n </div>\n {progress.nextWorkflowName && (\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-2 text-xs\">\n {progress.nextWorkflowName}\n </p>\n )}\n </div>\n \n <button\n onClick={() => setWorkflowChangeAcknowledged(true)}\n className=\"px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transition-colors\"\n >\n Continue with New Workflow\n </button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Show status display ONLY for finished or on hold states\n // IdentityPending should show the identity verification step\n // InProgress should show the workflow steps\n if (\n progress.status === ApplicantProgressStatus.Finished ||\n progress.status === ApplicantProgressStatus.OnHold\n ) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <KycStatusDisplay\n kycStatus={progress.kycStatus}\n reviewStatus={progress.reviewStatus}\n workflowResult={progress.workflowResult}\n customMessage={progress.customMessage}\n onContinue={\n onComplete && progress.workflowResult\n ? () => onComplete(progress.workflowResult!)\n : undefined\n }\n onContactSupport={() => {\n // Could be configured via props\n if (typeof window !== 'undefined') {\n window.location.href = 'mailto:support@example.com';\n }\n }}\n />\n </div>\n );\n }\n\n // For InProgress and IdentityPending status, show the workflow steps\n if (!currentStep) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">\n {progress.status === ApplicantProgressStatus.IdentityPending\n ? 'Loading identity verification...'\n : 'Loading current step...'}\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Get a human-readable fallback name based on step action type\n const getStepFallbackName = (action: WorkflowStepAction): string => {\n switch (action) {\n case WorkflowStepAction.Overview: return 'Overview';\n case WorkflowStepAction.Questionaries: return 'Questionnaire';\n case WorkflowStepAction.UploadDocument: return 'Documents';\n case WorkflowStepAction.IdentitySdk: return 'Identity';\n case WorkflowStepAction.RiskScoring: return 'Risk Assessment';\n case WorkflowStepAction.InvestorCategorization: return 'Investor Categorization';\n case WorkflowStepAction.AppropriatenessTest: return 'Appropriateness Test';\n case WorkflowStepAction.AdditionalData: return 'Additional Data';\n case WorkflowStepAction.ManualReview: return 'Review';\n default: return '';\n }\n };\n\n // Render workflow progress\n const renderProgress = () => {\n // Filter only visible steps for display\n const visibleSteps = steps.filter(step => step.visibility !== false);\n \n // Calculate current step position among visible steps\n const currentVisibleStepIndex = visibleSteps.findIndex(s => s.order === currentStep.order);\n const currentStepNumber = currentVisibleStepIndex >= 0 ? currentVisibleStepIndex + 1 : 1;\n const totalVisibleSteps = visibleSteps.length;\n \n return (\n <div className=\"mb-6\">\n {/* Header with logo and title */}\n <div className=\"flex items-start justify-between mb-4\">\n <Header />\n <Badge variant={progress.status === 1 ? 'info' : 'success'}>\n Step {currentStepNumber} of {totalVisibleSteps}\n </Badge>\n </div>\n\n <div className=\"flex items-center\">\n {visibleSteps.map((step, index) => {\n const isCompleted = index < currentVisibleStepIndex;\n const isCurrent = step.order === currentStep.order;\n \n return (\n <React.Fragment key={step.order}>\n <div className=\"flex items-center\">\n <div\n className={`\n w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium\n ${\n isCompleted || isCurrent\n ? 'bg-primary-500 text-white'\n : 'bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-400'\n }\n `}\n >\n {index + 1}\n </div>\n <span\n className={`ml-2 text-sm ${\n isCurrent\n ? 'font-semibold text-gray-900 dark:text-white'\n : 'text-gray-600 dark:text-gray-400'\n }`}\n >\n {step.displayName || step.name || getStepFallbackName(step.action) || `Step ${index + 1}`}\n </span>\n </div>\n {index < visibleSteps.length - 1 && (\n <div\n className={`flex-1 h-0.5 mx-4 ${\n isCompleted\n ? 'bg-primary-500'\n : 'bg-gray-200 dark:bg-gray-700'\n }`}\n />\n )}\n </React.Fragment>\n );\n })}\n </div>\n </div>\n );\n };\n\n // Render current step\n const renderCurrentStep = () => {\n const stepProps = {\n applicantId,\n onComplete: async () => {\n // Refresh progress after each step completion\n await refreshProgress();\n },\n onBack: currentStep.order > 0 ? moveBack : undefined,\n };\n\n switch (currentStep.action) {\n case WorkflowStepAction.Questionaries:\n return <QuestionnaireStep {...stepProps} />;\n\n case WorkflowStepAction.UploadDocument:\n return <UploadDocumentStep {...stepProps} />;\n\n case WorkflowStepAction.Overview:\n return <OverviewStep {...stepProps} />;\n\n case WorkflowStepAction.IdentitySdk:\n return <IdentityVerificationStep {...stepProps} />;\n\n case WorkflowStepAction.RiskScoring:\n return <RiskScoringStep {...stepProps} />;\n\n case WorkflowStepAction.AdditionalData:\n case WorkflowStepAction.InvestorCategorization:\n return <InvestorCategorizationStep {...stepProps} />;\n\n case WorkflowStepAction.AppropriatenessTest:\n return <AppropriatenessTestStep {...stepProps} />;\n\n case WorkflowStepAction.ManualReview:\n // ManualReview shows status display\n return (\n <KycStatusDisplay\n kycStatus={progress.kycStatus}\n reviewStatus={progress.reviewStatus}\n workflowResult={progress.workflowResult}\n customMessage={progress.customMessage}\n />\n );\n\n default:\n // Unknown step - show message but don't show status display\n // This should be a workflow step, not a final status\n return (\n <Card>\n <CardContent className=\"py-12 text-center\">\n <div className=\"mb-4\">\n <Spinner />\n </div>\n <p className=\"text-gray-600 dark:text-gray-400 mb-2\">\n Processing step: {currentStep.title || currentStep.name}\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Action type: {WorkflowStepAction[currentStep.action]}\n </p>\n </CardContent>\n </Card>\n );\n }\n };\n\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n {renderProgress()}\n {renderCurrentStep()}\n </div>\n );\n};\n","import { z } from 'zod';\nimport { QuestionnaireOutput } from '../types';\n\n/**\n * Generate zod schema for question values (reserved for future use)\n */\n/* Commented out for future use\nfunction generateQuestionValuesSchema(question: QuestionDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.array(z.string());\n\n // Apply required validation\n if (question.isRequired) {\n schema = (schema as z.ZodArray<any>).min(1, question.errorMessage || 'This field is required');\n } else {\n schema = schema.optional();\n }\n\n // Apply regex validation for the first value (single answer)\n if (!question.canMultipleAnswer && question.regex) {\n const regex = new RegExp(question.regex);\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || regex.test(val[0]),\n { message: question.errorMessage || 'Invalid format' }\n );\n }\n\n // Apply min/max validation for string length\n if (!question.canMultipleAnswer) {\n if (question.min !== undefined && question.min !== null) {\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || val[0].length >= question.min!,\n { message: `Minimum length is ${question.min}` }\n );\n }\n if (question.max !== undefined && question.max !== null) {\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || val[0].length <= question.max!,\n { message: `Maximum length is ${question.max}` }\n );\n }\n }\n\n return schema;\n}\n*/\n\n/**\n * Generate zod schema from questionnaire with grouped questions support\n */\nexport function generateQuestionnaireSchema(_questionnaire: QuestionnaireOutput) {\n // Generate schema for grouped questions structure\n // questionResults: [[{questionId, values}], [{questionId, values}], ...]\n return z.object({\n questionResults: z.any(),\n }).passthrough(); // Allow extra fields\n}\n","import { z } from 'zod';\nimport { UploadDocumentOutputDto, UploadDocumentFileDto } from '../types';\n\n/**\n * Generate zod schema for a single upload document file\n */\nfunction generateUploadDocumentFileSchema(file: UploadDocumentFileDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.array(z.instanceof(File));\n\n if (file.isRequired) {\n schema = (schema as z.ZodArray<any>).min(\n 1,\n `${file.displayName} is required`\n );\n } else {\n schema = schema.optional();\n }\n\n // Validate multiple files\n if (!file.multipleFile) {\n schema = (schema as z.ZodArray<any> | z.ZodOptional<z.ZodArray<any>>).refine(\n (files) => !files || files.length <= 1,\n { message: 'Only one file is allowed' }\n );\n }\n\n // Validate file size\n if (file.maxEachFileSizeByte > 0) {\n schema = (schema as any).refine(\n (files: File[] | undefined) =>\n !files || files.every((f) => f.size <= file.maxEachFileSizeByte),\n { message: `File size must not exceed ${Math.round(file.maxEachFileSizeByte / 1024 / 1024)}MB` }\n );\n }\n\n // Validate file type\n if (file.allowedTypes) {\n const allowedMimeTypes = file.allowedTypes.split(',').map((t) => t.trim());\n schema = (schema as any).refine(\n (files: File[] | undefined) => {\n if (!files) return true;\n return files.every((f) =>\n allowedMimeTypes.some((type) => {\n if (type.endsWith('/*')) {\n return f.type.startsWith(type.slice(0, -2));\n }\n return f.type === type;\n })\n );\n },\n { message: 'Invalid file type' }\n );\n }\n\n return schema;\n}\n\n/**\n * Generate zod schema from upload document\n */\nexport function generateUploadDocumentSchema(uploadDocument: UploadDocumentOutputDto) {\n const schemaObject: Record<string, z.ZodTypeAny> = {};\n\n uploadDocument.uploadDocumentFiles.forEach((file) => {\n const fieldName = `file_${file.id}`;\n schemaObject[fieldName] = generateUploadDocumentFileSchema(file);\n });\n\n return z.object(schemaObject);\n}\n","import { z } from 'zod';\nimport { RiskCriteriaDto } from '../types';\n\n/**\n * Generate zod schema for a single risk criterion (reserved for future use)\n */\n/* Commented out for future use\nfunction generateCriterionSchema(criterion: RiskCriteriaDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny;\n\n // Base schema based on value data type\n switch (criterion.valueDataType) {\n case ValueDataType.Integer:\n schema = z.coerce.number().int();\n if (criterion.min !== undefined && criterion.min !== null) {\n schema = (schema as z.ZodNumber).min(criterion.min);\n }\n if (criterion.max !== undefined && criterion.max !== null) {\n schema = (schema as z.ZodNumber).max(criterion.max);\n }\n break;\n\n case ValueDataType.Money:\n schema = z.coerce.number();\n if (criterion.min !== undefined && criterion.min !== null) {\n schema = (schema as z.ZodNumber).min(criterion.min);\n }\n if (criterion.max !== undefined && criterion.max !== null) {\n schema = (schema as z.ZodNumber).max(criterion.max);\n }\n break;\n\n case ValueDataType.Boolean:\n schema = z.boolean();\n break;\n\n case ValueDataType.Date:\n schema = z.string();\n break;\n\n case ValueDataType.Country:\n case ValueDataType.String:\n default:\n schema = z.string();\n if (criterion.regex) {\n const regex = new RegExp(criterion.regex);\n schema = (schema as z.ZodString).regex(regex, 'Invalid format');\n }\n break;\n }\n\n // Apply required validation\n if (criterion.isRequired) {\n if (schema instanceof z.ZodString) {\n schema = schema.min(1, `${criterion.displayName} is required`);\n }\n } else {\n schema = schema.optional();\n }\n\n return schema;\n}\n*/\n\n/**\n * Generate zod schema from risk criteria\n * Only validates user inputs (values), not metadata (riskCriteriaId)\n */\nexport function generateRiskScoringSchema(_criteria: RiskCriteriaDto[]) {\n // Don't validate the structure - just allow any data\n // Individual field validation happens during rendering\n return z.any();\n}\n","import { z } from 'zod';\nimport { AppropriatenessTestOutputDto, AppropriatenessQuestionOutputDto } from '../types';\n\n/**\n * Generate zod schema for a single appropriateness question\n */\nfunction generateQuestionSchema(_question: AppropriatenessQuestionOutputDto): z.ZodTypeAny {\n // All questions are required in the appropriateness test\n return z.string().min(1, 'This question is required');\n}\n\n/**\n * Generate zod schema from appropriateness test\n */\nexport function generateAppropriatenessSchema(test: AppropriatenessTestOutputDto) {\n const schemaObject: Record<string, z.ZodTypeAny> = {};\n\n test.appropriatenessQuestions.forEach((question) => {\n const fieldName = `question_${question.id}`;\n schemaObject[fieldName] = generateQuestionSchema(question);\n });\n\n return z.object(schemaObject);\n}\n\n// Simple schema for compatibility\nexport const appropriatenessTestSchema = z.any();\n"],"names":["WorkflowStepAction","WorkflowResultType","ApplicantProgressStatus","ApplicantProgressOnHoldReason","RiskLevel","KycStatus","ReviewStatus","ApplicantStatus","KycProcessStatus","IdentityVerificationProvider","UserType","GenderType","FileType","DocumentReviewStatus","AppropriatenessQuestionType","ValueDataType","RiskCriteriaType","CriteriaBuiltInType","InvestorCategorizationType","InvestorCategoryType","CountriesType","FIELD_METADATA","DEFAULT_VISIBLE_FIELDS","ALLOWED_LANGUAGES","ThemePreset","defaultConfig","EndpointBuilder","config","controller","action","customKey","MetaKYCError","message","code","details","validationErrors","response","__publicField","ErrorHandler","error","data","HttpClient","axios","originalRequest","_a","resolve","params","url","ApplicantService","httpClient","input","applicantId","language","externalRefId","QuestionnaireService","UploadDocumentService","AppropriatenessTestService","OverviewService","RiskScoringService","IdentityService","BaseInformationService","filter","lng","type","InvestorCategorizationService","defaultTheme","corporateTheme","fintechTheme","healthcareTheme","modernTheme","minimalTheme","themePresets","getThemePreset","preset","ThemeService","theme","parsed","p","isOldFormat","f","overrides","baseTheme","EventEmitter","event","callback","callbacks","WorkflowState","progress","previousStep","_b","StepRouter","handler","WorkflowOrchestrator","applicantService","questionnaireService","uploadDocumentService","appropriatenessTestService","overviewService","riskScoringService","_identityService","investorCategorizationService","loadScript","src","id","reject","script","isScriptLoaded","removeScript","SumsubProvider","containerId","payload","OnfidoProvider","SardinAIProvider","c","r","environment","region","sardineHost","loader","firstScript","clientId","flow","enableBiometrics","enablePortScanning","noscript","img","options","IdentityProviderManager","provider","tokenObject","contextConfig","sardinConfig","buildInputCSS","ThemeManager","container","colors","colorMap","key","value","cssVar","typography","spacing","css","str","MetaKYCContext","createContext","MetaKYCProvider","children","currentTheme","setCurrentTheme","useState","isLoadingThemeRef","React","hasLoadedThemeRef","services","useMemo","identityService","baseInformationService","themeService","themeManager","useEffect","jsx","useMetaKYC","context","useContext","fileToBase64","file","reader","base64","validateFileSize","maxSizeBytes","validateFileType","allowedTypes","prefix","formatFileSize","bytes","k","sizes","i","getAcceptString","cn","classes","STORAGE_KEYS","saveApplicantId","getApplicantId","stored","clearApplicantId","saveWorkflowState","state","getWorkflowState","clearWorkflowState","clearAllStorage","useKycWorkflow","createOrchestrator","setProgress","isLoading","setIsLoading","setError","orchestratorRef","useRef","effectiveApplicantId","isLoadingRef","hasLoadedRef","loadProgress","useCallback","result","err","refreshProgress","moveToNext","moveBack","submitCurrentStep","sortedSteps","a","b","hasWorkflowChanged","useQuestionnaire","questionnaire","setQuestionnaire","initialAnswers","setInitialAnswers","isSubmitting","setIsSubmitting","load","applicantData","textToAnswers","qr","answers","allQuestions","g","q","submit","useUploadDocument","uploadDocument","setUploadDocument","uploadProgress","setUploadProgress","useAppropriatenessTest","test","setTest","setResult","submitResult","useOverview","overview","setOverview","passOverview","useIdentityVerification","identityData","setIdentityData","isRequestingRef","requestIdentity","redirectUrl","ttl","requestCompanyIdentity","restartIdentity","useRiskScoring","criteria","setCriteria","latestResult","cr","values","v","useApplicant","isCreatingRef","isLoadingDataRef","generateSardinAISessionKey","createApplicant","sessionKey","createCompanyApplicant","getApplicantData","stopProgress","Button","variant","size","disabled","className","props","baseStyles","variantStyles","sizeStyles","jsxs","Input","forwardRef","label","helperText","leftIcon","rightIcon","style","ref","Card","CardHeader","CardContent","CardFooter","Badge","Spinner","Select","placeholder","option","idx","DROPDOWN_MAX_HEIGHT","MultiSelect","onChange","required","isOpen","setIsOpen","search","setSearch","pos","setPos","portalColors","setPortalColors","containerRef","triggerRef","dropdownRef","calcPos","rect","openUp","snapPortalColors","s","name","fallback","bg","open","close","e","target","update","filteredOptions","o","toggleOption","optionValue","removeValue","getLabel","val","borderColor","textPrimary","textSecondary","primaryColor","primaryLight","hoverBg","dropdownPanel","isSelected","createPortal","SearchableSelect","searchRef","handleToggle","selectedLabel","handleSelect","optValue","optDisabled","border","primary","FileUpload","accept","multiple","maxSize","isDragging","setIsDragging","inputRef","handleFiles","files","fileArray","maxSizeFormatted","handleDragOver","handleDragLeave","handleDrop","handleClick","removeFile","index","newFiles","_","PhoneInput","countryCode","onCountryCodeChange","mergeClasses","array","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","prop","Icon","color","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","ChevronLeft","ChevronRight","validateQuestion","question","isEmpty","first","num","buildPages","groups","flat","gi","qi","map","pq","qs","QuestionnaireStep","onComplete","onBack","setAnswers","fieldErrors","setFieldErrors","currentPage","setCurrentPage","pages","isLastPage","currentQuestions","setAnswer","questionId","prev","validatePage","newErrors","handleNext","handleBack","handleSubmit","questionResults","QuestionField","vals","qType","answer","UploadDocumentStep","setFiles","uploadDocumentResults","docFile","fileList","valueList","OverviewStep","handleConfirm","step","resolveLocale","locale","isMoneyWithOptions","criterion","formatMoneyLabel","raw","fmt","validateCriterion","isNumeric","cs","getInputType","RiskScoringStep","autoSubmitted","setAutoSubmitted","currentCriteria","criteriaId","criteriaValueInputs","x","CriterionField","inputType","moneyOptions","InvestorCategorizationStep","selectedType","setSelectedType","AppropriatenessTestStep","testData","setTestData","timeRemaining","setTimeRemaining","isTestStarted","setIsTestStarted","isTestExpired","setIsTestExpired","waitTimeRemaining","setWaitTimeRemaining","waitSeconds","parseTimeSpan","timeSpan","parts","hours","minutes","seconds","formatTime","mins","secs","timer","handleStartTest","handleAnswerChange","unansweredCount","reloadTestData","failureMessage","attemptsRemaining","answerIndex","IdentityVerificationStep","token","identityLoading","providerInstance","setProviderInstance","setApplicantData","countries","setCountries","phoneCountries","setPhoneCountries","isLoadingData","setIsLoadingData","showProvider","setShowProvider","providerError","setProviderError","isExpired","setIsExpired","hasAutoRequestedRef","reviewData","setReviewData","customData","setCustomData","reviewPage","reviewPageDisabled","reviewPageDisabledRef","form","useForm","countriesData","phoneData","seen","countryOptions","phoneSeen","phoneOptions","requestData","expirationTime","urlString","providerType","providerConfig","instance","errorMessage","handleRestart","iframe","iframeDoc","text","_c","COUNTRY_FIELD_META_TYPES","colClass","span","formatDisplayValue","opt","ReviewHelpButton","helpText","setOpen","btnRef","openModal","Fragment","ReactDOM","withHelp","content","renderCustomField","pn","checked","selected","toggleOpt","renderReviewField","meta","isPhoneCountry","isCountry","pageTitle","pageSubtitle","_d","Controller","field","KycStatusDisplay","kycStatus","reviewStatus","workflowResult","customMessage","onContinue","onContactSupport","statusInfo","Logo","Header","titleProp","subtitle","title","hasLogo","hasTitle","SYSTEM_REQUIRED","OPTION_INPUT_STYLE","FieldHelpWrapper","modal","CreateApplicantForm","workflowKeyProp","externalRefIdProp","onSuccess","onCancel","isCreatingApplicant","workflowKey","initialExternalRefId","initialEmail","formPages","requiredFields","set","clientReq","page","flatVisibleFields","fields","COUNTRY_FIELD_NAMES","neededCountryTypes","types","countriesMap","setCountriesMap","isLoadingCountries","setIsLoadingCountries","loadingTypesRef","loadedTypesRef","typesToLoad","t","keys","entries","isPhoneType","list","getCountriesForField","override","formData","setFormData","currentPageIndex","setCurrentPageIndex","pageErrors","setPageErrors","globalError","setGlobalError","handleChange","handleCustomChange","paramName","isConditionMet","nextPageIndex","prevPageIndex","errs","displayLabel","fieldName","doSubmit","allErrs","additionalDatas","handleFlatSubmit","renderBuiltInField","displayText","countriesTypeOverride","metadata","isRequired","fieldError","labelText","elementKey","commonProps","countryList","langOptions","l","nationalityList","linkLabel","selectedValues","isChecked","next","renderPageFields","_pageIndex","conditionMet","isFirst","isLast","totalPages","condMet","errorMessages","msg","KycWorkflow","onError","currentStep","steps","nextWorkflowKey","workflowChangeAcknowledged","setWorkflowChangeAcknowledged","getStepFallbackName","renderProgress","visibleSteps","currentVisibleStepIndex","currentStepNumber","totalVisibleSteps","isCompleted","isCurrent","renderCurrentStep","stepProps","generateQuestionnaireSchema","_questionnaire","z","generateUploadDocumentFileSchema","schema","allowedMimeTypes","generateUploadDocumentSchema","schemaObject","generateRiskScoringSchema","_criteria","generateQuestionSchema","_question","generateAppropriatenessSchema","appropriatenessTestSchema"],"mappings":"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","x_google_ignoreList":[57,58,59,60,61,62,63,64,65,66]}