mirror of
https://github.com/fromchat-messenger/web.git
synced 2026-09-23 03:25:07 +03:00
Refactor state
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import { create } from "zustand";
|
||||
|
||||
interface PresenceStore {
|
||||
onlineStatuses: Map<number, {online: boolean, lastSeen: string}>;
|
||||
typingUsers: Map<number, string>; // userId -> username
|
||||
dmTypingUsers: Map<number, boolean>;
|
||||
updateOnlineStatus: (userId: number, online: boolean, lastSeen: string) => void;
|
||||
addTypingUser: (userId: number, username: string) => void;
|
||||
removeTypingUser: (userId: number) => void;
|
||||
setDmTypingUser: (userId: number, isTyping: boolean) => void;
|
||||
}
|
||||
|
||||
export const usePresenceStore = create<PresenceStore>((set) => ({
|
||||
onlineStatuses: new Map(),
|
||||
typingUsers: new Map(),
|
||||
dmTypingUsers: new Map(),
|
||||
updateOnlineStatus: (userId: number, online: boolean, lastSeen: string) => set((state) => ({
|
||||
onlineStatuses: new Map(state.onlineStatuses).set(userId, { online, lastSeen })
|
||||
})),
|
||||
addTypingUser: (userId: number, username: string) => set((state) => ({
|
||||
typingUsers: new Map(state.typingUsers).set(userId, username)
|
||||
})),
|
||||
removeTypingUser: (userId: number) => set((state) => {
|
||||
const newTypingUsers = new Map(state.typingUsers);
|
||||
newTypingUsers.delete(userId);
|
||||
return {
|
||||
typingUsers: newTypingUsers
|
||||
};
|
||||
}),
|
||||
setDmTypingUser: (userId: number, isTyping: boolean) => set((state) => {
|
||||
const newDmTypingUsers = new Map(state.dmTypingUsers);
|
||||
if (isTyping) {
|
||||
newDmTypingUsers.set(userId, true);
|
||||
} else {
|
||||
newDmTypingUsers.delete(userId);
|
||||
}
|
||||
return {
|
||||
dmTypingUsers: newDmTypingUsers
|
||||
};
|
||||
})
|
||||
}));
|
||||
Reference in New Issue
Block a user