"use client"; import { forwardRef } from "react"; import type { ActionButtonProps } from "../../utils/createActionButton"; import { composeEventHandlers } from "@radix-ui/primitive"; import { Primitive } from "../../utils/Primitive"; import { useActionBarCopy } from "@assistant-ui/core/react"; import { useAuiState } from "@assistant-ui/store"; /** * Hook that provides copy functionality for action bar buttons. * * This hook returns a callback function that copies message content to the clipboard, * or null if copying is not available. It handles both regular message content and * composer text when in editing mode. * * @param options Configuration options * @param options.copiedDuration Duration in milliseconds to show the copied state * @returns A copy callback function, or null if copying is disabled * * @example * ```tsx * function CustomCopyButton() { * const copy = useActionBarPrimitiveCopy({ copiedDuration: 2000 }); * * return ( * * ); * } * ``` */ const useActionBarPrimitiveCopy = ({ copiedDuration = 3000, }: { copiedDuration?: number | undefined; } = {}) => { const { copy, disabled } = useActionBarCopy({ copiedDuration, copyToClipboard: (text) => navigator.clipboard.writeText(text), }); if (disabled) return null; return copy; }; export namespace ActionBarPrimitiveCopy { export type Element = HTMLButtonElement; /** * Props for the ActionBarPrimitive.Copy component. * Inherits all button element props and action button functionality. */ export type Props = ActionButtonProps; } /** * A button component that copies message content to the clipboard. * * This component automatically handles copying message text to the clipboard * and provides visual feedback through the data-copied attribute. It's disabled * when there's no copyable content available. * * @example * ```tsx * * Copy Message * * ``` */ export const ActionBarPrimitiveCopy = forwardRef< ActionBarPrimitiveCopy.Element, ActionBarPrimitiveCopy.Props >(({ copiedDuration, onClick, disabled, ...props }, forwardedRef) => { const isCopied = useAuiState((s) => s.message.isCopied); const callback = useActionBarPrimitiveCopy({ copiedDuration }); return ( { callback?.(); })} /> ); }); ActionBarPrimitiveCopy.displayName = "ActionBarPrimitive.Copy";