UNPKG

@assistant-ui/react

Version:

React components for AI chat.

1 lines 14.4 kB
{"version":3,"sources":["../../src/ui/assistant-action-bar.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, type FC } from \"react\";\nimport {\n AudioLinesIcon,\n CheckIcon,\n CopyIcon,\n RefreshCwIcon,\n StopCircleIcon,\n ThumbsDownIcon,\n ThumbsUpIcon,\n} from \"lucide-react\";\nimport { ActionBarPrimitive, MessagePrimitive } from \"../primitives\";\nimport {\n TooltipIconButton,\n TooltipIconButtonProps,\n} from \"./base/tooltip-icon-button\";\nimport { withDefaults } from \"./utils/withDefaults\";\nimport { useThreadConfig } from \"./thread-config\";\nimport { useThread } from \"../context\";\n\nconst useAllowCopy = (ensureCapability = false) => {\n const { assistantMessage: { allowCopy = true } = {} } = useThreadConfig();\n const copySupported = useThread((t) => t.capabilities.unstable_copy);\n return allowCopy && (!ensureCapability || copySupported);\n};\n\nconst useAllowSpeak = (ensureCapability = false) => {\n const { assistantMessage: { allowSpeak = true } = {} } = useThreadConfig();\n const speechSupported = useThread((t) => t.capabilities.speech);\n return allowSpeak && (!ensureCapability || speechSupported);\n};\n\nconst useAllowReload = (ensureCapability = false) => {\n const { assistantMessage: { allowReload = true } = {} } = useThreadConfig();\n const reloadSupported = useThread((t) => t.capabilities.reload);\n return allowReload && (!ensureCapability || reloadSupported);\n};\n\nconst useAllowFeedbackPositive = (ensureCapability = false) => {\n const { assistantMessage: { allowFeedbackPositive = true } = {} } =\n useThreadConfig();\n const feedbackSupported = useThread((t) => t.capabilities.feedback);\n return allowFeedbackPositive && (!ensureCapability || feedbackSupported);\n};\n\nconst useAllowFeedbackNegative = (ensureCapability = false) => {\n const { assistantMessage: { allowFeedbackNegative = true } = {} } =\n useThreadConfig();\n const feedbackSupported = useThread((t) => t.capabilities.feedback);\n return allowFeedbackNegative && (!ensureCapability || feedbackSupported);\n};\n\nconst AssistantActionBar: FC = () => {\n const allowCopy = useAllowCopy(true);\n const allowReload = useAllowReload(true);\n const allowSpeak = useAllowSpeak(true);\n const allowFeedbackPositive = useAllowFeedbackPositive(true);\n const allowFeedbackNegative = useAllowFeedbackNegative(true);\n if (\n !allowCopy &&\n !allowReload &&\n !allowSpeak &&\n !allowFeedbackPositive &&\n !allowFeedbackNegative\n )\n return null;\n\n return (\n <AssistantActionBarRoot\n hideWhenRunning\n autohide=\"not-last\"\n autohideFloat=\"single-branch\"\n >\n {allowSpeak && <AssistantActionBarSpeechControl />}\n {allowCopy && <AssistantActionBarCopy />}\n {allowReload && <AssistantActionBarReload />}\n {allowFeedbackPositive && <AssistantActionBarFeedbackPositive />}\n {allowFeedbackNegative && <AssistantActionBarFeedbackNegative />}\n </AssistantActionBarRoot>\n );\n};\n\nAssistantActionBar.displayName = \"AssistantActionBar\";\n\nconst AssistantActionBarRoot = withDefaults(ActionBarPrimitive.Root, {\n className: \"aui-assistant-action-bar-root\",\n});\n\nAssistantActionBarRoot.displayName = \"AssistantActionBarRoot\";\n\nnamespace AssistantActionBarCopy {\n export type Element = ActionBarPrimitive.Copy.Element;\n export type Props = Partial<TooltipIconButtonProps> & {\n copiedDuration?: number | undefined;\n };\n}\n\nconst AssistantActionBarCopy = forwardRef<\n AssistantActionBarCopy.Element,\n AssistantActionBarCopy.Props\n>(({ copiedDuration, ...props }, ref) => {\n const {\n strings: {\n assistantMessage: { copy: { tooltip = \"Copy\" } = {} } = {},\n } = {},\n } = useThreadConfig();\n\n return (\n <ActionBarPrimitive.Copy copiedDuration={copiedDuration} asChild>\n <TooltipIconButton tooltip={tooltip} {...props} ref={ref}>\n {props.children ?? (\n <>\n <MessagePrimitive.If copied>\n <CheckIcon />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon />\n </MessagePrimitive.If>\n </>\n )}\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n );\n});\n\nAssistantActionBarCopy.displayName = \"AssistantActionBarCopy\";\n\nconst AssistantActionBarSpeechControl: FC = () => {\n return (\n <>\n <MessagePrimitive.If speaking={false}>\n <AssistantActionBarSpeak />\n </MessagePrimitive.If>\n <MessagePrimitive.If speaking>\n <AssistantActionBarStopSpeaking />\n </MessagePrimitive.If>\n </>\n );\n};\n\nnamespace AssistantActionBarSpeak {\n export type Element = ActionBarPrimitive.Speak.Element;\n export type Props = Partial<TooltipIconButtonProps>;\n}\n\nconst AssistantActionBarSpeak = forwardRef<\n AssistantActionBarSpeak.Element,\n AssistantActionBarSpeak.Props\n>((props, ref) => {\n const {\n strings: {\n assistantMessage: { speak: { tooltip = \"Read aloud\" } = {} } = {},\n } = {},\n } = useThreadConfig();\n const allowSpeak = useAllowSpeak();\n\n return (\n <ActionBarPrimitive.Speak disabled={!allowSpeak} asChild>\n <TooltipIconButton tooltip={tooltip} {...props} ref={ref}>\n {props.children ?? <AudioLinesIcon />}\n </TooltipIconButton>\n </ActionBarPrimitive.Speak>\n );\n});\n\nAssistantActionBarSpeak.displayName = \"AssistantActionBarSpeak\";\n\nnamespace AssistantActionBarStopSpeaking {\n export type Element = ActionBarPrimitive.StopSpeaking.Element;\n export type Props = Partial<TooltipIconButtonProps>;\n}\n\nconst AssistantActionBarStopSpeaking = forwardRef<\n AssistantActionBarStopSpeaking.Element,\n AssistantActionBarStopSpeaking.Props\n>((props, ref) => {\n const {\n strings: {\n assistantMessage: {\n speak: { stop: { tooltip: stopTooltip = \"Stop\" } = {} } = {},\n } = {},\n } = {},\n } = useThreadConfig();\n const allowSpeak = useAllowSpeak();\n\n return (\n <ActionBarPrimitive.StopSpeaking disabled={!allowSpeak} asChild>\n <TooltipIconButton tooltip={stopTooltip} {...props} ref={ref}>\n {props.children ?? <StopCircleIcon />}\n </TooltipIconButton>\n </ActionBarPrimitive.StopSpeaking>\n );\n});\n\nAssistantActionBarStopSpeaking.displayName = \"AssistantActionBarStopSpeaking\";\n\nnamespace AssistantActionBarReload {\n export type Element = ActionBarPrimitive.Reload.Element;\n export type Props = Partial<TooltipIconButtonProps>;\n}\n\nconst AssistantActionBarReload = forwardRef<\n AssistantActionBarReload.Element,\n AssistantActionBarReload.Props\n>((props, ref) => {\n const {\n strings: {\n assistantMessage: { reload: { tooltip = \"Refresh\" } = {} } = {},\n } = {},\n } = useThreadConfig();\n const allowReload = useAllowReload();\n return (\n <ActionBarPrimitive.Reload disabled={!allowReload} asChild>\n <TooltipIconButton tooltip={tooltip} {...props} ref={ref}>\n {props.children ?? <RefreshCwIcon />}\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n );\n});\n\nAssistantActionBarReload.displayName = \"AssistantActionBarReload\";\n\nnamespace AssistantActionBarFeedbackPositive {\n export type Element = ActionBarPrimitive.FeedbackPositive.Element;\n export type Props = Partial<TooltipIconButtonProps>;\n}\n\nconst AssistantActionBarFeedbackPositive = forwardRef<\n AssistantActionBarFeedbackPositive.Element,\n AssistantActionBarFeedbackPositive.Props\n>((props, ref) => {\n const {\n strings: {\n assistantMessage: {\n feedback: { positive: { tooltip = \"Good response\" } = {} } = {},\n } = {},\n } = {},\n } = useThreadConfig();\n const allowFeedbackPositive = useAllowFeedbackPositive();\n return (\n <ActionBarPrimitive.FeedbackPositive\n disabled={!allowFeedbackPositive}\n className=\"aui-assistant-action-bar-feedback-positive\"\n asChild\n >\n <TooltipIconButton tooltip={tooltip} {...props} ref={ref}>\n {props.children ?? <ThumbsUpIcon />}\n </TooltipIconButton>\n </ActionBarPrimitive.FeedbackPositive>\n );\n});\n\nAssistantActionBarFeedbackPositive.displayName =\n \"AssistantActionBarFeedbackPositive\";\n\nnamespace AssistantActionBarFeedbackNegative {\n export type Element = ActionBarPrimitive.FeedbackNegative.Element;\n export type Props = Partial<TooltipIconButtonProps>;\n}\n\nconst AssistantActionBarFeedbackNegative = forwardRef<\n AssistantActionBarFeedbackNegative.Element,\n AssistantActionBarFeedbackNegative.Props\n>((props, ref) => {\n const {\n strings: {\n assistantMessage: {\n feedback: { negative: { tooltip = \"Bad response\" } = {} } = {},\n } = {},\n } = {},\n } = useThreadConfig();\n const allowFeedbackNegative = useAllowFeedbackNegative();\n return (\n <ActionBarPrimitive.FeedbackNegative\n disabled={!allowFeedbackNegative}\n className=\"aui-assistant-action-bar-feedback-negative\"\n asChild\n >\n <TooltipIconButton tooltip={tooltip} {...props} ref={ref}>\n {props.children ?? <ThumbsDownIcon />}\n </TooltipIconButton>\n </ActionBarPrimitive.FeedbackNegative>\n );\n});\n\nAssistantActionBarFeedbackNegative.displayName =\n \"AssistantActionBarFeedbackNegative\";\n\nconst exports = {\n Root: AssistantActionBarRoot,\n Reload: AssistantActionBarReload,\n Copy: AssistantActionBarCopy,\n Speak: AssistantActionBarSpeak,\n StopSpeaking: AssistantActionBarStopSpeaking,\n SpeechControl: AssistantActionBarSpeechControl,\n FeedbackPositive: AssistantActionBarFeedbackPositive,\n FeedbackNegative: AssistantActionBarFeedbackNegative,\n};\n\nexport default Object.assign(\n AssistantActionBar,\n exports,\n) as typeof AssistantActionBar & typeof exports;\n"],"mappings":"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","names":[]}