actionFinalize.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { KEYS } from "../keys";
  2. import { isInvisiblySmallElement } from "../element";
  3. import { resetCursor } from "../utils";
  4. import React from "react";
  5. import { ToolButton } from "../components/ToolButton";
  6. import { done } from "../components/icons";
  7. import { t } from "../i18n";
  8. import { register } from "./register";
  9. import { invalidateShapeForElement } from "../renderer/renderElement";
  10. import { mutateElement } from "../element/mutateElement";
  11. export const actionFinalize = register({
  12. name: "finalize",
  13. perform: (elements, appState) => {
  14. let newElements = elements;
  15. if (window.document.activeElement instanceof HTMLElement) {
  16. window.document.activeElement.blur();
  17. }
  18. if (appState.multiElement) {
  19. // pen and mouse have hover
  20. if (appState.lastPointerDownWith !== "touch") {
  21. mutateElement(appState.multiElement, {
  22. points: appState.multiElement.points.slice(
  23. 0,
  24. appState.multiElement.points.length - 1,
  25. ),
  26. });
  27. }
  28. if (isInvisiblySmallElement(appState.multiElement)) {
  29. newElements = newElements.slice(0, -1);
  30. }
  31. invalidateShapeForElement(appState.multiElement);
  32. if (!appState.elementLocked) {
  33. appState.selectedElementIds[appState.multiElement.id] = true;
  34. }
  35. }
  36. if (!appState.elementLocked || !appState.multiElement) {
  37. resetCursor();
  38. }
  39. return {
  40. elements: newElements,
  41. appState: {
  42. ...appState,
  43. elementType:
  44. appState.elementLocked && appState.multiElement
  45. ? appState.elementType
  46. : "selection",
  47. draggingElement: null,
  48. multiElement: null,
  49. editingElement: null,
  50. selectedElementIds: {},
  51. },
  52. };
  53. },
  54. keyTest: (event, appState) =>
  55. (event.key === KEYS.ESCAPE &&
  56. !appState.draggingElement &&
  57. appState.multiElement === null) ||
  58. ((event.key === KEYS.ESCAPE || event.key === KEYS.ENTER) &&
  59. appState.multiElement !== null),
  60. PanelComponent: ({ appState, updateData }) => (
  61. <ToolButton
  62. type="button"
  63. icon={done}
  64. title={t("buttons.done")}
  65. aria-label={t("buttons.done")}
  66. onClick={updateData}
  67. visible={appState.multiElement != null}
  68. />
  69. ),
  70. });