diff --git a/src/assets/svgs/modal/errorIcon.svg b/src/assets/svgs/modal/errorIcon.svg new file mode 100644 index 0000000..6e4c52e --- /dev/null +++ b/src/assets/svgs/modal/errorIcon.svg @@ -0,0 +1,4 @@ + diff --git a/src/components/common/ToastModal.jsx b/src/components/common/ToastModal.jsx index a12d0e8..7d3b98a 100644 --- a/src/components/common/ToastModal.jsx +++ b/src/components/common/ToastModal.jsx @@ -20,7 +20,7 @@ const ToastModal = ({
{data?.storeName}
-{data?.companyCategory ?? "기타"}
++ {businessTypeNameMap[data?.companyCategory] ?? "기타"} +
diff --git a/src/pages/map/components/review/ReviewImageCapture.jsx b/src/pages/map/components/review/ReviewImageCapture.jsx
index 9878509..dda4a6a 100644
--- a/src/pages/map/components/review/ReviewImageCapture.jsx
+++ b/src/pages/map/components/review/ReviewImageCapture.jsx
@@ -1,12 +1,11 @@
import { useState, useRef, useEffect } from "react";
import { useMutation } from "@tanstack/react-query";
import { postRecipt } from "@/apis/review/postRecipt";
-import { useNavigate } from "react-router-dom";
import Modal from "@/pages/map/components/Modal";
import ReceiptErrorModal from "@/pages/map/components/review/ReceiptErrorModal";
import "@/styles/spinner.css";
-
-import { usePaymentStore } from "@/store/paymentStore";
+import ErrorIcon from "/public/svgs/modal/errorIcon.svg?react";
+import ToastModal from "@/components/common/ToastModal";
import imageCompression from "browser-image-compression";
const ReviewImageCapture = ({
@@ -15,8 +14,6 @@ const ReviewImageCapture = ({
onCloseCamera,
onCaptureSuccess,
}) => {
- const navigate = useNavigate();
-
useEffect(() => () => stopCamera(), []);
const streamRef = useRef(null);
@@ -33,6 +30,17 @@ const ReviewImageCapture = ({
const [showIntroModal, setShowIntroModal] = useState(false);
const [showReceiptError, setShowReceiptError] = useState(false);
+ // 1) 토스트 상태 & 실행 함수
+ const [toast, setToast] = useState({
+ show: false,
+ message: "",
+ icon: null,
+ });
+ const fireToast = (message, icon = ErrorIcon, duration = 4000) => {
+ setToast({ show: true, message, icon });
+ setTimeout(() => setToast((t) => ({ ...t, show: false })), duration);
+ };
+
useEffect(() => {
const hasSeenModal = localStorage.getItem("hasSeenCameraIntro");
@@ -55,7 +63,10 @@ const ReviewImageCapture = ({
}
} catch (error) {
console.log("카메라 접근 실패", error);
- alert("카메라 접근에 실패했습니다. 카메라 접근 권한을 확인해 주세요!");
+ fireToast(
+ "카메라 접근에 실패했습니다.\n카메라 권한을 확인해 주세요!",
+ ErrorIcon
+ );
}
};
@@ -101,7 +112,7 @@ const ReviewImageCapture = ({
const file = e.target.files?.[0];
if (file) {
if (!file.type.startsWith("image/")) {
- alert("이미지 파일만 선택 가능합니다.");
+ fireToast("이미지 파일만 선택 가능합니다.", ErrorIcon);
e.target.value = "";
fileInputRef.current?.click();
return;
@@ -170,13 +181,13 @@ const ReviewImageCapture = ({
// FormData 에 file + companyId 담기
const form = new FormData();
form.append("file", compressedFile, compressedFile.name);
- form.append("companyId", String(780));
+ form.append("companyId", String(companyId));
// 단일 인자로 FormData 전달
mutate(form);
} catch (e) {
console.error(e);
- alert("이미지 압축 실패");
+ fireToast("이미지 압축에 실패했습니다. 다시 시도해 주세요!", ErrorIcon);
}
};
@@ -186,6 +197,14 @@ const ReviewImageCapture = ({
onTouchStart={(e) => e.stopPropagation()}
onTouchEnd={(e) => e.stopPropagation()}
>
+ {toast.show && (
+ 로딩 중… 로딩 중… navigate(-1)}
+ onClick={() => navigate("/")}
/>
0도
*/} - {/*