🐛 fix: Update minimum ratio value to 0 in protocol fields and adjust related schemas; enhance unit conversion in ServerConfig

This commit is contained in:
web 2025-09-28 08:48:17 -07:00
parent 3d778e5e36
commit 3b6ef177ba
4 changed files with 30 additions and 18 deletions

View File

@ -1,5 +1,6 @@
'use client'; 'use client';
import useGlobalStore from '@/config/use-global';
import { useNode } from '@/store/node'; import { useNode } from '@/store/node';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
import { import {
@ -78,6 +79,9 @@ export default function SubscribeForm<T extends Record<string, any>>({
trigger, trigger,
title, title,
}: Readonly<SubscribeFormProps<T>>) { }: Readonly<SubscribeFormProps<T>>) {
const { common } = useGlobalStore();
const { currency } = common;
const t = useTranslations('product'); const t = useTranslations('product');
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null); const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);
@ -213,7 +217,11 @@ export default function SubscribeForm<T extends Record<string, any>>({
form?.reset( form?.reset(
assign(defaultValues, shake(initialValues, (value) => value === null) as Record<string, any>), assign(defaultValues, shake(initialValues, (value) => value === null) as Record<string, any>),
); );
}, [form, initialValues]); const discount = form.getValues('discount') || [];
if (discount.length > 0) {
debouncedCalculateDiscount(discount, 'discount');
}
}, [form, initialValues, open]);
useEffect(() => { useEffect(() => {
return () => { return () => {
@ -228,7 +236,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
if (bool) setOpen(false); if (bool) setOpen(false);
} }
const { nodes, getAllAvailableTags, getNodesByTag, getNodesWithoutTags } = useNode(); const { getAllAvailableTags, getNodesByTag, getNodesWithoutTags } = useNode();
const tagGroups = getAllAvailableTags(); const tagGroups = getAllAvailableTags();
@ -630,9 +638,9 @@ export default function SubscribeForm<T extends Record<string, any>>({
{ {
name: 'discount', name: 'discount',
type: 'number', type: 'number',
min: 0.01, min: 1,
max: 100, max: 100,
step: 0.01, step: 1,
placeholder: t('form.discountPercent'), placeholder: t('form.discountPercent'),
suffix: '%', suffix: '%',
}, },
@ -642,6 +650,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
type: 'number', type: 'number',
min: 0, min: 0,
step: 0.01, step: 0.01,
prefix: currency.currency_symbol,
formatInput: (value) => unitConversion('centsToDollars', value), formatInput: (value) => unitConversion('centsToDollars', value),
formatOutput: (value) => formatOutput: (value) =>
unitConversion('dollarsToCents', value).toString(), unitConversion('dollarsToCents', value).toString(),

View File

@ -27,7 +27,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -134,7 +134,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -242,7 +242,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -500,7 +500,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -608,7 +608,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -716,7 +716,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -789,7 +789,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -809,7 +809,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -886,7 +886,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -963,7 +963,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',
@ -999,7 +999,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
name: 'ratio', name: 'ratio',
type: 'number', type: 'number',
label: 'traffic_ratio', label: 'traffic_ratio',
min: 1, min: 0,
step: 0.01, step: 0.01,
defaultValue: 1, defaultValue: 1,
group: 'basic', group: 'basic',

View File

@ -17,7 +17,7 @@ import {
const nullableString = z.string().nullish(); const nullableString = z.string().nullish();
const nullableBool = z.boolean().nullish(); const nullableBool = z.boolean().nullish();
const nullablePort = z.number().int().min(0).max(65535).nullish(); const nullablePort = z.number().int().min(0).max(65535).nullish();
const nullableRatio = z.number().min(1).nullish(); const nullableRatio = z.number().min(0).nullish();
const ss = z.object({ const ss = z.object({
ratio: nullableRatio, ratio: nullableRatio,

View File

@ -35,6 +35,7 @@ import { Textarea } from '@workspace/ui/components/textarea';
import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs'; import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { Icon } from '@workspace/ui/custom-components/icon'; import { Icon } from '@workspace/ui/custom-components/icon';
import { unitConversion } from '@workspace/ui/utils';
import { DicesIcon } from 'lucide-react'; import { DicesIcon } from 'lucide-react';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { uid } from 'radash'; import { uid } from 'radash';
@ -275,8 +276,10 @@ export default function ServerConfig() {
type='number' type='number'
min={0} min={0}
suffix='MB' suffix='MB'
value={field.value as any} value={unitConversion('bitsToMb', field.value as number | undefined)}
onValueChange={field.onChange} onValueChange={(value) => {
field.onChange(unitConversion('mbToBits', value));
}}
placeholder='1' placeholder='1'
/> />
</FormControl> </FormControl>