enhancement: message toolbar using tooltip
This commit is contained in:
parent
ad962c2cf6
commit
9d5e670344
@ -26,6 +26,11 @@ import {
|
|||||||
import { Button } from '@/components/ui/button'
|
import { Button } from '@/components/ui/button'
|
||||||
import { Textarea } from '@/components/ui/textarea'
|
import { Textarea } from '@/components/ui/textarea'
|
||||||
import { toast } from 'sonner'
|
import { toast } from 'sonner'
|
||||||
|
import {
|
||||||
|
Tooltip,
|
||||||
|
TooltipContent,
|
||||||
|
TooltipTrigger,
|
||||||
|
} from '@/components/ui/tooltip'
|
||||||
|
|
||||||
const CopyButton = ({ text }: { text: string }) => {
|
const CopyButton = ({ text }: { text: string }) => {
|
||||||
const [copied, setCopied] = useState(false)
|
const [copied, setCopied] = useState(false)
|
||||||
@ -47,12 +52,14 @@ const CopyButton = ({ text }: { text: string }) => {
|
|||||||
<span className="opacity-100">Copied!</span>
|
<span className="opacity-100">Copied!</span>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<Tooltip>
|
||||||
<IconCopy size={16} />
|
<TooltipTrigger asChild>
|
||||||
<span className="opacity-0 w-0 overflow-hidden whitespace-nowrap group-hover:w-auto group-hover:opacity-100 transition-all duration-300 ease-in-out">
|
<IconCopy size={16} />
|
||||||
Copy
|
</TooltipTrigger>
|
||||||
</span>
|
<TooltipContent>
|
||||||
</>
|
<p>Copy</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</button>
|
</button>
|
||||||
)
|
)
|
||||||
@ -140,17 +147,16 @@ export const ThreadContent = memo(
|
|||||||
<div className="flex items-center justify-end gap-2 text-main-view-fg/60 text-xs mt-2">
|
<div className="flex items-center justify-end gap-2 text-main-view-fg/60 text-xs mt-2">
|
||||||
<Dialog>
|
<Dialog>
|
||||||
<DialogTrigger asChild>
|
<DialogTrigger asChild>
|
||||||
<button
|
<Tooltip>
|
||||||
className="flex items-center gap-1 hover:text-accent transition-colors cursor-pointer group relative"
|
<TooltipTrigger asChild>
|
||||||
onClick={() => {
|
<button className="flex items-center gap-1 hover:text-accent transition-colors cursor-pointer group relative">
|
||||||
console.log('Edit clicked')
|
<IconPencil size={16} />
|
||||||
}}
|
</button>
|
||||||
>
|
</TooltipTrigger>
|
||||||
<IconPencil size={16} />
|
<TooltipContent>
|
||||||
<span className="opacity-0 w-0 overflow-hidden whitespace-nowrap group-hover:w-auto group-hover:opacity-100 transition-all duration-300 ease-in-out">
|
<p>Edit</p>
|
||||||
Edit
|
</TooltipContent>
|
||||||
</span>
|
</Tooltip>
|
||||||
</button>
|
|
||||||
</DialogTrigger>
|
</DialogTrigger>
|
||||||
<DialogContent>
|
<DialogContent>
|
||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
@ -195,17 +201,21 @@ export const ThreadContent = memo(
|
|||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
<button
|
<Tooltip>
|
||||||
className="flex items-center gap-1 hover:text-accent transition-colors cursor-pointer group relative"
|
<TooltipTrigger asChild>
|
||||||
onClick={() => {
|
<button
|
||||||
deleteMessage(item.thread_id, item.id)
|
className="flex items-center gap-1 hover:text-accent transition-colors cursor-pointer group relative"
|
||||||
}}
|
onClick={() => {
|
||||||
>
|
deleteMessage(item.thread_id, item.id)
|
||||||
<IconTrash size={16} />
|
}}
|
||||||
<span className="opacity-0 w-0 overflow-hidden whitespace-nowrap group-hover:w-auto group-hover:opacity-100 transition-all duration-300 ease-in-out">
|
>
|
||||||
Delete
|
<IconTrash size={16} />
|
||||||
</span>
|
</button>
|
||||||
</button>
|
</TooltipTrigger>
|
||||||
|
<TooltipContent>
|
||||||
|
<p>Delete</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@ -245,27 +255,36 @@ export const ThreadContent = memo(
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<CopyButton text={item.content?.[0]?.text.value || ''} />
|
<CopyButton text={item.content?.[0]?.text.value || ''} />
|
||||||
<button
|
<Tooltip>
|
||||||
className="flex items-center gap-1 hover:text-accent transition-colors cursor-pointer group relative"
|
<TooltipTrigger asChild>
|
||||||
onClick={() => {
|
<button
|
||||||
deleteMessage(item.thread_id, item.id)
|
className="flex items-center gap-1 hover:text-accent transition-colors cursor-pointer group relative"
|
||||||
}}
|
onClick={() => {
|
||||||
>
|
deleteMessage(item.thread_id, item.id)
|
||||||
<IconTrash size={16} />
|
}}
|
||||||
<span className="opacity-0 w-0 overflow-hidden whitespace-nowrap group-hover:w-auto group-hover:opacity-100 transition-all duration-300 ease-in-out">
|
>
|
||||||
Delete
|
<IconTrash size={16} />
|
||||||
</span>
|
</button>
|
||||||
</button>
|
</TooltipTrigger>
|
||||||
|
<TooltipContent>
|
||||||
|
<p>Delete</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
|
||||||
{item.isLastMessage && (
|
{item.isLastMessage && (
|
||||||
<button
|
<Tooltip>
|
||||||
className="flex items-center gap-1 hover:text-accent transition-colors cursor-pointer group relative"
|
<TooltipTrigger asChild>
|
||||||
onClick={regenerate}
|
<button
|
||||||
>
|
className="flex items-center gap-1 hover:text-accent transition-colors cursor-pointer group relative"
|
||||||
<IconRefresh size={16} />
|
onClick={regenerate}
|
||||||
<span className="opacity-0 w-0 overflow-hidden whitespace-nowrap group-hover:w-auto group-hover:opacity-100 transition-all duration-300 ease-in-out">
|
>
|
||||||
Regenerate
|
<IconRefresh size={16} />
|
||||||
</span>
|
</button>
|
||||||
</button>
|
</TooltipTrigger>
|
||||||
|
<TooltipContent>
|
||||||
|
<p>Regenerate</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user