import { useMemo, useState, type ReactNode } from 'react'; import { NavIcon } from './NavIcon'; import type { SettingsField, SettingsSection } from '../types/settingsSchema'; import { isTruthyCheckboxValue } from '../pages/settingsRenderField'; type Props = { tabSchema: SettingsSection[]; renderField: (f: SettingsField) => React.ReactNode; /** Current form values (for cross-field hints). */ draft?: Record; }; function sectionIconName(raw?: string): string { const s = (raw || '').trim(); const fa = s.replace(/^fas\s+fa-/, '').replace(/^fa-/, ''); switch (fa) { case 'shopping-cart': return 'chart'; case 'check-circle': return 'badge'; case 'user-plus': return 'users'; case 'users': return 'users'; case 'sign-out-alt': return 'layers'; case 'lock': return 'cog'; case 'calendar-alt': return 'tag'; default: return fa || 'layers'; } } function SectionShell(props: { title?: string; description?: string; icon?: string; locked?: boolean; lockedReason?: string; children: ReactNode; }) { const { title, description, icon, locked, lockedReason, children } = props; return (
{title ? (

{title}

{locked ? ( Pro ) : null}
{description ? (

{description}

) : null} {locked ? (

{lockedReason || 'Turn on the matching addon to edit these settings.'}

) : null}
) : null} {children}
); } /** Sub-tabs group all enrollment-related options in one sidebar destination (no duplicate “Enrollment” under Courses). */ const SUB_TABS: Array<{ id: 'purchase' | 'access' | 'rules'; label: string; icon: string; keys: string[] }> = [ { id: 'purchase', label: 'Purchase & completion', icon: 'chart', keys: ['enrollment_checkout', 'enrollment_dynamic_checkout_fields', 'enrollment_completion'], }, { id: 'access', label: 'Access & capacity', icon: 'users', keys: ['enrollment_access', 'enrollment_limits'], }, { id: 'rules', label: 'Unenroll & advanced', icon: 'layers', keys: ['enrollment_unenroll', 'enrollment_prerequisites', 'enrollment_periods'], }, ]; export function EnrollmentSettingsTab(props: Props) { const { tabSchema, renderField, draft } = props; const [sub, setSub] = useState<(typeof SUB_TABS)[number]['id']>('purchase'); const guestLoginConflict = draft && isTruthyCheckboxValue(draft.allow_guest_enrollment) && isTruthyCheckboxValue(draft.require_login); const byKey = useMemo(() => { const map = new Map(); for (const sec of tabSchema) { const k = sec.section_key; if (k) { map.set(k, sec); } } return map; }, [tabSchema]); const fieldsOf = (key: string) => byKey.get(key)?.fields ?? []; const activeKeys = SUB_TABS.find((t) => t.id === sub)?.keys ?? []; return (

Everything about joining courses, checkout behavior, completion rules, and capacity lives here — not under Courses. Use Courses for catalog layout, reviews, and search only.

{guestLoginConflict ? (

These two options usually conflict

Guest enrollment lets people join without a WordPress account. “Require login for course access” expects a logged-in user to open lessons. Together, guests may enroll but then cannot open content. Turn off guest enrollment if everyone must log in, or turn off the login requirement if you truly need guest access (subject to how your theme handles identity).

) : null}
{SUB_TABS.map((t) => ( ))}
{activeKeys.map((sectionKey) => { const sec = byKey.get(sectionKey); const fields = fieldsOf(sectionKey); if (!fields.length) { return null; } return (
{fields.map(renderField)}
); })}
); }