| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | import type { FC } from 'react'import { useState } from 'react'import { useTranslation } from 'react-i18next'import Modal from '@/app/components/base/modal'import Button from '@/app/components/base/button'import { BookOpen01 } from '@/app/components/base/icons/src/vender/line/education'import type { ApiBasedExtension } from '@/models/common'import {  addApiBasedExtension,  updateApiBasedExtension,} from '@/service/common'import { useToastContext } from '@/app/components/base/toast'export type ApiBasedExtensionData = {  name?: string  apiEndpoint?: string  apiKey?: string}type ApiBasedExtensionModalProps = {  data: ApiBasedExtension  onCancel: () => void  onSave?: (newData: ApiBasedExtension) => void}const ApiBasedExtensionModal: FC<ApiBasedExtensionModalProps> = ({  data,  onCancel,  onSave,}) => {  const { t } = useTranslation()  const [localeData, setLocaleData] = useState(data)  const [loading, setLoading] = useState(false)  const { notify } = useToastContext()  const handleDataChange = (type: string, value: string) => {    setLocaleData({ ...localeData, [type]: value })  }  const handleSave = async () => {    setLoading(true)    if (localeData && localeData.api_key && localeData.api_key?.length < 5) {      notify({ type: 'error', message: t('common.apiBasedExtension.modal.apiKey.lengthError') })      setLoading(false)      return    }    try {      let res: ApiBasedExtension = {}      if (!data.id) {        res = await addApiBasedExtension({          url: '/api-based-extension',          body: localeData,        })      }      else {        res = await updateApiBasedExtension({          url: `/api-based-extension/${data.id}`,          body: {            ...localeData,            api_key: data.api_key === localeData.api_key ? '[__HIDDEN__]' : localeData.api_key,          },        })        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })      }      if (onSave)        onSave(res)    }    finally {      setLoading(false)    }  }  return (    <Modal      isShow      onClose={() => {}}      wrapperClassName='!z-30'      className='!p-8 !pb-6 !max-w-none !w-[640px]'    >      <div className='mb-2 text-xl font-semibold text-gray-900'>        {          data.name            ? t('common.apiBasedExtension.modal.editTitle')            : t('common.apiBasedExtension.modal.title')        }      </div>      <div className='py-2'>        <div className='leading-9 text-sm font-medium text-gray-900'>          {t('common.apiBasedExtension.modal.name.title')}        </div>        <input          value={localeData.name || ''}          onChange={e => handleDataChange('name', e.target.value)}          className='block px-3 w-full h-9 bg-gray-100 rounded-lg text-sm text-gray-900 outline-none appearance-none'          placeholder={t('common.apiBasedExtension.modal.name.placeholder') || ''}        />      </div>      <div className='py-2'>        <div className='flex justify-between items-center h-9 text-sm font-medium text-gray-900'>          {t('common.apiBasedExtension.modal.apiEndpoint.title')}          <a            href={t('common.apiBasedExtension.linkUrl') || '/'}            target='_blank'            className='group flex items-center text-xs text-gray-500 font-normal hover:text-primary-600'          >            <BookOpen01 className='mr-1 w-3 h-3 text-gray-500 group-hover:text-primary-600' />            {t('common.apiBasedExtension.link')}          </a>        </div>        <input          value={localeData.api_endpoint || ''}          onChange={e => handleDataChange('api_endpoint', e.target.value)}          className='block px-3 w-full h-9 bg-gray-100 rounded-lg text-sm text-gray-900 outline-none appearance-none'          placeholder={t('common.apiBasedExtension.modal.apiEndpoint.placeholder') || ''}        />      </div>      <div className='py-2'>        <div className='leading-9 text-sm font-medium text-gray-900'>          {t('common.apiBasedExtension.modal.apiKey.title')}        </div>        <div className='flex items-center'>          <input            value={localeData.api_key || ''}            onChange={e => handleDataChange('api_key', e.target.value)}            className='block grow mr-2 px-3 h-9 bg-gray-100 rounded-lg text-sm text-gray-900 outline-none appearance-none'            placeholder={t('common.apiBasedExtension.modal.apiKey.placeholder') || ''}          />        </div>      </div>      <div className='flex items-center justify-end mt-6'>        <Button          onClick={onCancel}          className='mr-2 text-sm font-medium'        >          {t('common.operation.cancel')}        </Button>        <Button          type='primary'          className='text-sm font-medium'          disabled={!localeData.name || !localeData.api_endpoint || !localeData.api_key || loading}          onClick={handleSave}        >          {t('common.operation.save')}        </Button>      </div>    </Modal>  )}export default ApiBasedExtensionModal
 |