123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import styled from 'styles'
- import state, { useSelector } from 'state'
- import inputs from 'state/inputs'
- import React, { useCallback, useRef } from 'react'
- import useZoomEvents from 'hooks/useZoomEvents'
- import useCamera from 'hooks/useCamera'
- import Defs from './defs'
- import Page from './page'
- import Brush from './brush'
- import Bounds from './bounds/bounding-box'
- import BoundsBg from './bounds/bounds-bg'
- import Selected from './selected'
- import Handles from './bounds/handles'
- import { isMobile } from 'utils/utils'
-
- export default function Canvas() {
- const rCanvas = useRef<SVGSVGElement>(null)
- const rGroup = useRef<SVGGElement>(null)
-
- useCamera(rGroup)
- useZoomEvents()
-
- const isReady = useSelector((s) => s.isIn('ready'))
-
- const handlePointerDown = useCallback((e: React.PointerEvent) => {
- if (!inputs.canAccept(e.pointerId)) return
- rCanvas.current.setPointerCapture(e.pointerId)
- state.send('POINTED_CANVAS', inputs.pointerDown(e, 'canvas'))
- }, [])
-
- const handleTouchStart = useCallback((e: React.TouchEvent) => {
- if (e.touches.length === 2) {
- state.send('TOUCH_UNDO')
- } else {
- if (isMobile()) {
- state.send('TOUCHED_CANVAS')
- // state.send('POINTED_CANVAS', inputs.touchStart(e, 'canvas'))
- // e.preventDefault()
- // e.stopPropagation()
- }
- }
- }, [])
-
- // const handleTouchMove = useCallback((e: React.TouchEvent) => {
- // if (!inputs.canAccept(e.touches[0].identifier)) return
- // if (inputs.canAccept(e.touches[0].identifier)) {
- // state.send('MOVED_POINTER', inputs.touchMove(e))
- // }
- // }, [])
-
- const handlePointerMove = useCallback((e: React.PointerEvent) => {
- if (!inputs.canAccept(e.pointerId)) return
- if (inputs.canAccept(e.pointerId)) {
- state.send('MOVED_POINTER', inputs.pointerMove(e))
- }
- }, [])
-
- const handlePointerUp = useCallback((e: React.PointerEvent) => {
- if (!inputs.canAccept(e.pointerId)) return
- rCanvas.current.releasePointerCapture(e.pointerId)
- state.send('STOPPED_POINTING', { id: 'canvas', ...inputs.pointerUp(e) })
- }, [])
-
- return (
- <MainSVG
- ref={rCanvas}
- onPointerDown={handlePointerDown}
- onPointerMove={handlePointerMove}
- onPointerUp={handlePointerUp}
- onTouchStart={handleTouchStart}
- // onTouchMove={handleTouchMove}
- >
- <Defs />
- {isReady && (
- <g ref={rGroup}>
- <BoundsBg />
- <Page />
- {/* <Selected /> */}
- <Bounds />
- <Handles />
- <Brush />
- </g>
- )}
- </MainSVG>
- )
- }
-
- const MainSVG = styled('svg', {
- position: 'fixed',
- top: 0,
- left: 0,
- width: '100%',
- height: '100%',
- touchAction: 'none',
- zIndex: 100,
- backgroundColor: '$canvas',
-
- '& *': {
- userSelect: 'none',
- },
- })
|