Skip to content
3 changes: 0 additions & 3 deletions src/components/Modal/ReviewModal/EditReviewModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -300,9 +300,6 @@ const EditReviewModal = ({

return (
<div>
<Button variant='purpleDark' size='xs' width='sm' onClick={() => setShowEditModal(true)}>
๋ฆฌ๋ทฐ ์ˆ˜์ •ํ•˜๊ธฐ
</Button>
{isDesktop ? (
<BasicModal
type='review'
Expand Down
7 changes: 6 additions & 1 deletion src/components/Modal/WineModal/EditWineModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,13 @@ const EditWineModal = ({ wine, showEditModal, setShowEditModal }: EditWineModalP
const onSubmit = async (form: WineForm) => {
try {
const file = form.wineImage?.[0];
const imageUrl = file ? await uploadImage(file) : wine.image;
let imageUrl = file ? await uploadImage(file) : wine.image;

if (file) {
const uploaded = await uploadImage(file);
imageUrl = uploaded + `?t=${Date.now()}`; // ์บ์‹œ ๋ฐฉ์ง€
setPreviewImage(imageUrl); // ์ด๋ฏธ์ง€ ๊ฐฑ์‹ 
}
updateWineMutation.mutate({
wineId: wine.wineId,
name: form.wineName,
Expand Down
38 changes: 35 additions & 3 deletions src/components/my-profile/ReviewList.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import React, { useEffect, useRef } from 'react';
import React, { useEffect, useRef, useState } from 'react';

import { useInfiniteQuery } from '@tanstack/react-query';

import { getMyReviews } from '@/api/myReviews';
import DotIcon from '@/assets/icons/dot.svg';
import { MyCard } from '@/components/common/card/MyCard';
import MenuDropdown from '@/components/common/dropdown/MenuDropdown';
import DeleteModal from '@/components/Modal/DeleteModal/DeleteModal';
import EditReviewModal from '@/components/Modal/ReviewModal/EditReviewModal';
import { Badge } from '@/components/ui/badge';
import { useInfiniteScroll } from '@/hooks/useInfiniteScroll';
import { MyReview } from '@/types/MyReviewsTypes';
Expand All @@ -23,12 +25,14 @@ interface ReviewListProps {
*
*/
export function ReviewList({ setTotalCount }: ReviewListProps) {
const [editReview, setEditReview] = useState<MyReview | null>(null);
const [deleteReviewId, setDeleteReviewId] = useState<number | null>(null);
const observerRef = useRef<HTMLDivElement | null>(null);

// useInfiniteQuery ํ›…์œผ๋กœ ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌดํ•œ ์Šคํฌ๋กค ํ˜•ํƒœ๋กœ ์กฐํšŒ
const { data, isLoading, isError, fetchNextPage, hasNextPage, isFetchingNextPage } =
useInfiniteQuery({
queryKey: ['myReviews'],
queryKey: ['reviews'],
queryFn: ({ pageParam = 0 }) => getMyReviews({ cursor: pageParam, limit: PAGE_LIMIT }),
initialPageParam: 0,
getNextPageParam: (lastPage) => lastPage.nextCursor ?? null,
Expand Down Expand Up @@ -82,11 +86,39 @@ export function ReviewList({ setTotalCount }: ReviewListProps) {
{ label: '์ˆ˜์ •ํ•˜๊ธฐ', value: 'edit' },
{ label: '์‚ญ์ œํ•˜๊ธฐ', value: 'delete' },
]}
onSelect={(value) => console.log(`${value} clicked: review id=${review.id}`)}
onSelect={(value) => {
if (value === 'edit') {
setEditReview(review);
} else if (value === 'delete') {
setDeleteReviewId(review.id);
}
}}
/>
}
/>
))}
{editReview && (
<EditReviewModal
wineName={editReview.wine.name}
reviewData={editReview}
showEditModal={!!editReview}
setShowEditModal={(open) => {
if (!open) setEditReview(null);
}}
/>
)}

{deleteReviewId !== null && (
<DeleteModal
type='review'
id={deleteReviewId}
showDeleteModal={true}
setShowDeleteModal={(open) => {
if (!open) setDeleteReviewId(null);
}}
/>
)}

{/* ์˜ต์ €๋ฒ„ ๊ฐ์ง€ ์š”์†Œ */}
<div ref={observerRef} className='w-1 h-1' />
</div>
Expand Down
45 changes: 42 additions & 3 deletions src/components/my-profile/WineList.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useEffect, useRef } from 'react';
import React, { useEffect, useRef, useState } from 'react';

import { useInfiniteQuery } from '@tanstack/react-query';

Expand All @@ -9,6 +9,9 @@ import MenuDropdown from '@/components/common/dropdown/MenuDropdown';
import { Badge } from '@/components/ui/badge';
import { useInfiniteScroll } from '@/hooks/useInfiniteScroll';

import DeleteModal from '../Modal/DeleteModal/DeleteModal';
import EditWineModal from '../Modal/WineModal/EditWineModal';

import type { MyWine, MyWinesResponse } from '@/types/MyWinesTypes';

const PAGE_LIMIT = 10;
Expand All @@ -24,11 +27,13 @@ interface WineListProps {
*/
export function WineList({ setTotalCount }: WineListProps) {
const observerRef = useRef<HTMLDivElement | null>(null);
const [editWine, setEditWine] = useState<MyWine | null>(null);
const [deleteWineId, setDeleteWineId] = useState<number | null>(null);

//useInfiniteQuery ํ›…์œผ๋กœ ์™€์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌดํ•œ ์Šคํฌ๋กค ํ˜•ํƒœ๋กœ ์กฐํšŒ
const { data, isLoading, isError, fetchNextPage, hasNextPage, isFetchingNextPage } =
useInfiniteQuery({
queryKey: ['myWines'],
queryKey: ['wines'],
queryFn: ({ pageParam = 0 }) => getMyWines({ cursor: pageParam, limit: PAGE_LIMIT }),
initialPageParam: 0,
getNextPageParam: (lastPage: MyWinesResponse | undefined) => lastPage?.nextCursor ?? null,
Expand Down Expand Up @@ -74,7 +79,13 @@ export function WineList({ setTotalCount }: WineListProps) {
{ label: '์ˆ˜์ •ํ•˜๊ธฐ', value: 'edit' },
{ label: '์‚ญ์ œํ•˜๊ธฐ', value: 'delete' },
]}
onSelect={(value) => console.log(`${value} clicked for wine id: ${wine.id}`)}
onSelect={(value) => {
if (value === 'edit') {
setEditWine(wine);
} else if (value === 'delete') {
setDeleteWineId(wine.id);
}
}}
/>
}
>
Expand All @@ -93,6 +104,34 @@ export function WineList({ setTotalCount }: WineListProps) {
</div>
</ImageCard>
))}
{editWine && (
<EditWineModal
wine={{
wineId: editWine.id, // MyWine โ†’ EditWineModal ํƒ€์ž… ๋ณ€ํ™˜
name: editWine.name,
price: editWine.price,
region: editWine.region,
image: editWine.image,
type: editWine.type as 'RED' | 'WHITE' | 'SPARKLING',
avgRating: editWine.avgRating,
}}
showEditModal={true}
setShowEditModal={(isOpen) => {
if (!isOpen) setEditWine(null);
}}
/>
)}

{deleteWineId !== null && (
<DeleteModal
type='wine'
id={deleteWineId}
showDeleteModal={true}
setShowDeleteModal={(isOpen) => {
if (!isOpen) setDeleteWineId(null);
}}
/>
)}
{/* ์˜ต์ €๋ฒ„ ๊ฐ์ง€ ์š”์†Œ */}
<div ref={observerRef} className='w-1 h-1' />
</div>
Expand Down