UNPKG

tldraw

Version:

A tiny little drawing editor.

8 lines (7 loc) 7.91 kB
{ "version": 3, "sources": ["../../../src/lib/ui/overrides.ts"], "sourcesContent": ["import { Editor, objectMapEntries } from '@tldraw/editor'\nimport { useMemo } from 'react'\nimport { PORTRAIT_BREAKPOINT } from './constants'\nimport { ActionsProviderProps, TLUiActionsContextType } from './context/actions'\nimport { useBreakpoint } from './context/breakpoints'\nimport { useDialogs } from './context/dialogs'\nimport { useToasts } from './context/toasts'\nimport { useMenuClipboardEvents } from './hooks/useClipboardEvents'\nimport { useCopyAs } from './hooks/useCopyAs'\nimport { useExportAs } from './hooks/useExportAs'\nimport { useGetEmbedDefinition } from './hooks/useGetEmbedDefinition'\nimport { useInsertMedia } from './hooks/useInsertMedia'\nimport { usePrint } from './hooks/usePrint'\nimport { TLUiToolsContextType, 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 } = useDialogs()\n\n\tconst msg = useTranslation()\n\tconst insertMedia = useInsertMedia()\n\tconst printSelectionOrPages = usePrint()\n\tconst { cut, copy, paste } = useMenuClipboardEvents()\n\tconst copyAs = useCopyAs()\n\tconst exportAs = useExportAs()\n\tconst getEmbedDefinition = useGetEmbedDefinition()\n\n\t// This is the only one that will change during runtime\n\tconst breakpoint = useBreakpoint()\n\tconst isMobile = breakpoint < PORTRAIT_BREAKPOINT.TABLET_SM\n\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\tremoveDialog,\n\t\t\tclearDialogs,\n\t\t\tmsg,\n\t\t\tisMobile,\n\t\t\tinsertMedia,\n\t\t\tprintSelectionOrPages,\n\t\t\tcut,\n\t\t\tcopy,\n\t\t\tpaste,\n\t\t\tcopyAs,\n\t\t\texportAs,\n\t\t\tgetEmbedDefinition,\n\t\t}),\n\t\t[\n\t\t\taddToast,\n\t\t\tremoveToast,\n\t\t\tclearToasts,\n\t\t\taddDialog,\n\t\t\tremoveDialog,\n\t\t\tclearDialogs,\n\t\t\tmsg,\n\t\t\tisMobile,\n\t\t\tinsertMedia,\n\t\t\tprintSelectionOrPages,\n\t\t\tcut,\n\t\t\tcopy,\n\t\t\tpaste,\n\t\t\tcopyAs,\n\t\t\texportAs,\n\t\t\tgetEmbedDefinition,\n\t\t]\n\t)\n}\n\n/** @public */\nexport type TLUiOverrideHelpers = ReturnType<typeof useDefaultHelpers>\n\n/** @public */\nexport interface TLUiOverrides {\n\tactions?(\n\t\teditor: Editor,\n\t\tactions: TLUiActionsContextType,\n\t\thelpers: TLUiOverrideHelpers\n\t): TLUiActionsContextType\n\ttools?(\n\t\teditor: Editor,\n\t\ttools: TLUiToolsContextType,\n\t\thelpers: TLUiOverrideHelpers\n\t): TLUiToolsContextType\n\ttranslations?: TLUiTranslationProviderProps['overrides']\n}\n\nexport interface TLUiOverridesWithoutDefaults {\n\tactions?: ActionsProviderProps['overrides']\n\ttools?: TLUiToolsProviderProps['overrides']\n\ttranslations?: TLUiTranslationProviderProps['overrides']\n}\n\nexport function mergeOverrides(\n\toverrides: TLUiOverrides[],\n\tdefaultHelpers: TLUiOverrideHelpers\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\tactions: (editor, schema, helpers) => {\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, 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<T extends unknown[]>(array: T): T {\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\treturn useMemo(() => array, array)\n}\n\n/** @internal */\nexport function useMergedTranslationOverrides(\n\toverrides?: TLUiOverrides[] | TLUiOverrides\n): NonNullable<TLUiTranslationProviderProps['overrides']> {\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": [] }