mixed-variable-input
parent
57e1b896cd
commit
ab8146035d
@ -0,0 +1,39 @@
|
|||||||
|
import {
|
||||||
|
memo,
|
||||||
|
} from 'react'
|
||||||
|
import PromptEditor from '@/app/components/base/prompt-editor'
|
||||||
|
import cn from '@/utils/classnames'
|
||||||
|
import Placeholder from './placeholder'
|
||||||
|
|
||||||
|
type MixedVariableTextInputProps = {
|
||||||
|
editable?: boolean
|
||||||
|
value?: string
|
||||||
|
onChange?: (text: string) => void
|
||||||
|
}
|
||||||
|
const MixedVariableTextInput = ({
|
||||||
|
editable = true,
|
||||||
|
value = '',
|
||||||
|
onChange,
|
||||||
|
}: MixedVariableTextInputProps) => {
|
||||||
|
return (
|
||||||
|
<PromptEditor
|
||||||
|
wrapperClassName={cn(
|
||||||
|
'rounded-lg border border-transparent bg-components-input-bg-normal px-2 py-1',
|
||||||
|
'hover:border-components-input-border-hover hover:bg-components-input-bg-hover',
|
||||||
|
'focus-within:border-components-input-border-active focus-within:bg-components-input-bg-active focus-within:shadow-xs',
|
||||||
|
)}
|
||||||
|
className='caret:text-text-accent'
|
||||||
|
editable={editable}
|
||||||
|
value={value}
|
||||||
|
workflowVariableBlock={{
|
||||||
|
show: true,
|
||||||
|
variables: [],
|
||||||
|
workflowNodesMap: {},
|
||||||
|
}}
|
||||||
|
placeholder={<Placeholder />}
|
||||||
|
onChange={onChange}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default memo(MixedVariableTextInput)
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
import { useCallback } from 'react'
|
||||||
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
|
||||||
|
import { FOCUS_COMMAND } from 'lexical'
|
||||||
|
import { $insertNodes } from 'lexical'
|
||||||
|
import { CustomTextNode } from '@/app/components/base/prompt-editor/plugins/custom-text/node'
|
||||||
|
import Badge from '@/app/components/base/badge'
|
||||||
|
|
||||||
|
const Placeholder = () => {
|
||||||
|
const [editor] = useLexicalComposerContext()
|
||||||
|
|
||||||
|
const handleInsert = useCallback((text: string) => {
|
||||||
|
editor.update(() => {
|
||||||
|
const textNode = new CustomTextNode(text)
|
||||||
|
$insertNodes([textNode])
|
||||||
|
})
|
||||||
|
editor.dispatchCommand(FOCUS_COMMAND, undefined as any)
|
||||||
|
}, [editor])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className='pointer-events-auto flex h-full w-full cursor-text items-center px-2'
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation()
|
||||||
|
handleInsert('')
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div className='flex grow items-center'>
|
||||||
|
Type or press
|
||||||
|
<div className='system-kbd mx-0.5 flex h-4 w-4 items-center justify-center rounded bg-components-kbd-bg-gray text-text-placeholder'>/</div>
|
||||||
|
<div
|
||||||
|
className='system-sm-regular cursor-pointer text-components-input-text-placeholder underline decoration-dotted decoration-auto underline-offset-auto hover:text-text-tertiary'
|
||||||
|
onClick={((e) => {
|
||||||
|
e.stopPropagation()
|
||||||
|
handleInsert('/')
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
insert variable
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Badge
|
||||||
|
className='shrink-0'
|
||||||
|
text='String'
|
||||||
|
uppercase={false}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Placeholder
|
||||||
Loading…
Reference in New Issue