gitdataai/src/lib/room.ts
ZhenYi 616c0c0e88 fix(room): scroll-to-bottom logic and AI sender display name
- Remove duplicate smooth scroll effect from DiscordChatPanel; handle
  all scroll logic in MessageList instead
- MessageList: track isInitialLoadRef to instant-jump to bottom on
  first load (no animation), and only auto-scroll for new messages
  when user is already near the bottom
- sender.ts: getSenderDisplayName rejects UUID values and falls back
  to 'AI' for AI messages; getSenderModelId uses display_name
2026-04-25 09:52:58 +08:00

83 lines
2.4 KiB
TypeScript

export type WsOutEvent =
| { room_id: string; project_id?: undefined | null; event: WsEventPayload; error?: undefined | null }
| { room_id?: undefined | null; project_id: string; event: WsEventPayload; error?: undefined | null }
| { room_id?: undefined | null; project_id?: undefined | null; error: string };
export type WsEventPayload =
| { type: 'room_message'; data: RoomMessagePayload }
| { type: 'project_event'; data: ProjectEventPayload }
| { type: 'ai_stream_chunk'; data: AiStreamChunkPayload };
export type RoomMessagePayload = {
id: string;
room_id: string;
sender_type: string;
sender_id?: string | null;
thread_id?: string | null;
content: string;
content_type: string;
send_at: string;
seq: number;
display_name?: string | null;
};
export type ProjectEventPayload = {
event_type: string;
project_id: string;
room_id?: string | null;
category_id?: string | null;
message_id?: string | null;
seq?: number | null;
timestamp: string;
};
export type AiStreamChunkPayload = {
message_id: string;
room_id: string;
content: string;
done: boolean;
error?: string | null;
chunk_type?: string | null;
};
export type RoomWsStatus = 'idle' | 'connecting' | 'open' | 'closing' | 'closed' | 'error';
export function isRoomMessageEvent(
event: WsOutEvent,
): event is Extract<WsOutEvent, { room_id: string; event: { type: 'room_message'; data: RoomMessagePayload } }> {
return 'event' in event && !('error' in event) && event.event?.type === 'room_message';
}
export function isAiStreamChunkEvent(
event: WsOutEvent,
): event is Extract<WsOutEvent, { room_id: string; event: { type: 'ai_stream_chunk'; data: AiStreamChunkPayload } }> {
return 'event' in event && !('error' in event) && event.event?.type === 'ai_stream_chunk';
}
export function isProjectEvent(
event: WsOutEvent,
): event is Extract<WsOutEvent, { project_id: string; event: { type: 'project_event'; data: ProjectEventPayload } }> {
return 'event' in event && !('error' in event) && event.event?.type === 'project_event';
}
export type {
RoomResponse,
RoomCategoryResponse,
RoomMessageResponse,
RoomMessageListResponse,
RoomMemberResponse,
RoomThreadResponse,
UserInfo,
ReactionItem,
ReactionListData,
SearchResultData,
EditHistoryEntry,
AiConfigData,
NotificationData,
NotificationListData,
MentionData,
MentionListData,
SubscribeData,
MessageEditHistoryResponse,
} from './ws-protocol';