import * as React from 'react'; import { __, sprintf } from '@wordpress/i18n'; import { CatalogApi } from './api'; import { CatalogForm } from './CatalogForm'; import { resourceTypes, accessModes } from './fields'; import type { Config, Item, Payload, Resource, Sport } from './types'; export function CatalogApp({ config }: { config: Config & { page: 'sports' | 'resources'; }; }): React.ReactElement { const api = React.useMemo(() => new CatalogApi(config), [config]); const [items, setItems] = React.useState([]); const [sports, setSports] = React.useState([]); const [page, setPage] = React.useState(1); const [pages, setPages] = React.useState(1); const [total, setTotal] = React.useState(0); const [revision, refresh] = React.useReducer((value: number) => value + 1, 0); const [loading, setLoading] = React.useState(true); const [busy, setBusy] = React.useState(false); const [error, setError] = React.useState(''); const [notice, setNotice] = React.useState(''); const [editor, setEditor] = React.useState<{ item: Item | null; } | null>(null); const resources = config.page === 'resources'; React.useEffect(() => { let active = true; setLoading(true); setError(''); void Promise.all([api.list(config.page, page), resources ? api.sports() : Promise.resolve([])]) .then(([result, options]) => { if (!active) return; setItems(result.items); setPages(Math.max(1, result.pages)); setTotal(result.total); setSports(options); }) .catch(cause => { if (active) setError(cause instanceof Error ? cause.message : __('The request failed. Please try again.', 'abece-booking')); }) .finally(() => { if (active) setLoading(false); }); return () => { active = false; }; }, [api, config.page, resources, page, revision]); async function save(payload: Payload): Promise { await api.save(config.page, payload, editor?.item?.id); setEditor(null); setNotice(__('Changes saved.', 'abece-booking')); refresh(); } async function toggle(item: Item, field: 'is_active' | 'is_visible' | 'is_bookable'): Promise { setBusy(true); setError(''); setNotice(''); try { await api.save(config.page, { [field]: !(item as unknown as Record)[field] }, item.id); setNotice(__('Changes saved.', 'abece-booking')); refresh(); } catch (cause) { setError(cause instanceof Error ? cause.message : __('The request failed. Please try again.', 'abece-booking')); } finally { setBusy(false); } } const headers = resources ? [__('Name', 'abece-booking'), __('Sport', 'abece-booking'), __('Type', 'abece-booking'), __('Active', 'abece-booking'), __('Visible', 'abece-booking'), __('Bookable', 'abece-booking'), __('Access mode', 'abece-booking'), __('Sort order', 'abece-booking'), __('Actions', 'abece-booking')] : [__('Name', 'abece-booking'), __('Slug', 'abece-booking'), __('Status', 'abece-booking'), __('Sort order', 'abece-booking'), __('Actions', 'abece-booking')]; const yesNo = (value: boolean): string => value ? __('Yes', 'abece-booking') : __('No', 'abece-booking'); return

{resources ? __('Resources', 'abece-booking') : __('Sports', 'abece-booking')}

{false} {notice &&

{notice}

} {error &&

{error}

} {editor && setEditor(null)}/>} {loading &&

{__('Loading…', 'abece-booking')}

} {!loading && !error && <> {total === 0 &&

{resources ? __('Create your first resource to define what customers can book.', 'abece-booking') : __('Create a sport to group your resources.', 'abece-booking')}

}

{sprintf(__('Total items: %d', 'abece-booking'), total)}

{headers.map(header => )}{items.length === 0 ? : items.map(item => { const resource = item as Resource; return {resources ? <> : <>} ; })}
{header}
{__('No items found.', 'abece-booking')}
{item.name}{sports.find(sport => sport.id === resource.sport_id)?.name ?? __('No sport', 'abece-booking')} {resourceTypes.find(([value]) => value === resource.resource_type)?.[1] ?? resource.resource_type} {yesNo(item.is_active)}{yesNo(resource.is_visible)}{yesNo(resource.is_bookable)} {accessModes.find(([value]) => value === (config.membershipsEnabled === false ? 'public' : resource.access_mode))?.[1] ?? resource.access_mode}{item.slug}{item.is_active ? __('Active', 'abece-booking') : __('Inactive', 'abece-booking')}{item.sort_order}
{resources && <> }
{sprintf(__('Page %1$d of %2$d', 'abece-booking'), page, pages)}
}
; }