import { useCallback, useEffect } from "react"; import "./index.scss"; import { collectCode } from "../../document/code/playground"; import { SESSION_KEY } from "../utils"; import { useIsServer, useLocale } from "../../hooks"; import { Button } from "../../ui/atoms/button"; import { useUIStatus } from "../../ui-context"; import { QueueEntry } from "../../types/playground"; import { PLAYGROUND } from "../../telemetry/constants"; import { useGleanClick } from "../../telemetry/glean-context"; function PQEntry({ gleanContext, item: { id, key, lang }, unqueue, }: { gleanContext: string; item: QueueEntry; unqueue: () => void; }) { const gleanClick = useGleanClick(); const { setHighlightedQueueExample } = useUIStatus(); const getHeader = () => { const element = document.getElementById(id); return element?.parentElement?.parentElement; }; const setActive = (value: boolean) => { if (setHighlightedQueueExample) { if (value) { setHighlightedQueueExample(id); } else { setHighlightedQueueExample(null); } } }; const intoView = () => { const header = getHeader(); const top = (header?.getBoundingClientRect().top || 0) + window.scrollY - 130; window.scrollTo({ top, behavior: "smooth" }); }; return (
  • setActive(true)} onMouseLeave={() => setActive(false)} > {lang}
  • ); } export function PlayQueue({ gleanContext = PLAYGROUND, standalone = false, }: { gleanContext?: string; standalone?: boolean; }) { const locale = useLocale(); const isServer = useIsServer(); const gleanClick = useGleanClick(); const { queue, setQueue } = useUIStatus(); const cb = useCallback(() => { // Sync checkboxes to queue state. const elements = getQueueCheckboxes(); setQueue( elements .filter((e) => e.checked) .map((e) => createQueueEntry(e, elements)) ); }, [setQueue]); useEffect(() => { // Sync queue state to checkboxes. const ids = queue.map((item) => item.id); const elements = [ ...document.querySelectorAll(".playlist > input:checked"), ] as HTMLInputElement[]; for (const element of elements) { element.checked = ids.includes(element.id); } }, [queue]); useEffect(() => { if (!isServer) { window["playQueue"] = cb; } }, [cb, isServer]); return queue.length ? (
    ) : null; } function getQueueCheckboxes() { return [ ...document.querySelectorAll(".playlist > input"), ] as HTMLInputElement[]; } const LANG_MAPPING = { javascript: "js", }; export function createQueueEntry( elementOrId: HTMLInputElement | string, elements?: HTMLInputElement[] ) { const e = elementOrId instanceof HTMLInputElement ? elementOrId : (document.getElementById(elementOrId) as HTMLInputElement); elements ??= getQueueCheckboxes(); const key = elements.indexOf(e); const id = e.id; const lang = e ?.closest(".example-header") ?.querySelector(".language-name") ?.textContent?.toLowerCase() ?? ""; return { key, id, lang: LANG_MAPPING[lang] ?? lang }; }