Skip to content

Commit bde83c0

Browse files
authored
Refactor/#205-K: 가입된 워크스페이스 정보 Context 통일 (#211)
* refactor: UserContext에서 workspaces 제거 * refactor: API 요청 메서드 타입 수정 * refactor: 로그인 로직에서 workspaces 제거 * refactor: Workspace 컴포넌트에서 유저가 가입한 워크스페이스 정보 요청 * refactor: WorkspacesContext에서 상태와 상태 변경 함수 제공하도록 변경 context, hook에서 WorkspacesContext로 네이밍 통일 * refactor: WorkspacesContext를 WorkspacePage로 이동 * fix: 변경 사항 기존 파일들에 반영 * feat: 참여한 워크스페이스 페이지로 navigate
1 parent ec67dcb commit bde83c0

File tree

17 files changed

+123
-97
lines changed

17 files changed

+123
-97
lines changed

client/src/App.tsx

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@ import { Route, Routes, useLocation, useNavigate } from 'react-router-dom';
33
import { getAuth } from 'src/apis/auth';
44
import UserContext from 'src/contexts/user';
55
import { LoadingPage, LoginPage, OAuthPage, WorkspacePage } from 'src/pages';
6-
import { UserInfo } from 'src/types/user';
6+
import { User } from 'src/types/user';
77

88
import 'styles/reset.scss';
99

1010
function App() {
1111
const [isLoaded, setIsLoaded] = useState<boolean>(false);
12-
const [userInfo, setUserInfo] = useState<UserInfo | null>(null);
12+
const [user, setUser] = useState<User | null>(null);
1313

1414
const navigate = useNavigate();
1515
const location = useLocation();
1616

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

2120
setIsLoaded(true);
2221

@@ -25,25 +24,16 @@ function App() {
2524
return;
2625
}
2726

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

4131
useEffect(() => {
4232
autoLogin();
4333
}, []);
4434

4535
return isLoaded ? (
46-
<UserContext.Provider value={{ userInfo, setUserInfo }}>
36+
<UserContext.Provider value={{ user, setUser }}>
4737
<Routes>
4838
<Route path="/" element={<LoginPage />} />
4939
<Route path="/oauth" element={<OAuthPage />} />

client/src/apis/auth.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import { PostLoginParams } from 'params/auth';
2-
import { GetUserInfo } from 'src/types/workspace';
2+
import { User } from 'src/types/user';
3+
import { Workspace } from 'src/types/workspace';
34

45
import { http } from './http';
56
import { CREATED, OK } from './http-status';
67

8+
// TODO: BE API 변경할 때 제거
9+
type GetUserInfo = {
10+
user: User;
11+
workspaces: Workspace[];
12+
};
13+
714
export const getAuth = async (): Promise<GetUserInfo> => {
815
const res = await http.get(`/auth`);
916

client/src/apis/user.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import { GetWorkspaceParams } from 'params/user';
1+
import { GetWorkspaceParams, GetWorkspacesResBody } from 'params/user';
22

33
import { http } from './http';
44
import { OK } from './http-status';
55

6-
export const getWorkspaces = async ({ id }: GetWorkspaceParams) => {
6+
export const getWorkspaces = async ({
7+
id,
8+
}: GetWorkspaceParams): Promise<GetWorkspacesResBody> => {
79
const res = await http.get(`/user/${id}/workspace`);
810

911
if (res.status !== OK) throw new Error();

client/src/components/Sidebar/MemberList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { memo } from 'react';
2-
import { TUser } from 'src/types/user';
2+
import { User } from 'src/types/user';
33

44
import style from './style.module.scss';
55

66
interface MemberListProps {
7-
members: TUser[];
7+
members: User[];
88
}
99

1010
function MemberList({ members }: MemberListProps) {

client/src/components/WorkspaceList/index.tsx

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,16 @@
11
import Selector from 'common/Selector';
22
import WorkspaceModal from 'components/WorkspaceModal';
33
import WorkspaceThumbnaliList from 'components/WorkspaceThumbnailList';
4-
import { memo, useEffect, useState } from 'react';
4+
import { memo, useState } from 'react';
55
import { MENUS } from 'src/constants/workspace';
6-
import WorkspaceContext from 'src/contexts/workspaces';
7-
import { useUserContext } from 'src/hooks/useUserContext';
6+
import useWorkspacesContext from 'src/hooks/useWorkspacesContext';
87
import { SelectorStyle } from 'src/types/selector';
9-
import { Workspace } from 'src/types/workspace';
108

119
import AddButton from './AddButton';
1210
import style from './style.module.scss';
1311

1412
function WorkspaceList() {
15-
const userContext = useUserContext();
16-
17-
const [workspaces, setWorkspaces] = useState<Workspace[]>([]);
18-
19-
useEffect(() => {
20-
if (!userContext.userInfo) {
21-
return;
22-
}
23-
setWorkspaces(userContext.userInfo.workspaces);
24-
}, []);
13+
const { workspaces } = useWorkspacesContext();
2514

2615
const [selectedMenu, setSelectedMenu] = useState<number>(0);
2716

@@ -35,21 +24,19 @@ function WorkspaceList() {
3524
};
3625

3726
return (
38-
<WorkspaceContext.Provider value={{ setWorkspaces }}>
39-
<div className={style['workspace-list-container']}>
40-
<WorkspaceThumbnaliList workspaces={workspaces} />
41-
<Selector
42-
TriggerElement={AddButton}
43-
options={MENUS}
44-
onChange={onSelectMenu}
45-
style={selectorStyle}
46-
/>
47-
<WorkspaceModal
48-
selectedMenu={selectedMenu}
49-
setSelectedMenu={setSelectedMenu}
50-
/>
51-
</div>
52-
</WorkspaceContext.Provider>
27+
<div className={style['workspace-list-container']}>
28+
<WorkspaceThumbnaliList workspaces={workspaces} />
29+
<Selector
30+
TriggerElement={AddButton}
31+
options={MENUS}
32+
onChange={onSelectMenu}
33+
style={selectorStyle}
34+
/>
35+
<WorkspaceModal
36+
selectedMenu={selectedMenu}
37+
setSelectedMenu={setSelectedMenu}
38+
/>
39+
</div>
5340
);
5441
}
5542

client/src/components/WorkspaceModal/CreateModal.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useState } from 'react';
22
import { postWorkspace, postWorkspaceJoin } from 'src/apis/workspace';
33
import { MENU } from 'src/constants/workspace';
4-
import useWorkspaceContext from 'src/hooks/useWorkspaceContext';
4+
import useWorkspacesContext from 'src/hooks/useWorkspacesContext';
55

66
import FormModal, { ModalContents } from './FormModal';
77

@@ -18,7 +18,8 @@ function CreateModal({
1818
setSelectedMenu,
1919
setCode,
2020
}: CreateModalProps) {
21-
const { setWorkspaces } = useWorkspaceContext();
21+
const { setWorkspaces } = useWorkspacesContext();
22+
2223
const [inputValue, setInputValue] = useState<string>('');
2324

2425
const onSubmit = async () => {

client/src/components/WorkspaceModal/JoinModal.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// eslint-disable-next-line import/named
22
import { AxiosError, AxiosResponse } from 'axios';
33
import { useState } from 'react';
4+
import { useNavigate } from 'react-router-dom';
45
import { postWorkspaceJoin } from 'src/apis/workspace';
5-
import useWorkspaceContext from 'src/hooks/useWorkspaceContext';
6+
import useWorkspacesContext from 'src/hooks/useWorkspacesContext';
67

78
import FormModal, { ModalContents } from './FormModal';
89

@@ -12,9 +13,11 @@ interface JoinModalProps {
1213
}
1314

1415
function JoinModal({ modalContents, onClose }: JoinModalProps) {
16+
const navigate = useNavigate();
17+
const { setWorkspaces } = useWorkspacesContext();
18+
1519
const [inputValue, setInputValue] = useState<string>('');
1620

17-
const { setWorkspaces } = useWorkspaceContext();
1821
const [errorMessage, setErrorMessage] = useState<string | undefined>(
1922
undefined,
2023
);
@@ -28,6 +31,7 @@ function JoinModal({ modalContents, onClose }: JoinModalProps) {
2831
});
2932

3033
onClose();
34+
navigate(`/workspace/${workspace.id}`);
3135
} catch (e) {
3236
const { data } = (e as AxiosError).response as AxiosResponse;
3337

client/src/contexts/user.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { createContext, Dispatch, SetStateAction } from 'react';
2-
import { UserInfo } from 'src/types/user';
2+
import { User } from 'src/types/user';
33

44
interface IUserContext {
5-
userInfo: UserInfo | null;
6-
setUserInfo: Dispatch<SetStateAction<UserInfo | null>>;
5+
user: User | null;
6+
setUser: Dispatch<SetStateAction<User | null>>;
77
}
88

99
const UserContext = createContext<IUserContext | null>(null);

client/src/contexts/workspaces.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import { createContext } from 'react';
22
import { Workspace } from 'src/types/workspace';
33

44
interface IWorkspceContext {
5+
workspaces: Workspace[];
56
setWorkspaces: React.Dispatch<React.SetStateAction<Workspace[]>>;
67
}
78

8-
const WorkspaceContext = createContext<IWorkspceContext | null>(null);
9+
const WorkspacesContext = createContext<IWorkspceContext | null>(null);
910

10-
export default WorkspaceContext;
11+
export default WorkspacesContext;

client/src/hooks/useCRDT.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ interface RemoteOperation {
1717
}
1818

1919
export function useCRDT() {
20-
const userContext = useUserContext();
21-
const clientId = userContext.userInfo?.user.id;
20+
const { user } = useUserContext();
21+
22+
if (!user) throw new Error('인증되지 않은 유저에요 ^^');
23+
24+
const { id: clientId } = user;
2225

2326
const crdtRef = useRef<CRDT>(new CRDT(clientId, new LinkedList()));
2427

0 commit comments

Comments
 (0)