Skip to content

Commit cffe362

Browse files
Merge pull request #415 from boostcampwm-2024/feature-fe-#414
웹 소켓 연결 분리 및 성능 최적화
2 parents 8e5f11f + 65e334e commit cffe362

File tree

22 files changed

+402
-196
lines changed

22 files changed

+402
-196
lines changed

apps/frontend/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"emoji-mart": "^5.6.0",
3737
"fast-diff": "^1.3.0",
3838
"framer-motion": "^11.11.11",
39+
"lodash": "^4.17.21",
3940
"lowlight": "^3.1.0",
4041
"lucide-react": "^0.454.0",
4142
"next-themes": "^0.4.3",
@@ -59,6 +60,7 @@
5960
"@tailwindcss/typography": "^0.5.15",
6061
"@tanstack/router-devtools": "^1.82.12",
6162
"@tanstack/router-plugin": "^1.82.10",
63+
"@types/lodash": "^4.17.13",
6264
"@types/react": "^18.3.12",
6365
"@types/react-dom": "^18.3.1",
6466
"@vitejs/plugin-react": "^4.3.3",

apps/frontend/src/entities/user/model/useSyncedUsers.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,22 @@ import { useEffect } from "react";
22

33
import { useUserStore, type User } from "./userStore";
44
import { usePageStore } from "@/entities/page";
5+
import { useUserConnection } from "./useUserConnection";
6+
import useConnectionStore from "@/shared/model/useConnectionStore";
57

68
export const useSyncedUsers = () => {
79
const { currentPage } = usePageStore();
8-
const { provider, currentUser, setCurrentUser, setUsers } = useUserStore();
10+
useUserConnection();
11+
const { user } = useConnectionStore();
12+
const { currentUser, setCurrentUser, setUsers } = useUserStore();
913

1014
const updateUsersFromAwareness = () => {
15+
if (!user.provider) return;
16+
1117
const values = Array.from(
12-
provider.awareness.getStates().values(),
18+
user.provider.awareness.getStates().values(),
1319
) as User[];
20+
1421
setUsers(values);
1522
};
1623

@@ -21,32 +28,36 @@ export const useSyncedUsers = () => {
2128

2229
useEffect(() => {
2330
if (currentPage === null) return;
31+
if (!user.provider) return;
2432

2533
const updatedUser: User = {
2634
...currentUser,
2735
currentPageId: currentPage.toString(),
2836
};
2937

3038
setCurrentUser(updatedUser);
31-
provider.awareness.setLocalState(updatedUser);
32-
}, [currentPage]);
39+
user.provider.awareness.setLocalState(updatedUser);
40+
}, [currentPage, user.provider]);
3341

3442
useEffect(() => {
43+
if (!user.provider) return;
44+
3545
const localStorageUser = getLocalStorageUser();
3646

3747
if (!localStorageUser) {
3848
localStorage.setItem("currentUser", JSON.stringify(currentUser));
3949
} else {
4050
setCurrentUser(localStorageUser);
41-
provider.awareness.setLocalState(localStorageUser);
51+
user.provider.awareness.setLocalState(localStorageUser);
4252
}
4353

4454
updateUsersFromAwareness();
4555

46-
provider.awareness.on("change", updateUsersFromAwareness);
56+
user.provider.awareness.on("change", updateUsersFromAwareness);
4757

4858
return () => {
49-
provider.awareness.off("change", updateUsersFromAwareness);
59+
if (!user.provider) return;
60+
user.provider.awareness.off("change", updateUsersFromAwareness);
5061
};
51-
}, []);
62+
}, [user.provider]);
5263
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// provider: createSocketIOProvider("users", new Y.Doc()),
2+
import * as Y from "yjs";
3+
import { createSocketIOProvider } from "@/shared/api";
4+
import useConnectionStore from "@/shared/model/useConnectionStore";
5+
import { useEffect } from "react";
6+
7+
export const useUserConnection = () => {
8+
const { user, setProvider, setConnectionStatus } = useConnectionStore();
9+
10+
useEffect(() => {
11+
if (user.provider) {
12+
user.provider.destroy();
13+
}
14+
15+
setConnectionStatus("user", "connecting");
16+
17+
const provider = createSocketIOProvider("users", new Y.Doc());
18+
setProvider("user", provider);
19+
20+
provider.on(
21+
"status",
22+
({ status }: { status: "connected" | "disconnected" }) => {
23+
setConnectionStatus("user", status);
24+
},
25+
);
26+
27+
return () => {
28+
provider.doc.destroy();
29+
provider.destroy();
30+
};
31+
}, []);
32+
};

apps/frontend/src/entities/user/model/userStore.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
import { create } from "zustand";
2-
import * as Y from "yjs";
3-
import { SocketIOProvider } from "y-socket.io";
42

5-
import { createSocketIOProvider } from "@/shared/api";
63
import { getRandomColor, getRandomHexString } from "@/shared/lib";
74

85
export interface User {
@@ -12,15 +9,13 @@ export interface User {
129
}
1310

1411
interface UserStore {
15-
provider: SocketIOProvider;
1612
users: User[];
1713
currentUser: User;
1814
setUsers: (users: User[]) => void;
1915
setCurrentUser: (user: User) => void;
2016
}
2117

2218
export const useUserStore = create<UserStore>((set) => ({
23-
provider: createSocketIOProvider("users", new Y.Doc()),
2419
users: [],
2520
currentUser: {
2621
clientId: getRandomHexString(10),

0 commit comments

Comments
 (0)