import { useCallback, useState } from 'react' import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import { Portal } from '@headlessui/react' import type { FormValue, ProviderConfigModal } from '../declarations' import { ConfigurableProviders } from '../utils' import Form from './Form' import I18n from '@/context/i18n' import Button from '@/app/components/base/button' import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security' import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general' import { AlertCircle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback' import { useEventEmitterContextContext } from '@/context/event-emitter' type ModelModalProps = { isShow: boolean onCancel: () => void modelModal?: ProviderConfigModal onSave: (v?: FormValue) => void mode: string } const ModelModal: FC = ({ isShow, onCancel, modelModal, onSave, mode, }) => { const { t } = useTranslation() const { locale } = useContext(I18n) const { eventEmitter } = useEventEmitterContextContext() const [value, setValue] = useState() const [loading, setLoading] = useState(false) const [errorMessage, setErrorMessage] = useState('') const [cleared, setCleared] = useState(false) const [prevIsShow, setPrevIsShow] = useState(isShow) const [validating, setValidating] = useState(false) if (prevIsShow !== isShow) { setCleared(false) setPrevIsShow(isShow) } eventEmitter?.useSubscription((v) => { if (v === 'provider-save') setLoading(true) else setLoading(false) }) const handleValidatedError = useCallback((newErrorMessage: string) => { setErrorMessage(newErrorMessage) }, []) const handleValidating = useCallback((newValidating: boolean) => { setValidating(newValidating) }, []) const validateRequiredValue = () => { const validateValue = value || modelModal?.defaultValue if (modelModal) { const { fields } = modelModal const requiredFields = fields.filter(field => !(typeof field.hidden === 'function' ? field.hidden(validateValue) : field.hidden) && field.required) for (let i = 0; i < requiredFields.length; i++) { const currentField = requiredFields[i] if (!validateValue?.[currentField.key]) { setErrorMessage(t('appDebug.errorMessage.valueOfVarRequired', { key: currentField.label[locale] }) || '') return false } } return true } } const handleSave = () => { if (validateRequiredValue()) onSave(value || modelModal?.defaultValue) } const renderTitlePrefix = () => { let prefix if (mode === 'edit') prefix = t('common.operation.edit') else prefix = ConfigurableProviders.includes(modelModal!.key) ? t('common.operation.create') : t('common.operation.setup') return `${prefix} ${modelModal?.title[locale]}` } if (!isShow) return null return (
{renderTitlePrefix()}
{modelModal?.icon}
setValue(newValue)} onValidatedError={handleValidatedError} mode={mode} cleared={cleared} onClearedChange={setCleared} onValidating={handleValidating} />
{modelModal?.link.label[locale]}
{ errorMessage ? (
{errorMessage}
) : (
{t('common.modelProvider.encrypted.front')} PKCS1_OAEP {t('common.modelProvider.encrypted.back')}
) }
) } export default ModelModal