작성자
{props.review.nickname}
@@ -82,13 +59,13 @@ export default function ReviewItem(props: ReviewItemProps) {
/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- require */
{
if (evt.key === 'Enter' || evt.key === 'Spacebar') showReviewDetail();
}}
>
-
+
{}}
size="small"
@@ -99,11 +76,11 @@ export default function ReviewItem(props: ReviewItemProps) {
작성자 {props.review.nickname}
{props.review.content}
- {isReviewWrittenByLoginUser ? (
+ {props.review.isMine ? (
/*eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions --
- This is intentional*/
+ This is intentional*/
{
evt.stopPropagation();
}}
@@ -139,14 +116,31 @@ export default function ReviewItem(props: ReviewItemProps) {
))}
- {props.review.replies.map((it) => (
-
- ))}
)}
+ {style.reviewLike.buttonType !== 'NONE' && (
+
+ )}
);
}
diff --git a/apps/web/src/components/review/image-slide.tsx b/apps/web/src/components/review/image-slide.tsx
index ce9cf439..5750b579 100644
--- a/apps/web/src/components/review/image-slide.tsx
+++ b/apps/web/src/components/review/image-slide.tsx
@@ -21,46 +21,42 @@ export default function ImageSlide(props: ImageUrlsProps) {
const length = reviewResizeImageUrls.length;
return length > 0 ? (
-
+
diff --git a/apps/web/src/components/review/image-uploder.tsx b/apps/web/src/components/review/image-uploder.tsx
index 64d23e53..161d7d85 100644
--- a/apps/web/src/components/review/image-uploder.tsx
+++ b/apps/web/src/components/review/image-uploder.tsx
@@ -3,7 +3,9 @@ import { useRef } from 'react';
import Image from 'next/image';
-import type { ImageVideoUrl } from '@/services/api-types/review';
+import CameraIcon from '@/assets/icon/icon-camera.svg';
+import DeleteImageIcon from '@/assets/icon/icon-deleting-image.svg';
+import type { ImageVideoUrl } from '@/models/api-type';
export interface ImageUploaderProps {
uploadImages: ImageVideoUrl;
@@ -57,22 +59,7 @@ export function ImageUploader({ uploadImages, setUploadImages }: ImageUploaderPr
}}
type="button"
>
-
+
))}
@@ -90,25 +77,7 @@ export function ImageUploader({ uploadImages, setUploadImages }: ImageUploaderPr
onClick={handleClick}
type="button"
>
-
+
)}
diff --git a/apps/web/src/components/review/infinite-list.tsx b/apps/web/src/components/review/infinite-list.tsx
index 550dec06..e427bdb1 100644
--- a/apps/web/src/components/review/infinite-list.tsx
+++ b/apps/web/src/components/review/infinite-list.tsx
@@ -2,24 +2,26 @@ import { useEffect } from 'react';
import { useSuspenseInfiniteQuery } from '@tanstack/react-query';
-import type { ReviewListFilter, ReviewListSort } from '@/services/api-types/review';
+import IntersectionBoundary from '@/components/intersection-boundary.tsx';
+import type { ReviewListFilter, ReviewListSort } from '@/models/api-type';
+import type { ReviewLayoutDesign } from '@/models/design-property.ts';
import { useReviewService } from '@/services/review';
import { useConnectedShop } from '@/state/shop';
-import IntersectionBoundary from '../intersection-boundary';
-
-import ReviewItem from './item';
+import BoardStyleReviewItem from './board-style-item.tsx';
+import CardStyleReview from './card-style-item.tsx';
+import TalkStyleReviewItem from './talk-style-item.tsx';
interface MyReviewListProps {
+ layoutDesign: ReviewLayoutDesign;
productID: string;
filter: ReviewListFilter;
sort: ReviewListSort;
}
-export default function InfiniteList({ productID, filter, sort }: MyReviewListProps) {
+export default function InfiniteList({ layoutDesign, productID, filter, sort }: MyReviewListProps) {
const { id, userID } = useConnectedShop();
const reviewService = useReviewService();
-
const reviewListQuery = useSuspenseInfiniteQuery({
queryKey: ['review-list', { id, productID, filter, sort }],
queryFn: ({ pageParam }) => {
@@ -51,18 +53,33 @@ export default function InfiniteList({ productID, filter, sort }: MyReviewListPr
window.removeEventListener('message', handleMessage);
};
}, []);
-
const reviews = reviewListQuery.data.pages.flatMap((it) => it.data.content);
-
return (
<>
- {reviews.map((it) => (
-
- ))}
+ {reviews.map((it) => {
+ if (layoutDesign === 'CARD') {
+ return (
+
+ );
+ } else if (layoutDesign === 'TALK') {
+ return (
+
+ );
+ }
+ return (
+
+ );
+ })}
>
diff --git a/apps/web/src/components/review/list.tsx b/apps/web/src/components/review/list.tsx
index 3e697627..9f417e11 100644
--- a/apps/web/src/components/review/list.tsx
+++ b/apps/web/src/components/review/list.tsx
@@ -1,10 +1,10 @@
-import { Suspense, useState } from 'react';
+import { Suspense, useState, useMemo } from 'react';
import { generateBorderCSS, generatePaddingCSS, generateShadowCSS } from '@review-canvas/theme';
-import PaginatedList from '@/components/review/paginated-list.tsx';
-import { useReviewListStyle } from '@/contexts/style/review-list.ts';
-import type { ReviewListFilter, ReviewListSort } from '@/services/api-types/review.tsx';
+import PaginatedList from '@/components/review/paginated-list';
+import { useReviewListStyle } from '@/contexts/style/review-list-style';
+import type { ReviewListFilter, ReviewListSort } from '@/models/api-type';
import { Filter } from './filter';
import InfiniteList from './infinite-list';
@@ -16,7 +16,8 @@ interface ReviewListProps {
export default function ReviewList({ productID }: ReviewListProps) {
const style = useReviewListStyle();
-
+ style.reviewLayoutDesign = 'BOARD';
+ const layoutDesign = useMemo(() => style.reviewLayoutDesign, []);
const [filter, setFilter] = useState
('ALL');
const [sort, setSort] = useState('LATEST');
@@ -75,12 +76,14 @@ export default function ReviewList({ productID }: ReviewListProps) {
{style.paginationStyle === 'page' ? (
) : (
diff --git a/apps/web/src/components/review/my-infinite-list.tsx b/apps/web/src/components/review/my-page/infinite-list.tsx
similarity index 72%
rename from apps/web/src/components/review/my-infinite-list.tsx
rename to apps/web/src/components/review/my-page/infinite-list.tsx
index 96cd8248..c325cfa6 100644
--- a/apps/web/src/components/review/my-infinite-list.tsx
+++ b/apps/web/src/components/review/my-page/infinite-list.tsx
@@ -2,31 +2,27 @@ import { useEffect } from 'react';
import { useSuspenseInfiniteQuery } from '@tanstack/react-query';
-import type { ReviewListFilter, ReviewListSort } from '@/services/api-types/review';
+import IntersectionBoundary from '@/components/intersection-boundary';
+import ReviewItem from '@/components/review/board-style-item';
+import type { ReviewListFilter, ReviewListSort } from '@/models/api-type';
import { useReviewService } from '@/services/review';
import { useConnectedShop } from '@/state/shop';
-import IntersectionBoundary from '../intersection-boundary';
-
-import ReviewItem from './item';
-
interface MyReviewListProps {
- productID: string;
filter: ReviewListFilter;
sort: ReviewListSort;
}
-export default function MyInfiniteList({ productID, filter, sort }: MyReviewListProps) {
+export default function InfiniteList({ filter, sort }: MyReviewListProps) {
const { id, userID } = useConnectedShop();
const reviewService = useReviewService();
const myReviewListQuery = useSuspenseInfiniteQuery({
- queryKey: ['my-list', { id, productID, filter, sort }],
+ queryKey: ['my-list', { id, filter, sort }],
queryFn: ({ pageParam }) => {
return reviewService.myReiveiwList({
mallId: id,
memberId: userID,
- productNo: Number(productID),
sort,
filter,
page: pageParam,
@@ -58,10 +54,13 @@ export default function MyInfiniteList({ productID, filter, sort }: MyReviewList
<>
{reviews.map((it) => (
-
+
+
+
))}
diff --git a/apps/web/src/components/review/my-page/list.tsx b/apps/web/src/components/review/my-page/list.tsx
new file mode 100644
index 00000000..b2e318dd
--- /dev/null
+++ b/apps/web/src/components/review/my-page/list.tsx
@@ -0,0 +1,86 @@
+import { Suspense, useState } from 'react';
+
+import { generateBorderCSS, generatePaddingCSS, generateShadowCSS } from '@review-canvas/theme';
+
+import { Filter } from '@/components/review/filter';
+import { OrderSelector } from '@/components/review/order-selector';
+import { useReviewListStyle } from '@/contexts/style/review-list-style.ts';
+import type { ReviewListFilter, ReviewListSort } from '@/models/api-type';
+
+import InfiniteList from './infinite-list.tsx';
+import PaginatedList from './paginated-list.tsx';
+
+export default function MyReviewList() {
+ const style = useReviewListStyle();
+
+ const [filter, setFilter] = useState('ALL');
+ const [sort, setSort] = useState('LATEST');
+
+ return (
+
+
+
+
+
+
+
+
+ loading reviews... }>
+