feat: improve public chat UI and shared components

This commit is contained in:
CREDO23 2026-01-26 18:39:59 +02:00
parent 37adc54d6a
commit ee65e1377f
14 changed files with 403 additions and 275 deletions

View file

@ -1,17 +1,31 @@
"use client";
import {
type AppendMessage,
type ThreadMessageLike,
useExternalStoreRuntime,
} from "@assistant-ui/react";
import { type AppendMessage, useExternalStoreRuntime } from "@assistant-ui/react";
import { useCallback, useMemo } from "react";
import type { GetPublicChatResponse, PublicChatMessage } from "@/contracts/types/public-chat.types";
import { convertToThreadMessage } from "@/lib/chat/message-utils";
import type { MessageRecord } from "@/lib/chat/thread-persistence";
interface UsePublicChatRuntimeOptions {
data: GetPublicChatResponse | undefined;
}
/**
* Map PublicChatMessage to MessageRecord shape for reuse of convertToThreadMessage
*/
function toMessageRecord(msg: PublicChatMessage, idx: number): MessageRecord {
return {
id: idx,
thread_id: 0,
role: msg.role as "user" | "assistant" | "system",
content: msg.content,
created_at: msg.created_at,
author_id: msg.author ? "public" : null,
author_display_name: msg.author?.display_name ?? null,
author_avatar_url: msg.author?.avatar_url ?? null,
};
}
/**
* Creates a read-only runtime for public chat viewing.
*/
@ -21,24 +35,8 @@ export function usePublicChatRuntime({ data }: UsePublicChatRuntimeOptions) {
// No-op - public chat is read-only
const onNew = useCallback(async (_message: AppendMessage) => {}, []);
// Convert PublicChatMessage to ThreadMessageLike
const convertMessage = useCallback(
(msg: PublicChatMessage, idx: number): ThreadMessageLike => ({
id: `public-msg-${idx}`,
role: msg.role as "user" | "assistant",
content: msg.content as ThreadMessageLike["content"],
createdAt: new Date(msg.created_at),
metadata: msg.author
? {
custom: {
author: {
displayName: msg.author.display_name,
avatarUrl: msg.author.avatar_url,
},
},
}
: undefined,
}),
(msg: PublicChatMessage, idx: number) => convertToThreadMessage(toMessageRecord(msg, idx)),
[]
);