2021-07-05 05:49:43 +00:00
|
|
|
import log from "loglevel";
|
|
|
|
|
import * as Sentry from "@sentry/react";
|
2022-05-04 09:45:57 +00:00
|
|
|
import styled from "styled-components";
|
2022-08-19 10:10:36 +00:00
|
|
|
import { CanvasWidgetStructure } from "widgets/constants";
|
2022-05-04 09:45:57 +00:00
|
|
|
import WidgetFactory from "utils/WidgetFactory";
|
2023-02-03 05:47:40 +00:00
|
|
|
import React from "react";
|
2021-09-09 15:10:22 +00:00
|
|
|
|
|
|
|
|
import { RenderModes } from "constants/WidgetConstants";
|
2023-02-03 05:47:40 +00:00
|
|
|
import { useSelector } from "react-redux";
|
2022-05-04 09:45:57 +00:00
|
|
|
import { getSelectedAppTheme } from "selectors/appThemingSelectors";
|
|
|
|
|
import { previewModeSelector } from "selectors/editorSelectors";
|
2022-12-30 14:52:11 +00:00
|
|
|
import useWidgetFocus from "utils/hooks/useWidgetFocus";
|
2019-03-21 17:42:23 +00:00
|
|
|
|
2019-08-26 12:41:21 +00:00
|
|
|
interface CanvasProps {
|
2022-08-19 10:10:36 +00:00
|
|
|
widgetsStructure: CanvasWidgetStructure;
|
2021-08-18 10:29:52 +00:00
|
|
|
pageId: string;
|
2022-08-19 10:10:36 +00:00
|
|
|
canvasWidth: number;
|
2023-01-09 05:24:41 +00:00
|
|
|
canvasScale?: number;
|
2019-08-29 11:22:09 +00:00
|
|
|
}
|
|
|
|
|
|
2022-05-04 09:45:57 +00:00
|
|
|
const Container = styled.section<{
|
|
|
|
|
background: string;
|
2023-02-03 05:47:40 +00:00
|
|
|
width: number;
|
|
|
|
|
$canvasScale: number;
|
2022-05-04 09:45:57 +00:00
|
|
|
}>`
|
|
|
|
|
background: ${({ background }) => background};
|
2023-02-03 05:47:40 +00:00
|
|
|
width: ${(props) => props.width}px;
|
|
|
|
|
transform: scale(${(props) => props.$canvasScale});
|
|
|
|
|
transform-origin: "0 0";
|
2022-05-04 09:45:57 +00:00
|
|
|
`;
|
|
|
|
|
|
2023-02-03 05:47:40 +00:00
|
|
|
const Canvas = (props: CanvasProps) => {
|
|
|
|
|
const { canvasScale = 1, canvasWidth } = props;
|
2022-05-04 09:45:57 +00:00
|
|
|
const isPreviewMode = useSelector(previewModeSelector);
|
|
|
|
|
const selectedTheme = useSelector(getSelectedAppTheme);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* background for canvas
|
|
|
|
|
*/
|
|
|
|
|
let backgroundForCanvas;
|
|
|
|
|
|
|
|
|
|
if (isPreviewMode) {
|
|
|
|
|
backgroundForCanvas = "initial";
|
|
|
|
|
} else {
|
|
|
|
|
backgroundForCanvas = selectedTheme.properties.colors.backgroundColor;
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-30 14:52:11 +00:00
|
|
|
const focusRef = useWidgetFocus();
|
|
|
|
|
|
2019-11-26 10:45:46 +00:00
|
|
|
try {
|
|
|
|
|
return (
|
2022-05-04 09:45:57 +00:00
|
|
|
<Container
|
2023-02-03 05:47:40 +00:00
|
|
|
$canvasScale={canvasScale}
|
2022-05-04 09:45:57 +00:00
|
|
|
background={backgroundForCanvas}
|
|
|
|
|
className="relative mx-auto t--canvas-artboard pb-52"
|
2021-11-23 08:01:46 +00:00
|
|
|
data-testid="t--canvas-artboard"
|
|
|
|
|
id="art-board"
|
2022-12-30 14:52:11 +00:00
|
|
|
ref={focusRef}
|
2023-02-03 05:47:40 +00:00
|
|
|
width={canvasWidth}
|
2021-11-23 08:01:46 +00:00
|
|
|
>
|
2022-08-19 10:10:36 +00:00
|
|
|
{props.widgetsStructure.widgetId &&
|
2022-11-27 17:12:00 +00:00
|
|
|
WidgetFactory.createWidget(
|
|
|
|
|
props.widgetsStructure,
|
|
|
|
|
RenderModes.CANVAS,
|
|
|
|
|
)}
|
2022-05-04 09:45:57 +00:00
|
|
|
</Container>
|
2019-11-26 10:45:46 +00:00
|
|
|
);
|
|
|
|
|
} catch (error) {
|
2021-07-05 05:49:43 +00:00
|
|
|
log.error("Error rendering DSL", error);
|
|
|
|
|
Sentry.captureException(error);
|
2019-11-26 10:45:46 +00:00
|
|
|
return null;
|
|
|
|
|
}
|
2023-02-03 05:47:40 +00:00
|
|
|
};
|
2019-02-10 13:06:05 +00:00
|
|
|
|
2019-09-09 10:30:22 +00:00
|
|
|
export default Canvas;
|