import {useFormContext} from 'react-hook-form'; import {Product} from '@common/billing/product'; import React, {Fragment, useMemo, useState} from 'react'; import {useValueLists} from '@common/http/value-lists'; import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field'; import {Trans} from '@common/i18n/trans'; import {Item} from '@common/ui/forms/listbox/item'; import {FormSelect, Select} from '@common/ui/forms/select/select'; import {Price} from '@common/billing/price'; import {BillingPeriodPresets} from '@common/admin/plans/crupdate-plan-page/billing-period-presets'; import {Button} from '@common/ui/buttons/button'; import {message} from '@common/i18n/message'; import {useTrans} from '@common/i18n/use-trans'; interface PriceFormProps { index: number; onRemovePrice: () => void; } export function PriceForm({index, onRemovePrice}: PriceFormProps) { const {trans} = useTrans(); const query = useValueLists(['currencies']); const currencies = useMemo(() => { return query.data?.currencies ? Object.values(query.data.currencies) : []; }, [query.data]); const {watch, getValues} = useFormContext(); const isNewProduct = !watch('id'); const isNewPrice = watch(`prices.${index}.id`) == null; const subscriberCount = watch(`prices.${index}.subscriptions_count`) || 0; // select billing period preset based on price "interval" and "interval_count" const [billingPeriodPreset, setBillingPeriodPreset] = useState(() => { const interval = getValues(`prices.${index}.interval`); const intervalCount = getValues(`prices.${index}.interval_count`); const preset = BillingPeriodPresets.find( p => p.key === `${interval}${intervalCount}` ); return preset ? preset.key : 'custom'; }); const allowPriceChanges = isNewProduct || isNewPrice || !subscriberCount; return ( {!allowPriceChanges && (

)} } type="number" min={0.1} step={0.01} name={`prices.${index}.amount`} className="mb-20" /> } name={`prices.${index}.currency`} items={currencies} showSearchField searchPlaceholder={trans(message('Search currencies'))} selectionMode="single" className="mb-20" > {item => ( {`${item.code}: ${item.name}`} )} {billingPeriodPreset === 'custom' && ( )}
); } interface BillingPeriodSelectProps { index: number; value: string; onValueChange: (value: string) => void; disabled: boolean; } function BillingPeriodSelect({ index, value, onValueChange, disabled, }: BillingPeriodSelectProps) { const {setValue: setFormValue} = useFormContext(); return ( ); } interface CustomBillingPeriodFieldProps { index: number; disabled: boolean; } function CustomBillingPeriodField({ index, disabled, }: CustomBillingPeriodFieldProps) { const {watch} = useFormContext(); const interval = watch(`prices.${index}.interval`); let maxIntervalCount: number; if (interval === 'day') { maxIntervalCount = 365; } else if (interval === 'week') { maxIntervalCount = 52; } else { maxIntervalCount = 12; } return (
); }