227 lines
7.9 KiB
TypeScript
227 lines
7.9 KiB
TypeScript
import React from 'react';
|
|
import { FormSection } from '../../../components/forms/FormSection';
|
|
import { FormField } from '../../../components/forms/FormField';
|
|
import { SelectField } from '../../../components/forms/SelectField';
|
|
import { EINInput } from '../../../components/forms/EINInput';
|
|
import { Button } from '../../../components/shared/Button';
|
|
|
|
const businessTypes = ['Corporation', 'Limited Liability Corporation', 'Partnership', 'Co-operative', 'Non-profit Corporation'];
|
|
|
|
const industries = [
|
|
'AGRICULTURE', 'AUTOMOTIVE', 'BANKING', 'CONSTRUCTION', 'CONSUMER', 'EDUCATION',
|
|
'ELECTRONICS', 'ENGINEERING', 'ENERGY', 'FAST_MOVING_CONSUMER_GOODS', 'FINANCIAL',
|
|
'FINTECH', 'FOOD_AND_BEVERAGE', 'GOVERNMENT', 'HEALTHCARE', 'HOSPITALITY',
|
|
'INSURANCE', 'JEWELRY', 'LEGAL', 'MANUFACTURING', 'MEDIA', 'NOT_FOR_PROFIT',
|
|
'OIL_AND_GAS', 'ONLINE', 'PROFESSIONAL_SERVICES', 'RAW_MATERIALS', 'REAL_ESTATE',
|
|
'RELIGION', 'RETAIL', 'TECHNOLOGY', 'TELECOMMUNICATIONS', 'TRANSPORTATION', 'TRAVEL',
|
|
];
|
|
|
|
const regions = ['USA_AND_CANADA', 'EUROPE', 'ASIA', 'LATIN_AMERICA', 'AFRICA'];
|
|
|
|
const companyTypes = ['public', 'private', 'non-profit', 'government'];
|
|
|
|
const registrationIdentifiers = ['EIN', 'DUNS', 'CBN', 'CN', 'ACN', 'CIN', 'VAT', 'VATRN', 'RN', 'Other'];
|
|
|
|
interface BusinessInfoStepProps {
|
|
data: any;
|
|
errors: Record<string, string>;
|
|
onChange: (data: any) => void;
|
|
}
|
|
|
|
export function BusinessInfoStep({ data, errors, onChange }: BusinessInfoStepProps) {
|
|
const addSocialMediaUrl = () => {
|
|
onChange({ socialMediaUrls: [...data.socialMediaUrls, ''] });
|
|
};
|
|
|
|
const removeSocialMediaUrl = (index: number) => {
|
|
onChange({
|
|
socialMediaUrls: data.socialMediaUrls.filter((_: any, i: number) => i !== index),
|
|
});
|
|
};
|
|
|
|
const updateSocialMediaUrl = (index: number, value: string) => {
|
|
const updated = [...data.socialMediaUrls];
|
|
updated[index] = value;
|
|
onChange({ socialMediaUrls: updated });
|
|
};
|
|
|
|
const toggleRegion = (region: string) => {
|
|
const regions = data.regionsOfOperation.includes(region)
|
|
? data.regionsOfOperation.filter((r: string) => r !== region)
|
|
: [...data.regionsOfOperation, region];
|
|
onChange({ regionsOfOperation: regions });
|
|
};
|
|
|
|
return (
|
|
<div>
|
|
<FormSection title="Business Information" description="Provide your company's legal details">
|
|
<FormField
|
|
label="Business Name"
|
|
name="businessName"
|
|
value={data.businessName}
|
|
onChange={(v) => onChange({ businessName: v })}
|
|
placeholder="Exact legal name matching EIN"
|
|
error={errors.businessName}
|
|
required
|
|
/>
|
|
|
|
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 'var(--spacing-4)' }}>
|
|
<SelectField
|
|
label="Business Type"
|
|
name="businessType"
|
|
value={data.businessType}
|
|
onChange={(v) => onChange({ businessType: v })}
|
|
options={businessTypes}
|
|
error={errors.businessType}
|
|
required
|
|
/>
|
|
|
|
<SelectField
|
|
label="Company Type"
|
|
name="companyType"
|
|
value={data.companyType}
|
|
onChange={(v) => onChange({ companyType: v })}
|
|
options={companyTypes}
|
|
error={errors.companyType}
|
|
required
|
|
/>
|
|
</div>
|
|
|
|
<SelectField
|
|
label="Business Industry"
|
|
name="businessIndustry"
|
|
value={data.businessIndustry}
|
|
onChange={(v) => onChange({ businessIndustry: v })}
|
|
options={industries}
|
|
error={errors.businessIndustry}
|
|
required
|
|
/>
|
|
|
|
<div style={{ display: 'grid', gridTemplateColumns: '1fr 2fr', gap: 'var(--spacing-4)' }}>
|
|
<SelectField
|
|
label="Registration ID Type"
|
|
name="registrationIdentifier"
|
|
value={data.registrationIdentifier}
|
|
onChange={(v) => onChange({ registrationIdentifier: v })}
|
|
options={registrationIdentifiers}
|
|
required
|
|
/>
|
|
|
|
<EINInput
|
|
label="Registration Number"
|
|
name="registrationNumber"
|
|
value={data.registrationNumber}
|
|
onChange={(v) => onChange({ registrationNumber: v })}
|
|
helpText="9-digit EIN (XX-XXXXXXX)"
|
|
error={errors.registrationNumber}
|
|
required
|
|
/>
|
|
</div>
|
|
|
|
<FormField
|
|
label="Website URL"
|
|
name="websiteUrl"
|
|
type="url"
|
|
value={data.websiteUrl}
|
|
onChange={(v) => onChange({ websiteUrl: v })}
|
|
placeholder="https://example.com"
|
|
error={errors.websiteUrl}
|
|
required
|
|
/>
|
|
|
|
<div>
|
|
<label
|
|
style={{
|
|
display: 'block',
|
|
fontSize: 'var(--font-size-sm)',
|
|
fontWeight: 600,
|
|
color: 'var(--color-text-primary)',
|
|
marginBottom: 'var(--spacing-2)',
|
|
}}
|
|
>
|
|
Social Media URLs (optional)
|
|
</label>
|
|
{data.socialMediaUrls.map((url: string, index: number) => (
|
|
<div key={index} style={{ display: 'flex', gap: 'var(--spacing-2)', marginBottom: 'var(--spacing-2)' }}>
|
|
<input
|
|
type="url"
|
|
value={url}
|
|
onChange={(e) => updateSocialMediaUrl(index, e.target.value)}
|
|
placeholder="https://twitter.com/yourcompany"
|
|
style={{ flex: 1 }}
|
|
/>
|
|
<Button variant="danger" size="sm" onClick={() => removeSocialMediaUrl(index)}>
|
|
Remove
|
|
</Button>
|
|
</div>
|
|
))}
|
|
<Button variant="secondary" size="sm" onClick={addSocialMediaUrl}>
|
|
+ Add Social Media URL
|
|
</Button>
|
|
</div>
|
|
|
|
<SelectField
|
|
label="Business Identity"
|
|
name="businessIdentity"
|
|
value={data.businessIdentity}
|
|
onChange={(v) => onChange({ businessIdentity: v })}
|
|
options={[
|
|
{ value: 'direct_customer', label: 'Direct Customer' },
|
|
{ value: 'isv_reseller_or_partner', label: 'ISV / Reseller / Partner' },
|
|
]}
|
|
required
|
|
/>
|
|
|
|
<div>
|
|
<label
|
|
style={{
|
|
display: 'block',
|
|
fontSize: 'var(--font-size-sm)',
|
|
fontWeight: 600,
|
|
color: 'var(--color-text-primary)',
|
|
marginBottom: 'var(--spacing-2)',
|
|
}}
|
|
>
|
|
Regions of Operation *
|
|
</label>
|
|
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-3)' }}>
|
|
{regions.map((region) => (
|
|
<label
|
|
key={region}
|
|
style={{
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
gap: 'var(--spacing-2)',
|
|
cursor: 'pointer',
|
|
padding: 'var(--spacing-2) var(--spacing-3)',
|
|
background: data.regionsOfOperation.includes(region)
|
|
? 'var(--color-accent-primary)'
|
|
: 'var(--color-background-tertiary)',
|
|
color: data.regionsOfOperation.includes(region) ? 'white' : 'var(--color-text-primary)',
|
|
borderRadius: 'var(--border-radius-md)',
|
|
fontSize: 'var(--font-size-sm)',
|
|
fontWeight: 500,
|
|
transition: 'all 0.2s',
|
|
}}
|
|
>
|
|
<input
|
|
type="checkbox"
|
|
checked={data.regionsOfOperation.includes(region)}
|
|
onChange={() => toggleRegion(region)}
|
|
style={{ display: 'none' }}
|
|
/>
|
|
{region.replace(/_/g, ' ')}
|
|
</label>
|
|
))}
|
|
</div>
|
|
{errors.regionsOfOperation && (
|
|
<div style={{ fontSize: 'var(--font-size-sm)', color: 'var(--color-error)', marginTop: 'var(--spacing-1)' }}>
|
|
{errors.regionsOfOperation}
|
|
</div>
|
|
)}
|
|
</div>
|
|
</FormSection>
|
|
</div>
|
|
);
|
|
}
|