Skip to content

Commit c6b7d48

Browse files
authored
Merge pull request #277 from Podo-Store/feat/script-review
feat: sprint-32 개발
2 parents d64971a + 926eff7 commit c6b7d48

File tree

6 files changed

+107
-62
lines changed

6 files changed

+107
-62
lines changed

src/components/detail/PreviewDiv.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const PreviewDiv = ({
6868
setSelectedPage(selectedPage - 1);
6969
}
7070
}}
71+
style={selectedPage === 1 ? { opacity: "0" } : null}
7172
/>
7273
)}
7374

@@ -111,6 +112,7 @@ const PreviewDiv = ({
111112
setSelectedPage(selectedPage + 1);
112113
}
113114
}}
115+
style={selectedPage === showThreshold ? { opacity: "0" } : null}
114116
/>
115117
)}
116118
</div>

src/components/detail/ReviewList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ const ReviewList = React.memo(({ scriptId, review }: ReviewLitProps) => {
206206
</button>
207207
)}
208208

209-
<div className="flex items-center gap-[5px]">
209+
<div className="flex justify-end items-center gap-[5px] w-full">
210210
<button
211211
onClick={() => handleLike()}
212212
disabled={loading}

src/components/detail/ReviewSummary.tsx

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -220,19 +220,23 @@ const ReviewSummary: React.FC<ReviewSummaryProps> = ({ stats }) => {
220220
<div className="absolute left-1/2 -translate-x-1/2 mt-[-10px] w-[1px] h-[267px] bg-[#9E9E9E]"></div>
221221

222222
<div className="flex flex-col items-center w-1/2">
223-
<h3 className="p-medium-regular mb-[48px]">
224-
이 작품은 특히{" "}
225-
<span className="relative p-medium-bold">
226-
{
227-
featureDataWithFull.find(
228-
(d) =>
229-
d.value ===
230-
Math.max(...featureDataWithFull.map((d) => d.value))
231-
)?.name
232-
}
233-
<div className="absolute right-[0px] my-[0px] w-full h-[1px] bg-[#6A39C0]" />
234-
</span>
235-
</h3>
223+
{totalReviewCount > 0 ? (
224+
<h3 className="p-medium-regular mb-[48px]">
225+
이 작품은 특히&nbsp;&nbsp;
226+
<span className="relative p-medium-bold">
227+
{
228+
featureDataWithFull.find(
229+
(d) =>
230+
d.value ===
231+
Math.max(...featureDataWithFull.map((d) => d.value))
232+
)?.name
233+
}
234+
<div className="absolute right-[0px] my-[0px] w-full h-[1px] bg-[#6A39C0]" />
235+
</span>
236+
</h3>
237+
) : (
238+
<h3 className="p-medium-regular mb-[48px]">등록된 후기가 없어요.</h3>
239+
)}
236240
<ResponsiveContainer width={339} height={200}>
237241
<BarChart
238242
data={featureDataWithFull}

src/pages/myPage/AccountInfoChange/ChangeEnter.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ const AccountInfoChangeEnter = ({ setChangeShowPermission }) => {
5757
<h6>회원 정보 수정을 위해서 비밀번호를 다시 한 번 입력해주세요.</h6>
5858
<div className="a-items-start" id="enter-input">
5959
<AuthPwInputField
60-
type="password"
6160
placeholder="비밀번호를 입력해주세요."
6261
value={typedPassword}
6362
onChange={(event) => {

src/pages/myPage/AccountInfoChange/ChangeMain.jsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import axios from "axios";
22
import Cookies from "js-cookie";
33
import { useEffect, useState } from "react";
44

5-
import { AuthInputField, AuthPwInputField } from "../../../components/inputField";
5+
import {
6+
AuthInputField,
7+
AuthPwInputField,
8+
} from "../../../components/inputField";
69
import EnterForm from "../../../components/EnterForm";
710
import PartialLoading from "../../../components/loading/PartialLoading";
811
import SmallOnOffBtn from "../../../components/button/RoundBtn_135_40";
@@ -137,8 +140,8 @@ const AccountInfoChangeMain = ({ setIsDeleteAccountBtnClicked }) => {
137140
};
138141

139142
const onChangeDisableCondition = () => {
140-
// 모든 필드가 공란일 경우
141-
if (!pw && !pwCheck && !name) {
143+
// 비밀번호 필드들이 공란일 경우 disabled
144+
if (!pw && !pwCheck) {
142145
return true;
143146
}
144147

src/pages/work/Detail.tsx

Lines changed: 81 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export interface PostDetail {
8282

8383
const Detail = () => {
8484
const [script, setScript] = useState<PostDetail>();
85+
const [description, setDescription] = useState<string>("");
8586
const [bottomBarStyle, setBottomBarStyle] = useState<React.CSSProperties>({
8687
position: "fixed",
8788
display: "none", // bottom bar 비활성화
@@ -124,18 +125,17 @@ const Detail = () => {
124125
setReviews([]);
125126
setReviewPage(0);
126127

128+
const headers: Record<string, string> = {
129+
"Content-Type": "application/json",
130+
};
131+
132+
const token = Cookies.get("accessToken");
133+
if (token) {
134+
headers["Authorization"] = `Bearer ${token}`;
135+
}
127136
try {
128137
setIsLoading(true);
129138

130-
const headers: Record<string, string> = {
131-
"Content-Type": "application/json",
132-
};
133-
134-
const token = Cookies.get("accessToken");
135-
if (token) {
136-
headers["Authorization"] = `Bearer ${token}`;
137-
}
138-
139139
const response = await axios.get(`${SERVER_URL}scripts/detail`, {
140140
headers: headers,
141141
params: {
@@ -156,7 +156,6 @@ const Detail = () => {
156156
performancePrice: response.data.performancePrice ?? 0,
157157
playType: response.data.playType,
158158
imagePath: response.data.imagePath,
159-
descriptionPath: response.data.descriptionPath,
160159
buyStatus: response.data.buyStatus,
161160
like: response.data.like,
162161
likeCount: response.data.likeCount,
@@ -187,6 +186,19 @@ const Detail = () => {
187186
console.error("❌ 서버 응답:", errMsg);
188187
}
189188
setIsLoading(false);
189+
190+
const { data: description } = await axios.get(
191+
`${SERVER_URL}scripts/description`,
192+
{
193+
headers: headers,
194+
params: {
195+
script: id,
196+
},
197+
responseType: "blob",
198+
}
199+
);
200+
201+
setDescription(URL.createObjectURL(description));
190202
};
191203

192204
getDetail();
@@ -386,6 +398,29 @@ const Detail = () => {
386398
return count;
387399
};
388400

401+
const renderReviewWriteButton = () => {
402+
return (
403+
<button
404+
className="p-large-medium flex justify-end items-center gap-[10px] cursor-pointer hover:text-[#6A39C0]"
405+
onClick={() => {
406+
if (script?.isReviewWritten) {
407+
alert("이미 작성된 후기가 있습니다.");
408+
return;
409+
}
410+
if (!isAuthenticated) {
411+
alert("로그인이 필요한 서비스입니다.");
412+
navigate("/signin");
413+
return;
414+
}
415+
416+
navigate(`/list/review/${id}`);
417+
}}
418+
>
419+
후기 작성하기 <img src={rightArrow} alt=">"></img>
420+
</button>
421+
);
422+
};
423+
389424
return (
390425
<div className=" detail f-dir-column a-items-center">
391426
<FloatingBtn style={{ bottom: "100px" }} />
@@ -732,9 +767,9 @@ const Detail = () => {
732767

733768
<div className=" j-content-center">
734769
{/* PDF 삽입 */}
735-
{script?.descriptionPath ? (
770+
{description ? (
736771
<Document
737-
file={script.descriptionPath}
772+
file={description}
738773
onLoadSuccess={onDocumentLoadSuccess}
739774
loading={<PartialLoading />}
740775
>
@@ -761,20 +796,7 @@ const Detail = () => {
761796
)
762797
</p>
763798
<div className="flex justify-end w-full">
764-
<button
765-
className="p-large-medium flex justify-end items-center gap-[10px] cursor-pointer hover:text-[#6A39C0]"
766-
onClick={() => {
767-
if (!isAuthenticated) {
768-
alert("로그인이 필요한 서비스입니다.");
769-
navigate("/signin");
770-
return;
771-
}
772-
773-
navigate(`/list/review/${id}`);
774-
}}
775-
>
776-
후기 작성하기 <img src={rightArrow} alt=">"></img>
777-
</button>
799+
{renderReviewWriteButton()}
778800
</div>
779801
</section>
780802
<ReviewSummary stats={script?.reviewStatistics!} />
@@ -829,27 +851,42 @@ const Detail = () => {
829851
)}
830852
</div>
831853

832-
{reviews.map((review) => (
833-
<ReviewList
834-
key={review.id}
835-
scriptId={script?.id!}
836-
review={review}
837-
/>
838-
))}
854+
{reviews.length > 0 ? (
855+
reviews.map((review) => (
856+
<ReviewList
857+
key={review.id}
858+
scriptId={script?.id!}
859+
review={review}
860+
/>
861+
))
862+
) : (
863+
<div className="flex flex-col w-full">
864+
<hr className="m-[0px] mb-[74px] w-full bg-[#9E9E9E]" />
865+
<p className="p-large-bold text-center">
866+
작품의 후기를 남겨주세요.
867+
</p>
868+
<div className="mt-[25px] flex justify-center w-full">
869+
{renderReviewWriteButton()}
870+
</div>
871+
</div>
872+
)}
839873
</section>
840874
</section>
841875

842-
<ReviewPagination
843-
currentPage={reviewPage + 1}
844-
totalPages={
845-
Math.ceil((script?.reviewStatistics?.totalReviewCount ?? 5) / 5) ??
846-
1
847-
}
848-
onPageChange={(page) => {
849-
// 0 base로 parsing 필요
850-
setReviewPage(page - 1);
851-
}}
852-
/>
876+
{reviews.length > 0 && (
877+
<ReviewPagination
878+
currentPage={reviewPage + 1}
879+
totalPages={
880+
Math.ceil(
881+
(script?.reviewStatistics?.totalReviewCount ?? 5) / 5
882+
) ?? 1
883+
}
884+
onPageChange={(page) => {
885+
// 0 base로 parsing 필요
886+
setReviewPage(page - 1);
887+
}}
888+
/>
889+
)}
853890
</div>
854891

855892
{!isDetailBtnVisible && (

0 commit comments

Comments
 (0)