You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

useKeyboardEvents.ts 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import { useEffect } from "react"
  2. import state from "state"
  3. import { getKeyboardEventInfo, metaKey } from "utils/utils"
  4. export default function useKeyboardEvents() {
  5. useEffect(() => {
  6. function handleKeyDown(e: KeyboardEvent) {
  7. if (metaKey(e) && !["i", "r", "j"].includes(e.key)) {
  8. e.preventDefault()
  9. }
  10. switch (e.key) {
  11. case "!": {
  12. // Shift + 1
  13. if (e.shiftKey) {
  14. state.send("ZOOMED_TO_FIT")
  15. }
  16. break
  17. }
  18. case "@": {
  19. // Shift + 2
  20. if (e.shiftKey) {
  21. state.send("ZOOMED_TO_SELECTION")
  22. }
  23. break
  24. }
  25. case ")": {
  26. // Shift + 0
  27. if (e.shiftKey) {
  28. state.send("ZOOMED_TO_ACTUAL")
  29. }
  30. break
  31. }
  32. case "Escape": {
  33. state.send("CANCELLED")
  34. break
  35. }
  36. case "z": {
  37. if (metaKey(e)) {
  38. if (e.shiftKey) {
  39. state.send("REDO", getKeyboardEventInfo(e))
  40. } else {
  41. state.send("UNDO", getKeyboardEventInfo(e))
  42. }
  43. }
  44. break
  45. }
  46. case "‘": {
  47. if (metaKey(e)) {
  48. state.send("MOVED_TO_FRONT", getKeyboardEventInfo(e))
  49. }
  50. break
  51. }
  52. case "“": {
  53. if (metaKey(e)) {
  54. state.send("MOVED_TO_BACK", getKeyboardEventInfo(e))
  55. }
  56. break
  57. }
  58. case "]": {
  59. if (metaKey(e)) {
  60. state.send("MOVED_FORWARD", getKeyboardEventInfo(e))
  61. }
  62. break
  63. }
  64. case "[": {
  65. if (metaKey(e)) {
  66. state.send("MOVED_BACKWARD", getKeyboardEventInfo(e))
  67. }
  68. break
  69. }
  70. case "Shift": {
  71. state.send("PRESSED_SHIFT_KEY", getKeyboardEventInfo(e))
  72. break
  73. }
  74. case "Alt": {
  75. state.send("PRESSED_ALT_KEY", getKeyboardEventInfo(e))
  76. break
  77. }
  78. case "Backspace": {
  79. state.send("DELETED", getKeyboardEventInfo(e))
  80. break
  81. }
  82. case "s": {
  83. if (metaKey(e)) {
  84. state.send("SAVED", getKeyboardEventInfo(e))
  85. }
  86. break
  87. }
  88. case "a": {
  89. if (metaKey(e)) {
  90. state.send("SELECTED_ALL", getKeyboardEventInfo(e))
  91. }
  92. break
  93. }
  94. case "v": {
  95. if (metaKey(e)) {
  96. state.send("PASTED", getKeyboardEventInfo(e))
  97. } else {
  98. state.send("SELECTED_SELECT_TOOL", getKeyboardEventInfo(e))
  99. }
  100. break
  101. }
  102. case "d": {
  103. if (metaKey(e)) {
  104. state.send("DUPLICATED", getKeyboardEventInfo(e))
  105. } else {
  106. state.send("SELECTED_DOT_TOOL", getKeyboardEventInfo(e))
  107. }
  108. break
  109. }
  110. case "c": {
  111. if (metaKey(e)) {
  112. state.send("COPIED", getKeyboardEventInfo(e))
  113. } else {
  114. state.send("SELECTED_CIRCLE_TOOL", getKeyboardEventInfo(e))
  115. }
  116. break
  117. }
  118. case "i": {
  119. if (metaKey(e)) {
  120. } else {
  121. state.send("SELECTED_ELLIPSE_TOOL", getKeyboardEventInfo(e))
  122. }
  123. break
  124. }
  125. case "l": {
  126. if (metaKey(e)) {
  127. } else {
  128. state.send("SELECTED_LINE_TOOL", getKeyboardEventInfo(e))
  129. }
  130. break
  131. }
  132. case "y": {
  133. if (metaKey(e)) {
  134. } else {
  135. state.send("SELECTED_RAY_TOOL", getKeyboardEventInfo(e))
  136. }
  137. break
  138. }
  139. case "p": {
  140. if (metaKey(e)) {
  141. } else {
  142. state.send("SELECTED_POLYLINE_TOOL", getKeyboardEventInfo(e))
  143. }
  144. break
  145. }
  146. case "r": {
  147. if (metaKey(e)) {
  148. } else {
  149. state.send("SELECTED_RECTANGLE_TOOL", getKeyboardEventInfo(e))
  150. }
  151. break
  152. }
  153. default: {
  154. state.send("PRESSED_KEY", getKeyboardEventInfo(e))
  155. }
  156. }
  157. }
  158. function handleKeyUp(e: KeyboardEvent) {
  159. if (e.key === "Shift") {
  160. state.send("RELEASED_SHIFT_KEY", getKeyboardEventInfo(e))
  161. }
  162. if (e.key === "Alt") {
  163. state.send("RELEASED_ALT_KEY", getKeyboardEventInfo(e))
  164. }
  165. state.send("RELEASED_KEY", getKeyboardEventInfo(e))
  166. }
  167. document.body.addEventListener("keydown", handleKeyDown)
  168. document.body.addEventListener("keyup", handleKeyUp)
  169. return () => {
  170. document.body.removeEventListener("keydown", handleKeyDown)
  171. document.body.removeEventListener("keyup", handleKeyUp)
  172. }
  173. }, [])
  174. }