import * as React from 'react'; import { __ } from '@wordpress/i18n'; import { BookingApi } from '../booking-ui/api'; import { formatDateTime } from '../booking-ui/dateTime'; import type { FeatureManifest } from '../booking-ui/features'; interface License { state: string; updates: boolean; expires_at: string | null; renewal_cancelled: boolean | null; production_sites: number | null; account_url: string | null; upgrade_url: string | null; } interface Matrix extends FeatureManifest { license: License; catalog: Record; plans: Record; limits: { resources: number | null; online_resources: number | null; }; }>; } const licenseLabels: Record = { unlicensed: __('No active license', 'abece-booking'), active: __('Active license', 'abece-booking'), expired: __('Expired updates and support', 'abece-booking'), revoked: __('Revoked license', 'abece-booking') }; const labels: Record = { online_bookings: __('Customer online bookings', 'abece-booking'), public_calendar: __('Calendar', 'abece-booking'), admin_bookings: __('Admin bookings', 'abece-booking'), opening_hours: __('Opening hours', 'abece-booking'), single_operations: __('Resource blocks', 'abece-booking'), basic_pricing: __('Public price', 'abece-booking'), notifications: __('Email notifications', 'abece-booking'), pay_on_site: __('Pay on site', 'abece-booking'), receivables: __('Outstanding amounts', 'abece-booking'), debtor_blocking: __('Block new online bookings with an unpaid amount', 'abece-booking'), statistics_basic: __('Basic statistics', 'abece-booking'), advanced_pricing: __('Price rules', 'abece-booking'), multi_resource_operations: __('Selected resources', 'abece-booking'), recurring_bookings: __('Recurring bookings', 'abece-booking'), bank_transfer: __('Bank transfer', 'abece-booking'), bank_qr: __('QR payment', 'abece-booking'), memberships: __('Membership', 'abece-booking'), member_import: __('Import members', 'abece-booking'), bulk_membership_renewal: __('Bulk membership renewal', 'abece-booking'), member_benefits: __('Membership benefit', 'abece-booking'), usage_limits: __('Playing time limits', 'abece-booking'), customer_restrictions: __('Customer restrictions', 'abece-booking'), credits: __('Credits', 'abece-booking'), statistics_advanced: __('Advanced statistics', 'abece-booking'), report_exports: __('Export CSV', 'abece-booking'), financial_reporting: __('Finance', 'abece-booking') }; export function EditionApp({ api }: { api: BookingApi; }) { const [data, setData] = React.useState(null), [error, setError] = React.useState(''); React.useEffect(() => { let live = true; api.request('admin/edition').then(d => { if (live) setData(d); }).catch(e => { if (live) setError(e.message); }); return () => { live = false; }; }, [api]); return

{__('Editions and features', 'abece-booking')}

{error &&

{error}

}{data && <>

{__('Build', 'abece-booking')}: {data.edition === 'lite' ? 'Lite' : 'Premium'} · {__('Plan', 'abece-booking')}: ABeCe Booking {data.plan[0].toUpperCase() + data.plan.slice(1)}

{__('License', 'abece-booking')}: {licenseLabels[data.license.state] ?? data.license.state}

{__('Updates and support', 'abece-booking')}: {data.license.updates ? __('Yes', 'abece-booking') : __('No', 'abece-booking')}

{data.license.expires_at &&

{__('Paid period ends', 'abece-booking')}: {formatDateTime(data.license.expires_at)}

}{data.license.renewal_cancelled && data.plan !== 'lite' &&

{__('Automatic renewal is cancelled. Features remain available for the purchased edition.', 'abece-booking')}

}{data.license.state === 'expired' && data.plan !== 'lite' &&

{__('Purchased features remain available. Renew for updates and support.', 'abece-booking')}

}{data.license.production_sites !== null &&

{__('Production site limit', 'abece-booking')}: {data.license.production_sites}

}

{data.license.account_url && {__('Manage license', 'abece-booking')}}{' '}{data.license.upgrade_url && {__('Change plan', 'abece-booking')}}

{Object.keys(data.plans).map(p => )}{Object.entries(data.plans).map(([p, v]) => )}{Object.entries(data.plans).map(([p, v]) => )}{Object.keys(data.catalog).map(feature => {Object.entries(data.plans).map(([p, v]) => )})}
{__('Feature', 'abece-booking')}{p[0].toUpperCase() + p.slice(1)}
{__('Managed resources', 'abece-booking')}{v.limits.resources ?? '∞'}
{__('Online bookable resources', 'abece-booking')}{v.limits.online_resources ?? '∞'}
{labels[feature] ?? feature}{v.features[feature] ? __('Yes', 'abece-booking') : __('No', 'abece-booking')}
}
; }