import { FC, useCallback, useEffect, useState } from "react"; import { DialogTitle, DialogContent, Dialog, DialogHeader, Form, Button, Tabs, TabsTrigger, TabsContent, FormLabel } from '@marzneshin/components'; import { useTranslation } from 'react-i18next'; import { UserMutationType, useUsersCreationMutation, useUsersUpdateMutation } from "@marzneshin/features/users"; import { UserSchema } from "./schema"; import { UsernameField, DataLimitField, ExpireDateField, DataLimitResetStrategyField, NoteField, ServicesField, } from "./fields"; import { useMutationDialog } from "@marzneshin/hooks"; import { TabsList } from "@radix-ui/react-tabs"; import { OnHoldExpireDurationField } from "./fields/onhold-expire-duration"; import { OnHoldTimeoutField } from "./fields/onhold-timeout"; interface UsersMutationDialogProps { entity: UserMutationType | null; open: boolean; onOpenChange: (state: boolean) => void; } export const UsersMutationDialog: FC = ({ entity, open, onOpenChange, }) => { const { t } = useTranslation(); const getDefaultValues = useCallback((): UserMutationType => ({ services: [], data_limit: 1, expire: null, username: '', data_limit_reset_strategy: 'no_reset', status: 'active', note: '', on_hold_expire_duration: 0, on_hold_timeout: undefined, }), []); const { form, handleSubmit } = useMutationDialog({ entity, onOpenChange, createMutation: useUsersCreationMutation(), updateMutation: useUsersUpdateMutation(), schema: UserSchema, getDefaultValue: getDefaultValues, }) const [ selectedDataLimitTab, setSelectedDataLimitTab ] = useState<'limited' | 'unlimited' | string>('limited'); useEffect(() => { if (selectedDataLimitTab === 'limited') { form.setValue("data_limit", 1) form.setValue("data_limit_reset_strategy", "no_reset"); } else { form.setValue("data_limit", 0) form.setValue("data_limit_reset_strategy", "no_reset"); } }, [selectedDataLimitTab, form]); const getUserExpirationMethod = useCallback((entity: UserMutationType) => { if (entity.status === "on_hold") return 'onhold' else if (entity.expire !== undefined) return 'determined' else return 'unlimited' }, []) const defaultExpirationMethodTab = entity?.username ? getUserExpirationMethod(entity) : 'determined' const [ selectedExpirationMethodTab, setSelectedExpirationMethodTab ] = useState<'determined' | 'onhold' | 'unlimited' | string>(defaultExpirationMethodTab); useEffect(() => { form.setValue("status", "active") if (selectedExpirationMethodTab === 'onhold') { form.setValue("status", "on_hold") form.setValue("expire", null); form.clearErrors("expire"); } else if (selectedExpirationMethodTab === "unlimited") { form.setValue("expire", undefined); form.setValue("on_hold_expire_duration", undefined); form.setValue("on_hold_timeout", undefined); form.clearErrors("expire"); form.clearErrors("on_hold_expire_duration"); form.clearErrors("on_hold_timeout"); } else { form.setValue("on_hold_expire_duration", 0); form.setValue("on_hold_timeout", null); form.clearErrors("on_hold_expire_duration"); form.clearErrors("on_hold_timeout"); } }, [selectedExpirationMethodTab, form]); return ( {entity ? t('page.users.dialogs.edition.title') : t('page.users.dialogs.creation.title')}
{t('page.users.data_limit_method')}
{t('page.users.limited')} {t('page.users.unlimited')} {form.watch().data_limit !== 0 && }
{t('page.users.expire_method')} {t('page.users.determined_expire')} {t('page.users.onhold_expire')} {t('page.users.unlimited')}
); };