tldraw
Version:
A tiny little drawing editor.
173 lines (172 loc) • 5.63 kB
JavaScript
import { jsx, jsxs } from "react/jsx-runtime";
import {
DEFAULT_SUPPORTED_IMAGE_TYPES,
DEFAULT_SUPPORT_VIDEO_TYPES,
DefaultSpinner,
ErrorScreen,
LoadingScreen,
TldrawEditor,
useEditor,
useEditorComponents,
useOnMount,
useShallowArrayIdentity,
useShallowObjectIdentity
} from "@tldraw/editor";
import { useMemo } from "react";
import { TldrawHandles } from "./canvas/TldrawHandles.mjs";
import { TldrawScribble } from "./canvas/TldrawScribble.mjs";
import { TldrawSelectionBackground } from "./canvas/TldrawSelectionBackground.mjs";
import { TldrawSelectionForeground } from "./canvas/TldrawSelectionForeground.mjs";
import { TldrawShapeIndicators } from "./canvas/TldrawShapeIndicators.mjs";
import { defaultBindingUtils } from "./defaultBindingUtils.mjs";
import {
registerDefaultExternalContentHandlers
} from "./defaultExternalContentHandlers.mjs";
import { defaultShapeTools } from "./defaultShapeTools.mjs";
import { defaultShapeUtils } from "./defaultShapeUtils.mjs";
import { registerDefaultSideEffects } from "./defaultSideEffects.mjs";
import { defaultTools } from "./defaultTools.mjs";
import { EmbedShapeUtil } from "./shapes/embed/EmbedShapeUtil.mjs";
import { TldrawUi } from "./ui/TldrawUi.mjs";
import { useTldrawUiComponents } from "./ui/context/components.mjs";
import { useToasts } from "./ui/context/toasts.mjs";
import { usePreloadAssets } from "./ui/hooks/usePreloadAssets.mjs";
import { useTranslation } from "./ui/hooks/useTranslation/useTranslation.mjs";
import { useDefaultEditorAssetsWithOverrides } from "./utils/static-assets/assetUrls.mjs";
function Tldraw(props) {
const {
children,
maxImageDimension,
maxAssetSize,
acceptedImageMimeTypes,
acceptedVideoMimeTypes,
onMount,
components = {},
shapeUtils = [],
bindingUtils = [],
tools = [],
embeds,
...rest
} = props;
const _components = useShallowObjectIdentity(components);
const componentsWithDefault = useMemo(
() => ({
Scribble: TldrawScribble,
ShapeIndicators: TldrawShapeIndicators,
CollaboratorScribble: TldrawScribble,
SelectionForeground: TldrawSelectionForeground,
SelectionBackground: TldrawSelectionBackground,
Handles: TldrawHandles,
..._components
}),
[_components]
);
const _shapeUtils = useShallowArrayIdentity(shapeUtils);
const shapeUtilsWithDefaults = useMemo(
() => [...defaultShapeUtils, ..._shapeUtils],
[_shapeUtils]
);
const _bindingUtils = useShallowArrayIdentity(bindingUtils);
const bindingUtilsWithDefaults = useMemo(
() => [...defaultBindingUtils, ..._bindingUtils],
[_bindingUtils]
);
const _tools = useShallowArrayIdentity(tools);
const toolsWithDefaults = useMemo(
() => [...defaultTools, ...defaultShapeTools, ..._tools],
[_tools]
);
const _imageMimeTypes = useShallowArrayIdentity(
acceptedImageMimeTypes ?? DEFAULT_SUPPORTED_IMAGE_TYPES
);
const _videoMimeTypes = useShallowArrayIdentity(
acceptedVideoMimeTypes ?? DEFAULT_SUPPORT_VIDEO_TYPES
);
const mediaMimeTypes = useMemo(
() => [..._imageMimeTypes, ..._videoMimeTypes],
[_imageMimeTypes, _videoMimeTypes]
);
const assets = useDefaultEditorAssetsWithOverrides(rest.assetUrls);
const { done: preloadingComplete, error: preloadingError } = usePreloadAssets(assets);
if (preloadingError) {
return /* @__PURE__ */ jsx(ErrorScreen, { children: "Could not load assets. Please refresh the page." });
}
if (!preloadingComplete) {
return /* @__PURE__ */ jsx(LoadingScreen, { children: /* @__PURE__ */ jsx(DefaultSpinner, {}) });
}
const embedShapeUtil = shapeUtilsWithDefaults.find((util) => util.type === "embed");
if (embedShapeUtil && embeds) {
EmbedShapeUtil.setEmbedDefinitions(embeds);
}
return /* @__PURE__ */ jsx(
TldrawEditor,
{
initialState: "select",
...rest,
components: componentsWithDefault,
shapeUtils: shapeUtilsWithDefaults,
bindingUtils: bindingUtilsWithDefaults,
tools: toolsWithDefaults,
children: /* @__PURE__ */ jsxs(TldrawUi, { ...rest, components: componentsWithDefault, mediaMimeTypes, children: [
/* @__PURE__ */ jsx(
InsideOfEditorAndUiContext,
{
maxImageDimension,
maxAssetSize,
acceptedImageMimeTypes: _imageMimeTypes,
acceptedVideoMimeTypes: _videoMimeTypes,
onMount
}
),
children
] })
}
);
}
function InsideOfEditorAndUiContext({
maxImageDimension = 5e3,
maxAssetSize = 10 * 1024 * 1024,
// 10mb
acceptedImageMimeTypes = DEFAULT_SUPPORTED_IMAGE_TYPES,
acceptedVideoMimeTypes = DEFAULT_SUPPORT_VIDEO_TYPES,
onMount
}) {
const editor = useEditor();
const toasts = useToasts();
const msg = useTranslation();
useOnMount(() => {
const unsubs = [];
unsubs.push(registerDefaultSideEffects(editor));
registerDefaultExternalContentHandlers(
editor,
{
maxImageDimension,
maxAssetSize,
acceptedImageMimeTypes,
acceptedVideoMimeTypes
},
{
toasts,
msg
}
);
unsubs.push(editor.store.props.onMount(editor));
unsubs.push(onMount?.(editor));
return () => {
unsubs.forEach((fn) => fn?.());
};
});
const { Canvas } = useEditorComponents();
const { ContextMenu } = useTldrawUiComponents();
if (ContextMenu) {
return /* @__PURE__ */ jsx(ContextMenu, {});
}
if (Canvas) {
return /* @__PURE__ */ jsx(Canvas, {});
}
return null;
}
export {
Tldraw
};
//# sourceMappingURL=Tldraw.mjs.map