UNPKG

tldraw

Version:

A tiny little drawing editor.

191 lines (190 loc) • 5.29 kB
import { jsx } from "react/jsx-runtime"; import { GeoShapeGeoStyle, useEditor } from "@tldraw/editor"; import * as React from "react"; import { EmbedDialog } from "../components/EmbedDialog.mjs"; import { useUiEvents } from "../context/events.mjs"; import { useDefaultHelpers } from "../overrides.mjs"; const ToolsContext = React.createContext(null); function ToolsProvider({ overrides, children }) { const editor = useEditor(); const trackEvent = useUiEvents(); const helpers = useDefaultHelpers(); const tools = React.useMemo(() => { const toolsArray = [ { id: "select", label: "tool.select", icon: "tool-pointer", kbd: "v", readonlyOk: true, onSelect(source) { if (editor.isIn("select")) { const currentNode = editor.root.getCurrent(); currentNode.exit({}, currentNode.id); currentNode.enter({}, currentNode.id); } editor.setCurrentTool("select"); trackEvent("select-tool", { source, id: "select" }); } }, { id: "hand", label: "tool.hand", icon: "tool-hand", kbd: "h", readonlyOk: true, onSelect(source) { editor.setCurrentTool("hand"); trackEvent("select-tool", { source, id: "hand" }); } }, { id: "eraser", label: "tool.eraser", icon: "tool-eraser", kbd: "e", onSelect(source) { editor.setCurrentTool("eraser"); trackEvent("select-tool", { source, id: "eraser" }); } }, { id: "draw", label: "tool.draw", icon: "tool-pencil", kbd: "d,b,x", onSelect(source) { editor.setCurrentTool("draw"); trackEvent("select-tool", { source, id: "draw" }); } }, ...[...GeoShapeGeoStyle.values].map((id) => ({ id, label: `tool.${id}`, meta: { geo: id }, kbd: id === "rectangle" ? "r" : id === "ellipse" ? "o" : void 0, icon: "geo-" + id, onSelect(source) { editor.run(() => { editor.setStyleForNextShapes(GeoShapeGeoStyle, id); editor.setCurrentTool("geo"); trackEvent("select-tool", { source, id: `geo-${id}` }); }); } })), { id: "arrow", label: "tool.arrow", icon: "tool-arrow", kbd: "a", onSelect(source) { editor.setCurrentTool("arrow"); trackEvent("select-tool", { source, id: "arrow" }); } }, { id: "line", label: "tool.line", icon: "tool-line", kbd: "l", onSelect(source) { editor.setCurrentTool("line"); trackEvent("select-tool", { source, id: "line" }); } }, { id: "frame", label: "tool.frame", icon: "tool-frame", kbd: "f", onSelect(source) { editor.setCurrentTool("frame"); trackEvent("select-tool", { source, id: "frame" }); } }, { id: "text", label: "tool.text", icon: "tool-text", kbd: "t", onSelect(source) { editor.setCurrentTool("text"); trackEvent("select-tool", { source, id: "text" }); } }, { id: "asset", label: "tool.asset", icon: "tool-media", kbd: "$u", onSelect(source) { helpers.insertMedia(); trackEvent("select-tool", { source, id: "media" }); } }, { id: "note", label: "tool.note", icon: "tool-note", kbd: "n", onSelect(source) { editor.setCurrentTool("note"); trackEvent("select-tool", { source, id: "note" }); } }, { id: "laser", label: "tool.laser", readonlyOk: true, icon: "tool-laser", kbd: "k", onSelect(source) { editor.setCurrentTool("laser"); trackEvent("select-tool", { source, id: "laser" }); } }, { id: "embed", label: "tool.embed", icon: "dot", onSelect(source) { helpers.addDialog({ component: EmbedDialog }); trackEvent("select-tool", { source, id: "embed" }); } }, { id: "highlight", label: "tool.highlight", icon: "tool-highlight", // TODO: pick a better shortcut kbd: "!d", onSelect(source) { editor.setCurrentTool("highlight"); trackEvent("select-tool", { source, id: "highlight" }); } } ]; toolsArray.push(); const tools2 = Object.fromEntries(toolsArray.map((t) => [t.id, t])); if (overrides) { return overrides(editor, tools2, helpers); } return tools2; }, [overrides, editor, trackEvent, helpers]); return /* @__PURE__ */ jsx(ToolsContext.Provider, { value: tools, children }); } function useTools() { const ctx = React.useContext(ToolsContext); if (!ctx) { throw new Error("useTools must be used within a ToolProvider"); } return ctx; } export { ToolsContext, ToolsProvider, useTools }; //# sourceMappingURL=useTools.mjs.map