"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";