diff --git a/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.tsx b/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.tsx
index f26fafb..20ad124 100644
--- a/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.tsx
+++ b/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.tsx
@@ -10,6 +10,10 @@ import Text from "@/components/ui/Text/Text";
import { useRoute } from "@/hooks/common/useRoute";
+import { useGenerateReviewStore } from "@/store/useGenerateReviewStore";
+import { useCreateReviewStore } from "@/store/useReviewStore";
+import { useScanDataStore } from "@/store/useScanDataStore";
+
interface HomeNavigateConfirmModalProps {
isOpen: boolean;
handleClose: () => void;
@@ -18,6 +22,10 @@ interface HomeNavigateConfirmModalProps {
const HomeNavigateConfirmModal = ({ isOpen, handleClose }: HomeNavigateConfirmModalProps) => {
const { navigateToHome } = useRoute();
+ const { resetGenerateReviewData } = useGenerateReviewStore();
+ const { resetCreateReviewData } = useCreateReviewStore();
+ const { resetScanData } = useScanDataStore();
+
// 이후 상태 초기값 재설정
const [isShowButtonChecked, setIsShowButtonChecked] = useState(false);
@@ -27,6 +35,9 @@ const HomeNavigateConfirmModal = ({ isOpen, handleClose }: HomeNavigateConfirmMo
const handleNavigateHome = () => {
handleClose();
+ resetGenerateReviewData();
+ resetCreateReviewData();
+ resetScanData();
navigateToHome();
};
diff --git a/src/components/ReceiptEdit/ReceiptEdit.tsx b/src/components/ReceiptEdit/ReceiptEdit.tsx
index d7f863e..005b443 100644
--- a/src/components/ReceiptEdit/ReceiptEdit.tsx
+++ b/src/components/ReceiptEdit/ReceiptEdit.tsx
@@ -13,7 +13,7 @@ import { useScanDataStore } from "@/store/useScanDataStore";
const ReceiptEdit = () => {
const { navigateToHome, navigateToSelectTag } = useRoute();
- const { scanData } = useScanDataStore();
+ const { scanData, resetScanData } = useScanDataStore();
const { setOcrText } = useCreateReviewStore();
@@ -66,6 +66,11 @@ const ReceiptEdit = () => {
navigateToSelectTag();
};
+ const handleReScanClick = () => {
+ resetScanData();
+ navigateToHome();
+ };
+
return (
@@ -114,7 +119,7 @@ const ReceiptEdit = () => {
/>
) : (
<>
-
+
- {reviewText}
+ {generateReviewData}
- send({ type: AppBridgeMessageType.COPY, payload: { review: reviewText } })
- }
+ onClick={() => {
+ send({ type: AppBridgeMessageType.COPY, payload: { review: generateReviewData } });
+
+ showToast();
+ }}
/>
- {isToast &&
}
+ {isToast &&
}
diff --git a/src/components/SelectStyle/SelectStyle.tsx b/src/components/SelectStyle/SelectStyle.tsx
index be18f3f..eb89f9d 100644
--- a/src/components/SelectStyle/SelectStyle.tsx
+++ b/src/components/SelectStyle/SelectStyle.tsx
@@ -9,6 +9,9 @@ import Button from "@/components/ui/Button/Button";
import Icon from "@/components/ui/Icon/Icon";
import Text from "@/components/ui/Text/Text";
+import { useRoute } from "@/hooks/common/useRoute";
+
+import { useGenerateReviewStore } from "@/store/useGenerateReviewStore";
import { useCreateReviewStore } from "@/store/useReviewStore";
interface StyleProps {
@@ -17,16 +20,24 @@ interface StyleProps {
}
const IMG_STYLE_DATA = [
- { name: "default", image: "/assets/img/img-graphic-logo.png" },
{ name: "친절한 미식가", image: "/assets/img/img-style-friendly.png" },
{ name: "믿음직한 미식가", image: "/assets/img/img-style-trust.png" },
{ name: "귀여운 미식가", image: "/assets/img/img-style-cute.png" },
];
+const STYLE_NAME_MAPPING: { [key: string]: string } = {
+ "친절한 미식가": "FRIENDLY",
+ "귀여운 미식가": "CUTE",
+ "믿음직한 미식가": "PROFESSIONAL",
+};
+
const SelectStyle = () => {
const { send } = useAppBridge();
const { createReviewData, setReviewStyle } = useCreateReviewStore();
+ const { generateReviewData } = useGenerateReviewStore();
+
+ const { navigateToReviewResult } = useRoute();
const [selectedStyle, setSelectedStyle] = useState(IMG_STYLE_DATA[0]);
@@ -37,14 +48,25 @@ const SelectStyle = () => {
};
const handleCreateReview = () => {
- if (selectedStyle.name !== "default") {
- setReviewStyle(selectedStyle.name);
+ const mappedStyle = STYLE_NAME_MAPPING[selectedStyle.name];
+
+ if (mappedStyle) {
+ setReviewStyle(mappedStyle);
}
send({
type: AppBridgeMessageType.CREATE_REVIEW,
payload: { ocrText, hashTag, reviewStyle },
});
+
+ send({
+ type: AppBridgeMessageType.RECEIVE_GENERATED_REVIEW,
+ payload: { result: String(generateReviewData) },
+ });
+
+ if (generateReviewData.length > 0) {
+ navigateToReviewResult();
+ }
};
return (
@@ -63,7 +85,7 @@ const SelectStyle = () => {
- {IMG_STYLE_DATA.slice(1, 4).map((style) => (
+ {IMG_STYLE_DATA.map((style) => (
(null);
export function AppBridgeProvider({ children }: AppBridgeProviderProps) {
const { setScanData } = useScanDataStore();
+ const { setGenerateReviewData } = useGenerateReviewStore();
const userAgent = useUserAgent();
@@ -50,7 +52,7 @@ export function AppBridgeProvider({ children }: AppBridgeProviderProps) {
receiveGeneratedReview: (jsonData: string) => {
try {
const data = JSON.parse(jsonData);
- alert(`Generated Review: ${data.review}`);
+ setGenerateReviewData(data.result);
} catch (error) {
console.error("Invalid JSON data for generated review:", error);
}
diff --git a/src/components/provider/AppBridgeProvider/convertToNativeMessage.ts b/src/components/provider/AppBridgeProvider/convertToNativeMessage.ts
index 4c5e8c4..4a229cc 100644
--- a/src/components/provider/AppBridgeProvider/convertToNativeMessage.ts
+++ b/src/components/provider/AppBridgeProvider/convertToNativeMessage.ts
@@ -8,10 +8,11 @@ const iosHandlers = {
window.webkit?.messageHandlers.openGallery.postMessage(message),
[AppBridgeMessageType.SHARE]: (message: string) =>
window.webkit?.messageHandlers.share.postMessage(message),
- [AppBridgeMessageType.CREATE_REVIEW]: (message: { payload: { json: string } }) =>
- window.webkit?.messageHandlers.createReview.postMessage(message.payload.json),
- [AppBridgeMessageType.COPY]: (message: { payload: { json: string } }) =>
- window.webkit?.messageHandlers.copy.postMessage(message.payload.json),
+ [AppBridgeMessageType.CREATE_REVIEW]: (message: {
+ payload: { ocrText: string; hashTag: string[]; reviewStyle: string };
+ }) => window.webkit?.messageHandlers.createReview.postMessage(message.payload),
+ [AppBridgeMessageType.COPY]: (message: { payload: { review: string } }) =>
+ window.webkit?.messageHandlers.copy.postMessage(message.payload),
[AppBridgeMessageType.RECEIVE_SCAN_RESULT]: (message: { payload: { result: string } }) =>
window.response?.receiveScanResult(message.payload.result),
[AppBridgeMessageType.RECEIVE_GENERATED_REVIEW]: (message: { payload: { result: string } }) =>
@@ -22,10 +23,11 @@ const androidHandlers = {
[AppBridgeMessageType.OPEN_CAMERA]: () => window.AndroidBridge?.openCamera(),
[AppBridgeMessageType.OPEN_GALLERY]: () => window.AndroidBridge?.openGallery(),
[AppBridgeMessageType.SHARE]: () => window.AndroidBridge?.share(),
- [AppBridgeMessageType.CREATE_REVIEW]: (message: { payload: { json: string } }) =>
- window.AndroidBridge?.createReview(message.payload.json),
- [AppBridgeMessageType.COPY]: (message: { payload: { json: string } }) =>
- window.AndroidBridge?.copy(message.payload.json),
+ [AppBridgeMessageType.CREATE_REVIEW]: (message: {
+ payload: { ocrText: string; hashTag: string[]; reviewStyle: string };
+ }) => window.AndroidBridge?.createReview(message.payload),
+ [AppBridgeMessageType.COPY]: (message: { payload: { review: string } }) =>
+ window.AndroidBridge?.copy(message.payload),
[AppBridgeMessageType.RECEIVE_SCAN_RESULT]: (message: { payload: { result: string } }) =>
window.response?.receiveScanResult(message.payload.result),
[AppBridgeMessageType.RECEIVE_GENERATED_REVIEW]: (message: { payload: { result: string } }) =>
diff --git a/src/hooks/common/useRoute.ts b/src/hooks/common/useRoute.ts
index 62ebe02..c5e6044 100644
--- a/src/hooks/common/useRoute.ts
+++ b/src/hooks/common/useRoute.ts
@@ -11,6 +11,7 @@ export const useRoute = () => {
navigateToReceiptEdit: () => navigate(PATH.RECEIPT_EDIT),
navigateToSelectStyle: () => navigate(PATH.SELECT_STYLE),
navigateToSelectTag: () => navigate(PATH.SELECT_TAG),
+ navigateToReviewResult: () => navigate(PATH.REVIEW_RESULT),
};
return routes;
diff --git a/src/store/useGenerateReviewStore.ts b/src/store/useGenerateReviewStore.ts
new file mode 100644
index 0000000..a070a61
--- /dev/null
+++ b/src/store/useGenerateReviewStore.ts
@@ -0,0 +1,13 @@
+import { create } from "zustand";
+
+interface GenerateReviewStoreProps {
+ generateReviewData: string;
+ setGenerateReviewData: (review: string) => void;
+ resetGenerateReviewData: () => void;
+}
+
+export const useGenerateReviewStore = create((set) => ({
+ generateReviewData: "",
+ setGenerateReviewData: (review: string) => set({ generateReviewData: review }),
+ resetGenerateReviewData: () => set({ generateReviewData: "" }),
+}));
diff --git a/src/store/useReviewStore.ts b/src/store/useReviewStore.ts
index 82197e9..85506ce 100644
--- a/src/store/useReviewStore.ts
+++ b/src/store/useReviewStore.ts
@@ -11,12 +11,13 @@ interface CreateReviewDataStore {
setOcrText: (ocrText: string) => void;
setHashTag: (hashTag: string[]) => void;
setReviewStyle: (reviewStyle: string) => void;
+ resetCreateReviewData: () => void;
}
export const CREATE_REVIEW_DATA = {
ocrText: "",
hashTag: [],
- reviewStyle: "",
+ reviewStyle: "FRIENDLY",
};
export const useCreateReviewStore = create((set) => ({
@@ -33,4 +34,5 @@ export const useCreateReviewStore = create((set) => ({
set((state) => ({
createReviewData: { ...state.createReviewData, reviewStyle },
})),
+ resetCreateReviewData: () => set({ createReviewData: { ...CREATE_REVIEW_DATA } }),
}));
diff --git a/src/store/useScanDataStore.ts b/src/store/useScanDataStore.ts
index 8751675..4df364a 100644
--- a/src/store/useScanDataStore.ts
+++ b/src/store/useScanDataStore.ts
@@ -5,9 +5,11 @@ import type { ScanResult } from "@/components/Home/Home";
interface ScanDataStoreProps {
scanData: ScanResult[];
setScanData: (scanData: ScanResult[]) => void;
+ resetScanData: () => void;
}
export const useScanDataStore = create((set) => ({
scanData: [],
setScanData: (scanData: ScanResult[]) => set({ scanData }),
+ resetScanData: () => set({ scanData: [] }),
}));
diff --git a/src/types/global.d.ts b/src/types/global.d.ts
index b3924ce..1c9f6b3 100644
--- a/src/types/global.d.ts
+++ b/src/types/global.d.ts
@@ -10,6 +10,15 @@ type MessageHandler = {
};
declare global {
+ interface CreateReviewPayload {
+ ocrText: string;
+ hashTag: string[];
+ reviewStyle: string;
+ }
+
+ interface CopyMessagePayload {
+ review: string;
+ }
interface Window {
response?: {
receiveScanResult: (jsonData: string) => void;
@@ -20,16 +29,16 @@ declare global {
openCamera: MessageHandler;
openGallery: MessageHandler;
share: MessageHandler;
- createReview: MessageHandler;
- copy: MessageHandler;
+ createReview: MessageHandler;
+ copy: MessageHandler;
};
};
AndroidBridge?: {
openCamera: () => void;
openGallery: () => void;
share: () => void;
- createReview: (json: string) => void;
- copy: (json: string) => void;
+ createReview: (json: CreateReviewPayload) => void;
+ copy: (json: CopyMessagePayload) => void;
};
}
}