@nice2dev/licensing 1.0.11 → 1.0.14
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.
- package/dist/FeatureGate-9rvyns7j.cjs +1405 -0
- package/dist/FeatureGate-9rvyns7j.cjs.map +1 -0
- package/dist/FeatureGate-cIgJ8Gq2.js +1406 -0
- package/dist/FeatureGate-cIgJ8Gq2.js.map +1 -0
- package/dist/index.cjs +7 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +8 -6
- package/dist/index.mjs.map +1 -1
- package/dist/react.cjs +4 -4
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.mjs +4 -4
- package/dist/react.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const React = require("react");
|
|
5
|
-
const FeatureGate$1 = require("./FeatureGate-
|
|
5
|
+
const FeatureGate$1 = require("./FeatureGate-9rvyns7j.cjs");
|
|
6
6
|
const LicenseContext = React.createContext(null);
|
|
7
7
|
function LicenseProvider({
|
|
8
8
|
serverUrl = "https://license.nice2dev.com/api/v1",
|
|
@@ -350,7 +350,7 @@ function LicenseActivator({
|
|
|
350
350
|
}
|
|
351
351
|
function UpgradePrompt({
|
|
352
352
|
targetTier,
|
|
353
|
-
feature,
|
|
353
|
+
feature: _feature,
|
|
354
354
|
onUpgrade,
|
|
355
355
|
style,
|
|
356
356
|
compact = false
|
|
@@ -530,12 +530,12 @@ function LicensePortal({
|
|
|
530
530
|
}) {
|
|
531
531
|
const {
|
|
532
532
|
license,
|
|
533
|
-
validation,
|
|
533
|
+
validation: _validation,
|
|
534
534
|
loading,
|
|
535
535
|
error,
|
|
536
536
|
deactivate,
|
|
537
537
|
refresh,
|
|
538
|
-
hasFeature:
|
|
538
|
+
hasFeature: _checkFeat
|
|
539
539
|
} = useLicense();
|
|
540
540
|
const [activeTab, setActiveTab] = React.useState(defaultTab);
|
|
541
541
|
const [refreshing, setRefreshing] = React.useState(false);
|
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.cjs","sources":["../src/react.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/* ────────────────────────────────────────────────────────────────\r\n License React Components — UI for license management\r\n──────────────────────────────────────────────────────────────── */\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n type ReactNode,\r\n type CSSProperties,\r\n} from 'react';\r\n\r\nimport { hasFeature, checkFeatureAccess, getAllPlans, getMissingFeatures } from './FeatureGate';\r\nimport { maskLicenseKey, normalizeLicenseKey } from './LicenseKeyGenerator';\r\nimport { LicenseValidator } from './LicenseValidator';\r\nimport type {\r\n LicenseKey,\r\n LicenseInfo,\r\n LicenseValidationResult,\r\n LicenseState,\r\n FeatureId,\r\n LicensePlan,\r\n LicenseTier,\r\n} from './types';\r\n\r\n// ─── License Context ────────────────────────────────────────────\r\n\r\ninterface LicenseContextValue extends LicenseState {\r\n activate: (key: LicenseKey) => Promise<LicenseValidationResult>;\r\n deactivate: () => Promise<void>;\r\n refresh: () => Promise<void>;\r\n hasFeature: (featureId: FeatureId) => boolean;\r\n}\r\n\r\nconst LicenseContext = createContext<LicenseContextValue | null>(null);\r\n\r\n/**\r\n * License Provider Props\r\n */\r\nexport interface LicenseProviderProps {\r\n /** License server URL */\r\n serverUrl?: string;\r\n /** API key for server communication */\r\n apiKey?: string;\r\n /** Initial license key (from storage) */\r\n initialKey?: LicenseKey;\r\n /** Storage key for persisting license */\r\n storageKey?: string;\r\n /** Auto-validate on mount */\r\n autoValidate?: boolean;\r\n /** Validation interval in ms (0 to disable) */\r\n validationInterval?: number;\r\n /** On license change callback */\r\n onLicenseChange?: (license: LicenseInfo | null) => void;\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * License Provider Component\r\n */\r\nexport function LicenseProvider({\r\n serverUrl = 'https://license.nice2dev.com/api/v1',\r\n apiKey,\r\n initialKey,\r\n storageKey = 'nice2dev_license_key',\r\n autoValidate = true,\r\n validationInterval = 3600000, // 1 hour\r\n onLicenseChange,\r\n children,\r\n}: LicenseProviderProps) {\r\n const [state, setState] = useState<LicenseState>({\r\n license: null,\r\n validation: null,\r\n loading: true,\r\n error: null,\r\n features: new Set(),\r\n fingerprint: null,\r\n });\r\n\r\n const [validator] = useState(() => new LicenseValidator({ serverUrl, apiKey }));\r\n\r\n // Load license key from storage\r\n const loadStoredKey = useCallback((): LicenseKey | null => {\r\n if (typeof localStorage === 'undefined') {\r\n return null;\r\n }\r\n try {\r\n return localStorage.getItem(storageKey);\r\n } catch {\r\n return null;\r\n }\r\n }, [storageKey]);\r\n\r\n // Save license key to storage\r\n const saveKey = useCallback(\r\n (key: LicenseKey | null) => {\r\n if (typeof localStorage === 'undefined') {\r\n return;\r\n }\r\n try {\r\n if (key) {\r\n localStorage.setItem(storageKey, key);\r\n } else {\r\n localStorage.removeItem(storageKey);\r\n }\r\n } catch {\r\n // Storage not available\r\n }\r\n },\r\n [storageKey],\r\n );\r\n\r\n // Validate license\r\n const validateLicense = useCallback(\r\n async (key: LicenseKey): Promise<LicenseValidationResult> => {\r\n setState((s) => ({ ...s, loading: true, error: null }));\r\n\r\n try {\r\n const result = await validator.validate(key);\r\n\r\n setState((s) => ({\r\n ...s,\r\n license: result.license || null,\r\n validation: result,\r\n loading: false,\r\n error: result.valid ? null : result.errorMessage || 'Validation failed',\r\n features: new Set(result.availableFeatures || []),\r\n }));\r\n\r\n if (result.valid && result.license) {\r\n onLicenseChange?.(result.license);\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n setState((s) => ({\r\n ...s,\r\n loading: false,\r\n error: errorMessage,\r\n validation: {\r\n valid: false,\r\n errorCode: 'SERVER_ERROR',\r\n errorMessage,\r\n validatedAt: new Date().toISOString(),\r\n },\r\n }));\r\n\r\n return {\r\n valid: false,\r\n errorCode: 'SERVER_ERROR',\r\n errorMessage,\r\n validatedAt: new Date().toISOString(),\r\n };\r\n }\r\n },\r\n [validator, onLicenseChange],\r\n );\r\n\r\n // Activate license\r\n const activate = useCallback(\r\n async (key: LicenseKey): Promise<LicenseValidationResult> => {\r\n const normalized = normalizeLicenseKey(key);\r\n if (!normalized) {\r\n const result: LicenseValidationResult = {\r\n valid: false,\r\n errorCode: 'INVALID_KEY',\r\n errorMessage: 'Invalid license key format',\r\n validatedAt: new Date().toISOString(),\r\n };\r\n setState((s) => ({ ...s, error: result.errorMessage || null, validation: result }));\r\n return result;\r\n }\r\n\r\n const result = await validateLicense(normalized);\r\n\r\n if (result.valid) {\r\n saveKey(normalized);\r\n }\r\n\r\n return result;\r\n },\r\n [validateLicense, saveKey],\r\n );\r\n\r\n // Deactivate license\r\n const deactivate = useCallback(async () => {\r\n const key = loadStoredKey();\r\n if (key) {\r\n await validator.deactivateMachine(key);\r\n }\r\n\r\n saveKey(null);\r\n setState({\r\n license: null,\r\n validation: null,\r\n loading: false,\r\n error: null,\r\n features: new Set(),\r\n fingerprint: null,\r\n });\r\n onLicenseChange?.(null);\r\n }, [validator, loadStoredKey, saveKey, onLicenseChange]);\r\n\r\n // Refresh validation\r\n const refresh = useCallback(async () => {\r\n const key = state.license?.key || loadStoredKey();\r\n if (key) {\r\n await validateLicense(key);\r\n }\r\n }, [state.license?.key, loadStoredKey, validateLicense]);\r\n\r\n // Check feature\r\n const checkFeature = useCallback(\r\n (featureId: FeatureId): boolean => {\r\n return hasFeature(state.license, featureId);\r\n },\r\n [state.license],\r\n );\r\n\r\n // Initial validation\r\n useEffect(() => {\r\n if (!autoValidate) {\r\n setState((s) => ({ ...s, loading: false }));\r\n return;\r\n }\r\n\r\n const key = initialKey || loadStoredKey();\r\n if (key) {\r\n validateLicense(key);\r\n } else {\r\n setState((s) => ({ ...s, loading: false }));\r\n }\r\n }, [autoValidate, initialKey, loadStoredKey, validateLicense]);\r\n\r\n // Periodic validation\r\n useEffect(() => {\r\n if (validationInterval <= 0 || !state.license) {\r\n return;\r\n }\r\n\r\n const interval = setInterval(() => {\r\n refresh();\r\n }, validationInterval);\r\n\r\n return () => clearInterval(interval);\r\n }, [validationInterval, state.license, refresh]);\r\n\r\n const value: LicenseContextValue = {\r\n ...state,\r\n activate,\r\n deactivate,\r\n refresh,\r\n hasFeature: checkFeature,\r\n };\r\n\r\n return <LicenseContext.Provider value={value}>{children}</LicenseContext.Provider>;\r\n}\r\n\r\n/**\r\n * Hook to access license context\r\n */\r\nexport function useLicense(): LicenseContextValue {\r\n const context = useContext(LicenseContext);\r\n if (!context) {\r\n throw new Error('useLicense must be used within a LicenseProvider');\r\n }\r\n return context;\r\n}\r\n\r\n/**\r\n * Hook to check a specific feature\r\n */\r\nexport function useFeature(featureId: FeatureId): {\r\n allowed: boolean;\r\n loading: boolean;\r\n error: string | null;\r\n} {\r\n const { license, loading, error } = useLicense();\r\n const allowed = hasFeature(license, featureId);\r\n return { allowed, loading, error };\r\n}\r\n\r\n// ─── Feature Gate Component ─────────────────────────────────────\r\n\r\nexport interface FeatureGateProps {\r\n /** Feature ID to check */\r\n feature: FeatureId;\r\n /** Content to show when feature is allowed */\r\n children: ReactNode;\r\n /** Content to show when feature is not allowed */\r\n fallback?: ReactNode;\r\n /** Show upgrade prompt instead of fallback */\r\n showUpgradePrompt?: boolean;\r\n /** Custom upgrade prompt render */\r\n renderUpgradePrompt?: (targetTier: LicenseTier) => ReactNode;\r\n}\r\n\r\n/**\r\n * Feature Gate Component — conditionally render based on license\r\n */\r\nexport function FeatureGate({\r\n feature,\r\n children,\r\n fallback = null,\r\n showUpgradePrompt = false,\r\n renderUpgradePrompt,\r\n}: FeatureGateProps) {\r\n const { license, loading } = useLicense();\r\n\r\n if (loading) {\r\n return null; // Or a loading skeleton\r\n }\r\n\r\n const result = checkFeatureAccess(license, feature);\r\n\r\n if (result.allowed) {\r\n return <>{children}</>;\r\n }\r\n\r\n if (showUpgradePrompt && result.upgradeTarget) {\r\n if (renderUpgradePrompt) {\r\n return <>{renderUpgradePrompt(result.upgradeTarget)}</>;\r\n }\r\n return <UpgradePrompt targetTier={result.upgradeTarget} feature={feature} />;\r\n }\r\n\r\n return <>{fallback}</>;\r\n}\r\n\r\n// ─── License Status Widget ──────────────────────────────────────\r\n\r\nexport interface LicenseStatusProps {\r\n /** Show detailed info */\r\n detailed?: boolean;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Status Widget\r\n */\r\nexport function LicenseStatus({ detailed = false, style, className }: LicenseStatusProps) {\r\n const { license, validation, loading, error } = useLicense();\r\n\r\n const baseStyle: CSSProperties = {\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n ...style,\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div\r\n style={{ ...baseStyle, backgroundColor: '#f0f0f0', color: '#666' }}\r\n className={className}\r\n >\r\n <span>⏳</span>\r\n <span>Checking license...</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !license) {\r\n return (\r\n <div\r\n style={{ ...baseStyle, backgroundColor: '#fee2e2', color: '#991b1b' }}\r\n className={className}\r\n >\r\n <span>⚠️</span>\r\n <span>{error || 'No license'}</span>\r\n </div>\r\n );\r\n }\r\n\r\n const tierColors: Record<LicenseTier, string> = {\r\n trial: '#fef3c7',\r\n personal: '#dbeafe',\r\n team: '#d1fae5',\r\n enterprise: '#ede9fe',\r\n site: '#fce7f3',\r\n oem: '#f3e8ff',\r\n };\r\n\r\n const tierTextColors: Record<LicenseTier, string> = {\r\n trial: '#92400e',\r\n personal: '#1e40af',\r\n team: '#065f46',\r\n enterprise: '#5b21b6',\r\n site: '#9d174d',\r\n oem: '#7c3aed',\r\n };\r\n\r\n const bgColor = tierColors[license.tier] || '#f0f0f0';\r\n const textColor = tierTextColors[license.tier] || '#333';\r\n\r\n return (\r\n <div style={{ ...baseStyle, backgroundColor: bgColor, color: textColor }} className={className}>\r\n <span>✓</span>\r\n <span style={{ fontWeight: 600 }}>\r\n {license.tier.charAt(0).toUpperCase() + license.tier.slice(1)}\r\n </span>\r\n {validation?.inGracePeriod && (\r\n <span style={{ color: '#dc2626', fontSize: '12px' }}>(Grace period)</span>\r\n )}\r\n {detailed && validation?.daysRemaining !== undefined && validation.daysRemaining > 0 && (\r\n <span style={{ fontSize: '12px', opacity: 0.8 }}>\r\n {validation.daysRemaining} days remaining\r\n </span>\r\n )}\r\n {detailed && (\r\n <span style={{ fontSize: '12px', opacity: 0.6 }}>{maskLicenseKey(license.key)}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Activator ──────────────────────────────────────────\r\n\r\nexport interface LicenseActivatorProps {\r\n /** On successful activation */\r\n onActivated?: (license: LicenseInfo) => void;\r\n /** On activation error */\r\n onError?: (error: string) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Activator Form\r\n */\r\nexport function LicenseActivator({\r\n onActivated,\r\n onError,\r\n style,\r\n className,\r\n}: LicenseActivatorProps) {\r\n const { activate, loading } = useLicense();\r\n const [key, setKey] = useState('');\r\n const [localError, setLocalError] = useState<string | null>(null);\r\n const [isActivating, setIsActivating] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!key.trim() || isActivating) {\r\n return;\r\n }\r\n\r\n setIsActivating(true);\r\n setLocalError(null);\r\n\r\n try {\r\n const result = await activate(key.trim());\r\n\r\n if (result.valid && result.license) {\r\n setKey('');\r\n onActivated?.(result.license);\r\n } else {\r\n setLocalError(result.errorMessage || 'Activation failed');\r\n onError?.(result.errorMessage || 'Activation failed');\r\n }\r\n } finally {\r\n setIsActivating(false);\r\n }\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '12px',\r\n padding: '16px',\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '8px',\r\n backgroundColor: '#fff',\r\n ...style,\r\n };\r\n\r\n const inputStyle: CSSProperties = {\r\n padding: '10px 12px',\r\n fontSize: '14px',\r\n fontFamily: 'monospace',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n textTransform: 'uppercase',\r\n };\r\n\r\n const buttonStyle: CSSProperties = {\r\n padding: '10px 16px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: isActivating || loading ? '#9ca3af' : '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: isActivating || loading ? 'not-allowed' : 'pointer',\r\n };\r\n\r\n return (\r\n <form onSubmit={handleSubmit} style={containerStyle} className={className}>\r\n <label style={{ fontWeight: 500, color: '#374151' }}>Enter License Key</label>\r\n <input\r\n type=\"text\"\r\n value={key}\r\n onChange={(e) => setKey(e.target.value)}\r\n placeholder=\"XXXX-XXXX-XXXX-XXXX-XXXX\"\r\n style={inputStyle}\r\n disabled={isActivating || loading}\r\n />\r\n {localError && <div style={{ color: '#dc2626', fontSize: '13px' }}>{localError}</div>}\r\n <button type=\"submit\" style={buttonStyle} disabled={isActivating || loading || !key.trim()}>\r\n {isActivating ? 'Activating...' : 'Activate License'}\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n// ─── Upgrade Prompt ─────────────────────────────────────────────\r\n\r\nexport interface UpgradePromptProps {\r\n /** Target tier for upgrade */\r\n targetTier: LicenseTier;\r\n /** Feature that triggered the prompt */\r\n feature?: FeatureId;\r\n /** On upgrade click */\r\n onUpgrade?: (tier: LicenseTier) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Compact mode */\r\n compact?: boolean;\r\n}\r\n\r\n/**\r\n * Upgrade Prompt Component\r\n */\r\nexport function UpgradePrompt({\r\n targetTier,\r\n feature,\r\n onUpgrade,\r\n style,\r\n compact = false,\r\n}: UpgradePromptProps) {\r\n const { license } = useLicense();\r\n const missingFeatures = getMissingFeatures(license, targetTier);\r\n\r\n const handleUpgrade = () => {\r\n onUpgrade?.(targetTier);\r\n // Default: open upgrade page\r\n if (!onUpgrade) {\r\n window.open(`https://nice2dev.com/pricing?upgrade=${targetTier}`, '_blank');\r\n }\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n padding: compact ? '12px' : '20px',\r\n backgroundColor: '#eff6ff',\r\n borderRadius: '8px',\r\n border: '1px solid #bfdbfe',\r\n ...style,\r\n };\r\n\r\n const titleStyle: CSSProperties = {\r\n fontSize: compact ? '14px' : '16px',\r\n fontWeight: 600,\r\n color: '#1e40af',\r\n marginBottom: '8px',\r\n };\r\n\r\n const buttonStyle: CSSProperties = {\r\n padding: '8px 16px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n marginTop: '12px',\r\n };\r\n\r\n return (\r\n <div style={containerStyle}>\r\n <div style={titleStyle}>\r\n 🚀 Upgrade to {targetTier.charAt(0).toUpperCase() + targetTier.slice(1)}\r\n </div>\r\n {!compact && missingFeatures.length > 0 && (\r\n <ul style={{ margin: '8px 0', paddingLeft: '20px', color: '#374151', fontSize: '14px' }}>\r\n {missingFeatures.slice(0, 3).map((f) => (\r\n <li key={f.id}>{f.name}</li>\r\n ))}\r\n {missingFeatures.length > 3 && <li>+{missingFeatures.length - 3} more features</li>}\r\n </ul>\r\n )}\r\n <button onClick={handleUpgrade} style={buttonStyle}>\r\n Upgrade Now\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Comparison ─────────────────────────────────────────\r\n\r\nexport interface LicenseComparisonProps {\r\n /** Plans to show (default: all) */\r\n plans?: LicensePlan[];\r\n /** Current tier for highlighting */\r\n currentTier?: LicenseTier;\r\n /** On plan select */\r\n onSelect?: (plan: LicensePlan) => void;\r\n /** Show prices */\r\n showPrices?: boolean;\r\n}\r\n\r\n/**\r\n * License Comparison Table\r\n */\r\nexport function LicenseComparison({\r\n plans: customPlans,\r\n currentTier,\r\n onSelect,\r\n showPrices = true,\r\n}: LicenseComparisonProps) {\r\n const { license } = useLicense();\r\n const tier = currentTier || license?.tier;\r\n const plans = customPlans || getAllPlans().filter((p) => p.priceMonthly > 0 || p.id === 'trial');\r\n\r\n const formatPrice = (cents: number) => {\r\n if (cents === 0) {\r\n return 'Free';\r\n }\r\n return `$${(cents / 100).toFixed(0)}`;\r\n };\r\n\r\n return (\r\n <div style={{ display: 'flex', gap: '16px', flexWrap: 'wrap', justifyContent: 'center' }}>\r\n {plans.map((plan) => {\r\n const isCurrent = plan.id === tier;\r\n const isRecommended = plan.recommended;\r\n\r\n return (\r\n <div\r\n key={plan.id}\r\n style={{\r\n flex: '1 1 250px',\r\n maxWidth: '300px',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n border: isRecommended ? '2px solid #2563eb' : '1px solid #e5e7eb',\r\n backgroundColor: isCurrent ? '#f0f9ff' : '#fff',\r\n position: 'relative',\r\n }}\r\n >\r\n {isRecommended && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '-12px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n backgroundColor: '#2563eb',\r\n color: '#fff',\r\n padding: '4px 12px',\r\n borderRadius: '12px',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n }}\r\n >\r\n Recommended\r\n </div>\r\n )}\r\n\r\n <h3 style={{ margin: '0 0 4px', fontSize: '20px', color: '#111' }}>{plan.name}</h3>\r\n <p style={{ margin: '0 0 16px', fontSize: '14px', color: '#6b7280' }}>\r\n {plan.description}\r\n </p>\r\n\r\n {showPrices && (\r\n <div style={{ marginBottom: '16px' }}>\r\n <span style={{ fontSize: '32px', fontWeight: 700, color: '#111' }}>\r\n {formatPrice(plan.priceMonthly)}\r\n </span>\r\n {plan.priceMonthly > 0 && (\r\n <span style={{ fontSize: '14px', color: '#6b7280' }}>/month</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n <ul style={{ listStyle: 'none', padding: 0, margin: '0 0 16px' }}>\r\n {plan.highlights.map((h, i) => (\r\n <li key={i} style={{ padding: '6px 0', fontSize: '14px', color: '#374151' }}>\r\n ✓ {h}\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <button\r\n onClick={() => onSelect?.(plan)}\r\n disabled={isCurrent}\r\n style={{\r\n width: '100%',\r\n padding: '10px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: isCurrent ? '#9ca3af' : isRecommended ? '#fff' : '#2563eb',\r\n backgroundColor: isCurrent ? '#f3f4f6' : isRecommended ? '#2563eb' : '#fff',\r\n border: isCurrent ? 'none' : isRecommended ? 'none' : '1px solid #2563eb',\r\n borderRadius: '6px',\r\n cursor: isCurrent ? 'default' : 'pointer',\r\n }}\r\n >\r\n {isCurrent ? 'Current Plan' : 'Select'}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Trial Watermark ────────────────────────────────────────────\r\n\r\nexport interface TrialWatermarkProps {\r\n /** Position */\r\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\r\n /** Custom text */\r\n text?: string;\r\n}\r\n\r\n/**\r\n * Trial Watermark — shows for trial licenses\r\n */\r\nexport function TrialWatermark({\r\n position = 'bottom-right',\r\n text = 'Trial Version',\r\n}: TrialWatermarkProps) {\r\n const { license, hasFeature } = useLicense();\r\n\r\n // Only show for trial or if feature is enabled\r\n if (!hasFeature('trial-watermark') && license?.tier !== 'trial') {\r\n return null;\r\n }\r\n\r\n const positions: Record<string, CSSProperties> = {\r\n 'top-left': { top: '16px', left: '16px' },\r\n 'top-right': { top: '16px', right: '16px' },\r\n 'bottom-left': { bottom: '16px', left: '16px' },\r\n 'bottom-right': { bottom: '16px', right: '16px' },\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'fixed',\r\n ...positions[position],\r\n padding: '8px 16px',\r\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\r\n color: '#fff',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n borderRadius: '4px',\r\n zIndex: 9999,\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n {text}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Portal ─────────────────────────────────────────────\r\n\r\n/** License Portal tab identifier */\r\nexport type LicensePortalTab = 'overview' | 'activation' | 'seats' | 'features' | 'plans';\r\n\r\nexport interface LicensePortalProps {\r\n /** Tabs to display (default: all) */\r\n tabs?: LicensePortalTab[];\r\n /** Default active tab */\r\n defaultTab?: LicensePortalTab;\r\n /** On plan upgrade click */\r\n onUpgrade?: (tier: LicenseTier) => void;\r\n /** On deactivation */\r\n onDeactivate?: () => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Portal — self-service dashboard for customers to manage\r\n * their license (activation, seat overview, feature list, plan comparison).\r\n */\r\nexport function LicensePortal({\r\n tabs = ['overview', 'activation', 'seats', 'features', 'plans'],\r\n defaultTab = 'overview',\r\n onUpgrade,\r\n onDeactivate,\r\n style,\r\n className,\r\n}: LicensePortalProps) {\r\n const {\r\n license,\r\n validation,\r\n loading,\r\n error,\r\n deactivate,\r\n refresh,\r\n hasFeature: checkFeat,\r\n } = useLicense();\r\n const [activeTab, setActiveTab] = useState<LicensePortalTab>(defaultTab);\r\n const [refreshing, setRefreshing] = useState(false);\r\n\r\n const handleRefresh = async () => {\r\n setRefreshing(true);\r\n try {\r\n await refresh();\r\n } finally {\r\n setRefreshing(false);\r\n }\r\n };\r\n\r\n const handleDeactivate = async () => {\r\n await deactivate();\r\n onDeactivate?.();\r\n };\r\n\r\n const tabLabels: Record<LicensePortalTab, string> = {\r\n overview: 'Overview',\r\n activation: 'Activation',\r\n seats: 'Seats',\r\n features: 'Features',\r\n plans: 'Plans',\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '12px',\r\n backgroundColor: '#fff',\r\n overflow: 'hidden',\r\n ...style,\r\n };\r\n\r\n const tabBarStyle: CSSProperties = {\r\n display: 'flex',\r\n borderBottom: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n };\r\n\r\n const getTabStyle = (tab: LicensePortalTab): CSSProperties => ({\r\n padding: '12px 20px',\r\n fontSize: '14px',\r\n fontWeight: activeTab === tab ? 600 : 400,\r\n color: activeTab === tab ? '#2563eb' : '#6b7280',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderBottom: activeTab === tab ? '2px solid #2563eb' : '2px solid transparent',\r\n cursor: 'pointer',\r\n });\r\n\r\n const panelStyle: CSSProperties = { padding: '24px' };\r\n\r\n return (\r\n <div style={containerStyle} className={className}>\r\n {/* Tab bar */}\r\n <div style={tabBarStyle}>\r\n {tabs.map((tab) => (\r\n <button key={tab} style={getTabStyle(tab)} onClick={() => setActiveTab(tab)}>\r\n {tabLabels[tab]}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab panels */}\r\n <div style={panelStyle}>\r\n {loading && <p style={{ color: '#6b7280' }}>Loading license information...</p>}\r\n\r\n {!loading && activeTab === 'overview' && (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\r\n <LicenseStatus detailed />\r\n {license && (\r\n <>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '12px' }}>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Licensee</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>{license.licensee}</p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Email</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>{license.email}</p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Seats</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>\r\n {license.activeSeats} / {license.maxSeats ?? '∞'}\r\n </p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Expires</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>\r\n {license.expiresAt\r\n ? new Date(license.expiresAt).toLocaleDateString()\r\n : 'Perpetual'}\r\n </p>\r\n </div>\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n style={{\r\n padding: '8px 16px',\r\n fontSize: '13px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n backgroundColor: '#fff',\r\n cursor: refreshing ? 'not-allowed' : 'pointer',\r\n }}\r\n >\r\n {refreshing ? 'Refreshing...' : 'Refresh'}\r\n </button>\r\n <button\r\n onClick={handleDeactivate}\r\n style={{\r\n padding: '8px 16px',\r\n fontSize: '13px',\r\n color: '#dc2626',\r\n border: '1px solid #fecaca',\r\n borderRadius: '6px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Deactivate\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n {!license && !error && (\r\n <p style={{ color: '#6b7280' }}>\r\n No active license. Go to the Activation tab to enter your license key.\r\n </p>\r\n )}\r\n {error && <p style={{ color: '#dc2626' }}>{error}</p>}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'activation' && (\r\n <LicenseActivator onActivated={() => setActiveTab('overview')} />\r\n )}\r\n\r\n {!loading && activeTab === 'seats' && (\r\n <div>\r\n {license ? (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\r\n <div style={{ fontSize: '14px', color: '#374151' }}>\r\n <strong>{license.activeSeats}</strong> of{' '}\r\n <strong>{license.maxSeats ?? '∞'}</strong> seats in use\r\n {license.floatingSeats != null && (\r\n <span> ({license.floatingSeats} floating)</span>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n height: '8px',\r\n borderRadius: '4px',\r\n backgroundColor: '#e5e7eb',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n <div\r\n style={{\r\n height: '100%',\r\n width: license.maxSeats\r\n ? `${Math.min(100, (license.activeSeats / license.maxSeats) * 100)}%`\r\n : '10%',\r\n backgroundColor:\r\n license.maxSeats && license.activeSeats / license.maxSeats > 0.9\r\n ? '#dc2626'\r\n : '#2563eb',\r\n borderRadius: '4px',\r\n transition: 'width 0.3s ease',\r\n }}\r\n />\r\n </div>\r\n <div style={{ fontSize: '12px', color: '#9ca3af' }}>\r\n Machines bound: {license.boundMachines.length} / {license.maxMachines}\r\n </div>\r\n </div>\r\n ) : (\r\n <p style={{ color: '#6b7280' }}>Activate a license to view seat information.</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'features' && (\r\n <div>\r\n {license ? (\r\n <ul\r\n style={{\r\n listStyle: 'none',\r\n padding: 0,\r\n margin: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '8px',\r\n }}\r\n >\r\n {license.features.map((f) => (\r\n <li\r\n key={f}\r\n style={{\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n backgroundColor: '#f0fdf4',\r\n color: '#166534',\r\n fontSize: '14px',\r\n }}\r\n >\r\n ✓ {f}\r\n </li>\r\n ))}\r\n {license.features.length === 0 && (\r\n <li style={{ color: '#6b7280', fontSize: '14px' }}>\r\n No explicit features — tier-based access applies.\r\n </li>\r\n )}\r\n </ul>\r\n ) : (\r\n <p style={{ color: '#6b7280' }}>Activate a license to view features.</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'plans' && (\r\n <LicenseComparison\r\n currentTier={license?.tier}\r\n onSelect={(plan) => onUpgrade?.(plan.id)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Manager (Admin) ────────────────────────────────────\r\n\r\n/** Admin-managed license entry */\r\nexport interface ManagedLicense {\r\n key: LicenseKey;\r\n tier: LicenseTier;\r\n licensee: string;\r\n email: string;\r\n status: 'valid' | 'expired' | 'revoked' | 'grace';\r\n issuedAt: string;\r\n expiresAt: string | null;\r\n activeSeats: number;\r\n maxSeats: number | null;\r\n features: string[];\r\n}\r\n\r\nexport interface NiceLicenseManagerProps {\r\n /** Licenses to display */\r\n licenses: ManagedLicense[];\r\n /** Revoke a license */\r\n onRevoke?: (key: LicenseKey) => void;\r\n /** Extend a license */\r\n onExtend?: (key: LicenseKey, days: number) => void;\r\n /** Change tier */\r\n onChangeTier?: (key: LicenseKey, tier: LicenseTier) => void;\r\n /** Add seat */\r\n onAddSeats?: (key: LicenseKey, count: number) => void;\r\n /** Generate new license */\r\n onGenerate?: () => void;\r\n /** Search term change */\r\n onSearchChange?: (term: string) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * NiceLicenseManager — Admin panel for managing all issued licenses.\r\n * Shows a searchable table/list with inline actions (revoke, extend, change tier, manage seats).\r\n */\r\nexport function NiceLicenseManager({\r\n licenses,\r\n onRevoke,\r\n onExtend,\r\n onChangeTier,\r\n onAddSeats,\r\n onGenerate,\r\n onSearchChange,\r\n style,\r\n className,\r\n}: NiceLicenseManagerProps) {\r\n const [search, setSearch] = useState('');\r\n const [expandedKey, setExpandedKey] = useState<LicenseKey | null>(null);\r\n\r\n const handleSearch = (value: string) => {\r\n setSearch(value);\r\n onSearchChange?.(value);\r\n };\r\n\r\n const filtered = search\r\n ? licenses.filter(\r\n (l) =>\r\n l.licensee.toLowerCase().includes(search.toLowerCase()) ||\r\n l.email.toLowerCase().includes(search.toLowerCase()) ||\r\n l.key.toLowerCase().includes(search.toLowerCase()),\r\n )\r\n : licenses;\r\n\r\n const statusColors: Record<ManagedLicense['status'], string> = {\r\n valid: '#059669',\r\n expired: '#dc2626',\r\n revoked: '#6b7280',\r\n grace: '#d97706',\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '12px',\r\n backgroundColor: '#fff',\r\n overflow: 'hidden',\r\n ...style,\r\n };\r\n\r\n return (\r\n <div style={containerStyle} className={className}>\r\n {/* Header */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '16px 20px',\r\n borderBottom: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n }}\r\n >\r\n <h3 style={{ margin: 0, fontSize: '16px', color: '#111' }}>License Manager</h3>\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => handleSearch(e.target.value)}\r\n placeholder=\"Search licenses...\"\r\n style={{\r\n padding: '6px 12px',\r\n fontSize: '13px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n width: '220px',\r\n }}\r\n />\r\n {onGenerate && (\r\n <button\r\n onClick={onGenerate}\r\n style={{\r\n padding: '6px 14px',\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n + Generate\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* License list */}\r\n <div style={{ maxHeight: '500px', overflow: 'auto' }}>\r\n {filtered.length === 0 && (\r\n <p style={{ padding: '20px', textAlign: 'center', color: '#6b7280' }}>\r\n {search ? 'No licenses match your search.' : 'No licenses found.'}\r\n </p>\r\n )}\r\n\r\n {filtered.map((lic) => {\r\n const isExpanded = expandedKey === lic.key;\r\n\r\n return (\r\n <div\r\n key={lic.key}\r\n style={{\r\n borderBottom: '1px solid #f3f4f6',\r\n }}\r\n >\r\n {/* Summary row */}\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: '1fr 140px 100px 80px 60px',\r\n alignItems: 'center',\r\n padding: '12px 20px',\r\n cursor: 'pointer',\r\n backgroundColor: isExpanded ? '#f9fafb' : 'transparent',\r\n }}\r\n onClick={() => setExpandedKey(isExpanded ? null : lic.key)}\r\n >\r\n <div>\r\n <div style={{ fontWeight: 500, fontSize: '14px', color: '#111' }}>\r\n {lic.licensee}\r\n </div>\r\n <div style={{ fontSize: '12px', color: '#6b7280' }}>{lic.email}</div>\r\n </div>\r\n <div style={{ fontSize: '12px', fontFamily: 'monospace', color: '#6b7280' }}>\r\n {maskLicenseKey(lic.key)}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n textTransform: 'capitalize',\r\n color: statusColors[lic.status],\r\n }}\r\n >\r\n {lic.status}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '12px',\r\n fontWeight: 500,\r\n textTransform: 'capitalize',\r\n color: '#374151',\r\n }}\r\n >\r\n {lic.tier}\r\n </div>\r\n <div style={{ fontSize: '14px', color: '#6b7280', textAlign: 'right' }}>\r\n {isExpanded ? '▲' : '▼'}\r\n </div>\r\n </div>\r\n\r\n {/* Expanded details */}\r\n {isExpanded && (\r\n <div style={{ padding: '12px 20px 16px', backgroundColor: '#f9fafb' }}>\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(4, 1fr)',\r\n gap: '12px',\r\n marginBottom: '12px',\r\n }}\r\n >\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Issued</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {new Date(lic.issuedAt).toLocaleDateString()}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Expires</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {lic.expiresAt ? new Date(lic.expiresAt).toLocaleDateString() : 'Perpetual'}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Seats</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {lic.activeSeats} / {lic.maxSeats ?? '∞'}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Features</span>\r\n <div style={{ fontSize: '13px' }}>{lic.features.length} enabled</div>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>\r\n {onExtend && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onExtend(lic.key, 365);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Extend 1 Year\r\n </button>\r\n )}\r\n {onAddSeats && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAddSeats(lic.key, 5);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n +5 Seats\r\n </button>\r\n )}\r\n {onChangeTier && lic.status !== 'revoked' && (\r\n <select\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={(e) => onChangeTier(lic.key, e.target.value as LicenseTier)}\r\n value={lic.tier}\r\n style={{\r\n padding: '5px 8px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"trial\">Trial</option>\r\n <option value=\"personal\">Personal</option>\r\n <option value=\"team\">Team</option>\r\n <option value=\"enterprise\">Enterprise</option>\r\n <option value=\"site\">Site</option>\r\n <option value=\"oem\">OEM</option>\r\n </select>\r\n )}\r\n {onRevoke && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRevoke(lic.key);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n color: '#dc2626',\r\n border: '1px solid #fecaca',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Revoke\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div\r\n style={{\r\n padding: '10px 20px',\r\n borderTop: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n fontSize: '12px',\r\n color: '#6b7280',\r\n }}\r\n >\r\n {filtered.length} license{filtered.length !== 1 ? 's' : ''}\r\n {search && ` matching \"${search}\"`}\r\n {' · '}\r\n {licenses.filter((l) => l.status === 'valid').length} active\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["createContext","useState","LicenseValidator","useCallback","normalizeLicenseKey","result","_a","hasFeature","useEffect","jsx","useContext","checkFeatureAccess","Fragment","jsxs","maskLicenseKey","getMissingFeatures","getAllPlans"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react.cjs","sources":["../src/react.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/* ────────────────────────────────────────────────────────────────\r\n License React Components — UI for license management\r\n──────────────────────────────────────────────────────────────── */\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n type ReactNode,\r\n type CSSProperties,\r\n} from 'react';\r\n\r\nimport { hasFeature, checkFeatureAccess, getAllPlans, getMissingFeatures } from './FeatureGate';\r\nimport { maskLicenseKey, normalizeLicenseKey } from './LicenseKeyGenerator';\r\nimport { LicenseValidator } from './LicenseValidator';\r\nimport type {\r\n LicenseKey,\r\n LicenseInfo,\r\n LicenseValidationResult,\r\n LicenseState,\r\n FeatureId,\r\n LicensePlan,\r\n LicenseTier,\r\n} from './types';\r\n\r\n// ─── License Context ────────────────────────────────────────────\r\n\r\ninterface LicenseContextValue extends LicenseState {\r\n activate: (key: LicenseKey) => Promise<LicenseValidationResult>;\r\n deactivate: () => Promise<void>;\r\n refresh: () => Promise<void>;\r\n hasFeature: (featureId: FeatureId) => boolean;\r\n}\r\n\r\nconst LicenseContext = createContext<LicenseContextValue | null>(null);\r\n\r\n/**\r\n * License Provider Props\r\n */\r\nexport interface LicenseProviderProps {\r\n /** License server URL */\r\n serverUrl?: string;\r\n /** API key for server communication */\r\n apiKey?: string;\r\n /** Initial license key (from storage) */\r\n initialKey?: LicenseKey;\r\n /** Storage key for persisting license */\r\n storageKey?: string;\r\n /** Auto-validate on mount */\r\n autoValidate?: boolean;\r\n /** Validation interval in ms (0 to disable) */\r\n validationInterval?: number;\r\n /** On license change callback */\r\n onLicenseChange?: (license: LicenseInfo | null) => void;\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * License Provider Component\r\n */\r\nexport function LicenseProvider({\r\n serverUrl = 'https://license.nice2dev.com/api/v1',\r\n apiKey,\r\n initialKey,\r\n storageKey = 'nice2dev_license_key',\r\n autoValidate = true,\r\n validationInterval = 3600000, // 1 hour\r\n onLicenseChange,\r\n children,\r\n}: LicenseProviderProps) {\r\n const [state, setState] = useState<LicenseState>({\r\n license: null,\r\n validation: null,\r\n loading: true,\r\n error: null,\r\n features: new Set(),\r\n fingerprint: null,\r\n });\r\n\r\n const [validator] = useState(() => new LicenseValidator({ serverUrl, apiKey }));\r\n\r\n // Load license key from storage\r\n const loadStoredKey = useCallback((): LicenseKey | null => {\r\n if (typeof localStorage === 'undefined') {\r\n return null;\r\n }\r\n try {\r\n return localStorage.getItem(storageKey);\r\n } catch {\r\n return null;\r\n }\r\n }, [storageKey]);\r\n\r\n // Save license key to storage\r\n const saveKey = useCallback(\r\n (key: LicenseKey | null) => {\r\n if (typeof localStorage === 'undefined') {\r\n return;\r\n }\r\n try {\r\n if (key) {\r\n localStorage.setItem(storageKey, key);\r\n } else {\r\n localStorage.removeItem(storageKey);\r\n }\r\n } catch {\r\n // Storage not available\r\n }\r\n },\r\n [storageKey],\r\n );\r\n\r\n // Validate license\r\n const validateLicense = useCallback(\r\n async (key: LicenseKey): Promise<LicenseValidationResult> => {\r\n setState((s) => ({ ...s, loading: true, error: null }));\r\n\r\n try {\r\n const result = await validator.validate(key);\r\n\r\n setState((s) => ({\r\n ...s,\r\n license: result.license || null,\r\n validation: result,\r\n loading: false,\r\n error: result.valid ? null : result.errorMessage || 'Validation failed',\r\n features: new Set(result.availableFeatures || []),\r\n }));\r\n\r\n if (result.valid && result.license) {\r\n onLicenseChange?.(result.license);\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n setState((s) => ({\r\n ...s,\r\n loading: false,\r\n error: errorMessage,\r\n validation: {\r\n valid: false,\r\n errorCode: 'SERVER_ERROR',\r\n errorMessage,\r\n validatedAt: new Date().toISOString(),\r\n },\r\n }));\r\n\r\n return {\r\n valid: false,\r\n errorCode: 'SERVER_ERROR',\r\n errorMessage,\r\n validatedAt: new Date().toISOString(),\r\n };\r\n }\r\n },\r\n [validator, onLicenseChange],\r\n );\r\n\r\n // Activate license\r\n const activate = useCallback(\r\n async (key: LicenseKey): Promise<LicenseValidationResult> => {\r\n const normalized = normalizeLicenseKey(key);\r\n if (!normalized) {\r\n const result: LicenseValidationResult = {\r\n valid: false,\r\n errorCode: 'INVALID_KEY',\r\n errorMessage: 'Invalid license key format',\r\n validatedAt: new Date().toISOString(),\r\n };\r\n setState((s) => ({ ...s, error: result.errorMessage || null, validation: result }));\r\n return result;\r\n }\r\n\r\n const result = await validateLicense(normalized);\r\n\r\n if (result.valid) {\r\n saveKey(normalized);\r\n }\r\n\r\n return result;\r\n },\r\n [validateLicense, saveKey],\r\n );\r\n\r\n // Deactivate license\r\n const deactivate = useCallback(async () => {\r\n const key = loadStoredKey();\r\n if (key) {\r\n await validator.deactivateMachine(key);\r\n }\r\n\r\n saveKey(null);\r\n setState({\r\n license: null,\r\n validation: null,\r\n loading: false,\r\n error: null,\r\n features: new Set(),\r\n fingerprint: null,\r\n });\r\n onLicenseChange?.(null);\r\n }, [validator, loadStoredKey, saveKey, onLicenseChange]);\r\n\r\n // Refresh validation\r\n const refresh = useCallback(async () => {\r\n const key = state.license?.key || loadStoredKey();\r\n if (key) {\r\n await validateLicense(key);\r\n }\r\n }, [state.license?.key, loadStoredKey, validateLicense]);\r\n\r\n // Check feature\r\n const checkFeature = useCallback(\r\n (featureId: FeatureId): boolean => {\r\n return hasFeature(state.license, featureId);\r\n },\r\n [state.license],\r\n );\r\n\r\n // Initial validation\r\n useEffect(() => {\r\n if (!autoValidate) {\r\n setState((s) => ({ ...s, loading: false }));\r\n return;\r\n }\r\n\r\n const key = initialKey || loadStoredKey();\r\n if (key) {\r\n validateLicense(key);\r\n } else {\r\n setState((s) => ({ ...s, loading: false }));\r\n }\r\n }, [autoValidate, initialKey, loadStoredKey, validateLicense]);\r\n\r\n // Periodic validation\r\n useEffect(() => {\r\n if (validationInterval <= 0 || !state.license) {\r\n return;\r\n }\r\n\r\n const interval = setInterval(() => {\r\n refresh();\r\n }, validationInterval);\r\n\r\n return () => clearInterval(interval);\r\n }, [validationInterval, state.license, refresh]);\r\n\r\n const value: LicenseContextValue = {\r\n ...state,\r\n activate,\r\n deactivate,\r\n refresh,\r\n hasFeature: checkFeature,\r\n };\r\n\r\n return <LicenseContext.Provider value={value}>{children}</LicenseContext.Provider>;\r\n}\r\n\r\n/**\r\n * Hook to access license context\r\n */\r\nexport function useLicense(): LicenseContextValue {\r\n const context = useContext(LicenseContext);\r\n if (!context) {\r\n throw new Error('useLicense must be used within a LicenseProvider');\r\n }\r\n return context;\r\n}\r\n\r\n/**\r\n * Hook to check a specific feature\r\n */\r\nexport function useFeature(featureId: FeatureId): {\r\n allowed: boolean;\r\n loading: boolean;\r\n error: string | null;\r\n} {\r\n const { license, loading, error } = useLicense();\r\n const allowed = hasFeature(license, featureId);\r\n return { allowed, loading, error };\r\n}\r\n\r\n// ─── Feature Gate Component ─────────────────────────────────────\r\n\r\nexport interface FeatureGateProps {\r\n /** Feature ID to check */\r\n feature: FeatureId;\r\n /** Content to show when feature is allowed */\r\n children: ReactNode;\r\n /** Content to show when feature is not allowed */\r\n fallback?: ReactNode;\r\n /** Show upgrade prompt instead of fallback */\r\n showUpgradePrompt?: boolean;\r\n /** Custom upgrade prompt render */\r\n renderUpgradePrompt?: (targetTier: LicenseTier) => ReactNode;\r\n}\r\n\r\n/**\r\n * Feature Gate Component — conditionally render based on license\r\n */\r\nexport function FeatureGate({\r\n feature,\r\n children,\r\n fallback = null,\r\n showUpgradePrompt = false,\r\n renderUpgradePrompt,\r\n}: FeatureGateProps) {\r\n const { license, loading } = useLicense();\r\n\r\n if (loading) {\r\n return null; // Or a loading skeleton\r\n }\r\n\r\n const result = checkFeatureAccess(license, feature);\r\n\r\n if (result.allowed) {\r\n return <>{children}</>;\r\n }\r\n\r\n if (showUpgradePrompt && result.upgradeTarget) {\r\n if (renderUpgradePrompt) {\r\n return <>{renderUpgradePrompt(result.upgradeTarget)}</>;\r\n }\r\n return <UpgradePrompt targetTier={result.upgradeTarget} feature={feature} />;\r\n }\r\n\r\n return <>{fallback}</>;\r\n}\r\n\r\n// ─── License Status Widget ──────────────────────────────────────\r\n\r\nexport interface LicenseStatusProps {\r\n /** Show detailed info */\r\n detailed?: boolean;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Status Widget\r\n */\r\nexport function LicenseStatus({ detailed = false, style, className }: LicenseStatusProps) {\r\n const { license, validation, loading, error } = useLicense();\r\n\r\n const baseStyle: CSSProperties = {\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n ...style,\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div\r\n style={{ ...baseStyle, backgroundColor: '#f0f0f0', color: '#666' }}\r\n className={className}\r\n >\r\n <span>⏳</span>\r\n <span>Checking license...</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !license) {\r\n return (\r\n <div\r\n style={{ ...baseStyle, backgroundColor: '#fee2e2', color: '#991b1b' }}\r\n className={className}\r\n >\r\n <span>⚠️</span>\r\n <span>{error || 'No license'}</span>\r\n </div>\r\n );\r\n }\r\n\r\n const tierColors: Record<LicenseTier, string> = {\r\n trial: '#fef3c7',\r\n personal: '#dbeafe',\r\n team: '#d1fae5',\r\n enterprise: '#ede9fe',\r\n site: '#fce7f3',\r\n oem: '#f3e8ff',\r\n };\r\n\r\n const tierTextColors: Record<LicenseTier, string> = {\r\n trial: '#92400e',\r\n personal: '#1e40af',\r\n team: '#065f46',\r\n enterprise: '#5b21b6',\r\n site: '#9d174d',\r\n oem: '#7c3aed',\r\n };\r\n\r\n const bgColor = tierColors[license.tier] || '#f0f0f0';\r\n const textColor = tierTextColors[license.tier] || '#333';\r\n\r\n return (\r\n <div style={{ ...baseStyle, backgroundColor: bgColor, color: textColor }} className={className}>\r\n <span>✓</span>\r\n <span style={{ fontWeight: 600 }}>\r\n {license.tier.charAt(0).toUpperCase() + license.tier.slice(1)}\r\n </span>\r\n {validation?.inGracePeriod && (\r\n <span style={{ color: '#dc2626', fontSize: '12px' }}>(Grace period)</span>\r\n )}\r\n {detailed && validation?.daysRemaining !== undefined && validation.daysRemaining > 0 && (\r\n <span style={{ fontSize: '12px', opacity: 0.8 }}>\r\n {validation.daysRemaining} days remaining\r\n </span>\r\n )}\r\n {detailed && (\r\n <span style={{ fontSize: '12px', opacity: 0.6 }}>{maskLicenseKey(license.key)}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Activator ──────────────────────────────────────────\r\n\r\nexport interface LicenseActivatorProps {\r\n /** On successful activation */\r\n onActivated?: (license: LicenseInfo) => void;\r\n /** On activation error */\r\n onError?: (error: string) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Activator Form\r\n */\r\nexport function LicenseActivator({\r\n onActivated,\r\n onError,\r\n style,\r\n className,\r\n}: LicenseActivatorProps) {\r\n const { activate, loading } = useLicense();\r\n const [key, setKey] = useState('');\r\n const [localError, setLocalError] = useState<string | null>(null);\r\n const [isActivating, setIsActivating] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!key.trim() || isActivating) {\r\n return;\r\n }\r\n\r\n setIsActivating(true);\r\n setLocalError(null);\r\n\r\n try {\r\n const result = await activate(key.trim());\r\n\r\n if (result.valid && result.license) {\r\n setKey('');\r\n onActivated?.(result.license);\r\n } else {\r\n setLocalError(result.errorMessage || 'Activation failed');\r\n onError?.(result.errorMessage || 'Activation failed');\r\n }\r\n } finally {\r\n setIsActivating(false);\r\n }\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '12px',\r\n padding: '16px',\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '8px',\r\n backgroundColor: '#fff',\r\n ...style,\r\n };\r\n\r\n const inputStyle: CSSProperties = {\r\n padding: '10px 12px',\r\n fontSize: '14px',\r\n fontFamily: 'monospace',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n textTransform: 'uppercase',\r\n };\r\n\r\n const buttonStyle: CSSProperties = {\r\n padding: '10px 16px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: isActivating || loading ? '#9ca3af' : '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: isActivating || loading ? 'not-allowed' : 'pointer',\r\n };\r\n\r\n return (\r\n <form onSubmit={handleSubmit} style={containerStyle} className={className}>\r\n <label style={{ fontWeight: 500, color: '#374151' }}>Enter License Key</label>\r\n <input\r\n type=\"text\"\r\n value={key}\r\n onChange={(e) => setKey(e.target.value)}\r\n placeholder=\"XXXX-XXXX-XXXX-XXXX-XXXX\"\r\n style={inputStyle}\r\n disabled={isActivating || loading}\r\n />\r\n {localError && <div style={{ color: '#dc2626', fontSize: '13px' }}>{localError}</div>}\r\n <button type=\"submit\" style={buttonStyle} disabled={isActivating || loading || !key.trim()}>\r\n {isActivating ? 'Activating...' : 'Activate License'}\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n// ─── Upgrade Prompt ─────────────────────────────────────────────\r\n\r\nexport interface UpgradePromptProps {\r\n /** Target tier for upgrade */\r\n targetTier: LicenseTier;\r\n /** Feature that triggered the prompt */\r\n feature?: FeatureId;\r\n /** On upgrade click */\r\n onUpgrade?: (tier: LicenseTier) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Compact mode */\r\n compact?: boolean;\r\n}\r\n\r\n/**\r\n * Upgrade Prompt Component\r\n */\r\nexport function UpgradePrompt({\r\n targetTier,\r\n feature: _feature,\r\n onUpgrade,\r\n style,\r\n compact = false,\r\n}: UpgradePromptProps) {\r\n const { license } = useLicense();\r\n const missingFeatures = getMissingFeatures(license, targetTier);\r\n\r\n const handleUpgrade = () => {\r\n onUpgrade?.(targetTier);\r\n // Default: open upgrade page\r\n if (!onUpgrade) {\r\n window.open(`https://nice2dev.com/pricing?upgrade=${targetTier}`, '_blank');\r\n }\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n padding: compact ? '12px' : '20px',\r\n backgroundColor: '#eff6ff',\r\n borderRadius: '8px',\r\n border: '1px solid #bfdbfe',\r\n ...style,\r\n };\r\n\r\n const titleStyle: CSSProperties = {\r\n fontSize: compact ? '14px' : '16px',\r\n fontWeight: 600,\r\n color: '#1e40af',\r\n marginBottom: '8px',\r\n };\r\n\r\n const buttonStyle: CSSProperties = {\r\n padding: '8px 16px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n marginTop: '12px',\r\n };\r\n\r\n return (\r\n <div style={containerStyle}>\r\n <div style={titleStyle}>\r\n 🚀 Upgrade to {targetTier.charAt(0).toUpperCase() + targetTier.slice(1)}\r\n </div>\r\n {!compact && missingFeatures.length > 0 && (\r\n <ul style={{ margin: '8px 0', paddingLeft: '20px', color: '#374151', fontSize: '14px' }}>\r\n {missingFeatures.slice(0, 3).map((f) => (\r\n <li key={f.id}>{f.name}</li>\r\n ))}\r\n {missingFeatures.length > 3 && <li>+{missingFeatures.length - 3} more features</li>}\r\n </ul>\r\n )}\r\n <button onClick={handleUpgrade} style={buttonStyle}>\r\n Upgrade Now\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Comparison ─────────────────────────────────────────\r\n\r\nexport interface LicenseComparisonProps {\r\n /** Plans to show (default: all) */\r\n plans?: LicensePlan[];\r\n /** Current tier for highlighting */\r\n currentTier?: LicenseTier;\r\n /** On plan select */\r\n onSelect?: (plan: LicensePlan) => void;\r\n /** Show prices */\r\n showPrices?: boolean;\r\n}\r\n\r\n/**\r\n * License Comparison Table\r\n */\r\nexport function LicenseComparison({\r\n plans: customPlans,\r\n currentTier,\r\n onSelect,\r\n showPrices = true,\r\n}: LicenseComparisonProps) {\r\n const { license } = useLicense();\r\n const tier = currentTier || license?.tier;\r\n const plans = customPlans || getAllPlans().filter((p) => p.priceMonthly > 0 || p.id === 'trial');\r\n\r\n const formatPrice = (cents: number) => {\r\n if (cents === 0) {\r\n return 'Free';\r\n }\r\n return `$${(cents / 100).toFixed(0)}`;\r\n };\r\n\r\n return (\r\n <div style={{ display: 'flex', gap: '16px', flexWrap: 'wrap', justifyContent: 'center' }}>\r\n {plans.map((plan) => {\r\n const isCurrent = plan.id === tier;\r\n const isRecommended = plan.recommended;\r\n\r\n return (\r\n <div\r\n key={plan.id}\r\n style={{\r\n flex: '1 1 250px',\r\n maxWidth: '300px',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n border: isRecommended ? '2px solid #2563eb' : '1px solid #e5e7eb',\r\n backgroundColor: isCurrent ? '#f0f9ff' : '#fff',\r\n position: 'relative',\r\n }}\r\n >\r\n {isRecommended && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '-12px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n backgroundColor: '#2563eb',\r\n color: '#fff',\r\n padding: '4px 12px',\r\n borderRadius: '12px',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n }}\r\n >\r\n Recommended\r\n </div>\r\n )}\r\n\r\n <h3 style={{ margin: '0 0 4px', fontSize: '20px', color: '#111' }}>{plan.name}</h3>\r\n <p style={{ margin: '0 0 16px', fontSize: '14px', color: '#6b7280' }}>\r\n {plan.description}\r\n </p>\r\n\r\n {showPrices && (\r\n <div style={{ marginBottom: '16px' }}>\r\n <span style={{ fontSize: '32px', fontWeight: 700, color: '#111' }}>\r\n {formatPrice(plan.priceMonthly)}\r\n </span>\r\n {plan.priceMonthly > 0 && (\r\n <span style={{ fontSize: '14px', color: '#6b7280' }}>/month</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n <ul style={{ listStyle: 'none', padding: 0, margin: '0 0 16px' }}>\r\n {plan.highlights.map((h, i) => (\r\n <li key={i} style={{ padding: '6px 0', fontSize: '14px', color: '#374151' }}>\r\n ✓ {h}\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <button\r\n onClick={() => onSelect?.(plan)}\r\n disabled={isCurrent}\r\n style={{\r\n width: '100%',\r\n padding: '10px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: isCurrent ? '#9ca3af' : isRecommended ? '#fff' : '#2563eb',\r\n backgroundColor: isCurrent ? '#f3f4f6' : isRecommended ? '#2563eb' : '#fff',\r\n border: isCurrent ? 'none' : isRecommended ? 'none' : '1px solid #2563eb',\r\n borderRadius: '6px',\r\n cursor: isCurrent ? 'default' : 'pointer',\r\n }}\r\n >\r\n {isCurrent ? 'Current Plan' : 'Select'}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Trial Watermark ────────────────────────────────────────────\r\n\r\nexport interface TrialWatermarkProps {\r\n /** Position */\r\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\r\n /** Custom text */\r\n text?: string;\r\n}\r\n\r\n/**\r\n * Trial Watermark — shows for trial licenses\r\n */\r\nexport function TrialWatermark({\r\n position = 'bottom-right',\r\n text = 'Trial Version',\r\n}: TrialWatermarkProps) {\r\n const { license, hasFeature } = useLicense();\r\n\r\n // Only show for trial or if feature is enabled\r\n if (!hasFeature('trial-watermark') && license?.tier !== 'trial') {\r\n return null;\r\n }\r\n\r\n const positions: Record<string, CSSProperties> = {\r\n 'top-left': { top: '16px', left: '16px' },\r\n 'top-right': { top: '16px', right: '16px' },\r\n 'bottom-left': { bottom: '16px', left: '16px' },\r\n 'bottom-right': { bottom: '16px', right: '16px' },\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'fixed',\r\n ...positions[position],\r\n padding: '8px 16px',\r\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\r\n color: '#fff',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n borderRadius: '4px',\r\n zIndex: 9999,\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n {text}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Portal ─────────────────────────────────────────────\r\n\r\n/** License Portal tab identifier */\r\nexport type LicensePortalTab = 'overview' | 'activation' | 'seats' | 'features' | 'plans';\r\n\r\nexport interface LicensePortalProps {\r\n /** Tabs to display (default: all) */\r\n tabs?: LicensePortalTab[];\r\n /** Default active tab */\r\n defaultTab?: LicensePortalTab;\r\n /** On plan upgrade click */\r\n onUpgrade?: (tier: LicenseTier) => void;\r\n /** On deactivation */\r\n onDeactivate?: () => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * License Portal — self-service dashboard for customers to manage\r\n * their license (activation, seat overview, feature list, plan comparison).\r\n */\r\nexport function LicensePortal({\r\n tabs = ['overview', 'activation', 'seats', 'features', 'plans'],\r\n defaultTab = 'overview',\r\n onUpgrade,\r\n onDeactivate,\r\n style,\r\n className,\r\n}: LicensePortalProps) {\r\n const {\r\n license,\r\n validation: _validation,\r\n loading,\r\n error,\r\n deactivate,\r\n refresh,\r\n hasFeature: _checkFeat,\r\n } = useLicense();\r\n const [activeTab, setActiveTab] = useState<LicensePortalTab>(defaultTab);\r\n const [refreshing, setRefreshing] = useState(false);\r\n\r\n const handleRefresh = async () => {\r\n setRefreshing(true);\r\n try {\r\n await refresh();\r\n } finally {\r\n setRefreshing(false);\r\n }\r\n };\r\n\r\n const handleDeactivate = async () => {\r\n await deactivate();\r\n onDeactivate?.();\r\n };\r\n\r\n const tabLabels: Record<LicensePortalTab, string> = {\r\n overview: 'Overview',\r\n activation: 'Activation',\r\n seats: 'Seats',\r\n features: 'Features',\r\n plans: 'Plans',\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '12px',\r\n backgroundColor: '#fff',\r\n overflow: 'hidden',\r\n ...style,\r\n };\r\n\r\n const tabBarStyle: CSSProperties = {\r\n display: 'flex',\r\n borderBottom: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n };\r\n\r\n const getTabStyle = (tab: LicensePortalTab): CSSProperties => ({\r\n padding: '12px 20px',\r\n fontSize: '14px',\r\n fontWeight: activeTab === tab ? 600 : 400,\r\n color: activeTab === tab ? '#2563eb' : '#6b7280',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderBottom: activeTab === tab ? '2px solid #2563eb' : '2px solid transparent',\r\n cursor: 'pointer',\r\n });\r\n\r\n const panelStyle: CSSProperties = { padding: '24px' };\r\n\r\n return (\r\n <div style={containerStyle} className={className}>\r\n {/* Tab bar */}\r\n <div style={tabBarStyle}>\r\n {tabs.map((tab) => (\r\n <button key={tab} style={getTabStyle(tab)} onClick={() => setActiveTab(tab)}>\r\n {tabLabels[tab]}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab panels */}\r\n <div style={panelStyle}>\r\n {loading && <p style={{ color: '#6b7280' }}>Loading license information...</p>}\r\n\r\n {!loading && activeTab === 'overview' && (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\r\n <LicenseStatus detailed />\r\n {license && (\r\n <>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '12px' }}>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Licensee</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>{license.licensee}</p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Email</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>{license.email}</p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Seats</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>\r\n {license.activeSeats} / {license.maxSeats ?? '∞'}\r\n </p>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '12px', color: '#6b7280' }}>Expires</span>\r\n <p style={{ margin: '2px 0 0', fontWeight: 500 }}>\r\n {license.expiresAt\r\n ? new Date(license.expiresAt).toLocaleDateString()\r\n : 'Perpetual'}\r\n </p>\r\n </div>\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n style={{\r\n padding: '8px 16px',\r\n fontSize: '13px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n backgroundColor: '#fff',\r\n cursor: refreshing ? 'not-allowed' : 'pointer',\r\n }}\r\n >\r\n {refreshing ? 'Refreshing...' : 'Refresh'}\r\n </button>\r\n <button\r\n onClick={handleDeactivate}\r\n style={{\r\n padding: '8px 16px',\r\n fontSize: '13px',\r\n color: '#dc2626',\r\n border: '1px solid #fecaca',\r\n borderRadius: '6px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Deactivate\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n {!license && !error && (\r\n <p style={{ color: '#6b7280' }}>\r\n No active license. Go to the Activation tab to enter your license key.\r\n </p>\r\n )}\r\n {error && <p style={{ color: '#dc2626' }}>{error}</p>}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'activation' && (\r\n <LicenseActivator onActivated={() => setActiveTab('overview')} />\r\n )}\r\n\r\n {!loading && activeTab === 'seats' && (\r\n <div>\r\n {license ? (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\r\n <div style={{ fontSize: '14px', color: '#374151' }}>\r\n <strong>{license.activeSeats}</strong> of{' '}\r\n <strong>{license.maxSeats ?? '∞'}</strong> seats in use\r\n {license.floatingSeats != null && (\r\n <span> ({license.floatingSeats} floating)</span>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n height: '8px',\r\n borderRadius: '4px',\r\n backgroundColor: '#e5e7eb',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n <div\r\n style={{\r\n height: '100%',\r\n width: license.maxSeats\r\n ? `${Math.min(100, (license.activeSeats / license.maxSeats) * 100)}%`\r\n : '10%',\r\n backgroundColor:\r\n license.maxSeats && license.activeSeats / license.maxSeats > 0.9\r\n ? '#dc2626'\r\n : '#2563eb',\r\n borderRadius: '4px',\r\n transition: 'width 0.3s ease',\r\n }}\r\n />\r\n </div>\r\n <div style={{ fontSize: '12px', color: '#9ca3af' }}>\r\n Machines bound: {license.boundMachines.length} / {license.maxMachines}\r\n </div>\r\n </div>\r\n ) : (\r\n <p style={{ color: '#6b7280' }}>Activate a license to view seat information.</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'features' && (\r\n <div>\r\n {license ? (\r\n <ul\r\n style={{\r\n listStyle: 'none',\r\n padding: 0,\r\n margin: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '8px',\r\n }}\r\n >\r\n {license.features.map((f) => (\r\n <li\r\n key={f}\r\n style={{\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n backgroundColor: '#f0fdf4',\r\n color: '#166534',\r\n fontSize: '14px',\r\n }}\r\n >\r\n ✓ {f}\r\n </li>\r\n ))}\r\n {license.features.length === 0 && (\r\n <li style={{ color: '#6b7280', fontSize: '14px' }}>\r\n No explicit features — tier-based access applies.\r\n </li>\r\n )}\r\n </ul>\r\n ) : (\r\n <p style={{ color: '#6b7280' }}>Activate a license to view features.</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!loading && activeTab === 'plans' && (\r\n <LicenseComparison\r\n currentTier={license?.tier}\r\n onSelect={(plan) => onUpgrade?.(plan.id)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── License Manager (Admin) ────────────────────────────────────\r\n\r\n/** Admin-managed license entry */\r\nexport interface ManagedLicense {\r\n key: LicenseKey;\r\n tier: LicenseTier;\r\n licensee: string;\r\n email: string;\r\n status: 'valid' | 'expired' | 'revoked' | 'grace';\r\n issuedAt: string;\r\n expiresAt: string | null;\r\n activeSeats: number;\r\n maxSeats: number | null;\r\n features: string[];\r\n}\r\n\r\nexport interface NiceLicenseManagerProps {\r\n /** Licenses to display */\r\n licenses: ManagedLicense[];\r\n /** Revoke a license */\r\n onRevoke?: (key: LicenseKey) => void;\r\n /** Extend a license */\r\n onExtend?: (key: LicenseKey, days: number) => void;\r\n /** Change tier */\r\n onChangeTier?: (key: LicenseKey, tier: LicenseTier) => void;\r\n /** Add seat */\r\n onAddSeats?: (key: LicenseKey, count: number) => void;\r\n /** Generate new license */\r\n onGenerate?: () => void;\r\n /** Search term change */\r\n onSearchChange?: (term: string) => void;\r\n /** Custom styles */\r\n style?: CSSProperties;\r\n /** Custom class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * NiceLicenseManager — Admin panel for managing all issued licenses.\r\n * Shows a searchable table/list with inline actions (revoke, extend, change tier, manage seats).\r\n */\r\nexport function NiceLicenseManager({\r\n licenses,\r\n onRevoke,\r\n onExtend,\r\n onChangeTier,\r\n onAddSeats,\r\n onGenerate,\r\n onSearchChange,\r\n style,\r\n className,\r\n}: NiceLicenseManagerProps) {\r\n const [search, setSearch] = useState('');\r\n const [expandedKey, setExpandedKey] = useState<LicenseKey | null>(null);\r\n\r\n const handleSearch = (value: string) => {\r\n setSearch(value);\r\n onSearchChange?.(value);\r\n };\r\n\r\n const filtered = search\r\n ? licenses.filter(\r\n (l) =>\r\n l.licensee.toLowerCase().includes(search.toLowerCase()) ||\r\n l.email.toLowerCase().includes(search.toLowerCase()) ||\r\n l.key.toLowerCase().includes(search.toLowerCase()),\r\n )\r\n : licenses;\r\n\r\n const statusColors: Record<ManagedLicense['status'], string> = {\r\n valid: '#059669',\r\n expired: '#dc2626',\r\n revoked: '#6b7280',\r\n grace: '#d97706',\r\n };\r\n\r\n const containerStyle: CSSProperties = {\r\n border: '1px solid #e5e7eb',\r\n borderRadius: '12px',\r\n backgroundColor: '#fff',\r\n overflow: 'hidden',\r\n ...style,\r\n };\r\n\r\n return (\r\n <div style={containerStyle} className={className}>\r\n {/* Header */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '16px 20px',\r\n borderBottom: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n }}\r\n >\r\n <h3 style={{ margin: 0, fontSize: '16px', color: '#111' }}>License Manager</h3>\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => handleSearch(e.target.value)}\r\n placeholder=\"Search licenses...\"\r\n style={{\r\n padding: '6px 12px',\r\n fontSize: '13px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n width: '220px',\r\n }}\r\n />\r\n {onGenerate && (\r\n <button\r\n onClick={onGenerate}\r\n style={{\r\n padding: '6px 14px',\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n color: '#fff',\r\n backgroundColor: '#2563eb',\r\n border: 'none',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n + Generate\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* License list */}\r\n <div style={{ maxHeight: '500px', overflow: 'auto' }}>\r\n {filtered.length === 0 && (\r\n <p style={{ padding: '20px', textAlign: 'center', color: '#6b7280' }}>\r\n {search ? 'No licenses match your search.' : 'No licenses found.'}\r\n </p>\r\n )}\r\n\r\n {filtered.map((lic) => {\r\n const isExpanded = expandedKey === lic.key;\r\n\r\n return (\r\n <div\r\n key={lic.key}\r\n style={{\r\n borderBottom: '1px solid #f3f4f6',\r\n }}\r\n >\r\n {/* Summary row */}\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: '1fr 140px 100px 80px 60px',\r\n alignItems: 'center',\r\n padding: '12px 20px',\r\n cursor: 'pointer',\r\n backgroundColor: isExpanded ? '#f9fafb' : 'transparent',\r\n }}\r\n onClick={() => setExpandedKey(isExpanded ? null : lic.key)}\r\n >\r\n <div>\r\n <div style={{ fontWeight: 500, fontSize: '14px', color: '#111' }}>\r\n {lic.licensee}\r\n </div>\r\n <div style={{ fontSize: '12px', color: '#6b7280' }}>{lic.email}</div>\r\n </div>\r\n <div style={{ fontSize: '12px', fontFamily: 'monospace', color: '#6b7280' }}>\r\n {maskLicenseKey(lic.key)}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n textTransform: 'capitalize',\r\n color: statusColors[lic.status],\r\n }}\r\n >\r\n {lic.status}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: '12px',\r\n fontWeight: 500,\r\n textTransform: 'capitalize',\r\n color: '#374151',\r\n }}\r\n >\r\n {lic.tier}\r\n </div>\r\n <div style={{ fontSize: '14px', color: '#6b7280', textAlign: 'right' }}>\r\n {isExpanded ? '▲' : '▼'}\r\n </div>\r\n </div>\r\n\r\n {/* Expanded details */}\r\n {isExpanded && (\r\n <div style={{ padding: '12px 20px 16px', backgroundColor: '#f9fafb' }}>\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(4, 1fr)',\r\n gap: '12px',\r\n marginBottom: '12px',\r\n }}\r\n >\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Issued</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {new Date(lic.issuedAt).toLocaleDateString()}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Expires</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {lic.expiresAt ? new Date(lic.expiresAt).toLocaleDateString() : 'Perpetual'}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Seats</span>\r\n <div style={{ fontSize: '13px' }}>\r\n {lic.activeSeats} / {lic.maxSeats ?? '∞'}\r\n </div>\r\n </div>\r\n <div>\r\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Features</span>\r\n <div style={{ fontSize: '13px' }}>{lic.features.length} enabled</div>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>\r\n {onExtend && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onExtend(lic.key, 365);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Extend 1 Year\r\n </button>\r\n )}\r\n {onAddSeats && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAddSeats(lic.key, 5);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n +5 Seats\r\n </button>\r\n )}\r\n {onChangeTier && lic.status !== 'revoked' && (\r\n <select\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={(e) => onChangeTier(lic.key, e.target.value as LicenseTier)}\r\n value={lic.tier}\r\n style={{\r\n padding: '5px 8px',\r\n fontSize: '12px',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '4px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"trial\">Trial</option>\r\n <option value=\"personal\">Personal</option>\r\n <option value=\"team\">Team</option>\r\n <option value=\"enterprise\">Enterprise</option>\r\n <option value=\"site\">Site</option>\r\n <option value=\"oem\">OEM</option>\r\n </select>\r\n )}\r\n {onRevoke && lic.status !== 'revoked' && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRevoke(lic.key);\r\n }}\r\n style={{\r\n padding: '5px 12px',\r\n fontSize: '12px',\r\n color: '#dc2626',\r\n border: '1px solid #fecaca',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Revoke\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div\r\n style={{\r\n padding: '10px 20px',\r\n borderTop: '1px solid #e5e7eb',\r\n backgroundColor: '#f9fafb',\r\n fontSize: '12px',\r\n color: '#6b7280',\r\n }}\r\n >\r\n {filtered.length} license{filtered.length !== 1 ? 's' : ''}\r\n {search && ` matching \"${search}\"`}\r\n {' · '}\r\n {licenses.filter((l) => l.status === 'valid').length} active\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["createContext","useState","LicenseValidator","useCallback","normalizeLicenseKey","result","_a","hasFeature","useEffect","jsx","useContext","checkFeatureAccess","Fragment","jsxs","maskLicenseKey","getMissingFeatures","getAllPlans"],"mappings":"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"}
|
package/dist/react.d.ts
CHANGED
|
@@ -295,7 +295,7 @@ export declare interface TrialWatermarkProps {
|
|
|
295
295
|
/**
|
|
296
296
|
* Upgrade Prompt Component
|
|
297
297
|
*/
|
|
298
|
-
export declare function UpgradePrompt({ targetTier, feature, onUpgrade, style, compact, }: UpgradePromptProps): JSX_2.Element;
|
|
298
|
+
export declare function UpgradePrompt({ targetTier, feature: _feature, onUpgrade, style, compact, }: UpgradePromptProps): JSX_2.Element;
|
|
299
299
|
|
|
300
300
|
export declare interface UpgradePromptProps {
|
|
301
301
|
/** Target tier for upgrade */
|
package/dist/react.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { createContext, useState, useCallback, useEffect, useContext } from "react";
|
|
3
|
-
import { c as checkFeatureAccess, k as getAllPlans, L as LicenseValidator, D as normalizeLicenseKey, y as hasFeature, C as maskLicenseKey, r as getMissingFeatures } from "./FeatureGate-
|
|
3
|
+
import { c as checkFeatureAccess, k as getAllPlans, L as LicenseValidator, D as normalizeLicenseKey, y as hasFeature, C as maskLicenseKey, r as getMissingFeatures } from "./FeatureGate-cIgJ8Gq2.js";
|
|
4
4
|
const LicenseContext = createContext(null);
|
|
5
5
|
function LicenseProvider({
|
|
6
6
|
serverUrl = "https://license.nice2dev.com/api/v1",
|
|
@@ -348,7 +348,7 @@ function LicenseActivator({
|
|
|
348
348
|
}
|
|
349
349
|
function UpgradePrompt({
|
|
350
350
|
targetTier,
|
|
351
|
-
feature,
|
|
351
|
+
feature: _feature,
|
|
352
352
|
onUpgrade,
|
|
353
353
|
style,
|
|
354
354
|
compact = false
|
|
@@ -528,12 +528,12 @@ function LicensePortal({
|
|
|
528
528
|
}) {
|
|
529
529
|
const {
|
|
530
530
|
license,
|
|
531
|
-
validation,
|
|
531
|
+
validation: _validation,
|
|
532
532
|
loading,
|
|
533
533
|
error,
|
|
534
534
|
deactivate,
|
|
535
535
|
refresh,
|
|
536
|
-
hasFeature:
|
|
536
|
+
hasFeature: _checkFeat
|
|
537
537
|
} = useLicense();
|
|
538
538
|
const [activeTab, setActiveTab] = useState(defaultTab);
|
|
539
539
|
const [refreshing, setRefreshing] = useState(false);
|