fix(player): a library item played from the start keeps its point
A cached file that autoplays from 0:00 fires its one playing event before the resume hook subscribes, so the hook never counted it as played and reported nothing - not on pause, not on close. An element already playing when the hook subscribes now counts as played.
This commit is contained in:
@@ -94,6 +94,18 @@ describe("useResume", () => {
|
|||||||
expect(save).toHaveBeenLastCalledWith(42, 600, true);
|
expect(save).toHaveBeenLastCalledWith(42, 600, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("counts an element already playing when it subscribes as played", () => {
|
||||||
|
// A cached file started from 0 autoplays before the effect runs: its one `playing` is gone.
|
||||||
|
const m = fakeMedia();
|
||||||
|
m.metadata();
|
||||||
|
m.play();
|
||||||
|
const save = vi.fn();
|
||||||
|
renderHook(() => useResume(m.el, "7", 0, save));
|
||||||
|
m.at(42);
|
||||||
|
m.pause();
|
||||||
|
expect(save).toHaveBeenLastCalledWith(42, 600, false);
|
||||||
|
});
|
||||||
|
|
||||||
it("checkpoints while it plays, at most once per interval", () => {
|
it("checkpoints while it plays, at most once per interval", () => {
|
||||||
vi.useFakeTimers();
|
vi.useFakeTimers();
|
||||||
const m = fakeMedia();
|
const m = fakeMedia();
|
||||||
|
|||||||
@@ -48,7 +48,9 @@ export function useResume(
|
|||||||
const report = useEffectEvent(save);
|
const report = useEffectEvent(save);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!media || itemKey == null) return;
|
if (!media || itemKey == null) return;
|
||||||
let played = false;
|
// Already playing counts as played: a cached file that autoplays from the start can fire its
|
||||||
|
// one `playing` before this effect subscribes, and would then never report at all.
|
||||||
|
let played = !media.paused;
|
||||||
let lastAt = 0;
|
let lastAt = 0;
|
||||||
const duration = () => (Number.isFinite(media.duration) ? media.duration : 0);
|
const duration = () => (Number.isFinite(media.duration) ? media.duration : 0);
|
||||||
const put = (leaving: boolean) => {
|
const put = (leaving: boolean) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user