import { createRoot } from "react-dom/client"; import { logger } from "@/utils/logger"; import { BrowserRouter } from "react-router-dom"; import { setupChunkErrorProtection } from "@/utils/chunkErrorProtection"; import App from "./App.tsx"; import "./index.css"; logger.info("main.tsx loaded"); // 청크 로딩 오류 보호 시스템 즉시 활성화 setupChunkErrorProtection(); // iOS 안전 영역 메타 태그 추가 const setViewportMetaTag = () => { // 기존 viewport 메타 태그 찾기 let metaTag = document.querySelector('meta[name="viewport"]'); // 없으면 새로 생성 if (!metaTag) { metaTag = document.createElement("meta"); metaTag.setAttribute("name", "viewport"); document.head.appendChild(metaTag); } // content 속성 설정 (viewport-fit=cover 추가) metaTag.setAttribute( "content", "width=device-width, initial-scale=1.0, viewport-fit=cover" ); }; // 메타 태그 설정 적용 setViewportMetaTag(); // 안전한 에러 화면 표시 함수 const showErrorScreen = ( title: string, description: string, details?: string ) => { // React 렌더링과 충돌하지 않도록 안전하게 처리 setTimeout(() => { const rootElement = document.getElementById("root"); if (rootElement && !rootElement.querySelector(".error-screen")) { // 기존 내용을 보존하면서 에러 화면 추가 const errorDiv = document.createElement("div"); errorDiv.className = "error-screen"; errorDiv.style.cssText = ` position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 9999; display: flex; flex-direction: column; align-items: center; justify-content: center; background: rgba(255, 255, 255, 0.95); font-family: Arial, sans-serif; `; errorDiv.innerHTML = `
⚠️

${title}

${description}

${details ? `
${details}
` : ""} `; rootElement.appendChild(errorDiv); } }, 100); }; // 전역 오류 핸들러 추가 window.onerror = function (message, source, lineno, colno, error) { logger.error("전역 오류 발생:", { message, source, lineno, colno, error }); showErrorScreen( "Zellyy Finance 오류", "애플리케이션 로딩 중 오류가 발생했습니다.", String(message) ); return false; }; // 처리되지 않은 Promise 오류 핸들러 추가 window.addEventListener("unhandledrejection", function (event) { logger.error("처리되지 않은 Promise 오류:", event.reason); showErrorScreen( "Zellyy Finance 오류", "비동기 작업 중 오류가 발생했습니다.", String(event.reason) ); }); // 디버깅 정보 출력 logger.info("환경 변수:", { NODE_ENV: import.meta.env.MODE, BASE_URL: import.meta.env.BASE_URL, SUPABASE_URL: import.meta.env.VITE_SUPABASE_URL, CLERK_PUBLISHABLE_KEY: import.meta.env.VITE_CLERK_PUBLISHABLE_KEY?.substring(0, 20) + "...", }); // 상태 확인 // TypeScript에서 window 객체에 사용자 정의 속성 추가 declare global { interface Window { supabaseEnabled: boolean; } } // Supabase 활성화 window.supabaseEnabled = true; try { const rootElement = document.getElementById("root"); if (!rootElement) { throw new Error("Root element not found"); } // React root 생성 - DOM 직접 조작 제거 const root = createRoot(rootElement); root.render( ); logger.info("애플리케이션 렌더링 성공"); } catch (error) { logger.error("애플리케이션 렌더링 오류:", error); showErrorScreen( "Zellyy Finance 오류", "애플리케이션 로딩 중 오류가 발생했습니다.", String(error) ); }