HintViewer.tsx 1.5 KB

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