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 ;