오늘부터 유저 테스트를 받기 시작했다.
아직 부족한 부분이 많지만... 더 이상 미룰 수 없어서 올렸다.!
아직 메인 페이지 캐러셀에 들어갈 이미지는 완성되지 않은 상태.
우선 기존에 이미지가 있는 리뷰를 삭제할 경우, 테이블에서는 삭제가 되는데 스토리지에 있는 이미지 파일은 삭제가 되지 않는 문제가 있었다. 이 부분을 수정했었다.
(스토리지, 테이블 둘 다 삭제)
//리뷰 삭제
export const deleteReview = async ({
reviewId,
imagesUrl,
}: {
reviewId: string;
imagesUrl?: string[];
}) => {
// 테이블 삭제
const { error } = await supabase.from('reviews').delete().eq('id', reviewId);
if (error) {
throw error;
}
// 스토리지 (이미지) 삭제
if (imagesUrl) {
const fileNames = imagesUrl.map((url) =>
url.substring(url.lastIndexOf('/') + 1),
);
fileNames.forEach(async (fileName) => {
const { data, error } = await supabase.storage
.from('review_images')
.remove([`${fileName}`]);
if (error) throw error;
});
}
};
그러나, 우리는 장소에 대한 이미지를 받아올 수가 없어서, 첫 리뷰어가 이미지 있는 사진을 등록할 경우, 그 사진을 장소 대표 이미지로 설정하고 있는데, 장소 대표이미지를 가지고 있는 리뷰를 삭제할 경우, 스토리지에 그 이미지가 삭제되어, 장소 대표이미지 url이 not found가 되어버리는 문제가 있었다. (이미지url이 유효하지 않아서 엑박이 뜸...)
그래서 다음과 같이 수정했다.
const reviewDelete = () => {
Swal.fire({
icon: 'warning',
title: '정말 삭제하시겠습니까?',
showCancelButton: true,
confirmButtonText: '삭제',
cancelButtonText: '취소',
confirmButtonColor: '#7b4cff',
}).then((result) => {
if (result.isConfirmed) {
if (review.images_url) {
if (review.images_url.includes(review.places.image_url)) {
// 이미지에 장소 대표 이미지가 포함된 경우
deleteReview({
reviewId: review.id,
});
} else {
// 이미지가 있지만 장소대표이미지에 포함되지 않은 경우 또는 이미지가 없는 경우
deleteReview({
reviewId: review.id,
imagesUrl: review.images_url as string[],
});
}
}
router.back();
toastSuccess('삭제 완료');
}
});
};
includes
메서드를 통해서 리뷰 이미지들 중에 장소 대표 이미지가 포함된 경우에는 imageUrl 값을 가져가지 않고 mutationFn 으로 가도록 수정했다.
개발하기 바쁘다 보니 TIL을 미루게 되는데, 개발도 중요하지만 그 날 어떤 오류를 해결했고, 어떤 기능을 개발했는지 기록으로 남기는 것이 중요하다는 생각이 든다. 다시 열심히 써보자.!!
피드백을 받기 시작하니까 고쳐야 할 부분도 많이 보이고.. 기능 개발에만 급급했는데, 어떤 서비스인지 유저에게 명확하게 전달 할 필요성도 느낀다. 그리고 몸이 불편하신 분이 주요 대상인데, 그런 분이 실제로 사용해보고 피드백을 주셔서 더 감동이었다. 🥹 쓸만한 웹사이트를 만들려면 갈 길이 멀다는 것을 새삼 느꼈고.... 내일 부터 다시 달려보자ㅠ!