import { useTranslation } from "@browser-skill/i18n/react"; import { RiStopCircleLine } from "@remixicon/react"; import { useEffect, useRef, useState } from "react"; import logoUrl from "../../assets/logo.png"; export interface ControlOverlayProps { visible: boolean; interrupting: boolean; automationBypass: boolean; onInterrupt: () => void; } export function ControlOverlay({ visible, interrupting, automationBypass, onInterrupt, }: ControlOverlayProps) { const { t } = useTranslation("extension"); const [show, setShow] = useState(false); const blockerRef = useRef(null); useEffect(() => { if (visible) { const raf = requestAnimationFrame(() => setShow(true)); return () => cancelAnimationFrame(raf); } setShow(false); }, [visible]); useEffect(() => { const blocker = blockerRef.current; if (!blocker) return; const stopScroll = (event: WheelEvent | TouchEvent) => { if (automationBypass) return; event.preventDefault(); event.stopPropagation(); }; blocker.addEventListener("wheel", stopScroll, { passive: false }); blocker.addEventListener("touchmove", stopScroll, { passive: false }); return () => { blocker.removeEventListener("wheel", stopScroll); blocker.removeEventListener("touchmove", stopScroll); }; }, [automationBypass]); useEffect(() => { if (!visible || automationBypass) return; const stopScroll = (event: WheelEvent | TouchEvent) => { event.preventDefault(); event.stopPropagation(); }; window.addEventListener("wheel", stopScroll, { capture: true, passive: false }); window.addEventListener("touchmove", stopScroll, { capture: true, passive: false }); return () => { window.removeEventListener("wheel", stopScroll, { capture: true }); window.removeEventListener("touchmove", stopScroll, { capture: true }); }; }, [visible, automationBypass]); if (!visible) return null; const pointerEvents = automationBypass ? "none" : "auto"; return ( <>
{ if (automationBypass) return; event.preventDefault(); event.stopPropagation(); }} onClick={(event) => { if (automationBypass) return; event.preventDefault(); event.stopPropagation(); }} style={{ position: "fixed", inset: 0, zIndex: 2147483646, pointerEvents, background: "transparent", opacity: show ? 1 : 0, transition: "opacity 300ms ease-out", }} />
browser-skill {t("controlOverlay.status")}
); }