diff --git a/apps/webapp/app/components/code/CodeBlock.tsx b/apps/webapp/app/components/code/CodeBlock.tsx index 99f80c8e7..70fa2c709 100644 --- a/apps/webapp/app/components/code/CodeBlock.tsx +++ b/apps/webapp/app/components/code/CodeBlock.tsx @@ -1,10 +1,11 @@ import { ClipboardIcon } from "@heroicons/react/20/solid"; import type { Language, PrismTheme } from "prism-react-renderer"; import Highlight, { defaultProps } from "prism-react-renderer"; -import { forwardRef } from "react"; +import { forwardRef, useCallback, useState } from "react"; import { cn } from "~/utils/cn"; import { Tooltip, + TooltipArrow, TooltipContent, TooltipProvider, TooltipTrigger, @@ -156,16 +157,32 @@ export const CodeBlock = forwardRef( }: CodeBlockProps, ref ) => { + const [copied, setCopied] = useState(false); + const onCopied = useCallback( + (event: React.MouseEvent) => { + event.preventDefault(); + event.stopPropagation(); + navigator.clipboard.writeText(code); + setCopied(true); + setTimeout(() => { + setCopied(false); + }, 1500); + }, + [code] + ); + code = code.trim(); const maxLineSize = code.split("\n").length.toString().length; return (
( {showCopyButton && ( - - + + - Copy + + {copied ? "Copied" : "Copy"} + )} @@ -196,7 +223,12 @@ export const CodeBlock = forwardRef( }) => (
,
+  React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => (
+  
+));
+TooltipArrow.displayName = TooltipPrimitive.Arrow.displayName;
+
+const Tooltip = React.forwardRef<
+  React.ElementRef,
+  React.ComponentPropsWithoutRef
+>(({ delayDuration = 0, ...props }, ref) => (
+  
+));
+Tooltip.displayName = TooltipPrimitive.Root.displayName;
 
 const TooltipTrigger = TooltipPrimitive.Trigger;
 
@@ -26,4 +40,10 @@ const TooltipContent = React.forwardRef<
 ));
 TooltipContent.displayName = TooltipPrimitive.Content.displayName;
 
-export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
+export {
+  Tooltip,
+  TooltipTrigger,
+  TooltipContent,
+  TooltipProvider,
+  TooltipArrow,
+};