useDeviceSetting 훅을 통해 디바이스 설정을 가져오는 로직을 분리합니다.
import { FETCH_DEVICE_KEY } from ".";
declare const window: Window & {
ReactNativeWebView: {
postMessage: (message: string) => void;
};
};
export const useDeviceSetting = () => {
const fetchApp = async ({ query }) => {
const result = await new Promise((resolve) => {
FETCH_DEVICE_KEY[query] = resolve;
window.ReactNativeWebView.postMessage(JSON.stringify({ query }));
});
return result;
};
return {
fetchApp,
};
};
"use client";
import { useEffect } from "react";
export const FETCH_DEVICE_KEY: any = {
// fetchDeviceSystemForAppSet: resolve
// ...
// ...
};
export default function DeviceSetting({ children }) {
useEffect(() => {
// 1. 안드로이드에서 수신 대기
document.addEventListener("message", (message: any) => {
if (!message.data) return;
const response = JSON.parse(message.data);
const query = Object.keys(response)[0];
const resolve = FETCH_DEVICE_KEY[query];
resolve({ data: response });
delete FETCH_DEVICE_KEY[query];
});
// 2. IOS에서 수신 대기
window.addEventListener("message", (message: any) => {
if (!message.data) return;
const response = JSON.parse(message.data);
const query = Object.keys(response)[0];
const resolve = FETCH_DEVICE_KEY[query];
resolve({ data: response });
delete FETCH_DEVICE_KEY[query];
});
}, []);
return <>{children}</>;
}
리펙토링을 함으로써 볼 수 있는 장점은 다음과 같습니다.
이렇게 리팩토링을 통해 코드를 개선하면, 나중에 프로젝트가 커져도 관리하기 쉬운 구조를 유지할 수 있습니다!