diff --git a/src/App.tsx b/src/App.tsx index 75ede5e..58ac980 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,29 +1,40 @@ +import { useState } from "react"; import { Routes, Route, Navigate } from "react-router"; import AuthInitializer from "@/hooks/AuthListener"; import AuthLayout from "@/layouts/AuthLayout"; import SignInPage from "@/pages/auth/sign-in/SignInPage"; import SignUpPage from "@/pages/auth/sign-up/SignUpPage"; +import BootScreen from "@/pages/os/BootScreen"; import OsMain from "@/pages/os/OsMain"; import ProtectedRoute from "@/router/ProtectedRoute"; import PublicRoute from "@/router/PublicRoute"; export default function App() { + const [isBooting, setIsBooting] = useState(false); + const USE_ENTER_MODE = true; + return ( <> - - }> - }> - } /> - } /> + {!isBooting ? ( + setIsBooting(true)} useEnterMode={USE_ENTER_MODE} /> + ) : ( + + }> + }> + } /> + } /> + + + + }> + } /> - - }> - } /> - - } /> - + + } /> + + )} ); } diff --git a/src/assets/os/bios.png b/src/assets/os/bios.png new file mode 100644 index 0000000..7984a05 Binary files /dev/null and b/src/assets/os/bios.png differ diff --git a/src/assets/sounds/windows95-startup-sound.mp3 b/src/assets/sounds/windows95-startup-sound.mp3 new file mode 100644 index 0000000..b9e0f6f Binary files /dev/null and b/src/assets/sounds/windows95-startup-sound.mp3 differ diff --git a/src/pages/os/BootScreen.tsx b/src/pages/os/BootScreen.tsx new file mode 100644 index 0000000..e58a66e --- /dev/null +++ b/src/pages/os/BootScreen.tsx @@ -0,0 +1,51 @@ +import { useEffect } from "react"; + +import Bios from "@/assets/os/bios.png"; +import StartupSound from "@/assets/sounds/windows95-startup-sound.mp3"; + +interface BootScreenProps { + onComplete: () => void; + useEnterMode: boolean; +} + +export default function BootScreen({ onComplete, useEnterMode }: BootScreenProps) { + useEffect(() => { + if (!useEnterMode) return; + + const handleKeyDown = async (event: KeyboardEvent) => { + if (event.key === "Enter") { + onComplete(); + + try { + const audio = new Audio(StartupSound); + audio.volume = 0.1; + await audio.play(); + } catch (error) { + console.error("오디오 에러:", error); + } + } + }; + + window.addEventListener("keydown", handleKeyDown); + + return () => window.removeEventListener("keydown", handleKeyDown); + }, [useEnterMode, onComplete]); + + useEffect(() => { + if (useEnterMode) return; + + const timer = setTimeout(() => { + onComplete(); + }, 2000); + + return () => clearTimeout(timer); + }, [useEnterMode, onComplete]); + + return ( +
+
+ 바이오스 화면 +
+
+ ); +} diff --git a/src/router/ProtectedRoute.tsx b/src/router/ProtectedRoute.tsx index 8cb120f..787727f 100644 --- a/src/router/ProtectedRoute.tsx +++ b/src/router/ProtectedRoute.tsx @@ -3,11 +3,7 @@ import { Navigate, Outlet } from "react-router"; import { useAuthUser } from "@/hooks/useAuthUser"; export default function ProtectedRoute() { - const { isLoggedIn, isLoading } = useAuthUser(); - - if (isLoading) { - return
Loading...
; - } + const { isLoggedIn } = useAuthUser(); if (!isLoggedIn) { return ; diff --git a/src/router/PublicRoute.tsx b/src/router/PublicRoute.tsx index 1cca07c..1c2d295 100644 --- a/src/router/PublicRoute.tsx +++ b/src/router/PublicRoute.tsx @@ -3,11 +3,7 @@ import { Navigate, Outlet } from "react-router"; import { useAuthUser } from "@/hooks/useAuthUser"; export default function PublicRoute() { - const { isLoggedIn, isLoading } = useAuthUser(); - - if (isLoading) { - return
Loading...
; - } + const { isLoggedIn } = useAuthUser(); if (isLoggedIn) { return ;