1
+ /* eslint-disable react-hooks/exhaustive-deps */
1
2
import { useEffect , useRef , useState } from "react" ;
2
3
import "./App.css" ;
3
4
import { io } from "socket.io-client" ;
@@ -16,39 +17,43 @@ function App() {
16
17
const [ showMenu , setShowMenu ] = useState ( false ) ;
17
18
const eraserMode = useRecoilValue ( eraserState ) ;
18
19
const [ position , setPosition ] = useRecoilState ( cursorPosition ) ;
20
+ const [ ctx , setCtx ] = useState ( null ) ;
21
+ const [ startX , setStartX ] = useState ( 0 ) ;
22
+ const [ startY , setStartY ] = useState ( 0 ) ;
23
+ const [ isDrawing , setIsDrawing ] = useState ( false ) ;
24
+ const [ penColor , setPenColor ] = useState ( "#000000" ) ;
19
25
20
26
function toggleMenu ( ) {
21
27
setShowMenu ( ! showMenu ) ;
22
28
}
23
29
24
30
const canvasRef = useRef ( null ) ;
25
31
const sidebarRef = useRef ( null ) ;
26
- let color = '#000000'
27
- let ctx ;
28
- let canvas ;
29
32
let lineWidth ;
30
-
31
- function drawLine ( sx , sy , ex , ey , color , lineWidth ) {
33
+
34
+ function drawLine ( sx , sy , ex , ey , penColor , lineWidth ) {
32
35
ctx . moveTo ( sx , sy ) ;
33
36
ctx . lineTo ( ex , ey ) ;
34
37
ctx . lineCap = "round" ;
35
38
ctx . lineWidth = lineWidth ;
36
- ctx . strokeStyle = color ;
39
+ ctx . strokeStyle = penColor ;
37
40
ctx . stroke ( ) ;
38
41
}
39
-
42
+
40
43
useEffect ( ( ) => {
41
- canvas = canvasRef . current ;
42
- let isDrawing = false ;
43
- let startX = 0 ;
44
- let startY = 0 ;
45
-
46
- ctx = canvas . getContext ( "2d" ) ;
47
- canvas . width = canvas . getBoundingClientRect ( ) . width ;
48
- canvas . height = canvas . getBoundingClientRect ( ) . height ;
44
+ const canvas = canvasRef . current ;
45
+ if ( canvas ) {
46
+ const context = canvas . getContext ( "2d" ) ;
47
+ canvas . width = canvas . getBoundingClientRect ( ) . width ;
48
+ canvas . height = canvas . getBoundingClientRect ( ) . height ;
49
+ setCtx ( context ) ;
50
+ }
51
+ } , [ canvasRef . current ] ) ;
49
52
53
+ useEffect ( ( ) => {
54
+ if ( ! ctx ) return ;
55
+ const canvas = canvasRef . current ;
50
56
function handleMousemove ( e ) {
51
-
52
57
// if eraseMode is set the position of the eraser cursor
53
58
if ( eraserMode ) {
54
59
setPosition ( ( ) => ( { x : e . clientX , y : e . clientY } ) ) ;
@@ -57,21 +62,24 @@ function App() {
57
62
if ( ! isDrawing ) return ;
58
63
const endX = e . clientX - canvas . getBoundingClientRect ( ) . left ;
59
64
const endY = e . clientY - canvas . getBoundingClientRect ( ) . top ;
60
- drawLine ( startX , startY , endX , endY , color ) ;
61
- socket . emit ( "draw" , { startX, startY, endX, endY, color, lineWidth } ) ;
62
- startX = endX ;
63
- startY = endY ;
65
+ drawLine ( startX , startY , endX , endY , penColor ) ;
66
+ socket . emit ( "draw" , { startX, startY, endX, endY, penColor, lineWidth } ) ;
67
+ setStartX ( endX ) ;
68
+ setStartY ( endY ) ;
69
+
64
70
}
65
71
66
72
function handleMousedown ( e ) {
67
- isDrawing = true ;
68
- startX = e . clientX - canvas . getBoundingClientRect ( ) . left ;
69
- startY = e . clientY - canvas . getBoundingClientRect ( ) . top ;
73
+ setIsDrawing ( true ) ;
74
+ let X = e . clientX - canvas . getBoundingClientRect ( ) . left ;
75
+ let Y = e . clientY - canvas . getBoundingClientRect ( ) . top ;
76
+ setStartX ( X ) ;
77
+ setStartY ( Y ) ;
70
78
}
71
79
function handleMouseup ( ) {
72
- isDrawing = false ;
73
- startX = 0 ;
74
- startY = 0 ;
80
+ setIsDrawing ( false ) ;
81
+ setStartX ( 0 ) ;
82
+ setStartY ( 0 ) ;
75
83
ctx . beginPath ( ) ;
76
84
}
77
85
@@ -84,7 +92,7 @@ function App() {
84
92
canvas . removeEventListener ( "mousedown" , handleMousedown ) ;
85
93
canvas . removeEventListener ( "mouseup" , handleMouseup ) ;
86
94
} ;
87
- } , [ color , eraserMode , position ] ) ;
95
+ } , [ penColor , eraserMode , position , ctx , isDrawing , startX , startY ] ) ;
88
96
89
97
useEffect ( ( ) => {
90
98
socket . on ( "draw" , ( data ) => {
@@ -93,7 +101,7 @@ function App() {
93
101
data . startY ,
94
102
data . endX ,
95
103
data . endY ,
96
- data . color ,
104
+ data . penColor ,
97
105
data . lineWidth
98
106
) ;
99
107
} ) ;
@@ -106,10 +114,12 @@ function App() {
106
114
socket . off ( "draw" ) ;
107
115
socket . off ( "clear" ) ;
108
116
}
109
- } , [ ] ) ;
117
+ } , [ socket , ctx ] ) ;
110
118
111
119
function clearRect ( ) {
112
- ctx . clearRect ( 0 , 0 , canvas . width , canvas . height ) ;
120
+ if ( ctx ) {
121
+ ctx . clearRect ( 0 , 0 , canvasRef . current . width , canvasRef . current . height ) ;
122
+ }
113
123
}
114
124
115
125
function clearOnClick ( ) {
@@ -120,16 +130,20 @@ function App() {
120
130
function addStroke ( e ) {
121
131
if ( e . target . id === "penColor" ) {
122
132
const newColor = e . target . value ;
123
- color = newColor ;
124
- ctx . strokeStyle = newColor ;
133
+ setPenColor ( newColor ) ;
134
+ if ( ctx ) {
135
+ ctx . strokeStyle = newColor ;
136
+ }
125
137
126
138
}
127
139
}
128
140
129
141
function addLineWidth ( e ) {
130
142
if ( e . target . id === "lineWidth" ) {
131
143
lineWidth = e . target . value ;
132
- ctx . lineWidth = lineWidth ;
144
+ if ( ctx ) {
145
+ ctx . lineWidth = lineWidth ;
146
+ }
133
147
}
134
148
}
135
149
0 commit comments