{ "version": 3, "sources": ["../../../src/lib/ui/overrides.ts"], "sourcesContent": ["import { Editor, objectMapEntries } from '@tldraw/editor'\nimport { useMemo } from 'react'\nimport { ActionsProviderProps } from './hooks/useActions'\nimport { ActionsMenuSchemaProviderProps } from './hooks/useActionsMenuSchema'\nimport { useBreakpoint } from './hooks/useBreakpoint'\nimport { TLUiContextMenuSchemaProviderProps } from './hooks/useContextMenuSchema'\nimport { useDialogs } from './hooks/useDialogsProvider'\nimport { TLUiHelpMenuSchemaProviderProps } from './hooks/useHelpMenuSchema'\nimport { TLUiKeyboardShortcutsSchemaProviderProps } from './hooks/useKeyboardShortcutsSchema'\nimport { TLUiMenuSchemaProviderProps } from './hooks/useMenuSchema'\nimport { useToasts } from './hooks/useToastsProvider'\nimport { TLUiToolbarSchemaProviderProps } from './hooks/useToolbarSchema'\nimport { TLUiToolsProviderProps } from './hooks/useTools'\nimport { TLUiTranslationProviderProps, useTranslation } from './hooks/useTranslation/useTranslation'\n\n/** @public */\nexport function useDefaultHelpers() {\n\tconst { addToast, removeToast, clearToasts } = useToasts()\n\tconst { addDialog, clearDialogs, removeDialog, updateDialog } = useDialogs()\n\tconst breakpoint = useBreakpoint()\n\tconst isMobile = breakpoint < 5\n\tconst msg = useTranslation()\n\treturn useMemo(\n\t\t() => ({\n\t\t\taddToast,\n\t\t\tremoveToast,\n\t\t\tclearToasts,\n\t\t\taddDialog,\n\t\t\tclearDialogs,\n\t\t\tremoveDialog,\n\t\t\tupdateDialog,\n\t\t\tmsg,\n\t\t\tisMobile,\n\t\t}),\n\t\t[\n\t\t\taddDialog,\n\t\t\taddToast,\n\t\t\tclearDialogs,\n\t\t\tclearToasts,\n\t\t\tmsg,\n\t\t\tremoveDialog,\n\t\t\tremoveToast,\n\t\t\tupdateDialog,\n\t\t\tisMobile,\n\t\t]\n\t)\n}\n\ntype DefaultHelpers = ReturnType\n\nexport type TLUiOverride = (editor: Editor, schema: Type, helpers: Helpers) => Type\n\ntype WithDefaultHelpers> = T extends TLUiOverride<\n\tinfer Type,\n\tinfer Helpers\n>\n\t? TLUiOverride\n\t: never\n\n/** @public */\nexport interface TLUiOverrides {\n\tactionsMenu?: WithDefaultHelpers>\n\tactions?: WithDefaultHelpers>\n\tcontextMenu?: WithDefaultHelpers>\n\thelpMenu?: WithDefaultHelpers>\n\tmenu?: WithDefaultHelpers>\n\ttoolbar?: WithDefaultHelpers>\n\tkeyboardShortcutsMenu?: WithDefaultHelpers<\n\t\tNonNullable\n\t>\n\ttools?: WithDefaultHelpers>\n\ttranslations?: TLUiTranslationProviderProps['overrides']\n}\n\nexport interface TLUiOverridesWithoutDefaults {\n\tactionsMenu?: ActionsMenuSchemaProviderProps['overrides']\n\tactions?: ActionsProviderProps['overrides']\n\tcontextMenu?: TLUiContextMenuSchemaProviderProps['overrides']\n\thelpMenu?: TLUiHelpMenuSchemaProviderProps['overrides']\n\tmenu?: TLUiMenuSchemaProviderProps['overrides']\n\ttoolbar?: TLUiToolbarSchemaProviderProps['overrides']\n\tkeyboardShortcutsMenu?: TLUiKeyboardShortcutsSchemaProviderProps['overrides']\n\ttools?: TLUiToolsProviderProps['overrides']\n\ttranslations?: TLUiTranslationProviderProps['overrides']\n}\n\nexport function mergeOverrides(\n\toverrides: TLUiOverrides[],\n\tdefaultHelpers: DefaultHelpers\n): TLUiOverridesWithoutDefaults {\n\tconst mergedTranslations: TLUiTranslationProviderProps['overrides'] = {}\n\tfor (const override of overrides) {\n\t\tif (override.translations) {\n\t\t\tfor (const [key, value] of objectMapEntries(override.translations)) {\n\t\t\t\tlet strings = mergedTranslations[key]\n\t\t\t\tif (!strings) {\n\t\t\t\t\tstrings = mergedTranslations[key] = {}\n\t\t\t\t}\n\t\t\t\tObject.assign(strings, value)\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tactionsMenu: (editor, schema, helpers) => {\n\t\t\tfor (const override of overrides) {\n\t\t\t\tif (override.actionsMenu) {\n\t\t\t\t\tschema = override.actionsMenu(editor, schema, { ...defaultHelpers, ...helpers })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema\n\t\t},\n\t\tactions: (editor, schema) => {\n\t\t\tfor (const override of overrides) {\n\t\t\t\tif (override.actions) {\n\t\t\t\t\tschema = override.actions(editor, schema, defaultHelpers)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema\n\t\t},\n\t\tcontextMenu: (editor, schema, helpers) => {\n\t\t\tfor (const override of overrides) {\n\t\t\t\tif (override.contextMenu) {\n\t\t\t\t\tschema = override.contextMenu(editor, schema, { ...defaultHelpers, ...helpers })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema\n\t\t},\n\t\thelpMenu: (editor, schema, helpers) => {\n\t\t\tfor (const override of overrides) {\n\t\t\t\tif (override.helpMenu) {\n\t\t\t\t\tschema = override.helpMenu(editor, schema, { ...defaultHelpers, ...helpers })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema\n\t\t},\n\t\tmenu: (editor, schema, helpers) => {\n\t\t\tfor (const override of overrides) {\n\t\t\t\tif (override.menu) {\n\t\t\t\t\tschema = override.menu(editor, schema, { ...defaultHelpers, ...helpers })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema\n\t\t},\n\t\ttoolbar: (editor, schema, helpers) => {\n\t\t\tfor (const override of overrides) {\n\t\t\t\tif (override.toolbar) {\n\t\t\t\t\tschema = override.toolbar(editor, schema, { ...defaultHelpers, ...helpers })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema\n\t\t},\n\t\tkeyboardShortcutsMenu: (editor, schema, helpers) => {\n\t\t\tfor (const override of overrides) {\n\t\t\t\tif (override.keyboardShortcutsMenu) {\n\t\t\t\t\tschema = override.keyboardShortcutsMenu(editor, schema, { ...defaultHelpers, ...helpers })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema\n\t\t},\n\t\ttools: (editor, schema, helpers) => {\n\t\t\tfor (const override of overrides) {\n\t\t\t\tif (override.tools) {\n\t\t\t\t\tschema = override.tools(editor, schema, { ...defaultHelpers, ...helpers })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn schema\n\t\t},\n\t\ttranslations: mergedTranslations,\n\t}\n}\n\nfunction useShallowArrayEquality(array: T): T {\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\treturn useMemo(() => array, array)\n}\n\nexport function useMergedTranslationOverrides(\n\toverrides?: TLUiOverrides[] | TLUiOverrides\n): NonNullable {\n\tconst overridesArray = useShallowArrayEquality(\n\t\toverrides == null ? [] : Array.isArray(overrides) ? overrides : [overrides]\n\t)\n\treturn useMemo(() => {\n\t\tconst mergedTranslations: TLUiTranslationProviderProps['overrides'] = {}\n\t\tfor (const override of overridesArray) {\n\t\t\tif (override.translations) {\n\t\t\t\tfor (const [key, value] of objectMapEntries(override.translations)) {\n\t\t\t\t\tlet strings = mergedTranslations[key]\n\t\t\t\t\tif (!strings) {\n\t\t\t\t\t\tstrings = mergedTranslations[key] = {}\n\t\t\t\t\t}\n\t\t\t\t\tObject.assign(strings, value)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn mergedTranslations\n\t}, [overridesArray])\n}\n\nexport function useMergedOverrides(\n\toverrides?: TLUiOverrides[] | TLUiOverrides\n): TLUiOverridesWithoutDefaults {\n\tconst defaultHelpers = useDefaultHelpers()\n\tconst overridesArray = useShallowArrayEquality(\n\t\toverrides == null ? [] : Array.isArray(overrides) ? overrides : [overrides]\n\t)\n\treturn useMemo(\n\t\t() => mergeOverrides(overridesArray, defaultHelpers),\n\t\t[overridesArray, defaultHelpers]\n\t)\n}\n"], "mappings": "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", "names": [] }