summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/session-turn.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'packages/ui/src/components/session-turn.tsx')
-rw-r--r--packages/ui/src/components/session-turn.tsx106
1 files changed, 2 insertions, 104 deletions
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index d878bd245..7c5694ba5 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -8,25 +8,16 @@ import {
TextPart,
ToolPart,
} from "@opencode-ai/sdk/v2/client"
-import { type FileDiff } from "@opencode-ai/sdk/v2"
import { useData } from "../context"
-import { useDiffComponent } from "../context/diff"
import { type UiI18nKey, type UiI18nParams, useI18n } from "../context/i18n"
import { findLast } from "@opencode-ai/util/array"
-import { getDirectory, getFilename } from "@opencode-ai/util/path"
import { Binary } from "@opencode-ai/util/binary"
import { createEffect, createMemo, createSignal, For, Match, on, onCleanup, ParentProps, Show, Switch } from "solid-js"
-import { DiffChanges } from "./diff-changes"
import { Message, Part } from "./message-part"
import { Markdown } from "./markdown"
-import { Accordion } from "./accordion"
-import { StickyAccordionHeader } from "./sticky-accordion-header"
-import { FileIcon } from "./file-icon"
-import { Icon } from "./icon"
import { IconButton } from "./icon-button"
import { Card } from "./card"
-import { Dynamic } from "solid-js/web"
import { Button } from "./button"
import { Spinner } from "./spinner"
import { Tooltip } from "./tooltip"
@@ -143,7 +134,6 @@ export function SessionTurn(
) {
const i18n = useI18n()
const data = useData()
- const diffComponent = useDiffComponent()
const emptyMessages: MessageType[] = []
const emptyParts: PartType[] = []
@@ -153,7 +143,6 @@ export function SessionTurn(
const emptyPermissionParts: { part: ToolPart; message: AssistantMessage }[] = []
const emptyQuestions: QuestionRequest[] = []
const emptyQuestionParts: { part: ToolPart; message: AssistantMessage }[] = []
- const emptyDiffs: FileDiff[] = []
const idle = { type: "idle" as const }
const allMessages = createMemo(() => data.store.message[props.sessionID] ?? emptyMessages)
@@ -409,8 +398,7 @@ export function SessionTurn(
const response = createMemo(() => lastTextPart()?.text)
const responsePartId = createMemo(() => lastTextPart()?.id)
- const messageDiffs = createMemo(() => message()?.summary?.diffs ?? emptyDiffs)
- const hasDiffs = createMemo(() => messageDiffs().length > 0)
+ const hasDiffs = createMemo(() => (message()?.summary?.diffs?.length ?? 0) > 0)
const hideResponsePart = createMemo(() => !working() && !!responsePartId())
const [copied, setCopied] = createSignal(false)
@@ -476,28 +464,12 @@ export function SessionTurn(
updateStickyHeight(sticky.getBoundingClientRect().height)
})
- const diffInit = 20
- const diffBatch = 20
-
const [store, setStore] = createStore({
retrySeconds: 0,
- diffsOpen: [] as string[],
- diffLimit: diffInit,
status: rawStatus(),
duration: duration(),
})
- createEffect(
- on(
- () => message()?.id,
- () => {
- setStore("diffsOpen", [])
- setStore("diffLimit", diffInit)
- },
- { defer: true },
- ),
- )
-
createEffect(() => {
const r = retry()
if (!r) {
@@ -727,7 +699,7 @@ export function SessionTurn(
<div class="sr-only" aria-live="polite">
{!working() && response() ? response() : ""}
</div>
- <Show when={!working() && (response() || hasDiffs())}>
+ <Show when={!working() && response()}>
<div data-slot="session-turn-summary-section">
<div data-slot="session-turn-summary-header">
<h2 data-slot="session-turn-summary-title">{i18n.t("ui.sessionTurn.summary.response")}</h2>
@@ -760,80 +732,6 @@ export function SessionTurn(
</Show>
</div>
</div>
- <Accordion
- data-slot="session-turn-accordion"
- multiple
- value={store.diffsOpen}
- onChange={(value) => {
- if (!Array.isArray(value)) return
- setStore("diffsOpen", value)
- }}
- >
- <For each={messageDiffs().slice(0, store.diffLimit)}>
- {(diff) => (
- <Accordion.Item value={diff.file}>
- <StickyAccordionHeader>
- <Accordion.Trigger>
- <div data-slot="session-turn-accordion-trigger-content">
- <div data-slot="session-turn-file-info">
- <FileIcon
- node={{ path: diff.file, type: "file" }}
- data-slot="session-turn-file-icon"
- />
- <div data-slot="session-turn-file-path">
- <Show when={diff.file.includes("/")}>
- <span data-slot="session-turn-directory">
- {`\u202A${getDirectory(diff.file)}\u202C`}
- </span>
- </Show>
- <span data-slot="session-turn-filename">{getFilename(diff.file)}</span>
- </div>
- </div>
- <div data-slot="session-turn-accordion-actions">
- <DiffChanges changes={diff} />
- <Icon name="chevron-grabber-vertical" size="small" />
- </div>
- </div>
- </Accordion.Trigger>
- </StickyAccordionHeader>
- <Accordion.Content data-slot="session-turn-accordion-content">
- <Show when={store.diffsOpen.includes(diff.file!)}>
- <Dynamic
- component={diffComponent}
- before={{
- name: diff.file!,
- contents: diff.before!,
- }}
- after={{
- name: diff.file!,
- contents: diff.after!,
- }}
- />
- </Show>
- </Accordion.Content>
- </Accordion.Item>
- )}
- </For>
- </Accordion>
- <Show when={messageDiffs().length > store.diffLimit}>
- <Button
- data-slot="session-turn-accordion-more"
- variant="ghost"
- size="small"
- onClick={() => {
- const total = messageDiffs().length
- setStore("diffLimit", (limit) => {
- const next = limit + diffBatch
- if (next > total) return total
- return next
- })
- }}
- >
- {i18n.t("ui.sessionTurn.diff.showMore", {
- count: messageDiffs().length - store.diffLimit,
- })}
- </Button>
- </Show>
</div>
</Show>
<Show when={error() && !props.stepsExpanded}>