Nightly: Rainbow-Flash stabil State-basierte Klasse statt direct classList (verhindert fehlendes Repaint)
This commit is contained in:
parent
60a0ac3a82
commit
191cf43ec8
1 changed files with 10 additions and 12 deletions
|
|
@ -39,6 +39,7 @@ export default function App() {
|
||||||
return groups.join('').split('');
|
return groups.join('').split('');
|
||||||
}, []);
|
}, []);
|
||||||
const [showBroccoli, setShowBroccoli] = useState<boolean>(false);
|
const [showBroccoli, setShowBroccoli] = useState<boolean>(false);
|
||||||
|
const [flashMap, setFlashMap] = useState<Record<string, boolean>>({});
|
||||||
const selectedCount = useMemo(() => Object.values(selectedSet).filter(Boolean).length, [selectedSet]);
|
const selectedCount = useMemo(() => Object.values(selectedSet).filter(Boolean).length, [selectedSet]);
|
||||||
const [clock, setClock] = useState<string>(() => new Intl.DateTimeFormat('de-DE', { hour: '2-digit', minute: '2-digit', hour12: false, timeZone: 'Europe/Berlin' }).format(new Date()));
|
const [clock, setClock] = useState<string>(() => new Intl.DateTimeFormat('de-DE', { hour: '2-digit', minute: '2-digit', hour12: false, timeZone: 'Europe/Berlin' }).format(new Date()));
|
||||||
const [totalPlays, setTotalPlays] = useState<number>(0);
|
const [totalPlays, setTotalPlays] = useState<number>(0);
|
||||||
|
|
@ -594,18 +595,15 @@ export default function App() {
|
||||||
onChange={(e)=>{ e.stopPropagation(); toggleSelect(key, e.target.checked); }}
|
onChange={(e)=>{ e.stopPropagation(); toggleSelect(key, e.target.checked); }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<div className="sound-btn group rounded-xl flex items-center justify-between p-3 cursor-pointer"
|
<div className={`sound-btn group rounded-xl flex items-center justify-between p-3 cursor-pointer ${flashMap[key] ? 'rainbow-flash' : ''}`}
|
||||||
onClick={async (e)=>{
|
onClick={async ()=>{
|
||||||
// Rainbow-Flash für 1s im Rainbow-Theme
|
// Rainbow-Flash via State, damit Re-Render die Klasse erhält
|
||||||
try {
|
if (theme === 'rainbow') {
|
||||||
if (theme === 'rainbow') {
|
setFlashMap(prev => ({ ...prev, [key]: true }));
|
||||||
const el = (e.currentTarget as HTMLDivElement | undefined);
|
setTimeout(() => {
|
||||||
if (el) {
|
setFlashMap(prev => { const n = { ...prev }; delete n[key]; return n; });
|
||||||
el.classList.add('rainbow-flash');
|
}, 2000);
|
||||||
setTimeout(()=> el.classList.remove('rainbow-flash'), 2000);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch {}
|
|
||||||
await handlePlay(s.name, s.relativePath);
|
await handlePlay(s.name, s.relativePath);
|
||||||
}}>
|
}}>
|
||||||
<span className="text-sm font-medium truncate pr-2">
|
<span className="text-sm font-medium truncate pr-2">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue