Files
cinny/src/app/hooks/media/useMediaSeek.ts
T
Lotus Bot 61a1f008d0 chore: upgrade i18next 26, prettier 3, fontsource-variable, domhandler 6, lint-staged 17
- i18next 23->26 + react-i18next 15->17
- prettier 2->3, reformat all files
- replace @fontsource/inter with @fontsource-variable/inter 5, update import path
- domhandler 5->6 (aligns with transitive deps)
- lint-staged 16->17
2026-05-21 23:30:50 -04:00

52 lines
1.3 KiB
TypeScript

import { useCallback, useEffect, useState } from 'react';
export type MediaSeekData = {
seeking: boolean;
seekable?: TimeRanges;
};
export type MediaSeekControl = {
seek: (time: number) => void;
};
export const useMediaSeek = (
getTargetElement: () => HTMLMediaElement | null,
): MediaSeekData & MediaSeekControl => {
const [seekData, setSeekData] = useState<MediaSeekData>({
seeking: false,
seekable: undefined,
});
const seek = useCallback(
(time: number) => {
const targetEl = getTargetElement();
if (!targetEl) return;
targetEl.currentTime = time;
},
[getTargetElement],
);
useEffect(() => {
const targetEl = getTargetElement();
const handleChange = () => {
if (!targetEl) return;
setSeekData({
seeking: targetEl.seeking,
seekable: targetEl.seekable,
});
};
targetEl?.addEventListener('loadedmetadata', handleChange);
targetEl?.addEventListener('seeked', handleChange);
targetEl?.addEventListener('seeking', handleChange);
return () => {
targetEl?.removeEventListener('loadedmetadata', handleChange);
targetEl?.removeEventListener('seeked', handleChange);
targetEl?.removeEventListener('seeking', handleChange);
};
}, [getTargetElement]);
return {
...seekData,
seek,
};
};