import {ReactNode, useCallback, useMemo, cloneElement} from "react"; import {forwardRef} from "@nextui-org/system"; import {Tooltip} from "@nextui-org/tooltip"; import {CopyLinearIcon, CheckLinearIcon} from "@nextui-org/shared-icons"; import {Button} from "@nextui-org/button"; import {useSnippet, UseSnippetProps} from "./use-snippet"; export interface SnippetProps extends UseSnippetProps {} const Snippet = forwardRef<"div", SnippetProps>((props, ref) => { const { Component, domRef, preRef, children, slots, classNames, copied, copyIcon = , checkIcon = , symbolBefore, disableCopy, disableTooltip, hideSymbol, hideCopyButton, tooltipProps, isMultiLine, onCopy, getSnippetProps, getCopyButtonProps, } = useSnippet({...props, ref}); const TooltipContent = useCallback( ({children}: {children?: ReactNode}) => ( {children} ), [...Object.values(tooltipProps)], ); const contents = useMemo(() => { if (hideCopyButton) { return null; } const clonedCheckIcon = checkIcon && cloneElement(checkIcon, {className: slots.checkIcon()}); const clonedCopyIcon = copyIcon && cloneElement(copyIcon, {className: slots.copyIcon()}); const copyButton = ( ); if (disableTooltip) { return copyButton; } return {copyButton}; }, [ slots, classNames?.copyButton, copied, checkIcon, copyIcon, onCopy, TooltipContent, disableCopy, disableTooltip, hideCopyButton, ]); const preContent = useMemo(() => { if (isMultiLine && children && Array.isArray(children)) { return (
{children.map((t, index) => (
              {!hideSymbol && (
                {symbolBefore}
              )}
              {t}
            
))}
); } return (
        {!hideSymbol && (
          {symbolBefore}
        )}
        {children}
      
); }, [children, hideSymbol, isMultiLine, symbolBefore, classNames?.pre, slots]); return ( {preContent} {contents} ); }); Snippet.displayName = "NextUI.Snippet"; export default Snippet;