Skip to content

Commit 925e9ff

Browse files
authored
refactor(fe): use useShallow access for improved performance (#24)
refactor: use shallow state access for improved performance
1 parent 37f4a13 commit 925e9ff

File tree

13 files changed

+112
-41
lines changed

13 files changed

+112
-41
lines changed

apps/client/src/components/Header.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Link, useNavigate } from '@tanstack/react-router';
2+
import { useShallow } from 'zustand/react/shallow';
23

34
import { logout, useAuthStore } from '@/features/auth';
45
import { useModal } from '@/features/modal';
@@ -7,7 +8,12 @@ import { useToastStore } from '@/features/toast';
78
import { Button, SignInModal, SignUpModal } from '@/components';
89

910
function Header() {
10-
const { isLogin, clearAuthInformation: clearAccessToken } = useAuthStore();
11+
const { isLogin, clearAuthInformation: clearAccessToken } = useAuthStore(
12+
useShallow((state) => ({
13+
isLogin: state.isLogin,
14+
clearAuthInformation: state.clearAuthInformation,
15+
})),
16+
);
1117

1218
const addToast = useToastStore((state) => state.addToast);
1319

apps/client/src/components/modal/CreateQuestionModal.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useMutation } from '@tanstack/react-query';
22
import { useEffect, useState } from 'react';
33
import Markdown from 'react-markdown';
4+
import { useShallow } from 'zustand/react/shallow';
45

56
import { useModalContext } from '@/features/modal';
67
import { useSessionStore } from '@/features/session';
@@ -14,11 +15,19 @@ interface CreateQuestionModalProps {
1415
}
1516

1617
function CreateQuestionModal({ question }: CreateQuestionModalProps) {
17-
const { addToast } = useToastStore();
18-
1918
const { closeModal } = useModalContext();
2019

21-
const { sessionId, sessionToken, expired, addQuestion, updateQuestion } = useSessionStore();
20+
const addToast = useToastStore((state) => state.addToast);
21+
22+
const { sessionId, sessionToken, expired, addQuestion, updateQuestion } = useSessionStore(
23+
useShallow((state) => ({
24+
sessionId: state.sessionId,
25+
sessionToken: state.sessionToken,
26+
expired: state.expired,
27+
addQuestion: state.addQuestion,
28+
updateQuestion: state.updateQuestion,
29+
})),
30+
);
2231

2332
const [body, setBody] = useState('');
2433

apps/client/src/components/modal/CreateReplyModal.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useMutation } from '@tanstack/react-query';
22
import { useEffect, useState } from 'react';
33
import Markdown from 'react-markdown';
4+
import { useShallow } from 'zustand/react/shallow';
45

56
import { useModalContext } from '@/features/modal';
67
import { useSessionStore } from '@/features/session';
@@ -17,9 +18,17 @@ interface CreateReplyModalProps {
1718
function CreateReplyModal({ question, reply }: CreateReplyModalProps) {
1819
const { closeModal } = useModalContext();
1920

20-
const { addToast } = useToastStore();
21+
const addToast = useToastStore((state) => state.addToast);
2122

22-
const { sessionToken, sessionId, expired, addReply, updateReply } = useSessionStore();
23+
const { sessionToken, sessionId, expired, addReply, updateReply } = useSessionStore(
24+
useShallow((state) => ({
25+
sessionToken: state.sessionToken,
26+
sessionId: state.sessionId,
27+
expired: state.expired,
28+
addReply: state.addReply,
29+
updateReply: state.updateReply,
30+
})),
31+
);
2332

2433
const [body, setBody] = useState('');
2534

apps/client/src/components/modal/SessionParticipantsModal.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useMutation } from '@tanstack/react-query';
22
import { isAxiosError } from 'axios';
33
import { useEffect, useState } from 'react';
44
import { IoClose } from 'react-icons/io5';
5+
import { useShallow } from 'zustand/react/shallow';
56

67
import { useModalContext } from '@/features/modal';
78
import { getSessionUsers, patchSessionHost, useSessionStore } from '@/features/session';
@@ -13,10 +14,19 @@ import Participant from '@/components/modal/Participant';
1314
function SessionParticipantsModal() {
1415
const { closeModal } = useModalContext();
1516

16-
const { addToast } = useToastStore();
17-
1817
const { sessionUsers, sessionId, sessionToken, setSessionUsers, updateSessionUser, updateReplyIsHost } =
19-
useSessionStore();
18+
useSessionStore(
19+
useShallow((state) => ({
20+
sessionUsers: state.sessionUsers,
21+
sessionId: state.sessionId,
22+
sessionToken: state.sessionToken,
23+
setSessionUsers: state.setSessionUsers,
24+
updateSessionUser: state.updateSessionUser,
25+
updateReplyIsHost: state.updateReplyIsHost,
26+
})),
27+
);
28+
29+
const addToast = useToastStore((state) => state.addToast);
2030

2131
const [selectedUserId, setSelectedUserId] = useState<number>();
2232

apps/client/src/components/qna/ChattingList.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { AnimatePresence, motion } from 'motion/react';
22
import { useCallback, useEffect, useRef, useState } from 'react';
3+
import { useShallow } from 'zustand/react/shallow';
34

45
import { useSessionStore } from '@/features/session';
56
import { getChattingList } from '@/features/session/chatting';
@@ -8,7 +9,16 @@ import { useSocket } from '@/features/socket';
89
import ChattingMessage from '@/components/qna/ChattingMessage';
910

1011
function ChattingList() {
11-
const { expired, chatting, participantCount, sessionId, sessionToken, addChattingToFront } = useSessionStore();
12+
const { expired, chatting, participantCount, sessionId, sessionToken, addChattingToFront } = useSessionStore(
13+
useShallow((state) => ({
14+
expired: state.expired,
15+
chatting: state.chatting,
16+
participantCount: state.participantCount,
17+
sessionId: state.sessionId,
18+
sessionToken: state.sessionToken,
19+
addChattingToFront: state.addChattingToFront,
20+
})),
21+
);
1222

1323
const [message, setMessage] = useState('');
1424
const [isBottom, setIsBottom] = useState(true);

apps/client/src/components/qna/QuestionDetail.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useNavigate } from '@tanstack/react-router';
22
import { GoArrowLeft } from 'react-icons/go';
33
import Markdown from 'react-markdown';
4+
import { useShallow } from 'zustand/react/shallow';
45

56
import { useModal } from '@/features/modal';
67
import { useSessionStore } from '@/features/session';
@@ -11,9 +12,14 @@ import ReplyItem from '@/components/qna/ReplyItem';
1112
function QuestionDetail() {
1213
const navigate = useNavigate();
1314

14-
const { questions, expired } = useSessionStore();
15-
16-
const { selectedQuestionId, setSelectedQuestionId } = useSessionStore();
15+
const { questions, expired, selectedQuestionId, setSelectedQuestionId } = useSessionStore(
16+
useShallow((state) => ({
17+
questions: state.questions,
18+
expired: state.expired,
19+
selectedQuestionId: state.selectedQuestionId,
20+
setSelectedQuestionId: state.setSelectedQuestionId,
21+
})),
22+
);
1723

1824
const question = questions.find((q) => q.questionId === selectedQuestionId);
1925

apps/client/src/components/qna/QuestionItem.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { GoCheck } from 'react-icons/go';
77
import { GrClose, GrLike, GrLikeFill, GrPin } from 'react-icons/gr';
88
import { RiQuestionAnswerLine } from 'react-icons/ri';
99
import Markdown from 'react-markdown';
10+
import { useShallow } from 'zustand/react/shallow';
1011

1112
import { useModal } from '@/features/modal';
1213
import { useSessionStore } from '@/features/session';
@@ -34,13 +35,17 @@ function QuestionItem({ question, onQuestionSelect }: QuestionItemProps) {
3435
<CreateQuestionModal question={question} />,
3536
);
3637

37-
const sessionToken = useSessionStore((state) => state.sessionToken);
38-
const sessionId = useSessionStore((state) => state.sessionId);
39-
const isHost = useSessionStore((state) => state.isHost);
40-
const expired = useSessionStore((state) => state.expired);
41-
const removeQuestion = useSessionStore((state) => state.removeQuestion);
42-
const updateQuestion = useSessionStore((state) => state.updateQuestion);
43-
const setFromDetail = useSessionStore((state) => state.setFromDetail);
38+
const { sessionToken, sessionId, isHost, expired, removeQuestion, updateQuestion, setFromDetail } = useSessionStore(
39+
useShallow((state) => ({
40+
sessionToken: state.sessionToken,
41+
sessionId: state.sessionId,
42+
isHost: state.isHost,
43+
expired: state.expired,
44+
removeQuestion: state.removeQuestion,
45+
updateQuestion: state.updateQuestion,
46+
setFromDetail: state.setFromDetail,
47+
})),
48+
);
4449

4550
const addToast = useToastStore((state) => state.addToast);
4651

apps/client/src/components/qna/QuestionList.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { motion } from 'motion/react';
33
import { useMemo, useRef, useState } from 'react';
44
import { GrValidate } from 'react-icons/gr';
55
import { IoClose, IoShareSocialOutline } from 'react-icons/io5';
6+
import { useShallow } from 'zustand/react/shallow';
67

78
import { useModal } from '@/features/modal';
89
import { postSessionTerminate, useSessionStore } from '@/features/session';
@@ -15,14 +16,19 @@ import QuestionSection from '@/components/qna/QuestionSection';
1516
import SessionSettingsDropdown from '@/components/qna/SessionSettingsDropdown';
1617

1718
function QuestionList() {
18-
const isHost = useSessionStore((state) => state.isHost);
19-
const expired = useSessionStore((state) => state.expired);
20-
const questions = useSessionStore((state) => state.questions);
21-
const sessionId = useSessionStore((state) => state.sessionId);
22-
const sessionTitle = useSessionStore((state) => state.sessionTitle);
23-
const sessionToken = useSessionStore((state) => state.sessionToken);
24-
const setExpired = useSessionStore((state) => state.setExpired);
25-
const setSelectedQuestionId = useSessionStore((state) => state.setSelectedQuestionId);
19+
const { isHost, expired, questions, sessionId, sessionTitle, sessionToken, setExpired, setSelectedQuestionId } =
20+
useSessionStore(
21+
useShallow((state) => ({
22+
isHost: state.isHost,
23+
expired: state.expired,
24+
questions: state.questions,
25+
sessionId: state.sessionId,
26+
sessionTitle: state.sessionTitle,
27+
sessionToken: state.sessionToken,
28+
setExpired: state.setExpired,
29+
setSelectedQuestionId: state.setSelectedQuestionId,
30+
})),
31+
);
2632

2733
const addToast = useToastStore((state) => state.addToast);
2834

apps/client/src/components/qna/ReplyItem.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useCallback } from 'react';
44
import { FiEdit2 } from 'react-icons/fi';
55
import { GrClose, GrLike, GrLikeFill, GrValidate } from 'react-icons/gr';
66
import Markdown from 'react-markdown';
7+
import { useShallow } from 'zustand/react/shallow';
78

89
import { useModal } from '@/features/modal';
910
import { useSessionStore } from '@/features/session';
@@ -19,9 +20,17 @@ interface ReplyItemProps {
1920
}
2021

2122
function ReplyItem({ question, reply }: ReplyItemProps) {
22-
const { addToast } = useToastStore();
23+
const addToast = useToastStore((state) => state.addToast);
2324

24-
const { sessionId, sessionToken, isHost, expired, updateReply } = useSessionStore();
25+
const { sessionId, sessionToken, isHost, expired, updateReply } = useSessionStore(
26+
useShallow((state) => ({
27+
sessionId: state.sessionId,
28+
sessionToken: state.sessionToken,
29+
isHost: state.isHost,
30+
expired: state.expired,
31+
updateReply: state.updateReply,
32+
})),
33+
);
2534

2635
const { Modal: CreateReply, openModal: openCreateReplyModal } = useModal(
2736
<CreateReplyModal question={question} reply={reply} />,

apps/client/src/features/auth/auth.hook.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import { ValidationStatusWithMessage } from '@/shared';
1313
export function useSignInForm() {
1414
const router = useRouterState();
1515

16-
const { setAuthInformation } = useAuthStore();
16+
const setAuthInformation = useAuthStore((state) => state.setAuthInformation);
1717

18-
const { addToast } = useToastStore();
18+
const addToast = useToastStore((state) => state.addToast);
1919

2020
const [email, setEmail] = useState('');
2121

0 commit comments

Comments
 (0)