From 6084a363c543f049138197e6c6c5deb8cc93a0e2 Mon Sep 17 00:00:00 2001 From: Ivan Leo Date: Sun, 19 Jan 2025 22:31:55 +0800 Subject: [PATCH] fix: add sorting for messages on package and ui level --- kura/types/conversation.py | 14 +++- ui/bun.lockb | Bin 148809 -> 196520 bytes ui/src/components/ChatDialog.tsx | 7 +- ui/src/components/code-block.tsx | 38 +++++++++++ ui/src/components/markdown.tsx | 107 +++++++++++++++++++++++++++++++ 5 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 ui/src/components/code-block.tsx create mode 100644 ui/src/components/markdown.tsx diff --git a/kura/types/conversation.py b/kura/types/conversation.py index e3cb25f..8c0181e 100644 --- a/kura/types/conversation.py +++ b/kura/types/conversation.py @@ -24,7 +24,9 @@ def from_claude_conversation_dump(cls, file_path: str) -> list["Conversation"]: created_at=conversation["created_at"], messages=[ Message( - created_at=message["created_at"], + created_at=datetime.fromisoformat( + message["created_at"].replace("Z", "+00:00") + ), role="user" if message["sender"] == "human" else "assistant", @@ -36,7 +38,15 @@ def from_claude_conversation_dump(cls, file_path: str) -> list["Conversation"]: ] ), ) - for message in conversation["chat_messages"] + for message in sorted( + conversation["chat_messages"], + key=lambda x: ( + datetime.fromisoformat( + x["created_at"].replace("Z", "+00:00") + ), + 0 if x["sender"] == "human" else 1, + ), + ) ], ) for conversation in json.load(f) diff --git a/ui/bun.lockb b/ui/bun.lockb index c66b3c9a84e207a1c6c9f35b33c119e3f2f276fd..029987ebbfa215297fbf9b9146c275fcb3ea5879 100755 GIT binary patch delta 57171 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 R4W&~2{EE^*tb3r``#*?alcN9t diff --git a/ui/src/components/ChatDialog.tsx b/ui/src/components/ChatDialog.tsx index 4bb81af..752df48 100644 --- a/ui/src/components/ChatDialog.tsx +++ b/ui/src/components/ChatDialog.tsx @@ -1,5 +1,5 @@ import { Conversation } from "@/types/conversation"; -import React from "react"; + import { Dialog, DialogContent, @@ -8,6 +8,7 @@ import { DialogTitle, DialogTrigger, } from "./ui/dialog"; +import { Markdown } from "./markdown"; type Props = { chatId: string; @@ -36,13 +37,13 @@ const ChatDialog = ({ chatId, conversation }: Props) => { }`} >
-

{m.content}

+ {m.content}
{m.role === "user" ? "You" : "Assistant"} diff --git a/ui/src/components/code-block.tsx b/ui/src/components/code-block.tsx new file mode 100644 index 0000000..7bf5b8f --- /dev/null +++ b/ui/src/components/code-block.tsx @@ -0,0 +1,38 @@ +"use client"; + +interface CodeBlockProps { + node: any; + inline: boolean; + className: string; + children: any; +} + +export function CodeBlock({ + node, + inline, + className, + children, + ...props +}: CodeBlockProps) { + if (!inline) { + return ( +
+
+          {children}
+        
+
+ ); + } else { + return ( + + {children} + + ); + } +} diff --git a/ui/src/components/markdown.tsx b/ui/src/components/markdown.tsx new file mode 100644 index 0000000..ff3996f --- /dev/null +++ b/ui/src/components/markdown.tsx @@ -0,0 +1,107 @@ +import { memo } from "react"; +import ReactMarkdown, { type Components } from "react-markdown"; +import remarkGfm from "remark-gfm"; +import { CodeBlock } from "./code-block"; + +const components: Partial = { + // @ts-expect-error + code: CodeBlock, + pre: ({ children }) => <>{children}, + ol: ({ node, children, ...props }) => { + return ( +
    + {children} +
+ ); + }, + li: ({ node, children, ...props }) => { + return ( +
  • + {children} +
  • + ); + }, + ul: ({ node, children, ...props }) => { + return ( +
      + {children} +
    + ); + }, + strong: ({ node, children, ...props }) => { + return ( + + {children} + + ); + }, + a: ({ node, children, ...props }) => { + return ( +
    + {children} + + ); + }, + h1: ({ node, children, ...props }) => { + return ( +

    + {children} +

    + ); + }, + h2: ({ node, children, ...props }) => { + return ( +

    + {children} +

    + ); + }, + h3: ({ node, children, ...props }) => { + return ( +

    + {children} +

    + ); + }, + h4: ({ node, children, ...props }) => { + return ( +

    + {children} +

    + ); + }, + h5: ({ node, children, ...props }) => { + return ( +
    + {children} +
    + ); + }, + h6: ({ node, children, ...props }) => { + return ( +
    + {children} +
    + ); + }, +}; + +const remarkPlugins = [remarkGfm]; + +const NonMemoizedMarkdown = ({ children }: { children: string }) => { + return ( + + {children} + + ); +}; + +export const Markdown = memo( + NonMemoizedMarkdown, + (prevProps, nextProps) => prevProps.children === nextProps.children +);