fix: React-Hooks in Demo-Tour und LogEntriesList bereinigen

Tour-Schritte über zentralen Effect synchronisieren, Escape-Listener per Ref stabilisieren
und Eintragsliste nur bei Logbook-Wechsel bzw. Rückkehr aus dem Editor neu laden.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-29 18:08:34 +02:00
parent 181cbe4895
commit 4c3f93602c
4 changed files with 47 additions and 37 deletions
+5 -3
View File
@@ -1,4 +1,4 @@
import { useEffect, useLayoutEffect, useState } from 'react'
import { useEffect, useLayoutEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { X, ChevronLeft, ChevronRight } from 'lucide-react'
import {
@@ -34,6 +34,8 @@ export default function AppTourOverlay() {
} = useAppTour()
const [spotlight, setSpotlight] = useState<SpotlightRect | null>(null)
const skipTourRef = useRef(skipTour)
skipTourRef.current = skipTour
useLayoutEffect(() => {
if (!isActive || !currentStepId || isCenteredTourStep(currentStepId)) {
@@ -94,11 +96,11 @@ export default function AppTourOverlay() {
useEffect(() => {
if (!isActive) return
const onKeyDown = (event: KeyboardEvent) => {
if (event.key === 'Escape') skipTour()
if (event.key === 'Escape') skipTourRef.current()
}
window.addEventListener('keydown', onKeyDown)
return () => window.removeEventListener('keydown', onKeyDown)
}, [isActive, skipTour])
}, [isActive])
if (!isActive || !currentStepId) return null
+17 -9
View File
@@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react'
import React, { useState, useEffect, useCallback, useRef } from 'react'
import { useTranslation } from 'react-i18next'
import { db } from '../services/db.js'
import { getActiveMasterKey } from '../services/auth.js'
@@ -70,14 +70,9 @@ export default function LogEntriesList({
const [loading, setLoading] = useState(false)
const [exporting, setExporting] = useState(false)
const [error, setError] = useState<string | null>(null)
const prevSelectedEntryIdRef = useRef<string | null | undefined>(undefined)
useEffect(() => {
if (!selectedEntryId) {
loadEntries()
}
}, [logbookId, selectedEntryId])
const loadEntries = async () => {
const loadEntries = useCallback(async () => {
setLoading(true)
setError(null)
try {
@@ -136,7 +131,20 @@ export default function LogEntriesList({
} finally {
setLoading(false)
}
}
}, [logbookId, readOnly, preloadedEntries])
useEffect(() => {
loadEntries()
}, [loadEntries])
useEffect(() => {
const prevSelectedEntryId = prevSelectedEntryIdRef.current
prevSelectedEntryIdRef.current = selectedEntryId
if (prevSelectedEntryId !== undefined && prevSelectedEntryId !== null && selectedEntryId === null) {
loadEntries()
}
}, [selectedEntryId, loadEntries])
const handleDownloadCsv = async () => {
setExporting(true)