import { useEffect, useState } from 'react' import { Users, Crown, Loader2 } from 'lucide-react' import { FeatureHeader } from '@/components/feature-header' import { FeatureTabs, FeatureTabsNavigation, FeatureTabsTrigger, FeatureTabsContent, FeatureSubTabsList, FeatureSubTabsTrigger, FEATURE_TABS_SURFACE_CLASSNAME } from '@/components/ui/feature-tabs' import { Tabs, TabsContent } from '@/components/ui/tabs' import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Switch } from '@/components/ui/switch' import { Label } from '@/components/ui/label' import { ReportError } from '@/components/ui/reporting' import { FeatureUpgradeTab } from '@/components/pro/feature-upgrade-tab' import { usePro } from '@/contexts/pro-context' import { useNavigation } from '@/contexts/navigation-context' import { settingsSaved, toast } from '@/components/ui/toast' import { EditorTab } from '@/features/customization/registration-form/components/tabs/editor-tab' import { SettingsTab as FormSettings } from '@/features/customization/registration-form/components/tabs/settings-tab' import { EmailsTab as WelcomeEmail } from '@/features/customization/registration-form/components/tabs/emails-tab' import { SettingsTab as AccessSettings } from '@/features/spam/email-verification/components/tabs/settings-tab' import { AdvancedTab } from '@/features/spam/email-verification/components/tabs/advanced-tab' import { VerificationEmailTab } from '@/features/spam/email-verification/components/tabs/verification-email-tab' import { CustomizationTab as ApprovalEmails } from '@/features/spam/email-verification/components/tabs/customization-tab' import { RegistrationReview } from './registration-review' import { useRegistrationAccess } from './use-registration-access' import { DomainRestrictions } from './domain-restrictions' export function RegistrationAccessSettings() { const state = useRegistrationAccess() const { isPro } = usePro() const { currentPage, currentTab, navigateTo } = useNavigation() const [formTab, setFormTab] = useState('fields') const reviewAvailable = isPro && state.providers.review === true const tabs = ['overview', 'forms', 'access', ...(reviewAvailable ? ['registrations'] : []), 'emails', ...(reviewAvailable ? ['activity'] : []), ...(!isPro ? ['upgrade'] : [])] // Old deep links remain usable; ordinary visits/tab changes still create history. const legacy = currentPage === 'customization/registration-form' ? ({ editor: 'forms', settings: 'forms', emails: 'emails', upgrade: 'upgrade' } as Record)[currentTab || 'editor'] : currentPage === 'spam/email-verification' ? ({ settings: 'access', advanced: 'access', customization: 'emails', 'pending-users': 'registrations', emails: 'emails', upgrade: 'upgrade' } as Record)[currentTab || 'settings'] : undefined const requested = currentTab?.startsWith('registrations/') ? 'registrations' : legacy || currentTab || '' const active = tabs.includes(requested) ? requested : 'overview' const go = (tab: string) => navigateTo('customers/registration-access', tab) useEffect(() => { document.title = 'Registration & Access · Swift Commerce' return () => { document.title = 'Swift Commerce Dashboard' } }, []) useEffect(() => { const warn = (event: BeforeUnloadEvent) => { if (state.hasChanges) { event.preventDefault(); event.returnValue = '' } } const leaving = (event: Event) => { const page = (event as CustomEvent<{ page: string }>).detail.page if (state.hasChanges && !['customers/registration-access', 'customization/registration-form', 'spam/email-verification'].includes(page) && !window.confirm('Leave Registration & Access and discard unsaved changes?')) event.preventDefault() } window.addEventListener('beforeunload', warn) window.addEventListener('swift-commerce:navigate', leaving) return () => { window.removeEventListener('beforeunload', warn); window.removeEventListener('swift-commerce:navigate', leaving) } }, [state.hasChanges]) if (state.loading) return
Loading registration settings…
if (!state.canEdit && !state.hasChanges && state.error) return
const forms = state.forms.settings, access = state.access.settings const formProps = { settings: forms, fields: state.forms.fields, onUpdateSettings: state.updateForms, accessState: access } const accessProps = { settings: access, updateSettings: state.updateAccess, registrationFormState: forms } const save = async () => { if (await state.save()) settingsSaved(); else toast.error('Not all changes were saved. Review the message below.') } return } title="Registration & Access" description="Customize registration forms, verify email addresses and review new accounts." documentationUrl="https://www.swiftcommerce.io/help/customization/registration-forms/" enabled hideEnabledSwitch hasProFeatures={false} onEnabledChange={() => {}} hasChanges={state.hasChanges && state.canEdit} isSaving={state.saving} onSave={save} onReset={state.discard} resetButtonText="Discard changes" resetConfirmMessage="Discard unsaved Forms and Access changes? Saved fields, account decisions, emails and shared branding will not be reset." hideSettingsActions={['registrations', 'activity', 'upgrade'].includes(active)} contentClassName={FEATURE_TABS_SURFACE_CLASSNAME} contentInnerClassName="p-0" headerClassName="border-b-0"> {state.error &&

{state.error}

} {tabs.map(tab => {tab === 'upgrade' && }{({ overview: 'Overview', forms: 'Forms', access: 'Access', registrations: 'Registrations', emails: 'Emails', activity: 'Activity', upgrade: 'Upgrade to Pro' } as Record)[tab]} {((tab === 'forms' && state.dirtyForms) || (tab === 'access' && state.dirtyAccess)) && } )} Current setupCustom fields and access checks can be used independently. Changes take effect after saving. {isPro && !reviewAvailable &&

The registration review provider is unavailable. Update both Free and Pro together before using the new review workspace. Existing account restrictions are retained.

}

Registration fields

{forms.enabled ? 'Custom fields enabled' : 'Default registration fields'}

Account access

{!access.enabled ? 'No additional access check' : access.verificationMode === 'admin_approval' ? 'Administrator approval' : 'Email verification'}

{state.hasChanges ? 'This summary includes unsaved changes.' : 'Showing saved configuration.'} Disabling form customization does not disable account access checks.

{reviewAvailable && }
FieldsAppearance
state.updateForms({ enabled })} />
{ const field = state.forms.fields.find(item => item.id === id); if (field) state.updateField(id, { enabled: !field.enabled }) }} onReorderFields={state.reorderFields} />
{isPro && state.providers.domainRestrictions === true && }

{access.enabled ? 'New registrations at selected locations must complete the check.' : 'Swift Commerce adds no access check for new registrations.'} Existing review decisions are retained.

state.updateAccess('enabled', value)} />
{isPro && } state.updateAccess('skipRoles', access.skipRoles.includes(role) ? access.skipRoles.filter(item => item !== role) : [...access.skipRoles, role])} /> {isPro && }
{isPro && access.verificationMode === 'admin_approval' && }{isPro && }
{reviewAvailable && } {reviewAvailable && } {!isPro && }
}