- Normalize snake_case REST API responses to camelCase in useChat so messages are correctly attributed after page reload - Remove max-w-3xl from chat-ui messages and composer for full-width - Remove discussion header/border so chat fills the tablo section - Remove plan badge pills from settings page header - Use org logo in NavigationBar avatar instead of first-letter fallback - Persist plan announcement in localStorage instead of sessionStorage Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { UserTablo } from "@xtablo/shared/types/tablos.types";
|
|
import { useEffect } from "react";
|
|
import { useChat } from "../hooks/useChat";
|
|
import { useTabloMembers } from "../hooks/tablos";
|
|
import { useUser } from "../providers/UserStoreProvider";
|
|
import { ChatMessages } from "./ChatMessages";
|
|
|
|
interface TabloDiscussionSectionProps {
|
|
tablo: UserTablo;
|
|
isAdmin: boolean;
|
|
}
|
|
|
|
export const TabloDiscussionSection = ({ tablo }: TabloDiscussionSectionProps) => {
|
|
const user = useUser();
|
|
const {
|
|
messages,
|
|
sendMessage,
|
|
sendTyping,
|
|
typingUsers,
|
|
loadMoreMessages,
|
|
hasMoreMessages,
|
|
markAsRead,
|
|
} = useChat(tablo.id);
|
|
|
|
const { data: members = [] } = useTabloMembers(tablo.id);
|
|
|
|
// Mark as read when opening the discussion
|
|
useEffect(() => {
|
|
if (messages.length > 0) {
|
|
markAsRead();
|
|
}
|
|
}, [messages.length, markAsRead]);
|
|
|
|
return (
|
|
<div className="flex flex-col h-full overflow-hidden">
|
|
<div className="flex-1 overflow-hidden min-h-0">
|
|
<ChatMessages
|
|
messages={messages}
|
|
currentUserId={user.id}
|
|
members={members}
|
|
typingUsers={typingUsers}
|
|
hasMoreMessages={hasMoreMessages}
|
|
onLoadMore={loadMoreMessages}
|
|
onSend={sendMessage}
|
|
onTyping={sendTyping}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|