-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathpresence.ts
More file actions
49 lines (41 loc) · 1.26 KB
/
presence.ts
File metadata and controls
49 lines (41 loc) · 1.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"use socket";
import { createEffect, createMemo, createSignal, onCleanup } from "solid-js";
import { createSocketMemo } from "../../socket/lib/shared";
import { useCookies } from "../../socket/lib/server";
export type PresenceUser = {
name: string;
x: number;
y: number;
color: string;
};
const [presenceDocs, setPresence] = createSignal<
Record<string, Record<string, PresenceUser>>
>({});
export const usePresence = (
mousePos: () => { docId?: string; x: number; y: number } | undefined
) => {
const { userId } = useCookies();
const color = Math.floor(Math.random() * 16777215).toString(16);
createEffect(() => {
const { docId = userId, x, y } = mousePos() || {};
x &&
y &&
setPresence((prev) => ({
...prev,
[docId]: { ...prev[docId], [userId]: { name: userId, x, y, color } },
}));
});
onCleanup(() => {
const { docId = userId } = mousePos() || {};
setPresence((prev) => {
const { [userId]: _, ...rest } = prev[docId] || {};
return { ...prev, [docId]: rest };
});
});
const otherUsers = createMemo(() => {
const docId = mousePos()?.docId || userId;
const { [userId]: _, ...rest } = presenceDocs()[docId] || {};
return rest;
});
return createSocketMemo(otherUsers);
};