Fixed message dupes

This commit is contained in:
2026-01-09 20:59:12 +01:00
parent dad1e3f04a
commit 5635f483e4
2 changed files with 37 additions and 32 deletions
-17
View File
@@ -27,7 +27,6 @@ export default function useApp(): App {
>({}); >({});
const [speaking, setSpeaking] = useState<Record<number, number>>({}); const [speaking, setSpeaking] = useState<Record<number, number>>({});
const [pmsLoaded, setPmsLoaded] = useState(false);
useEffect(() => { useEffect(() => {
const stored = Cookies.get("servers"); const stored = Cookies.get("servers");
@@ -43,22 +42,6 @@ export default function useApp(): App {
.catch(toast.error); .catch(toast.error);
}, []); }, []);
useEffect(() => {
const json = localStorage.getItem("privateMessages");
if (json) {
privateMessages.setMessages(JSON.parse(json));
}
setPmsLoaded(true);
}, []);
useEffect(() => {
if (!pmsLoaded) return;
localStorage.setItem(
"privateMessages",
JSON.stringify(privateMessages.messages)
);
}, [privateMessages.messages, pmsLoaded]);
return { return {
speaking, speaking,
setSpeaking, setSpeaking,
+37 -15
View File
@@ -10,23 +10,45 @@ export interface MessageStore {
clearMessages: () => void; clearMessages: () => void;
insertMessages: (msgs: Message[]) => void; insertMessages: (msgs: Message[]) => void;
} }
export default function useMessages(): MessageStore { export default function useMessages(): MessageStore {
const [messages, setMessages] = useState<Message[]>([]); const [messages, setMessagesState] = useState<Message[]>([]);
// Helper to ensure unique messages by id
const uniqueMessages = (msgs: Message[]) => {
const map = new Map<number, Message>();
msgs.forEach((m) => map.set(m.id, m)); // duplicates overwrite
return Array.from(map.values());
};
const setMessages = (msgs: Message[]) =>
setMessagesState(uniqueMessages(msgs));
const addMessage = (msg: Message) =>
setMessagesState((messages) =>
messages.some((m) => m.id === msg.id) ? messages : [...messages, msg]
);
const insertMessages = (msgs: Message[]) =>
setMessagesState((messages) => uniqueMessages([...msgs, ...messages]));
const deleteMessage = (id: number) =>
setMessagesState((messages) => messages.filter((m) => m.id !== id));
const editMessage = (id: number, contents: string) =>
setMessagesState((messages) =>
messages.map((m) => (m.id === id ? { ...m, contents } : m))
);
const clearMessages = () => setMessagesState([]);
return { return {
messages: messages, messages,
setMessages: (msgs) => setMessages(msgs), setMessages,
addMessage: (msg) => addMessage,
setMessages((messages) => deleteMessage,
messages.some((m) => m.id === msg.id) ? messages : [...messages, msg] editMessage,
), clearMessages,
deleteMessage: (id: number) => insertMessages,
setMessages((messages) => messages.filter((m) => m.id !== id)),
editMessage: (id: number, contents) =>
setMessages((messages) =>
messages.map((m) => (m.id === id ? { ...m, contents } : m))
),
clearMessages: () => setMessages([]),
insertMessages: (msgs) => setMessages((m) => [...msgs, ...m]),
}; };
} }