123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- 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
|