Admin User nach einer Zeit von einer Stunde löschen (Cookie oder Local Storrage) , automatisch abmelden
This commit is contained in:
@@ -6,6 +6,6 @@ NEXT_PUBLIC_USE_MOCK_BACKEND_LOOP_START=false
|
||||
NEXT_PUBLIC_EXPORT_STATIC=false
|
||||
NEXT_PUBLIC_USE_CGI=false
|
||||
# App-Versionsnummer
|
||||
NEXT_PUBLIC_APP_VERSION=1.6.855
|
||||
NEXT_PUBLIC_APP_VERSION=1.6.856
|
||||
NEXT_PUBLIC_CPL_MODE=json # json (Entwicklungsumgebung) oder jsSimulatedProd (CPL ->CGI-Interface-Simulator) oder production (CPL-> CGI-Interface Platzhalter)
|
||||
|
||||
|
||||
@@ -5,5 +5,5 @@ NEXT_PUBLIC_CPL_API_PATH=/CPL
|
||||
NEXT_PUBLIC_EXPORT_STATIC=true
|
||||
NEXT_PUBLIC_USE_CGI=true
|
||||
# App-Versionsnummer
|
||||
NEXT_PUBLIC_APP_VERSION=1.6.855
|
||||
NEXT_PUBLIC_APP_VERSION=1.6.856
|
||||
NEXT_PUBLIC_CPL_MODE=production
|
||||
@@ -1,3 +1,8 @@
|
||||
## [1.6.856] – 2025-09-08
|
||||
|
||||
- chore: Jenkinsfile
|
||||
|
||||
---
|
||||
## [1.6.855] – 2025-09-05
|
||||
|
||||
- fix: allow scripts in woodpecker
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
"use client"; // components/Header.jsx
|
||||
import React, { useState, useEffect } from "react";
|
||||
import React, { useState, useEffect, useRef, useCallback } from "react";
|
||||
import { Icon } from "@iconify/react";
|
||||
import Image from "next/image";
|
||||
import { useRouter } from "next/router";
|
||||
@@ -15,16 +15,18 @@ function Header() {
|
||||
const router = useRouter();
|
||||
const [showSettingsModal, setShowSettingsModal] = useState(false);
|
||||
const [isAdminLoggedIn, setIsAdminLoggedIn] = useState(false);
|
||||
const autoLogoutTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
||||
// Removed duplicate declaration of deviceName
|
||||
|
||||
const handleCloseSettingsModal = () => setShowSettingsModal(false);
|
||||
|
||||
const handleLogout = () => {
|
||||
const handleLogout = useCallback(() => {
|
||||
sessionStorage.removeItem("token"); // Token entfernen
|
||||
localStorage.setItem("isAdminLoggedIn", "false"); // Admin-Status entfernen
|
||||
localStorage.removeItem("adminLoginTime"); // Login-Zeitpunkt entfernen
|
||||
setIsAdminLoggedIn(false); // Zustand sofort aktualisieren
|
||||
router.push("/offline.html"); // Weiterleitung
|
||||
};
|
||||
}, [router]);
|
||||
|
||||
useEffect(() => {
|
||||
// Initialer Check beim Laden der Komponente
|
||||
@@ -43,6 +45,56 @@ function Header() {
|
||||
clearInterval(interval); // Intervall stoppen, wenn die Komponente entladen wird
|
||||
};
|
||||
}, [isAdminLoggedIn]);
|
||||
|
||||
// Auto-Logout nach 1 Minute (Test): nutzt adminLoginTime aus localStorage
|
||||
useEffect(() => {
|
||||
// Timer bereinigen, wenn sich der Status ändert
|
||||
if (autoLogoutTimerRef.current) {
|
||||
clearTimeout(autoLogoutTimerRef.current);
|
||||
autoLogoutTimerRef.current = null;
|
||||
}
|
||||
|
||||
if (!isAdminLoggedIn) return;
|
||||
|
||||
const iso = localStorage.getItem("adminLoginTime");
|
||||
const loginTime = iso ? new Date(iso).getTime() : Date.now();
|
||||
if (!iso) {
|
||||
// Falls älterer Login ohne Zeitstempel, setze jetzt
|
||||
try {
|
||||
localStorage.setItem(
|
||||
"adminLoginTime",
|
||||
new Date(loginTime).toISOString()
|
||||
);
|
||||
} catch {
|
||||
void 0; // ignore write errors (e.g., storage disabled)
|
||||
}
|
||||
}
|
||||
|
||||
// 1 Minute ab Login (60_000 ms), eine Stunde (3_600_000 ms) im Produktivbetrieb
|
||||
const target = loginTime + 3_600_000;
|
||||
const delay = Math.max(0, target - Date.now());
|
||||
|
||||
// Fallback: wenn Datum in Vergangenheit (z.B. Uhrzeit geändert), sofort abmelden
|
||||
autoLogoutTimerRef.current = setTimeout(() => {
|
||||
// Versuche den Button zu klicken, falls vorhanden
|
||||
const btn = document.querySelector<HTMLButtonElement>(
|
||||
'button[aria-label="Abmelden"]'
|
||||
);
|
||||
if (btn) {
|
||||
btn.click();
|
||||
} else {
|
||||
// Fallback direkt
|
||||
handleLogout();
|
||||
}
|
||||
}, delay);
|
||||
|
||||
return () => {
|
||||
if (autoLogoutTimerRef.current) {
|
||||
clearTimeout(autoLogoutTimerRef.current);
|
||||
autoLogoutTimerRef.current = null;
|
||||
}
|
||||
};
|
||||
}, [isAdminLoggedIn, handleLogout]);
|
||||
//----------------------------------------------------------------
|
||||
const dispatch = useDispatch<AppDispatch>();
|
||||
|
||||
@@ -139,6 +191,7 @@ function Header() {
|
||||
<div className="flex items-center justify-end w-1/4 space-x-1">
|
||||
<button
|
||||
onClick={handleLogout}
|
||||
aria-label="Abmelden"
|
||||
className="bg-littwin-blue text-white px-4 py-2 rounded"
|
||||
>
|
||||
Abmelden
|
||||
|
||||
@@ -22,6 +22,12 @@ const UserManagementSettings: React.FC = () => {
|
||||
() => {
|
||||
setLoginSuccess(true);
|
||||
setError("");
|
||||
// Speichere die System-Uhrzeit (Login-Zeitpunkt) im localStorage
|
||||
try {
|
||||
localStorage.setItem("adminLoginTime", new Date().toISOString());
|
||||
} catch {
|
||||
// Ignoriere Speicherfehler (z. B. in Private Mode)
|
||||
}
|
||||
},
|
||||
(errorMsg) => {
|
||||
setLoginSuccess(false);
|
||||
@@ -47,7 +53,14 @@ const UserManagementSettings: React.FC = () => {
|
||||
<button
|
||||
type="button"
|
||||
className="bg-littwin-blue text-white px-4 py-2 h-8 text-xs rounded whitespace-nowrap"
|
||||
onClick={logoutAdmin}
|
||||
onClick={() => {
|
||||
try {
|
||||
localStorage.removeItem("adminLoginTime");
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
logoutAdmin();
|
||||
}}
|
||||
>
|
||||
Admin abmelden
|
||||
</button>
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "cpl-v4",
|
||||
"version": "1.6.855",
|
||||
"version": "1.6.856",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "cpl-v4",
|
||||
"version": "1.6.855",
|
||||
"version": "1.6.856",
|
||||
"dependencies": {
|
||||
"@fontsource/roboto": "^5.1.0",
|
||||
"@headlessui/react": "^2.2.4",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cpl-v4",
|
||||
"version": "1.6.855",
|
||||
"version": "1.6.856",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev -p 3000",
|
||||
|
||||
Reference in New Issue
Block a user