import { useEffect, useState } from 'react'; import * as React from 'react'; import { Machine } from '../../models/machine'; import { IApplication } from '../../models/application'; import { react2angular } from 'react2angular'; import { Loader } from '../base/loader'; import MachineAPI from '../../api/machine'; import { MachineCard } from './machine-card'; import { MachinesFilters } from './machines-filters'; import { User } from '../../models/user'; import { useTranslation } from 'react-i18next'; import { FabButton } from '../base/fab-button'; declare const Application: IApplication; interface MachinesListProps { user?: User, onError: (message: string) => void, onSuccess: (message: string) => void, onShowMachine: (machine: Machine) => void, onReserveMachine: (machine: Machine) => void, onLoginRequested: () => Promise, onEnrollRequested: (trainingId: number) => void, canProposePacks: boolean, } /** * This component shows a list of all machines and allows filtering on that list. */ export const MachinesList: React.FC = ({ onError, onSuccess, onShowMachine, onReserveMachine, onLoginRequested, onEnrollRequested, user, canProposePacks }) => { const { t } = useTranslation('public'); // shown machines const [machines, setMachines] = useState>(null); // we keep the full list of machines, for filtering const [allMachines, setAllMachines] = useState>(null); // retrieve the full list of machines on component mount useEffect(() => { MachineAPI.index() .then(data => setAllMachines(data)) .catch(e => onError(e)); }, []); // filter the machines shown when the full list was retrieved useEffect(() => { handleFilterByStatus(true); }, [allMachines]); /** * Callback triggered when the user changes the status filter. * Set the 'machines' state to a filtered list, depending on the provided parameter. * @param status, true = enabled machines, false = disabled machines, null = all machines */ const handleFilterByStatus = (status: boolean): void => { if (!allMachines) return; if (status === null) return setMachines(allMachines); // enabled machines may have the m.disabled property null (for never disabled machines) // or false (for re-enabled machines) setMachines(allMachines.filter(m => !!m.disabled === !status)); }; /** * Go to store */ const linkToStore = (): void => { window.location.href = '/#!/store'; }; // TODO: Conditionally display the store ad return (
{false &&
linkToStore}>

{t('app.public.machines_list.store_ad.title')}

{t('app.public.machines_list.store_ad.buy')}

{t('app.public.machines_list.store_ad.sell')}

} className="cta" onClick={linkToStore}> {t('app.public.machines_list.store_ad.link')}
} {machines && machines.map(machine => { return ; })}
); }; const MachinesListWrapper: React.FC = (props) => { return ( ); }; Application.Components.component('machinesList', react2angular(MachinesListWrapper, ['user', 'onError', 'onSuccess', 'onShowMachine', 'onReserveMachine', 'onLoginRequested', 'onEnrollRequested', 'canProposePacks']));