11import { Button , List , SelectDialog , Tooltip , IconButton , Tabs , Icon } from "@opencode-ai/ui"
22import { FileIcon } from "@/ui"
33import FileTree from "@/components/file-tree"
4- import { For , onCleanup , onMount , Show , Match , Switch , createSignal , createEffect } from "solid-js"
4+ import { For , onCleanup , onMount , Show , Match , Switch , createSignal , createEffect , createMemo } from "solid-js"
55import { useLocal , type LocalFile , type TextSelection } from "@/context/local"
66import { createStore } from "solid-js/store"
77import { getDirectory , getFilename } from "@/utils"
@@ -21,6 +21,7 @@ import type { JSX } from "solid-js"
2121import { Code } from "@/components/code"
2222import { useSync } from "@/context/sync"
2323import { useSDK } from "@/context/sdk"
24+ import { Diff } from "@/components/diff"
2425
2526export default function Page ( ) {
2627 const local = useLocal ( )
@@ -374,27 +375,36 @@ export default function Page() {
374375 onSelect = { ( s ) => local . session . setActive ( s ?. id ) }
375376 onHover = { ( s ) => ( ! ! s ? sync . session . sync ( s ?. id ) : undefined ) }
376377 >
377- { ( session ) => (
378- < Tooltip placement = "right" value = { session . title } >
379- < div >
380- < div class = "flex items-center self-stretch gap-6" >
381- < span class = "text-14-regular text-text-strong overflow-hidden text-ellipsis truncate" >
382- { session . title }
383- </ span >
384- < span class = "text-12-regular text-text-weak text-right whitespace-nowrap" >
385- { DateTime . fromMillis ( session . time . updated ) . toRelative ( ) }
386- </ span >
387- </ div >
388- < div class = "flex justify-between items-center self-stretch" >
389- < span class = "text-12-regular text-text-weak" > 2 files changed</ span >
390- < div class = "flex gap-2 justify-end items-center" >
391- < span class = "text-12-mono text-right text-text-diff-add-base" > +43</ span >
392- < span class = "text-12-mono text-right text-text-diff-delete-base" > -2</ span >
378+ { ( session ) => {
379+ const diffs = createMemo ( ( ) => session . summary ?. diffs ?? [ ] )
380+ const filesChanged = createMemo ( ( ) => diffs ( ) . length )
381+ const additions = createMemo ( ( ) => diffs ( ) . reduce ( ( acc , diff ) => ( acc ?? 0 ) + ( diff . additions ?? 0 ) , 0 ) )
382+ const deletions = createMemo ( ( ) => diffs ( ) . reduce ( ( acc , diff ) => ( acc ?? 0 ) + ( diff . deletions ?? 0 ) , 0 ) )
383+
384+ return (
385+ < Tooltip placement = "right" value = { session . title } >
386+ < div >
387+ < div class = "flex items-center self-stretch gap-6" >
388+ < span class = "text-14-regular text-text-strong overflow-hidden text-ellipsis truncate" >
389+ { session . title }
390+ </ span >
391+ < span class = "text-12-regular text-text-weak text-right whitespace-nowrap" >
392+ { DateTime . fromMillis ( session . time . updated ) . toRelative ( ) }
393+ </ span >
394+ </ div >
395+ < div class = "flex justify-between items-center self-stretch" >
396+ < span class = "text-12-regular text-text-weak" > { `${ filesChanged ( ) || "No" } file${ filesChanged ( ) !== 1 ? "s" : "" } changed` } </ span >
397+ < Show when = { additions ( ) || deletions ( ) } >
398+ < div class = "flex gap-2 justify-end items-center" >
399+ < span class = "text-12-mono text-right text-text-diff-add-base" > { `+${ additions ( ) } ` } </ span >
400+ < span class = "text-12-mono text-right text-text-diff-delete-base" > { `-${ deletions ( ) } ` } </ span >
401+ </ div >
402+ </ Show >
393403 </ div >
394404 </ div >
395- </ div >
396- </ Tooltip >
397- ) }
405+ </ Tooltip >
406+ )
407+ } }
398408 </ List >
399409 </ div >
400410 </ div >
@@ -521,60 +531,77 @@ export default function Page() {
521531 { ( activeSession ) => (
522532 < div class = "py-3 flex flex-col flex-1 min-h-0" >
523533 < div class = "flex items-start gap-8 flex-1 min-h-0" >
524- < ul role = "list" class = "w-60 shrink-0 flex flex-col items-start gap-1" >
525- < For each = { local . session . userMessages ( ) } >
526- { ( message ) => (
527- < li
528- class = "group/li flex items-center gap-x-2 py-1 self-stretch cursor-default"
529- onClick = { ( ) => local . session . setActiveMessage ( message . id ) }
530- >
531- < div class = "w-[18px] shrink-0" >
532- < svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 18 12" fill = "none" >
533- < g >
534- < rect x = "0" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
535- < rect x = "4" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
536- < rect x = "8" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
537- < rect x = "12" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
538- < rect x = "16" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
539- </ g >
540- </ svg >
541- </ div >
542- < div
543- data-active = { local . session . activeMessage ( ) ?. id === message . id }
544- classList = { {
545- "text-14-regular text-text-weak whitespace-nowrap truncate min-w-0" : true ,
546- "text-text-weak data-[active=true]:text-text-strong group-hover/li:text-text-base" : true ,
547- } }
534+ < Show when = { local . session . userMessages ( ) . length > 1 } >
535+ < ul role = "list" class = "w-60 shrink-0 flex flex-col items-start gap-1" >
536+ < For each = { local . session . userMessages ( ) } >
537+ { ( message ) => (
538+ < li
539+ class = "group/li flex items-center gap-x-2 py-1 self-stretch cursor-default"
540+ onClick = { ( ) => local . session . setActiveMessage ( message . id ) }
548541 >
549- { local . session . getMessageText ( message ) }
550- </ div >
551- </ li >
552- ) }
553- </ For >
554- </ ul >
542+ < div class = "w-[18px] shrink-0" >
543+ < svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 18 12" fill = "none" >
544+ < g >
545+ < rect x = "0" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
546+ < rect x = "4" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
547+ < rect x = "8" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
548+ < rect x = "12" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
549+ < rect x = "16" width = "2" height = "12" rx = "1" fill = "#CFCECD" />
550+ </ g >
551+ </ svg >
552+ </ div >
553+ < div
554+ data-active = { local . session . activeMessage ( ) ?. id === message . id }
555+ classList = { {
556+ "text-14-regular text-text-weak whitespace-nowrap truncate min-w-0" : true ,
557+ "text-text-weak data-[active=true]:text-text-strong group-hover/li:text-text-base" : true ,
558+ } }
559+ >
560+ { local . session . getMessageText ( message ) }
561+ </ div >
562+ </ li >
563+ ) }
564+ </ For >
565+ </ ul >
566+ </ Show >
555567 < div
556568 ref = { messageScrollElement }
557569 class = "grow min-w-0 h-full overflow-y-auto no-scrollbar snap-y"
558570 >
559571 < div class = "flex flex-col items-start gap-50 pb-[800px]" >
560572 < For each = { local . session . userMessages ( ) } >
561- { ( message ) => (
562- < div
563- data-message = { message . id }
564- class = "flex flex-col items-start self-stretch gap-8 pt-1.5 snap-start"
565- >
566- < div class = "flex flex-col items-start gap-4" >
567- < div class = "text-14-medium text-text-strong overflow-hidden text-ellipsis min-w-0" >
568- { local . session . getMessageText ( message ) }
573+ { ( message ) => {
574+ console . log ( message )
575+ return (
576+ < div
577+ data-message = { message . id }
578+ class = "flex flex-col items-start self-stretch gap-8 pt-1.5 snap-start"
579+ >
580+ < div class = "flex flex-col items-start gap-4" >
581+ < div class = "text-14-medium text-text-strong overflow-hidden text-ellipsis min-w-0" >
582+ { local . session . getMessageText ( message ) }
583+ </ div >
584+ < div class = "text-14-regular text-text-base" > { message . summary ?. text } </ div >
569585 </ div >
570- < div class = "text-14-regular text-text-base" >
571- { message . summary ?. text ||
572- local . session . getMessageText ( local . session . activeAssistantMessagesWithText ( ) ) }
586+ < div class = "" >
587+ < For each = { message . summary ?. diffs } >
588+ { ( diff ) => (
589+ < Diff
590+ before = { {
591+ name : diff . file ! ,
592+ contents : diff . before ! ,
593+ } }
594+ after = { {
595+ name : diff . file ! ,
596+ contents : diff . after ! ,
597+ } }
598+ />
599+ ) }
600+ </ For >
573601 </ div >
574602 </ div >
575- < div class = "" > </ div >
576- </ div >
577- ) }
603+ )
604+ } }
578605 </ For >
579606 </ div >
580607 </ div >
0 commit comments