Check the render method of SlotClone. #432

This commit is contained in:
Diego Souza 2024-11-26 17:39:13 -03:00
parent 9b62edd910
commit 44bda1500a
3 changed files with 107 additions and 94 deletions

View File

@ -69,8 +69,8 @@ export const Messages = React.forwardRef<HTMLDivElement, MessagesProps>((props:
</div> </div>
{!isUserMessage && ( {!isUserMessage && (
<div className="flex gap-2 flex-col lg:flex-row"> <div className="flex gap-2 flex-col lg:flex-row">
<WithTooltip tooltip="Revert to this message"> {messageId && (
{messageId && ( <WithTooltip tooltip="Revert to this message">
<button <button
onClick={() => handleRewind(messageId)} onClick={() => handleRewind(messageId)}
key="i-ph:arrow-u-up-left" key="i-ph:arrow-u-up-left"
@ -79,8 +79,8 @@ export const Messages = React.forwardRef<HTMLDivElement, MessagesProps>((props:
'text-xl text-bolt-elements-textSecondary hover:text-bolt-elements-textPrimary transition-colors', 'text-xl text-bolt-elements-textSecondary hover:text-bolt-elements-textPrimary transition-colors',
)} )}
/> />
)} </WithTooltip>
</WithTooltip> )}
<WithTooltip tooltip="Fork chat from this message"> <WithTooltip tooltip="Fork chat from this message">
<button <button

View File

@ -1,4 +1,4 @@
import { memo } from 'react'; import { memo, forwardRef, type ForwardedRef } from 'react';
import { classNames } from '~/utils/classNames'; import { classNames } from '~/utils/classNames';
type IconSize = 'sm' | 'md' | 'lg' | 'xl' | 'xxl'; type IconSize = 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
@ -25,41 +25,48 @@ type IconButtonWithChildrenProps = {
type IconButtonProps = IconButtonWithoutChildrenProps | IconButtonWithChildrenProps; type IconButtonProps = IconButtonWithoutChildrenProps | IconButtonWithChildrenProps;
// Componente IconButton com suporte a refs
export const IconButton = memo( export const IconButton = memo(
({ forwardRef(
icon, (
size = 'xl', {
className, icon,
iconClassName, size = 'xl',
disabledClassName, className,
disabled = false, iconClassName,
title, disabledClassName,
onClick, disabled = false,
children, title,
}: IconButtonProps) => { onClick,
return ( children,
<button }: IconButtonProps,
className={classNames( ref: ForwardedRef<HTMLButtonElement>,
'flex items-center text-bolt-elements-item-contentDefault bg-transparent enabled:hover:text-bolt-elements-item-contentActive rounded-md p-1 enabled:hover:bg-bolt-elements-item-backgroundActive disabled:cursor-not-allowed', ) => {
{ return (
[classNames('opacity-30', disabledClassName)]: disabled, <button
}, ref={ref}
className, className={classNames(
)} 'flex items-center text-bolt-elements-item-contentDefault bg-transparent enabled:hover:text-bolt-elements-item-contentActive rounded-md p-1 enabled:hover:bg-bolt-elements-item-backgroundActive disabled:cursor-not-allowed',
title={title} {
disabled={disabled} [classNames('opacity-30', disabledClassName)]: disabled,
onClick={(event) => { },
if (disabled) { className,
return; )}
} title={title}
disabled={disabled}
onClick={(event) => {
if (disabled) {
return;
}
onClick?.(event); onClick?.(event);
}} }}
> >
{children ? children : <div className={classNames(icon, getIconSize(size), iconClassName)}></div>} {children ? children : <div className={classNames(icon, getIconSize(size), iconClassName)}></div>}
</button> </button>
); );
}, },
),
); );
function getIconSize(size: IconSize) { function getIconSize(size: IconSize) {

View File

@ -1,8 +1,9 @@
import * as Tooltip from '@radix-ui/react-tooltip'; import * as Tooltip from '@radix-ui/react-tooltip';
import { forwardRef, type ForwardedRef, type ReactElement } from 'react';
interface TooltipProps { interface TooltipProps {
tooltip: React.ReactNode; tooltip: React.ReactNode;
children: React.ReactNode; children: ReactElement;
sideOffset?: number; sideOffset?: number;
className?: string; className?: string;
arrowClassName?: string; arrowClassName?: string;
@ -12,62 +13,67 @@ interface TooltipProps {
delay?: number; delay?: number;
} }
const WithTooltip = ({ const WithTooltip = forwardRef(
tooltip, (
children, {
sideOffset = 5, tooltip,
className = '', children,
arrowClassName = '', sideOffset = 5,
tooltipStyle = {}, className = '',
position = 'top', arrowClassName = '',
maxWidth = 250, tooltipStyle = {},
delay = 0, position = 'top',
}: TooltipProps) => { maxWidth = 250,
return ( delay = 0,
<Tooltip.Root delayDuration={delay}> }: TooltipProps,
<Tooltip.Trigger asChild>{children}</Tooltip.Trigger> _ref: ForwardedRef<HTMLElement>,
<Tooltip.Portal> ) => {
<Tooltip.Content return (
side={position} <Tooltip.Root delayDuration={delay}>
className={` <Tooltip.Trigger asChild>{children}</Tooltip.Trigger>
z-[2000] <Tooltip.Portal>
px-2.5 <Tooltip.Content
py-1.5 side={position}
max-h-[300px]
select-none
rounded-md
bg-bolt-elements-background-depth-3
text-bolt-elements-textPrimary
text-sm
leading-tight
shadow-lg
animate-in
fade-in-0
zoom-in-95
data-[state=closed]:animate-out
data-[state=closed]:fade-out-0
data-[state=closed]:zoom-out-95
${className}
`}
sideOffset={sideOffset}
style={{
maxWidth,
...tooltipStyle,
}}
>
<div className="break-words">{tooltip}</div>
<Tooltip.Arrow
className={` className={`
fill-bolt-elements-background-depth-3 z-[2000]
${arrowClassName} px-2.5
py-1.5
max-h-[300px]
select-none
rounded-md
bg-bolt-elements-background-depth-3
text-bolt-elements-textPrimary
text-sm
leading-tight
shadow-lg
animate-in
fade-in-0
zoom-in-95
data-[state=closed]:animate-out
data-[state=closed]:fade-out-0
data-[state=closed]:zoom-out-95
${className}
`} `}
width={12} sideOffset={sideOffset}
height={6} style={{
/> maxWidth,
</Tooltip.Content> ...tooltipStyle,
</Tooltip.Portal> }}
</Tooltip.Root> >
); <div className="break-words">{tooltip}</div>
}; <Tooltip.Arrow
className={`
fill-bolt-elements-background-depth-3
${arrowClassName}
`}
width={12}
height={6}
/>
</Tooltip.Content>
</Tooltip.Portal>
</Tooltip.Root>
);
},
);
export default WithTooltip; export default WithTooltip;