import React, { useEffect, useMemo, useState } from "react"; import { getCommonBounds } from "../element/bounds"; import { NonDeletedExcalidrawElement } from "../element/types"; import { t } from "../i18n"; import { getTargetElements } from "../scene"; import Scene from "../scene/Scene"; import { AppState, ExcalidrawProps } from "../types"; import { CloseIcon } from "./icons"; import { Island } from "./Island"; import "./Stats.scss"; import { throttle } from "lodash"; import DragInput from "./DragInput"; const STATS_TIMEOUT = 50; interface StatsProps { appState: AppState; scene: Scene; setAppState: React.Component["setState"]; onClose: () => void; renderCustomStats: ExcalidrawProps["renderCustomStats"]; } type ElementStatItem = { label: string; property: "x" | "y" | "width" | "height" | "angle"; }; export const Stats = (props: StatsProps) => { const elements = props.scene.getNonDeletedElements(); const selectedElements = getTargetElements(elements, props.appState); const singleElement = selectedElements.length === 1 ? selectedElements[0] : null; const [sceneDimension, setSceneDimension] = useState<{ width: number; height: number; }>({ width: 0, height: 0, }); const throttledSetSceneDimension = useMemo( () => throttle((elements: readonly NonDeletedExcalidrawElement[]) => { const boundingBox = getCommonBounds(elements); setSceneDimension({ width: Math.round(boundingBox[2]) - Math.round(boundingBox[0]), height: Math.round(boundingBox[3]) - Math.round(boundingBox[1]), }); }, STATS_TIMEOUT), [], ); useEffect(() => { throttledSetSceneDimension(elements); }, [props.scene.version, elements, throttledSetSceneDimension]); useEffect( () => () => throttledSetSceneDimension.cancel(), [throttledSetSceneDimension], ); return (
{CloseIcon}

{t("stats.generalStats")}

{props.renderCustomStats?.(elements, props.appState)}
{t("stats.scene")}
{t("stats.elements")} {elements.length}
{t("stats.width")} {sceneDimension.width}
{t("stats.height")} {sceneDimension.height}
{singleElement && (

{t("stats.elementStats")}

{t(`element.${singleElement.type}`)}
{( [ { label: "X", property: "x", }, { label: "Y", property: "y", }, { label: "W", property: "width", }, { label: "H", property: "height", }, { label: "A", property: "angle", }, ] as ElementStatItem[] ).map((statsItem) => ( ))}
)}
); };