types.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import React from "react";
  2. import { ExcalidrawElement } from "../element/types";
  3. import {
  4. AppClassProperties,
  5. AppState,
  6. ExcalidrawProps,
  7. BinaryFiles,
  8. } from "../types";
  9. export type ActionSource = "ui" | "keyboard" | "contextMenu" | "api";
  10. /** if false, the action should be prevented */
  11. export type ActionResult =
  12. | {
  13. elements?: readonly ExcalidrawElement[] | null;
  14. appState?: MarkOptional<
  15. AppState,
  16. "offsetTop" | "offsetLeft" | "width" | "height"
  17. > | null;
  18. files?: BinaryFiles | null;
  19. commitToHistory: boolean;
  20. syncHistory?: boolean;
  21. replaceFiles?: boolean;
  22. }
  23. | false;
  24. type ActionFn = (
  25. elements: readonly ExcalidrawElement[],
  26. appState: Readonly<AppState>,
  27. formData: any,
  28. app: AppClassProperties,
  29. ) => ActionResult | Promise<ActionResult>;
  30. export type UpdaterFn = (res: ActionResult) => void;
  31. export type ActionFilterFn = (action: Action) => void;
  32. export type ActionName =
  33. | "copy"
  34. | "cut"
  35. | "paste"
  36. | "copyAsPng"
  37. | "copyAsSvg"
  38. | "copyText"
  39. | "sendBackward"
  40. | "bringForward"
  41. | "sendToBack"
  42. | "bringToFront"
  43. | "copyStyles"
  44. | "selectAll"
  45. | "pasteStyles"
  46. | "gridMode"
  47. | "zenMode"
  48. | "stats"
  49. | "changeStrokeColor"
  50. | "changeBackgroundColor"
  51. | "changeFillStyle"
  52. | "changeStrokeWidth"
  53. | "changeStrokeShape"
  54. | "changeSloppiness"
  55. | "changeStrokeStyle"
  56. | "changeArrowhead"
  57. | "changeOpacity"
  58. | "changeFontSize"
  59. | "toggleCanvasMenu"
  60. | "toggleEditMenu"
  61. | "undo"
  62. | "redo"
  63. | "finalize"
  64. | "changeProjectName"
  65. | "changeExportBackground"
  66. | "changeExportEmbedScene"
  67. | "changeExportScale"
  68. | "saveToActiveFile"
  69. | "saveFileToDisk"
  70. | "loadScene"
  71. | "duplicateSelection"
  72. | "deleteSelectedElements"
  73. | "changeViewBackgroundColor"
  74. | "clearCanvas"
  75. | "zoomIn"
  76. | "zoomOut"
  77. | "resetZoom"
  78. | "zoomToFit"
  79. | "zoomToSelection"
  80. | "changeFontFamily"
  81. | "changeTextAlign"
  82. | "changeVerticalAlign"
  83. | "toggleFullScreen"
  84. | "toggleShortcuts"
  85. | "group"
  86. | "ungroup"
  87. | "goToCollaborator"
  88. | "addToLibrary"
  89. | "changeRoundness"
  90. | "alignTop"
  91. | "alignBottom"
  92. | "alignLeft"
  93. | "alignRight"
  94. | "alignVerticallyCentered"
  95. | "alignHorizontallyCentered"
  96. | "distributeHorizontally"
  97. | "distributeVertically"
  98. | "flipHorizontal"
  99. | "flipVertical"
  100. | "viewMode"
  101. | "exportWithDarkMode"
  102. | "toggleTheme"
  103. | "increaseFontSize"
  104. | "decreaseFontSize"
  105. | "unbindText"
  106. | "hyperlink"
  107. | "eraser"
  108. | "bindText"
  109. | "toggleLock"
  110. | "toggleLinearEditor";
  111. export type PanelComponentProps = {
  112. elements: readonly ExcalidrawElement[];
  113. appState: AppState;
  114. updateData: (formData?: any) => void;
  115. appProps: ExcalidrawProps;
  116. data?: Record<string, any>;
  117. };
  118. export interface Action {
  119. name: ActionName;
  120. PanelComponent?: React.FC<
  121. PanelComponentProps & { isInHamburgerMenu: boolean }
  122. >;
  123. perform: ActionFn;
  124. keyPriority?: number;
  125. keyTest?: (
  126. event: React.KeyboardEvent | KeyboardEvent,
  127. appState: AppState,
  128. elements: readonly ExcalidrawElement[],
  129. ) => boolean;
  130. contextItemLabel?:
  131. | string
  132. | ((
  133. elements: readonly ExcalidrawElement[],
  134. appState: Readonly<AppState>,
  135. ) => string);
  136. contextItemPredicate?: (
  137. elements: readonly ExcalidrawElement[],
  138. appState: AppState,
  139. ) => boolean;
  140. checked?: (appState: Readonly<AppState>) => boolean;
  141. trackEvent:
  142. | false
  143. | {
  144. category:
  145. | "toolbar"
  146. | "element"
  147. | "canvas"
  148. | "export"
  149. | "history"
  150. | "menu"
  151. | "collab"
  152. | "hyperlink";
  153. action?: string;
  154. predicate?: (
  155. appState: Readonly<AppState>,
  156. elements: readonly ExcalidrawElement[],
  157. value: any,
  158. ) => boolean;
  159. };
  160. /** if set to `true`, allow action to be performed in viewMode.
  161. * Defaults to `false` */
  162. viewMode?: boolean;
  163. }