| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | import { useState } from 'react'import Operate from './Operate'import KeyInput from './KeyInput'import { useValidate } from './hooks'import type { Form, KeyFrom, Status, ValidateValue } from './declarations'import { useEventEmitterContextContext } from '@/context/event-emitter'import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'export type KeyValidatorProps = {  type: string  title: React.ReactNode  status: Status  forms: Form[]  keyFrom: KeyFrom  onSave: (v: ValidateValue) => Promise<boolean | undefined>  disabled?: boolean}const KeyValidator = ({  type,  title,  status,  forms,  keyFrom,  onSave,  disabled,}: KeyValidatorProps) => {  const triggerKey = `plugins/${type}`  const { eventEmitter } = useEventEmitterContextContext()  const [isOpen, setIsOpen] = useState(false)  const prevValue = forms.reduce((prev: ValidateValue, next: Form) => {    prev[next.key] = next.value    return prev  }, {})  const [value, setValue] = useState(prevValue)  const [validate, validating, validatedStatusState] = useValidate(value)  eventEmitter?.useSubscription((v) => {    if (v !== triggerKey) {      setIsOpen(false)      setValue(prevValue)      validate({ before: () => false })    }  })  const handleCancel = () => {    eventEmitter?.emit('')  }  const handleSave = async () => {    if (await onSave(value))      eventEmitter?.emit('')  }  const handleAdd = () => {    setIsOpen(true)    eventEmitter?.emit(triggerKey)  }  const handleEdit = () => {    setIsOpen(true)    eventEmitter?.emit(triggerKey)  }  const handleChange = (form: Form, val: string) => {    setValue({ ...value, [form.key]: val })    if (form.validate)      validate(form.validate)  }  const handleFocus = (form: Form) => {    if (form.handleFocus)      form.handleFocus(value, setValue)  }  return (    <div className='mb-2 border-[0.5px] border-gray-200 bg-gray-50 rounded-md'>      <div className={        `flex items-center justify-between px-4 h-[52px] cursor-pointer ${isOpen && 'border-b-[0.5px] border-b-gray-200'}`      }>        {title}        <Operate          isOpen={isOpen}          status={status}          onCancel={handleCancel}          onSave={handleSave}          onAdd={handleAdd}          onEdit={handleEdit}          disabled={disabled}        />      </div>      {        isOpen && !disabled && (          <div className='px-4 py-3'>            {              forms.map(form => (                <KeyInput                  key={form.key}                  className='mb-4'                  name={form.title}                  placeholder={form.placeholder}                  value={value[form.key] as string || ''}                  onChange={v => handleChange(form, v)}                  onFocus={() => handleFocus(form)}                  validating={validating}                  validatedStatusState={validatedStatusState}                />              ))            }            <a className="flex items-center text-xs cursor-pointer text-primary-600" href={keyFrom.link} target='_blank' rel='noopener noreferrer'>              {keyFrom.text}              <LinkExternal02 className='w-3 h-3 ml-1 text-primary-600' />            </a>          </div>        )      }    </div>  )}export default KeyValidator
 |