import { state } from "../state"; import { displayTimeFromAbsolute, absoluteTimeFromDisplay } from "../timeline"; import { showControls } from "../controls"; import { saveProgress } from "../progress"; import { safeLocalStorage } from "../storage"; // button label based on segment type const skipLabel = (type: string): string => (type === "ed" ? "Skip outro" : "Skip intro"); /** * Updates skip button visibility and auto-skip logic. * Called on timeupdate. Shows button when in active segment. */ export const updateSkipButton = (currentTime: number): void => { const btn = state.container.querySelector("[data-skip]") as HTMLButtonElement | null; const displayTime = displayTimeFromAbsolute(currentTime); // find segment that contains current time (with delay buffer) const segment = state.activeSegments.find((s) => { const delay = Math.min(1, Math.max(0.25, (s.end - s.start) * 0.02)); return displayTime >= s.start + delay && displayTime < s.end; }); if (!segment) { state.activeSkipSegment = null; btn?.classList.add("hidden"); return; } // auto-skip: jump to end if enabled const autoSkip = safeLocalStorage.getItem("mal:autoskip-enabled") === "true"; if (autoSkip && displayTime >= segment.start && displayTime < segment.end) { state.video.currentTime = absoluteTimeFromDisplay(segment.end + 0.01); void saveProgress(); return; } // show skip button state.activeSkipSegment = segment; if (btn) { btn.textContent = skipLabel(segment.type); btn.title = skipLabel(segment.type); btn.classList.remove("hidden"); } }; /** * Syncs autoskip checkbox with localStorage. */ export const updateAutoSkipButton = (): void => { const btn = document.querySelector("[data-autoskip]") as HTMLInputElement | null; if (!btn) return; btn.checked = safeLocalStorage.getItem("mal:autoskip-enabled") === "true"; }; /** * Binds autoskip toggle change handler. */ export const setupSkip = (): void => { document.addEventListener("change", (e) => { const target = e.target as HTMLElement; if (target.hasAttribute("data-autoskip")) { safeLocalStorage.setItem( "mal:autoskip-enabled", (target as HTMLInputElement).checked ? "true" : "false", ); showControls(); } }); };