'use client' import { useState } from 'react' import { KeyIcon, CheckCircleIcon, ExclamationTriangleIcon, UserIcon, DocumentTextIcon } from '@heroicons/react/24/outline' interface LicenseValidationProps { systemInfo: any configData: any onComplete: (data: any) => void onBack?: () => void isCompleted: boolean } interface LicenseData { email: string licenseKey: string organizationName?: string acceptedAt?: string } export default function LicenseValidation({ systemInfo, configData, onComplete, onBack, isCompleted }: LicenseValidationProps) { const [licenseData, setLicenseData] = useState({ email: configData?.license?.email || '', licenseKey: configData?.license?.licenseKey || '', organizationName: configData?.license?.organizationName || '' }) const [validating, setValidating] = useState(false) const [validationResult, setValidationResult] = useState<{ valid: boolean message: string details?: any } | null>(null) const [error, setError] = useState('') // Email validation function const isValidEmail = (email: string): boolean => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ return emailRegex.test(email) } // Check if form is ready for validation const canValidate = licenseData.email && isValidEmail(licenseData.email) && licenseData.licenseKey const validateLicense = async () => { if (!licenseData.email || !licenseData.licenseKey) { setError('Both email and license key are required') return } if (!isValidEmail(licenseData.email)) { setError('Please enter a valid email address') return } setValidating(true) setError('') setValidationResult(null) try { const response = await fetch('/api/setup/license/validate', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: licenseData.email, licenseKey: licenseData.licenseKey, organizationName: licenseData.organizationName }), }) const result = await response.json() if (response.ok && result.valid) { setValidationResult({ valid: true, message: result.message || 'License validated successfully', details: result.details }) } else { setValidationResult({ valid: false, message: result.message || 'License validation failed', details: result.details }) } } catch (error) { console.error('License validation error:', error) setValidationResult({ valid: false, message: 'Failed to validate license. Please check your connection and try again.' }) } finally { setValidating(false) } } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (!licenseData.email || !licenseData.licenseKey) { setError('Both email and license key are required') return } if (!validationResult?.valid) { setError('Please validate your license before continuing') return } setError('') onComplete({ license: { ...licenseData, validatedAt: new Date().toISOString(), validationDetails: validationResult.details } }) } return (
{/* License Information */}

License Information

{validationResult?.valid && }
setLicenseData(prev => ({ ...prev, email: e.target.value }))} placeholder="your-email@company.com" className={`w-full pl-10 pr-4 py-3 border rounded-lg focus:ring-bzzz-primary focus:border-bzzz-primary ${ licenseData.email && !isValidEmail(licenseData.email) ? 'border-red-300 bg-red-50' : 'border-gray-300' }`} required />
{licenseData.email && !isValidEmail(licenseData.email) ? (

Please enter a valid email address

) : (

The email address associated with your CHORUS:agents license

)}
setLicenseData(prev => ({ ...prev, licenseKey: e.target.value }))} placeholder="BZZZ-XXXX-XXXX-XXXX-XXXX" className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-lg focus:ring-bzzz-primary focus:border-bzzz-primary font-mono" required />

Your unique CHORUS:agents license key (found in your purchase confirmation email). Validation is powered by KACHING license authority.

setLicenseData(prev => ({ ...prev, organizationName: e.target.value }))} placeholder="Your Company Name" className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-bzzz-primary focus:border-bzzz-primary" />

Optional: Organization name for license tracking

{/* Validation Result */} {validationResult && (
{validationResult.valid ? ( ) : ( )}

{validationResult.valid ? 'License Valid' : 'License Invalid'}

{validationResult.message}

{validationResult.valid && validationResult.details && (

License Type: {validationResult.details.licenseType || 'Standard'}

Max Nodes: {validationResult.details.maxNodes || 'Unlimited'}

Expires: {validationResult.details.expiresAt || 'Never'}

)}
)} {error && (
{error}
)} {/* Need a License Panel */}

Need a License?

If you don't have a CHORUS:agents license yet, you can:

{onBack && ( )}
) }