diff --git a/components/Header.jsx b/components/Header.jsx index b59f227..f2f8f4c 100644 --- a/components/Header.jsx +++ b/components/Header.jsx @@ -1,20 +1,27 @@ "use client"; // components/Header.jsx -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import Image from "next/image"; +import { useRouter } from "next/router"; import "bootstrap-icons/font/bootstrap-icons.css"; import SettingsModal from "./modales/settingsModal/SettingsModal"; import { useSelector } from "react-redux"; function Header() { + const router = useRouter(); const deviceName = useSelector((state) => state.variables.deviceName); - const [cplStatus, setCplStatus] = useState("Lädt..."); const [showSettingsModal, setShowSettingsModal] = useState(false); const handleSettingsClick = () => setShowSettingsModal(true); const handleCloseSettingsModal = () => setShowSettingsModal(false); const handleLogout = () => (window.location.href = "/offline.html"); - //------------------------------------------------------------------ + // Funktion zur Weiterleitung zur Login-Seite abhängig von der Umgebung + const handleAdminLogin = () => { + const loginPath = + process.env.NODE_ENV === "production" ? "/login.html" : "/login"; + router.push(loginPath); + }; + return (
@@ -44,7 +51,15 @@ function Header() {
-
+
+ + - {error &&

{error}

} - - ); + // Leitet den Benutzer sofort zur richtigen Dashboard-Seite weiter + router.replace(dashboardPath); + }, [router]); + + return null; // Die Seite zeigt keinen Inhalt an und leitet sofort um } diff --git a/pages/login.js b/pages/login.js new file mode 100644 index 0000000..0e78b94 --- /dev/null +++ b/pages/login.js @@ -0,0 +1,120 @@ +// pages/index.js + +import Image from "next/image"; +import { useState } from "react"; +import { useRouter } from "next/router"; + +const USERS = { + Admin: { username: "admin", password: "admin", role: "Admin" }, + Ismail: { username: "ismail", password: "ismailpasswort", role: "Admin" }, +}; + +function generateToken(user) { + const payload = { + username: user.username, + role: user.role, + exp: Date.now() + 5 * 60 * 1000, // Ablauf in 5 Minuten + }; + return btoa(JSON.stringify(payload)); // Verwende btoa für das Payload +} + +export default function Home() { + const router = useRouter(); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(""); + + const handleLogin = (e) => { + e.preventDefault(); + const user = Object.values(USERS).find( + (u) => u.username.toLowerCase() === username.toLowerCase() + ); + + if (user && user.password === password) { + const token = generateToken(user); + localStorage.setItem("token", token); + router.replace("/dashboard"); + } else { + setError("Login fehlgeschlagen"); + } + }; + + return ( +
+ {/* Hintergrundbild */} +
+ + {/* Overlay */} +
+ +
+ {/* Logo */} +
+ Littwin Logo +
+ + {/* Titel */} +

Willkommen

+ + {/* Formular */} +
+ {/* Benutzername */} +
+ + setUsername(e.target.value)} + className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-transparent" + /> +
+ + {/* Passwort */} +
+ + setPassword(e.target.value)} + className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-transparent" + /> +
+ + {/* Login Button */} + +
+ {error &&

{error}

} +
+
+ ); +} diff --git a/public/loginPageImg/background.png b/public/loginPageImg/background.png new file mode 100644 index 0000000..fbf1ee5 Binary files /dev/null and b/public/loginPageImg/background.png differ diff --git a/public/loginPageImg/logo.png b/public/loginPageImg/logo.png new file mode 100644 index 0000000..1bbe480 Binary files /dev/null and b/public/loginPageImg/logo.png differ