Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

useKeyboardEvents.ts 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
  2. import { useEffect } from 'react'
  3. import state from 'state'
  4. import { MoveType } from 'types'
  5. import { getKeyboardEventInfo, metaKey } from 'utils'
  6. export default function useKeyboardEvents() {
  7. useEffect(() => {
  8. function handleKeyDown(e: KeyboardEvent) {
  9. if (
  10. metaKey(e) &&
  11. ![
  12. 'a',
  13. 'i',
  14. 'r',
  15. 'j',
  16. 'ArrowLeft',
  17. 'ArrowRight',
  18. 'ArrowUp',
  19. 'ArrowDown',
  20. 'z',
  21. ].includes(e.key)
  22. ) {
  23. e.preventDefault()
  24. }
  25. switch (e.key) {
  26. case 'ArrowUp': {
  27. state.send('NUDGED', { delta: [0, -1], ...getKeyboardEventInfo(e) })
  28. break
  29. }
  30. case 'ArrowRight': {
  31. state.send('NUDGED', { delta: [1, 0], ...getKeyboardEventInfo(e) })
  32. break
  33. }
  34. case 'ArrowDown': {
  35. state.send('NUDGED', { delta: [0, 1], ...getKeyboardEventInfo(e) })
  36. break
  37. }
  38. case 'ArrowLeft': {
  39. state.send('NUDGED', { delta: [-1, 0], ...getKeyboardEventInfo(e) })
  40. break
  41. }
  42. case '=': {
  43. if (e.metaKey) {
  44. state.send('ZOOMED_IN')
  45. }
  46. break
  47. }
  48. case '-': {
  49. if (e.metaKey) {
  50. state.send('ZOOMED_OUT')
  51. }
  52. break
  53. }
  54. case '!': {
  55. // Shift + 1
  56. if (e.shiftKey) {
  57. state.send('ZOOMED_TO_FIT')
  58. }
  59. break
  60. }
  61. case '@': {
  62. // Shift + 2
  63. if (e.shiftKey) {
  64. state.send('ZOOMED_TO_SELECTION')
  65. }
  66. break
  67. }
  68. case ')': {
  69. // Shift + 0
  70. if (e.shiftKey) {
  71. state.send('ZOOMED_TO_ACTUAL')
  72. }
  73. break
  74. }
  75. case 'Escape': {
  76. state.send('CANCELLED')
  77. break
  78. }
  79. case 'z': {
  80. if (metaKey(e)) {
  81. if (e.shiftKey) {
  82. state.send('REDO', getKeyboardEventInfo(e))
  83. } else {
  84. state.send('UNDO', getKeyboardEventInfo(e))
  85. }
  86. }
  87. break
  88. }
  89. case '‘': {
  90. if (metaKey(e)) {
  91. state.send('MOVED', {
  92. ...getKeyboardEventInfo(e),
  93. type: MoveType.ToFront,
  94. })
  95. }
  96. break
  97. }
  98. case '“': {
  99. if (metaKey(e)) {
  100. state.send('MOVED', {
  101. ...getKeyboardEventInfo(e),
  102. type: MoveType.ToBack,
  103. })
  104. }
  105. break
  106. }
  107. case ']': {
  108. if (metaKey(e)) {
  109. state.send('MOVED', {
  110. ...getKeyboardEventInfo(e),
  111. type: MoveType.Forward,
  112. })
  113. }
  114. break
  115. }
  116. case '[': {
  117. if (metaKey(e)) {
  118. state.send('MOVED', {
  119. ...getKeyboardEventInfo(e),
  120. type: MoveType.Backward,
  121. })
  122. }
  123. break
  124. }
  125. case 'Shift': {
  126. state.send('PRESSED_SHIFT_KEY', getKeyboardEventInfo(e))
  127. break
  128. }
  129. case 'Alt': {
  130. state.send('PRESSED_ALT_KEY', getKeyboardEventInfo(e))
  131. break
  132. }
  133. case 'Backspace': {
  134. state.send('DELETED', getKeyboardEventInfo(e))
  135. break
  136. }
  137. case 'g': {
  138. if (metaKey(e)) {
  139. if (e.shiftKey) {
  140. state.send('UNGROUPED', getKeyboardEventInfo(e))
  141. } else {
  142. state.send('GROUPED', getKeyboardEventInfo(e))
  143. }
  144. }
  145. break
  146. }
  147. case 's': {
  148. if (metaKey(e)) {
  149. if (e.shiftKey) {
  150. state.send('SAVED_AS_TO_FILESYSTEM', getKeyboardEventInfo(e))
  151. } else {
  152. state.send('SAVED', getKeyboardEventInfo(e))
  153. }
  154. }
  155. break
  156. }
  157. case 'o': {
  158. if (metaKey(e)) {
  159. break
  160. } else {
  161. state.send('SELECTED_DOT_TOOL', getKeyboardEventInfo(e))
  162. }
  163. break
  164. }
  165. case 'v': {
  166. if (metaKey(e)) {
  167. state.send('PASTED', getKeyboardEventInfo(e))
  168. } else {
  169. state.send('SELECTED_SELECT_TOOL', getKeyboardEventInfo(e))
  170. }
  171. break
  172. }
  173. case 'a': {
  174. if (metaKey(e)) {
  175. state.send('SELECTED_ALL', getKeyboardEventInfo(e))
  176. } else {
  177. state.send('SELECTED_ARROW_TOOL', getKeyboardEventInfo(e))
  178. }
  179. break
  180. }
  181. case 'd': {
  182. if (metaKey(e)) {
  183. state.send('DUPLICATED', getKeyboardEventInfo(e))
  184. } else {
  185. state.send('SELECTED_DRAW_TOOL', getKeyboardEventInfo(e))
  186. }
  187. break
  188. }
  189. case 't': {
  190. state.send('SELECTED_TEXT_TOOL', getKeyboardEventInfo(e))
  191. break
  192. }
  193. case 'c': {
  194. if (metaKey(e)) {
  195. if (e.shiftKey) {
  196. state.send('COPIED_TO_SVG', getKeyboardEventInfo(e))
  197. } else {
  198. state.send('COPIED', getKeyboardEventInfo(e))
  199. }
  200. } else {
  201. state.send('SELECTED_ELLIPSE_TOOL', getKeyboardEventInfo(e))
  202. }
  203. break
  204. }
  205. case 'i': {
  206. if (metaKey(e)) {
  207. break
  208. } else {
  209. state.send('SELECTED_CIRCLE_TOOL', getKeyboardEventInfo(e))
  210. }
  211. break
  212. }
  213. case 'l': {
  214. if (metaKey(e)) {
  215. if (e.shiftKey) {
  216. state.send('LOADED_FROM_FILE_STSTEM', getKeyboardEventInfo(e))
  217. }
  218. } else {
  219. state.send('SELECTED_LINE_TOOL', getKeyboardEventInfo(e))
  220. }
  221. break
  222. }
  223. case 'y': {
  224. if (metaKey(e)) {
  225. break
  226. } else {
  227. state.send('SELECTED_RAY_TOOL', getKeyboardEventInfo(e))
  228. }
  229. break
  230. }
  231. case 'p': {
  232. if (metaKey(e)) {
  233. break
  234. } else {
  235. state.send('SELECTED_POLYLINE_TOOL', getKeyboardEventInfo(e))
  236. }
  237. break
  238. }
  239. case 'r': {
  240. if (metaKey(e)) {
  241. break
  242. } else {
  243. state.send('SELECTED_RECTANGLE_TOOL', getKeyboardEventInfo(e))
  244. }
  245. break
  246. }
  247. case '|': {
  248. state.send('COPIED_STATE_TO_CLIPBOARD')
  249. break
  250. }
  251. default: {
  252. state.send('PRESSED_KEY', getKeyboardEventInfo(e))
  253. }
  254. }
  255. }
  256. function handleKeyUp(e: KeyboardEvent) {
  257. if (e.key === 'Shift') {
  258. state.send('RELEASED_SHIFT_KEY', getKeyboardEventInfo(e))
  259. }
  260. if (e.key === 'Alt') {
  261. state.send('RELEASED_ALT_KEY', getKeyboardEventInfo(e))
  262. }
  263. state.send('RELEASED_KEY', getKeyboardEventInfo(e))
  264. }
  265. document.body.addEventListener('keydown', handleKeyDown)
  266. document.body.addEventListener('keyup', handleKeyUp)
  267. return () => {
  268. document.body.removeEventListener('keydown', handleKeyDown)
  269. document.body.removeEventListener('keyup', handleKeyUp)
  270. }
  271. }, [])
  272. }