import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import * as React from "react"; import { useHotkeys, useObserver, useRovingFocus, useSelections, useTraits, } from "."; import { createFileTree } from "./file-tree"; import type { Dir } from "./file-tree"; import { getNodesFromMockFs, waitForTree } from "./test/utils"; describe("useHotkeys()", () => { let fileTree = createFileTree(getNodesFromMockFs); afterEach(() => { fileTree = createFileTree(getNodesFromMockFs); }); beforeAll(() => { // this is here to silence a warning temporarily // we'll fix it in the next exercise jest.spyOn(console, "error").mockImplementation(() => {}); }); afterAll(() => { // @ts-expect-error console.error.mockRestore(); }); const createComponent = () => { const element = document.createElement("div"); document.body.appendChild(element); element.tabIndex = 0; element.style.paddingTop = "0"; element.style.paddingBottom = "0"; Object.defineProperties(element, { clientHeight: { get: () => 24, }, }); const windowRef = { current: element }; return [ element, () => { const [, forceUpdate] = React.useState({}); const rovingFocus = useRovingFocus(fileTree); const selections = useSelections(fileTree); const traits = useTraits(fileTree, ["selected"]); useHotkeys(fileTree, { windowRef, rovingFocus, selections, }); useObserver(rovingFocus.didChange, () => { forceUpdate({}); }); useObserver(selections.didChange, (nodeIds) => { traits.set("selected", [...nodeIds]); forceUpdate({}); }); return ( {fileTree.visibleNodes.map((nodeId, index) => (
))}