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 };
}