{ "version": 3, "sources": ["../../../../src/lib/ui/hooks/useTools.tsx"], "sourcesContent": ["import { Editor, GeoShapeGeoStyle, useEditor } from '@tldraw/editor'\nimport * as React from 'react'\nimport { EmbedDialog } from '../components/EmbedDialog'\nimport { TLUiIconType } from '../icon-types'\nimport { useDialogs } from './useDialogsProvider'\nimport { TLUiEventSource, useUiEvents } from './useEventsProvider'\nimport { useInsertMedia } from './useInsertMedia'\nimport { TLUiTranslationKey } from './useTranslation/TLUiTranslationKey'\n\n/** @public */\nexport interface TLUiToolItem {\n\tid: string\n\tlabel: TLUiTranslationKey\n\tshortcutsLabel?: TLUiTranslationKey\n\ticon: TLUiIconType\n\tonSelect: (source: TLUiEventSource) => void\n\tkbd?: string\n\treadonlyOk: boolean\n\tmeta?: {\n\t\t[key: string]: any\n\t}\n}\n\n/** @public */\nexport type TLUiToolsContextType = Record\n\n/** @internal */\nexport const ToolsContext = React.createContext({} as TLUiToolsContextType)\n\n/** @public */\nexport type TLUiToolsProviderProps = {\n\toverrides?: (\n\t\teditor: Editor,\n\t\ttools: TLUiToolsContextType,\n\t\thelpers: { insertMedia: () => void }\n\t) => TLUiToolsContextType\n\tchildren: any\n}\n\n/** @internal */\nexport function ToolsProvider({ overrides, children }: TLUiToolsProviderProps) {\n\tconst editor = useEditor()\n\tconst trackEvent = useUiEvents()\n\n\tconst { addDialog } = useDialogs()\n\tconst insertMedia = useInsertMedia()\n\n\tconst tools = React.useMemo(() => {\n\t\tconst toolsArray: TLUiToolItem[] = [\n\t\t\t{\n\t\t\t\tid: 'select',\n\t\t\t\tlabel: 'tool.select',\n\t\t\t\ticon: 'tool-pointer',\n\t\t\t\tkbd: 'v',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('select')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'select' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'hand',\n\t\t\t\tlabel: 'tool.hand',\n\t\t\t\ticon: 'tool-hand',\n\t\t\t\tkbd: 'h',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('hand')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'hand' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'eraser',\n\t\t\t\tlabel: 'tool.eraser',\n\t\t\t\ticon: 'tool-eraser',\n\t\t\t\tkbd: 'e',\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('eraser')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'eraser' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'draw',\n\t\t\t\tlabel: 'tool.draw',\n\t\t\t\treadonlyOk: false,\n\t\t\t\ticon: 'tool-pencil',\n\t\t\t\tkbd: 'd,b,x',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('draw')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'draw' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t...[...GeoShapeGeoStyle.values].map((id) => ({\n\t\t\t\tid,\n\t\t\t\tlabel: `tool.${id}` as TLUiTranslationKey,\n\t\t\t\treadonlyOk: false,\n\t\t\t\tmeta: {\n\t\t\t\t\tgeo: id,\n\t\t\t\t},\n\t\t\t\tkbd: id === 'rectangle' ? 'r' : id === 'ellipse' ? 'o' : undefined,\n\t\t\t\ticon: ('geo-' + id) as TLUiIconType,\n\t\t\t\tonSelect(source: TLUiEventSource) {\n\t\t\t\t\teditor.batch(() => {\n\t\t\t\t\t\teditor.updateInstanceState(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstylesForNextShape: {\n\t\t\t\t\t\t\t\t\t...editor.instanceState.stylesForNextShape,\n\t\t\t\t\t\t\t\t\t[GeoShapeGeoStyle.id]: id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ ephemeral: true }\n\t\t\t\t\t\t)\n\t\t\t\t\t\teditor.setCurrentTool('geo')\n\t\t\t\t\t\ttrackEvent('select-tool', { source, id: `geo-${id}` })\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})),\n\t\t\t{\n\t\t\t\tid: 'arrow',\n\t\t\t\tlabel: 'tool.arrow',\n\t\t\t\treadonlyOk: false,\n\t\t\t\ticon: 'tool-arrow',\n\t\t\t\tkbd: 'a',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('arrow')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'arrow' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'line',\n\t\t\t\tlabel: 'tool.line',\n\t\t\t\treadonlyOk: false,\n\t\t\t\ticon: 'tool-line',\n\t\t\t\tkbd: 'l',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('line')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'line' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'frame',\n\t\t\t\tlabel: 'tool.frame',\n\t\t\t\treadonlyOk: false,\n\t\t\t\ticon: 'tool-frame',\n\t\t\t\tkbd: 'f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('frame')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'frame' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'text',\n\t\t\t\tlabel: 'tool.text',\n\t\t\t\treadonlyOk: false,\n\t\t\t\ticon: 'tool-text',\n\t\t\t\tkbd: 't',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('text')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'text' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'asset',\n\t\t\t\tlabel: 'tool.asset',\n\t\t\t\treadonlyOk: false,\n\t\t\t\ticon: 'tool-media',\n\t\t\t\tkbd: '$u',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tinsertMedia()\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'media' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'note',\n\t\t\t\tlabel: 'tool.note',\n\t\t\t\treadonlyOk: false,\n\t\t\t\ticon: 'tool-note',\n\t\t\t\tkbd: 'n',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('note')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'note' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'laser',\n\t\t\t\tlabel: 'tool.laser',\n\t\t\t\treadonlyOk: true,\n\t\t\t\ticon: 'tool-laser',\n\t\t\t\tkbd: 'k',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('laser')\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'laser' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'embed',\n\t\t\t\tlabel: 'tool.embed',\n\t\t\t\treadonlyOk: false,\n\t\t\t\ticon: 'tool-embed',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\taddDialog({ component: EmbedDialog })\n\t\t\t\t\ttrackEvent('select-tool', { source, id: 'embed' })\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\n\t\ttoolsArray.push({\n\t\t\tid: 'highlight',\n\t\t\tlabel: 'tool.highlight',\n\t\t\treadonlyOk: true,\n\t\t\ticon: 'tool-highlight',\n\t\t\t// TODO: pick a better shortcut\n\t\t\tkbd: '!d',\n\t\t\tonSelect(source) {\n\t\t\t\teditor.setCurrentTool('highlight')\n\t\t\t\ttrackEvent('select-tool', { source, id: 'highlight' })\n\t\t\t},\n\t\t})\n\n\t\tconst tools = Object.fromEntries(toolsArray.map((t) => [t.id, t]))\n\n\t\tif (overrides) {\n\t\t\treturn overrides(editor, tools, { insertMedia })\n\t\t}\n\n\t\treturn tools\n\t}, [overrides, editor, trackEvent, insertMedia, addDialog])\n\n\treturn {children}\n}\n\n/** @public */\nexport function useTools() {\n\tconst ctx = React.useContext(ToolsContext)\n\n\tif (!ctx) {\n\t\tthrow new Error('useTools must be used within a ToolProvider')\n\t}\n\n\treturn ctx\n}\n"], "mappings": "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", "names": ["tools"] }