HintViewer.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import React from "react";
  2. import { t } from "../i18n";
  3. import { ExcalidrawElement } from "../element/types";
  4. import { getSelectedElements } from "../scene";
  5. import "./HintViewer.scss";
  6. import { AppState } from "../types";
  7. interface Hint {
  8. appState: AppState;
  9. elements: readonly ExcalidrawElement[];
  10. }
  11. const getHints = ({ appState, elements }: Hint) => {
  12. const { elementType, isResizing } = appState;
  13. const multiMode = appState.multiElement !== null;
  14. if (elementType === "arrow" || elementType === "line") {
  15. if (!multiMode) {
  16. return t("hints.linearElement");
  17. }
  18. return t("hints.linearElementMulti");
  19. }
  20. if (isResizing) {
  21. const selectedElements = getSelectedElements(elements, appState);
  22. if (
  23. selectedElements.length === 1 &&
  24. (selectedElements[0].type === "arrow" ||
  25. selectedElements[0].type === "line") &&
  26. selectedElements[0].points.length > 2
  27. ) {
  28. return null;
  29. }
  30. return t("hints.resize");
  31. }
  32. return null;
  33. };
  34. export const HintViewer = ({ appState, elements }: Hint) => {
  35. const hint = getHints({
  36. appState,
  37. elements,
  38. });
  39. if (!hint) {
  40. return null;
  41. }
  42. return (
  43. <div className="HintViewer">
  44. <span>{hint}</span>
  45. </div>
  46. );
  47. };