PromucFlow_constructor/app/client/src/pages/Editor/Canvas.tsx

99 lines
2.8 KiB
TypeScript
Raw Normal View History

import React, { memo, useCallback } from "react";
import store, { useSelector } from "store";
import WidgetFactory from "utils/WidgetFactory";
import PropertyPane from "pages/Editor/PropertyPane";
2019-11-25 05:07:27 +00:00
import ArtBoard from "pages/common/ArtBoard";
import log from "loglevel";
import * as Sentry from "@sentry/react";
import { DSLWidget } from "widgets/constants";
import CanvasMultiPointerArena, {
POINTERS_CANVAS_ID,
} from "../common/CanvasMultiPointerArena";
import { throttle } from "lodash";
import { io } from "socket.io-client";
import {
APP_COLLAB_EVENTS,
NAMESPACE_COLLAB_PAGE_EDIT,
} from "constants/AppCollabConstants";
import { RenderModes } from "constants/WidgetConstants";
import { RTS_BASE_PATH } from "constants/WebsocketConstants";
import { isMultiplayerEnabledForUser as isMultiplayerEnabledForUserSelector } from "selectors/appCollabSelectors";
2019-03-21 17:42:23 +00:00
2019-08-26 12:41:21 +00:00
interface CanvasProps {
dsl: DSLWidget;
pageId: string;
2019-08-29 11:22:09 +00:00
}
// This auto connects the socket
const pageEditSocket = io(NAMESPACE_COLLAB_PAGE_EDIT, {
path: RTS_BASE_PATH,
});
const shareMousePointer = (e: any, pageId: string) => {
if (store.getState().ui.appCollab.editors.length < 2) return;
if (pageEditSocket && pageEditSocket.connected) {
const selectionCanvas: any = document.getElementById(POINTERS_CANVAS_ID);
const rect = selectionCanvas.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
pageEditSocket.emit(APP_COLLAB_EVENTS.SHARE_USER_POINTER, {
data: { x, y },
pageId,
});
} else {
pageEditSocket && pageEditSocket.connect();
}
};
// TODO(abhinav): get the render mode from context
const Canvas = memo((props: CanvasProps) => {
const { pageId } = props;
const isMultiplayerEnabledForUser = useSelector(
isMultiplayerEnabledForUserSelector,
);
const delayedShareMousePointer = useCallback(
throttle((e) => shareMousePointer(e, pageId), 50, {
trailing: false,
}),
[shareMousePointer, pageId],
);
try {
return (
<>
2020-01-20 09:00:37 +00:00
<PropertyPane />
<ArtBoard
className="t--canvas-artboard"
data-testid="t--canvas-artboard"
id="art-board"
onMouseMove={(e) => {
e.persist();
if (!isMultiplayerEnabledForUser) return;
delayedShareMousePointer(e);
}}
width={props.dsl.rightColumn}
>
2020-01-20 09:00:37 +00:00
{props.dsl.widgetId &&
WidgetFactory.createWidget(props.dsl, RenderModes.CANVAS)}
{isMultiplayerEnabledForUser && (
<CanvasMultiPointerArena
pageEditSocket={pageEditSocket}
pageId={pageId}
/>
)}
2020-01-20 09:00:37 +00:00
</ArtBoard>
</>
);
} catch (error) {
log.error("Error rendering DSL", error);
Sentry.captureException(error);
return null;
}
});
Canvas.displayName = "Canvas";
export default Canvas;