'use client' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { RiClipboardFill, RiClipboardLine } from '@remixicon/react' import { debounce } from 'lodash-es' import copy from 'copy-to-clipboard' import type { InputProps } from '../input' import Tooltip from '../tooltip' import ActionButton from '../action-button' import cn from '@/utils/classnames' export type InputWithCopyProps = { showCopyButton?: boolean copyValue?: string // Value to copy, defaults to input value onCopy?: (value: string) => void // Callback when copy is triggered } & Omit // Remove conflicting props const prefixEmbedded = 'appOverview.overview.appInfo.embedded' const InputWithCopy = React.forwardRef(( { showCopyButton = true, copyValue, onCopy, value, wrapperClassName, ...inputProps }, ref, ) => { const { t } = useTranslation() const [isCopied, setIsCopied] = useState(false) // Determine what value to copy const valueToString = typeof value === 'string' ? value : String(value || '') const finalCopyValue = copyValue || valueToString const onClickCopy = debounce(() => { copy(finalCopyValue) setIsCopied(true) onCopy?.(finalCopyValue) }, 100) const onMouseLeave = debounce(() => { setIsCopied(false) }, 100) useEffect(() => { if (isCopied) { const timeout = setTimeout(() => { setIsCopied(false) }, 2000) return () => { clearTimeout(timeout) } } }, [isCopied]) return (
rest)(inputProps)} /> {showCopyButton && (
{isCopied ? ( ) : ( )}
)}
) }) InputWithCopy.displayName = 'InputWithCopy' export default InputWithCopy