Skip to content

Commit 7a9e830

Browse files
authored
Merge pull request #273 from ItRecode/FE-260
[FE-260] feat: μ„€μ • νŽ˜μ΄μ§€ λΌμš°ν„° λ³€κ²½, 상세 νŽ˜μ΄μ§€ μ„œμŠ€νŽœμŠ€ 적용
2 parents 39260ad + 90745ba commit 7a9e830

4 files changed

Lines changed: 180 additions & 122 deletions

File tree

β€Žsrc/components/Loading.tsxβ€Ž

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import React from 'react'
22
import Spinner from './Spinner'
33

4-
export default function Loading() {
4+
const Loading = React.memo(function LoadingComponent() {
55
return (
66
<div className="flex h-full flex-col items-center justify-center">
77
<Spinner size="large" />
88
<h3 className="mt-8 text-base font-medium">λ‘œλ”© 쀑 μ΄μ—μš”</h3>
99
<p className="mt-3 text-xs">μž μ‹œλ§Œ κΈ°λ‹€λ € μ£Όμ„Έμš”</p>
1010
</div>
1111
)
12-
}
12+
})
13+
14+
export default Loading

β€Žsrc/pages/DetailRecord/DetailRecord.tsxβ€Ž

Lines changed: 56 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import BackButton from '@components/BackButton'
22
import Button from '@components/Button'
33
import Chip from '@components/Chip'
4-
import MoreButton from '@components/MoreButton'
5-
import React, { useState } from 'react'
6-
import { useEffect } from 'react'
4+
import React, { Suspense, lazy, useState, useEffect } from 'react'
75
import { useLocation, useNavigate, useParams } from 'react-router-dom'
86
import { IRecordDataType } from 'types/recordData'
97
import {
@@ -13,16 +11,12 @@ import {
1311
import { getCreatedDate } from './getCreatedDate'
1412
import ReplyList from './ReplyList'
1513
import ReplyInput from './ReplyInput'
16-
import MemoizedShareModal from './ShareModal'
17-
import EditModal from './EditModal'
1814
import { useRef } from 'react'
19-
import Modal from '@components/Modal'
2015
import { deleteRecord, getRecord } from '@apis/record'
2116
import { useQuery } from '@tanstack/react-query'
2217
import { getChipIconName } from './getChipIconName'
2318
import ImageContainer from './ImageContainer'
2419
import { useUser } from '@react-query/hooks/useUser'
25-
import Alert from '@components/Alert'
2620
import { AxiosError } from 'axios'
2721
import { createBrowserHistory } from 'history'
2822
import { useResetRecoilState, useSetRecoilState } from 'recoil'
@@ -34,7 +28,13 @@ import {
3428
} from '@store/detailPageAtom'
3529
import { SessionStorage } from '@utils/sessionStorage'
3630
import { PREVIOUS_URL } from '@assets/constant/others'
37-
import NotFound from '@pages/NotFound/NotFound'
31+
32+
const MoreButton = lazy(() => import('@components/MoreButton'))
33+
const NotFound = lazy(() => import('@pages/NotFound/NotFound'))
34+
const Alert = lazy(() => import('@components/Alert'))
35+
const Modal = lazy(() => import('@components/Modal'))
36+
const MemoizedShareModal = lazy(() => import('./ShareModal'))
37+
const EditModal = lazy(() => import('./EditModal'))
3838

3939
export default function DetailRecord() {
4040
const [shareStatus, setShareStatus] = useState(false)
@@ -144,54 +144,64 @@ export default function DetailRecord() {
144144
const handleBackButton = () => {
145145
navigate(`/${SessionStorage.get(PREVIOUS_URL)}`)
146146
}
147-
148147
return (
149148
<>
150149
{isError ? (
151-
<NotFound />
150+
<Suspense>
151+
<NotFound />
152+
</Suspense>
152153
) : (
153154
<div className="relative h-screen w-full">
154155
{shareStatus && (
155-
<Modal visible={shareStatus} onClose={() => setShareStatus(false)}>
156-
<MemoizedShareModal
157-
setShareStatus={setShareStatus}
158-
recordId={recordId}
159-
title={title}
160-
description={content}
161-
backgroundColor={background_color}
162-
iconName={iconName}
163-
imageUrl={imageUrls[0]}
164-
/>
165-
</Modal>
156+
<Suspense>
157+
<Modal
158+
visible={shareStatus}
159+
onClose={() => setShareStatus(false)}
160+
>
161+
<MemoizedShareModal
162+
setShareStatus={setShareStatus}
163+
recordId={recordId}
164+
title={title}
165+
description={content}
166+
backgroundColor={background_color}
167+
iconName={iconName}
168+
imageUrl={imageUrls[0]}
169+
/>
170+
</Modal>
171+
</Suspense>
166172
)}
167173
{editModalState && (
168-
<EditModal
169-
POST_ID={POST_ID}
170-
setIsDelete={setIsDelete}
171-
setEditModalState={setEditModalState}
172-
/>
174+
<Suspense>
175+
<EditModal
176+
POST_ID={POST_ID}
177+
setIsDelete={setIsDelete}
178+
setEditModalState={setEditModalState}
179+
/>
180+
</Suspense>
173181
)}
174182
{isDelete && (
175-
<Alert
176-
mainMessage={
177-
<div className="text-base font-semibold leading-6">
178-
μ •λ§λ‘œ 이 λ ˆμ½”λ“œλ₯Ό
179-
<br />
180-
<span className="text-sub-1">μ‚­μ œ</span>ν•˜μ‹œκ² μ–΄μš”?
181-
</div>
182-
}
183-
subMessage={<>μ‚­μ œ ν›„ λ³΅κ΅¬λŠ” λΆˆκ°€λŠ₯ν•΄μš”.</>}
184-
visible={isDelete}
185-
cancelMessage="μ·¨μ†Œ"
186-
confirmMessage="μ‚­μ œ"
187-
danger={true}
188-
onClose={() => setIsDelete(false)}
189-
onCancel={() => setIsDelete(false)}
190-
onConfirm={() => {
191-
deleteRecordById(POST_ID)
192-
navigate(-1)
193-
}}
194-
/>
183+
<Suspense>
184+
<Alert
185+
mainMessage={
186+
<div className="text-base font-semibold leading-6">
187+
μ •λ§λ‘œ 이 λ ˆμ½”λ“œλ₯Ό
188+
<br />
189+
<span className="text-sub-1">μ‚­μ œ</span>ν•˜μ‹œκ² μ–΄μš”?
190+
</div>
191+
}
192+
subMessage={<>μ‚­μ œ ν›„ λ³΅κ΅¬λŠ” λΆˆκ°€λŠ₯ν•΄μš”.</>}
193+
visible={isDelete}
194+
cancelMessage="μ·¨μ†Œ"
195+
confirmMessage="μ‚­μ œ"
196+
danger={true}
197+
onClose={() => setIsDelete(false)}
198+
onCancel={() => setIsDelete(false)}
199+
onConfirm={() => {
200+
deleteRecordById(POST_ID)
201+
navigate(-1)
202+
}}
203+
/>
204+
</Suspense>
195205
)}
196206
<header className="p-4">
197207
<nav className="flex justify-between">

β€Žsrc/pages/DetailRecord/ReplyItem.tsxβ€Ž

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
import { INPUT_MODE } from '@assets/constant/constant'
22
import { useUser } from '@react-query/hooks/useUser'
33
import { scrollTarget } from '@store/atom'
4-
import React, { useEffect, useRef, useState } from 'react'
4+
import React, { Suspense, useEffect, useRef, useState } from 'react'
55
import { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil'
66
import { CommentData } from 'types/replyData'
77
import { getCreatedDate } from './getCreatedDate'
8-
import NestedReplyList from './NestedReplyList'
98
import { ReactComponent as Arrow_Down_icon } from '@assets/detail_page_icon/arrow_down.svg'
109
import { ReactComponent as Arrow_Up_icon } from '@assets/detail_page_icon/arrow_up.svg'
1110
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
1211
import { deleteReply, getReply } from '@apis/reply'
13-
import Alert from '@components/Alert'
1412
import {
1513
DetailPageInputMode,
1614
modifyComment,
1715
nestedReplyState,
1816
} from '@store/detailPageAtom'
1917

18+
const NestedReplyList = React.lazy(() => import('./NestedReplyList'))
19+
const Alert = React.lazy(() => import('@components/Alert'))
20+
2021
export default function ReplyItem({
2122
content,
2223
createdAt,
@@ -165,31 +166,35 @@ export default function ReplyItem({
165166
)}
166167

167168
{openNestedReplyList && (
168-
<NestedReplyList
169-
nestedReplyData={
170-
nestedReplyData && nestedReplyData.data.commentList
171-
}
172-
isLoading={isLoading}
173-
recordwriter={recordwriter}
174-
recordId={recordId}
175-
parentId={commentId}
176-
/>
169+
<Suspense>
170+
<NestedReplyList
171+
nestedReplyData={
172+
nestedReplyData && nestedReplyData.data.commentList
173+
}
174+
isLoading={isLoading}
175+
recordwriter={recordwriter}
176+
recordId={recordId}
177+
parentId={commentId}
178+
/>
179+
</Suspense>
177180
)}
178181
</div>
179182
{deleteAlert && (
180-
<Alert
181-
visible={deleteAlert}
182-
mainMessage={<>λŒ“κΈ€μ„ μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?</>}
183-
subMessage={<>μ‚­μ œ ν›„ λ³΅κ΅¬λŠ” λΆˆκ°€λŠ₯ν•΄μš”.</>}
184-
cancelMessage="μ•„λ‹ˆμ˜€"
185-
confirmMessage="예"
186-
onClose={() => setDeleteAlert(false)}
187-
onCancel={() => setDeleteAlert(false)}
188-
onConfirm={() => {
189-
onDeleteReply()
190-
}}
191-
danger={true}
192-
/>
183+
<Suspense>
184+
<Alert
185+
visible={deleteAlert}
186+
mainMessage={<>λŒ“κΈ€μ„ μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?</>}
187+
subMessage={<>μ‚­μ œ ν›„ λ³΅κ΅¬λŠ” λΆˆκ°€λŠ₯ν•΄μš”.</>}
188+
cancelMessage="μ•„λ‹ˆμ˜€"
189+
confirmMessage="예"
190+
onClose={() => setDeleteAlert(false)}
191+
onCancel={() => setDeleteAlert(false)}
192+
onConfirm={() => {
193+
onDeleteReply()
194+
}}
195+
danger={true}
196+
/>
197+
</Suspense>
193198
)}
194199
</div>
195200
)

0 commit comments

Comments
Β (0)