|
|
@@ -1,7 +1,7 @@
|
|
|
import { UserMessage } from "@opencode-ai/sdk/v2"
|
|
|
-import { ComponentProps, For, Match, Show, splitProps, Switch } from "solid-js"
|
|
|
+import { HoverCard } from "@kobalte/core/hover-card"
|
|
|
+import { ComponentProps, For, Match, Show, createSignal, splitProps, Switch } from "solid-js"
|
|
|
import { DiffChanges } from "./diff-changes"
|
|
|
-import { Tooltip } from "./tooltip"
|
|
|
import { useI18n } from "../context/i18n"
|
|
|
|
|
|
export function MessageNav(
|
|
|
@@ -14,18 +14,24 @@ export function MessageNav(
|
|
|
},
|
|
|
) {
|
|
|
const i18n = useI18n()
|
|
|
- const [local, others] = splitProps(props, ["messages", "current", "size", "onMessageSelect", "getLabel"])
|
|
|
+ const [local, others] = splitProps(props, ["messages", "current", "size", "onMessageSelect", "getLabel", "class"])
|
|
|
+ const [hovercardOpen, setHovercardOpen] = createSignal(false)
|
|
|
|
|
|
- const content = () => (
|
|
|
- <ul role="list" data-component="message-nav" data-size={local.size} {...others}>
|
|
|
+ const selectMessage = (message: UserMessage) => {
|
|
|
+ setHovercardOpen(false)
|
|
|
+ local.onMessageSelect(message)
|
|
|
+ }
|
|
|
+
|
|
|
+ const content = (className?: string) => (
|
|
|
+ <ul role="list" data-component="message-nav" data-size={local.size} class={className} {...others}>
|
|
|
<For each={local.messages}>
|
|
|
{(message) => {
|
|
|
- const handleClick = () => local.onMessageSelect(message)
|
|
|
+ const handleClick = () => selectMessage(message)
|
|
|
|
|
|
const handleKeyPress = (event: KeyboardEvent) => {
|
|
|
if (event.key !== "Enter" && event.key !== " ") return
|
|
|
event.preventDefault()
|
|
|
- local.onMessageSelect(message)
|
|
|
+ selectMessage(message)
|
|
|
}
|
|
|
|
|
|
return (
|
|
|
@@ -70,23 +76,27 @@ export function MessageNav(
|
|
|
return (
|
|
|
<Switch>
|
|
|
<Match when={local.size === "compact"}>
|
|
|
- <Tooltip
|
|
|
+ <HoverCard
|
|
|
+ open={hovercardOpen()}
|
|
|
+ onOpenChange={setHovercardOpen}
|
|
|
openDelay={0}
|
|
|
+ closeDelay={120}
|
|
|
placement="right-start"
|
|
|
- gutter={-40}
|
|
|
- shift={-10}
|
|
|
- overlap
|
|
|
- contentClass="message-nav-tooltip"
|
|
|
- value={
|
|
|
- <div data-slot="message-nav-tooltip-content">
|
|
|
- <MessageNav {...props} size="normal" class="" />
|
|
|
- </div>
|
|
|
- }
|
|
|
+ gutter={8}
|
|
|
+ overflowPadding={24}
|
|
|
+ fitViewport
|
|
|
>
|
|
|
- {content()}
|
|
|
- </Tooltip>
|
|
|
+ <HoverCard.Trigger as="div" data-component="message-nav-hovercard" class={local.class}>
|
|
|
+ {content()}
|
|
|
+ </HoverCard.Trigger>
|
|
|
+ <HoverCard.Portal>
|
|
|
+ <HoverCard.Content data-slot="message-nav-hovercard-content">
|
|
|
+ <MessageNav {...props} size="normal" class="" onMessageSelect={selectMessage} />
|
|
|
+ </HoverCard.Content>
|
|
|
+ </HoverCard.Portal>
|
|
|
+ </HoverCard>
|
|
|
</Match>
|
|
|
- <Match when={local.size === "normal"}>{content()}</Match>
|
|
|
+ <Match when={local.size === "normal"}>{content(local.class)}</Match>
|
|
|
</Switch>
|
|
|
)
|
|
|
}
|