您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

state.ts 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { createSelectorHook, createState } from "@state-designer/react"
  2. import { clamp, screenToWorld } from "utils/utils"
  3. import * as vec from "utils/vec"
  4. import { Data } from "types"
  5. import { defaultDocument } from "./data"
  6. import * as Sessions from "./sessions"
  7. const initialData: Data = {
  8. camera: {
  9. point: [0, 0],
  10. zoom: 1,
  11. },
  12. brush: undefined,
  13. pointedId: null,
  14. selectedIds: [],
  15. currentPageId: "page0",
  16. document: defaultDocument,
  17. }
  18. const state = createState({
  19. data: initialData,
  20. on: {
  21. ZOOMED_CAMERA: {
  22. do: "zoomCamera",
  23. },
  24. PANNED_CAMERA: {
  25. do: "panCamera",
  26. },
  27. },
  28. initial: "selecting",
  29. states: {
  30. selecting: {
  31. on: {
  32. POINTED_CANVAS: { to: "brushSelecting" },
  33. },
  34. },
  35. brushSelecting: {
  36. onEnter: "startBrushSession",
  37. on: {
  38. MOVED_POINTER: "updateBrushSession",
  39. STOPPED_POINTING: { do: "completeSession", to: "selecting" },
  40. CANCELLED: { do: "cancelSession", to: "selecting" },
  41. },
  42. },
  43. },
  44. actions: {
  45. cancelSession(data) {
  46. session.cancel(data)
  47. session = undefined
  48. },
  49. completeSession(data) {
  50. session.complete(data)
  51. session = undefined
  52. },
  53. startBrushSession(data, { point }) {
  54. session = new Sessions.BrushSession(data, point)
  55. },
  56. updateBrushSession(data, { point }) {
  57. session.update(data, point)
  58. },
  59. zoomCamera(data, payload: { delta: number; point: number[] }) {
  60. const { camera } = data
  61. const p0 = screenToWorld(payload.point, data)
  62. camera.zoom = clamp(
  63. camera.zoom - (payload.delta / 100) * camera.zoom,
  64. 0.5,
  65. 3
  66. )
  67. const p1 = screenToWorld(payload.point, data)
  68. camera.point = vec.add(camera.point, vec.sub(p1, p0))
  69. },
  70. panCamera(data, payload: { delta: number[]; point: number[] }) {
  71. const { camera } = data
  72. data.camera.point = vec.sub(
  73. camera.point,
  74. vec.div(payload.delta, camera.zoom)
  75. )
  76. },
  77. },
  78. })
  79. let session: Sessions.BaseSession
  80. export default state
  81. export const useSelector = createSelectorHook(state)