Fix crypto and message duplication

This commit is contained in:
2025-08-30 12:14:36 +03:00
Unverified
parent ebd075136b
commit bd52b3c05a
4 changed files with 55 additions and 29 deletions
+17 -6
View File
@@ -1,4 +1,4 @@
import { useEffect, useCallback } from "react";
import { useEffect, useCallback, useRef } from "react";
import { useAppState } from "../state";
import { request, websocket } from "../../websocket";
import { API_BASE_URL } from "../../core/config";
@@ -19,9 +19,11 @@ export function useChat() {
user
} = useAppState();
const messagesLoadedRef = useRef(false);
// Load messages for the current chat
const loadMessages = useCallback(async () => {
if (!user.authToken) return;
if (!user.authToken || messagesLoadedRef.current) return;
try {
const response = await fetch(`${API_BASE_URL}/get_messages`, {
@@ -38,6 +40,7 @@ export function useChat() {
});
}
}
messagesLoadedRef.current = true;
} catch (error) {
console.error("Error loading messages:", error);
}
@@ -99,12 +102,20 @@ export function useChat() {
return () => {
websocket.removeEventListener("message", handleWebSocketMessage);
};
}, [addMessage, user.currentUser]);
}, [addMessage, updateMessage, removeMessage, user.currentUser]);
// Load messages when component mounts or chat changes
// Load messages only once when component mounts and user is authenticated
useEffect(() => {
loadMessages();
}, [loadMessages]);
if (user.authToken && !messagesLoadedRef.current) {
loadMessages();
}
}, [user.authToken, loadMessages]);
// Reset messages loaded flag and clear messages when chat changes
useEffect(() => {
messagesLoadedRef.current = false;
clearMessages(); // Clear messages when switching chats
}, [chat.currentChat, clearMessages]);
return {
messages: chat.messages,
+6 -3
View File
@@ -55,13 +55,16 @@ export default function LoginScreen() {
if (response.ok) {
const data: LoginResponse = await response.json();
// Store the JWT token
setUser(data.token, data.user)
// Store the JWT token first
setUser(data.token, data.user);
// Setup keys with the token we just received
try {
await ensureKeysOnLogin(password);
await ensureKeysOnLogin(password, data.token);
} catch (e) {
console.error("Key setup failed:", e);
}
setCurrentPage("chat");
// initializeProfile(); // Initialize profile after login
} else {
+13 -5
View File
@@ -49,12 +49,20 @@ export const useAppState = create<AppState>((set, get) => ({
dmUsers: [],
activeDm: null
},
addMessage: (message: Message) => set((state) => ({
chat: {
...state.chat,
messages: [...state.chat.messages, message]
addMessage: (message: Message) => set((state) => {
// Check if message already exists to prevent duplicates
const messageExists = state.chat.messages.some(msg => msg.id === message.id);
if (messageExists) {
return state; // Return unchanged state if message already exists
}
})),
return {
chat: {
...state.chat,
messages: [...state.chat.messages, message]
}
};
}),
updateMessage: (messageId: number, updatedMessage: Partial<Message>) => set((state) => ({
chat: {
...state.chat,