types.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import React from "react";
  2. import { ExcalidrawElement } from "../element/types";
  3. import { AppState } from "../types";
  4. /** if false, the action should be prevented */
  5. export type ActionResult =
  6. | {
  7. elements?: readonly ExcalidrawElement[] | null;
  8. appState?: MarkOptional<AppState, "offsetTop" | "offsetLeft"> | null;
  9. commitToHistory: boolean;
  10. syncHistory?: boolean;
  11. }
  12. | false;
  13. type ActionFn = (
  14. elements: readonly ExcalidrawElement[],
  15. appState: Readonly<AppState>,
  16. formData: any,
  17. app: { canvas: HTMLCanvasElement | null },
  18. ) => ActionResult | Promise<ActionResult>;
  19. export type UpdaterFn = (res: ActionResult) => void;
  20. export type ActionFilterFn = (action: Action) => void;
  21. export type ActionName =
  22. | "copy"
  23. | "cut"
  24. | "paste"
  25. | "copyAsPng"
  26. | "copyAsSvg"
  27. | "sendBackward"
  28. | "bringForward"
  29. | "sendToBack"
  30. | "bringToFront"
  31. | "copyStyles"
  32. | "selectAll"
  33. | "pasteStyles"
  34. | "gridMode"
  35. | "zenMode"
  36. | "stats"
  37. | "changeStrokeColor"
  38. | "changeBackgroundColor"
  39. | "changeFillStyle"
  40. | "changeStrokeWidth"
  41. | "changeSloppiness"
  42. | "changeStrokeStyle"
  43. | "changeArrowhead"
  44. | "changeOpacity"
  45. | "changeFontSize"
  46. | "toggleCanvasMenu"
  47. | "toggleEditMenu"
  48. | "undo"
  49. | "redo"
  50. | "finalize"
  51. | "changeProjectName"
  52. | "changeExportBackground"
  53. | "changeExportEmbedScene"
  54. | "changeShouldAddWatermark"
  55. | "saveScene"
  56. | "saveAsScene"
  57. | "loadScene"
  58. | "duplicateSelection"
  59. | "deleteSelectedElements"
  60. | "changeViewBackgroundColor"
  61. | "clearCanvas"
  62. | "zoomIn"
  63. | "zoomOut"
  64. | "resetZoom"
  65. | "zoomToFit"
  66. | "zoomToSelection"
  67. | "changeFontFamily"
  68. | "changeTextAlign"
  69. | "toggleFullScreen"
  70. | "toggleShortcuts"
  71. | "group"
  72. | "ungroup"
  73. | "goToCollaborator"
  74. | "addToLibrary"
  75. | "changeSharpness"
  76. | "alignTop"
  77. | "alignBottom"
  78. | "alignLeft"
  79. | "alignRight"
  80. | "alignVerticallyCentered"
  81. | "alignHorizontallyCentered"
  82. | "distributeHorizontally"
  83. | "distributeVertically"
  84. | "viewMode"
  85. | "exportWithDarkMode";
  86. export interface Action {
  87. name: ActionName;
  88. PanelComponent?: React.FC<{
  89. elements: readonly ExcalidrawElement[];
  90. appState: AppState;
  91. updateData: (formData?: any) => void;
  92. id?: string;
  93. }>;
  94. perform: ActionFn;
  95. keyPriority?: number;
  96. keyTest?: (
  97. event: KeyboardEvent,
  98. appState: AppState,
  99. elements: readonly ExcalidrawElement[],
  100. ) => boolean;
  101. contextItemLabel?: string;
  102. contextItemPredicate?: (
  103. elements: readonly ExcalidrawElement[],
  104. appState: AppState,
  105. ) => boolean;
  106. checked?: (appState: Readonly<AppState>) => boolean;
  107. }
  108. export interface ActionsManagerInterface {
  109. actions: Record<ActionName, Action>;
  110. registerAction: (action: Action) => void;
  111. handleKeyDown: (event: KeyboardEvent) => boolean;
  112. renderAction: (name: ActionName) => React.ReactElement | null;
  113. }