Files
Psychotoxical-psysonic/src/components/fullscreenPlayer/FsClock.tsx
T
cucadmuh e527cfe67f fix(fullscreen): respect Settings clock format on wall clock (#1025)
* fix(fullscreen): respect Settings clock format on wall clock

The fullscreen player corner clock always used the browser locale default
(12-hour). Route it through formatClockTime and authStore.clockFormat so
24-hour matches queue ETA and sleep-timer preview.

* docs(changelog): fullscreen clock format fix (PR #1025)
2026-06-08 01:02:29 +03:00

43 lines
1.5 KiB
TypeScript

import { memo, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useAuthStore } from '../../store/authStore';
import { formatClockTime } from '../../utils/format/formatClockTime';
/**
* Standalone wall-clock for the fullscreen player. Owns its own state so the
* static player never re-renders for the time. Ticks every 30s (enough to catch
* the minute rollover) and pauses while the window/tab is hidden.
*/
export const FsClock = memo(function FsClock() {
const clockFormat = useAuthStore(s => s.clockFormat);
const { i18n } = useTranslation();
const formatNow = () => formatClockTime(Date.now(), clockFormat, i18n.language);
const [time, setTime] = useState(formatNow);
useEffect(() => {
setTime(formatNow());
}, [clockFormat, i18n.language]);
useEffect(() => {
let id: number | undefined;
const tick = () => setTime(formatClockTime(Date.now(), clockFormat, i18n.language));
const sync = () => {
if (document.hidden) {
if (id !== undefined) { clearInterval(id); id = undefined; }
} else {
tick();
if (id === undefined) id = window.setInterval(tick, 30_000);
}
};
sync();
document.addEventListener('visibilitychange', sync);
return () => {
if (id !== undefined) clearInterval(id);
document.removeEventListener('visibilitychange', sync);
};
}, [clockFormat, i18n.language]);
return <span className="fsp-clock">{time}</span>;
});