Files
var-monorepo/apps/dispatch/app/_store/chatStore.ts
2025-03-21 10:27:32 -07:00

71 lines
1.9 KiB
TypeScript

import { create } from "zustand";
import { ChatMessage } from "@repo/db";
import { socket } from "(dispatch)/socket";
interface ChatStore {
ownId: null | string;
setOwnId: (id: string) => void;
chats: Record<string, { name: string; messages: ChatMessage[] }>;
sendMessage: (userId: string, message: string) => Promise<void>;
addChat: (userId: string, name: string) => void;
addMessage: (userId: string, message: ChatMessage) => void;
}
export const useChatStore = create<ChatStore>((set, get) => ({
ownId: null,
setOwnId: (id: string) => set({ ownId: id }),
chats: {},
sendMessage: (userId: string, message: string) => {
return new Promise((resolve, reject) => {
console.log("sendMessage", userId, message);
socket.emit(
"send-message",
{ userId, message },
({ error }: { error?: string }) => {
if (error) {
reject(error);
} else {
resolve();
}
},
);
});
},
addChat: (userId, name) => {
set((state) => ({
chats: {
...state.chats, // Bestehende Chats beibehalten
[userId]: { name, messages: [] }, // Neuen Chat hinzufügen
},
}));
},
addMessage: (userId: string, message: ChatMessage) => {
console.log("addMessage", userId, message);
set((state) => {
const user = state.chats[userId] || { name: userId, messages: [] };
const isSender = message.senderId === state.ownId;
return {
chats: {
...state.chats,
[userId]: {
...user,
name: isSender ? message.receiverName : message.senderName,
messages: [...user.messages, message], // Neuen Zustand erzeugen
},
},
};
});
},
}));
socket.on(
"chat-message",
({ userId, message }: { userId: string; message: ChatMessage }) => {
const store = useChatStore.getState();
console.log("chat-message", userId, message);
// Update the chat store with the new message
store.addMessage(userId, message);
},
);