Skip to content

Commit 226724e

Browse files
authored
Feat/#201-K: 가입된 워크스페이스 없어도 워크스페이스 페이지로 이동 (#204)
1 parent d359ca6 commit 226724e

File tree

5 files changed

+85
-56
lines changed

5 files changed

+85
-56
lines changed

client/src/App.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ function App() {
1515
const location = useLocation();
1616

1717
const autoLogin = async () => {
18-
const { user, workspaces } = await getAuth();
18+
const authorizedUser = await getAuth();
19+
const { user, workspaces } = authorizedUser;
1920

2021
setIsLoaded(true);
2122

@@ -24,9 +25,16 @@ function App() {
2425
return;
2526
}
2627

27-
setUserInfo({ user, workspaces });
28+
setUserInfo(authorizedUser);
29+
30+
if (!workspaces.length) {
31+
navigate('/workspace');
32+
return;
33+
}
34+
35+
const defaultWorkspace = workspaces[0];
36+
const { id } = defaultWorkspace;
2837

29-
const { id } = workspaces[0];
3038
navigate(`/workspace/${id}`);
3139
};
3240

@@ -39,7 +47,7 @@ function App() {
3947
<Routes>
4048
<Route path="/" element={<LoginPage />} />
4149
<Route path="/oauth" element={<OAuthPage />} />
42-
<Route path="/workspace/:id" element={<WorkspacePage />} />
50+
<Route path="/workspace/*" element={<WorkspacePage />} />
4351
</Routes>
4452
</UserContext.Provider>
4553
) : (

client/src/components/Workspace/index.tsx

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,63 @@
11
import Mom from 'components/Mom';
22
import Sidebar from 'components/Sidebar';
3-
import { useEffect, useState } from 'react';
3+
import { useState, useEffect, useMemo } from 'react';
4+
import { useParams } from 'react-router-dom';
45
import { getWorkspaceInfo } from 'src/apis/workspace';
6+
import ConfMediaBar from 'src/components/ConfMediaBar';
7+
import SOCKET_MESSAGE from 'src/constants/socket-message';
8+
import ConfContext from 'src/contexts/conf';
59
import { SelectedMomContext } from 'src/contexts/selected-mom';
10+
import { SocketContext } from 'src/contexts/socket';
11+
import useSocket from 'src/hooks/useSocket';
612
import { TMom } from 'src/types/mom';
713
import { WorkspaceInfo } from 'src/types/workspace';
814

9-
interface WorkspaceProps {
10-
workspaceId?: string;
11-
}
15+
function Workspace() {
16+
const { id } = useParams();
17+
const [isStart, setIsStart] = useState(false);
18+
19+
const momSocket = useMemo(() => useSocket(`/sc-workspace/${id}`), [id]);
20+
const workspaceSocket = useMemo(() => useSocket(`/workspace/${id}`), [id]);
1221

13-
function Workspace({ workspaceId }: WorkspaceProps) {
1422
const [workspace, setWorkspace] = useState<WorkspaceInfo | null>(null);
1523
const [selectedMom, setSelectedMom] = useState<TMom | null>(null);
1624

17-
useEffect(() => {
18-
loadWorkspaceInfo();
19-
}, [workspaceId]);
20-
2125
const loadWorkspaceInfo = async () => {
22-
if (workspaceId) {
23-
const workspaceInfo = await getWorkspaceInfo({ id: workspaceId });
26+
if (id) {
27+
const workspaceInfo = await getWorkspaceInfo({ id });
2428

2529
setWorkspace(workspaceInfo);
2630

2731
if (!workspaceInfo.moms[0]) setSelectedMom(null);
2832
}
2933
};
3034

35+
useEffect(() => {
36+
workspaceSocket.on(SOCKET_MESSAGE.WORKSPACE.START_MEETING, () => {
37+
setIsStart(true);
38+
});
39+
40+
workspaceSocket.on(SOCKET_MESSAGE.WORKSPACE.END_MEETING, () => {
41+
setIsStart(false);
42+
});
43+
}, []);
44+
45+
useEffect(() => {
46+
loadWorkspaceInfo();
47+
}, [id]);
48+
3149
return (
32-
workspace && (
33-
<SelectedMomContext.Provider value={{ selectedMom, setSelectedMom }}>
34-
<Sidebar workspace={workspace} />
35-
<Mom />
36-
</SelectedMomContext.Provider>
37-
)
50+
<SocketContext.Provider value={{ momSocket, workspaceSocket }}>
51+
<ConfContext.Provider value={{ isStart, setIsStart }}>
52+
{workspace && (
53+
<SelectedMomContext.Provider value={{ selectedMom, setSelectedMom }}>
54+
<Sidebar workspace={workspace} />
55+
<Mom />
56+
</SelectedMomContext.Provider>
57+
)}
58+
{isStart && <ConfMediaBar />}
59+
</ConfContext.Provider>
60+
</SocketContext.Provider>
3861
);
3962
}
4063

client/src/pages/OAuth/index.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,16 @@ function OAuthPage() {
2222

2323
userContext.setUserInfo(authorizedUser);
2424

25-
const id = authorizedUser.workspaces[0].id;
25+
const { workspaces } = authorizedUser;
26+
27+
if (!workspaces.length) {
28+
navigate('/workspace');
29+
return;
30+
}
31+
32+
const defaultWorkspace = workspaces[0];
33+
const { id } = defaultWorkspace;
34+
2635
navigate(`/workspace/${id}`);
2736
} catch (e) {
2837
navigate('/');
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import WorkspaceList from 'components/WorkspaceList';
2+
import { Outlet } from 'react-router-dom';
3+
4+
import style from './style.module.scss';
5+
6+
function Layout() {
7+
return (
8+
<div className={style.container}>
9+
<WorkspaceList />
10+
<Outlet />
11+
</div>
12+
);
13+
}
14+
15+
export default Layout;

client/src/pages/Workspace/index.tsx

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,16 @@
11
import Workspace from 'components/Workspace';
2-
import WorkspaceList from 'components/WorkspaceList';
3-
import { useEffect, useMemo, useState } from 'react';
4-
import { useParams } from 'react-router-dom';
5-
import ConfMediaBar from 'src/components/ConfMediaBar';
6-
import SOCKET_MESSAGE from 'src/constants/socket-message';
7-
import ConfContext from 'src/contexts/conf';
8-
import { SocketContext } from 'src/contexts/socket';
9-
import useSocket from 'src/hooks/useSocket';
2+
import { Route, Routes } from 'react-router-dom';
103

11-
import style from './style.module.scss';
4+
import Layout from './Layout';
125

136
function WorkspacePage() {
14-
const { id } = useParams();
15-
const [isStart, setIsStart] = useState(false);
16-
17-
const momSocket = useMemo(() => useSocket(`/sc-workspace/${id}`), [id]);
18-
const workspaceSocket = useMemo(() => useSocket(`/workspace/${id}`), [id]);
19-
20-
useEffect(() => {
21-
workspaceSocket.on(SOCKET_MESSAGE.WORKSPACE.START_MEETING, () => {
22-
setIsStart(true);
23-
});
24-
25-
workspaceSocket.on(SOCKET_MESSAGE.WORKSPACE.END_MEETING, () => {
26-
setIsStart(false);
27-
});
28-
}, []);
29-
307
return (
31-
<SocketContext.Provider value={{ momSocket, workspaceSocket }}>
32-
<ConfContext.Provider value={{ isStart, setIsStart }}>
33-
<div className={style.container}>
34-
<WorkspaceList />
35-
<Workspace workspaceId={id} />
36-
{isStart && <ConfMediaBar />}
37-
</div>
38-
</ConfContext.Provider>
39-
</SocketContext.Provider>
8+
<Routes>
9+
<Route path="/" element={<Layout />}>
10+
<Route index element={<div>만들어질 예정인 예외 페이지</div>} />
11+
<Route path="/:id" element={<Workspace />} />
12+
</Route>
13+
</Routes>
4014
);
4115
}
4216

0 commit comments

Comments
 (0)