Fixed message dupes
This commit is contained in:
@@ -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
@@ -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]),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user