AW-496-assistant-typing

This commit is contained in:
gofnnp 2025-07-26 20:01:24 +04:00
parent 33863911c4
commit f2b1519c67
3 changed files with 13 additions and 5 deletions

View File

@ -30,18 +30,19 @@ export interface ChatMessageProps {
} }
export default function ChatMessage({ message }: ChatMessageProps) { export default function ChatMessage({ message }: ChatMessageProps) {
const { read } = useChat(); const { isConnected, read } = useChat();
useEffect(() => { useEffect(() => {
if ( if (
!!message.id && !!message.id &&
!message.isRead && !message.isRead &&
message.id !== "typing" && message.id !== "typing" &&
!message.id.startsWith("sending-message") !message.id.startsWith("sending-message") &&
isConnected
) { ) {
read([message.id]); read([message.id]);
} }
}, [message.id, message.isRead, read]); }, [message.id, message.isRead, read, isConnected]);
return ( return (
<div className={clsx(styles.message, message.isOwn && styles.own)}> <div className={clsx(styles.message, message.isOwn && styles.own)}>

View File

@ -9,6 +9,7 @@ const ChatMessageSchema = z.object({
isRead: z.boolean(), isRead: z.boolean(),
type: z.enum(["text", "image", "voice"]), type: z.enum(["text", "image", "voice"]),
text: z.string().optional(), text: z.string().optional(),
isLast: z.boolean().optional(),
suggestions: z.array(z.string()).optional(), suggestions: z.array(z.string()).optional(),
}); });

View File

@ -22,7 +22,7 @@ const PAGE_LIMIT = 50;
type UIMessage = Pick< type UIMessage = Pick<
IChatMessage, IChatMessage,
"id" | "role" | "text" | "createdDate" | "isRead" | "suggestions" "id" | "role" | "text" | "createdDate" | "isRead" | "suggestions" | "isLast"
>; >;
interface UseChatSocketOptions { interface UseChatSocketOptions {
@ -46,6 +46,7 @@ export const useChatSocket = (
createdDate: m.createdDate, createdDate: m.createdDate,
isRead: m.isRead, isRead: m.isRead,
suggestions: m.suggestions, suggestions: m.suggestions,
isLast: m.isLast,
}); });
const [messages, setMessages] = useState<UIMessage[]>(() => const [messages, setMessages] = useState<UIMessage[]>(() =>
@ -65,7 +66,11 @@ export const useChatSocket = (
const { suggestions, setSuggestions } = useChatStore(state => state); const { suggestions, setSuggestions } = useChatStore(state => state);
const isLoadingAdvisorMessage = useMemo(() => { const isLoadingAdvisorMessage = useMemo(() => {
return messages.length > 0 && messages[0].role !== "assistant"; return (
messages.length > 0 &&
(messages[0].role !== "assistant" ||
(Object.hasOwn(messages[0], "isLast") && !messages[0].isLast))
);
}, [messages]); }, [messages]);
const joinChat = useCallback( const joinChat = useCallback(
@ -179,6 +184,7 @@ export const useChatSocket = (
createdDate: d.createdDate, createdDate: d.createdDate,
isRead: d.isRead, isRead: d.isRead,
suggestions: d.suggestions, suggestions: d.suggestions,
isLast: d.isLast,
}) })
); );
return Array.from(map.values()).sort( return Array.from(map.values()).sort(