import React, { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { react2angular } from 'react2angular'; import { Loader } from '../base/loader'; import { FabAlert } from '../base/fab-alert'; import { HtmlTranslate } from '../base/html-translate'; import MachineAPI from '../../api/machine'; import GroupAPI from '../../api/group'; import { IFablab } from '../../models/fablab'; import { Machine } from '../../models/machine'; import { Group } from '../../models/group'; import { IApplication } from '../../models/application'; import { EditablePrice } from './editable-price'; import { ConfigurePacksButton } from './configure-packs-button'; import PriceAPI from '../../api/price'; import { Price } from '../../models/price'; import PrepaidPackAPI from '../../api/prepaid-pack'; import { PrepaidPack } from '../../models/prepaid-pack'; declare var Fablab: IFablab; declare var Application: IApplication; interface MachinesPricingProps { onError: (message: string) => void, onSuccess: (message: string) => void, } /** * Interface to set and edit the prices of machines-hours, per group */ const MachinesPricing: React.FC = ({ onError, onSuccess }) => { const { t } = useTranslation('admin'); const [machines, setMachines] = useState>(null); const [groups, setGroups] = useState>(null); const [prices, setPrices] = useState>(null); const [packs, setPacks] = useState>(null); // retrieve the initial data useEffect(() => { MachineAPI.index([{ key: 'disabled', value: false }]) .then(data => setMachines(data)) .catch(error => onError(error)); GroupAPI.index([{ key: 'disabled', value: false }]) .then(data => setGroups(data)) .catch(error => onError(error)); PriceAPI.index([{ key: 'priceable_type', value: 'Machine'}, { key: 'plan_id', value: null }]) .then(data => setPrices(data)) .catch(error => onError(error)); PrepaidPackAPI.index() .then(data => setPacks(data)) .catch(error => onError(error)) }, []); // duration of the example slot const EXEMPLE_DURATION = 20; /** * Return the exemple price, formatted */ const examplePrice = (type: 'hourly_rate' | 'final_price'): string => { const hourlyRate = 10; if (type === 'hourly_rate') { return new Intl.NumberFormat(Fablab.intl_locale, { style: 'currency', currency: Fablab.intl_currency }).format(hourlyRate); } const price = (hourlyRate / 60) * EXEMPLE_DURATION; return new Intl.NumberFormat(Fablab.intl_locale, { style: 'currency', currency: Fablab.intl_currency }).format(price); }; /** * Find the price matching the given criterion */ const findPriceBy = (machineId, groupId): Price => { for (const price of prices) { if ((price.priceable_id === machineId) && (price.group_id === groupId)) { return price; } } }; /** * Callback triggered when the user has confirmed to update a price */ const handleUpdatePrice = (price: Price): void => { PriceAPI.update(price) .then(() => onSuccess(t('app.admin.machines_pricing.price_updated'))) .catch(error => onError(error)) } return (

{t('app.admin.machines_pricing.you_can_override')}

{groups?.map(group => )} {machines?.map(machine => {groups?.map(group => )} )}
{t('app.admin.machines_pricing.machines')}{group.name}
{machine.name} {prices && } {packs && }
); } const MachinesPricingWrapper: React.FC = ({ onError, onSuccess }) => { return ( ); } Application.Components.component('machinesPricing', react2angular(MachinesPricingWrapper, ['onError', 'onSuccess']));