Fix auth race condition and add typing indicator emission

This commit is contained in:
2026-03-11 21:34:48 -07:00
parent 7063f79514
commit 4c9568e8da
+12 -2
View File
@@ -14,6 +14,7 @@ export default function Chat() {
const { friendId } = useParams<{ friendId: string }>();
const navigate = useNavigate();
const user = useAuthStore((s) => s.user);
const authLoading = useAuthStore((s) => s.isLoading);
const {
messages,
typingFriendIds,
@@ -24,6 +25,7 @@ export default function Chat() {
openConversation,
loadMoreMessages,
sendMessage,
emitTyping,
clearChat,
} = useChatStore();
const { friends } = useFriendsStore();
@@ -33,10 +35,12 @@ export default function Chat() {
const messagesEndRef = useRef<HTMLDivElement>(null);
const scrollContainerRef = useRef<HTMLDivElement>(null);
const lastTypingEmit = useRef(0);
const friend = friends.find((f) => f.friend.id === friendId)?.friend;
useEffect(() => {
if (authLoading) return;
if (!user) {
navigate('/login');
return;
@@ -51,7 +55,7 @@ export default function Chat() {
clearChat();
disconnect();
};
}, [user, friendId, navigate, connect, disconnect, openConversation, clearChat]);
}, [user, authLoading, friendId, navigate, connect, disconnect, openConversation, clearChat]);
useEffect(() => {
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
@@ -153,7 +157,13 @@ export default function Chat() {
<Input
placeholder="Type a message..."
value={input}
onChange={(e) => setInput(e.target.value)}
onChange={(e) => {
setInput(e.target.value);
if (friendId && Date.now() - lastTypingEmit.current > 2000) {
lastTypingEmit.current = Date.now();
emitTyping(friendId);
}
}}
className="flex-1"
/>
<Button type="submit" size="sm" disabled={!input.trim() || sending}>