@@ -34,7 +34,7 @@ const Canvas = React.forwardRef(({ canvasState }: CanvasProps, ref: any) => {
3434 handleCanvasOffsetReset,
3535 } = useDragAndDropText ( + canvasWidth , + canvasHeight ) ;
3636
37- const getLineWidthByStrokeType = ( ) => {
37+ const getLineWidthByStrokeType = useCallback ( ( ) => {
3838 const strokeObj = {
3939 None : 0 ,
4040 Thin : 3 ,
@@ -43,7 +43,7 @@ const Canvas = React.forwardRef(({ canvasState }: CanvasProps, ref: any) => {
4343 } as { [ key : string ] : number } ;
4444
4545 return strokeObj [ fontStrokeType ] ;
46- } ;
46+ } , [ fontStrokeType ] ) ;
4747
4848 const getCenterX = useCallback (
4949 ( lineMaxWidth : number ) => {
@@ -77,7 +77,7 @@ const Canvas = React.forwardRef(({ canvasState }: CanvasProps, ref: any) => {
7777
7878 return { x, y } ;
7979 } ,
80- [ dragAndDropTextData , canvasHeight ]
80+ [ dragAndDropTextData , canvasHeight , getCenterX ]
8181 ) ;
8282
8383 const setFontStroke = useCallback (
@@ -91,79 +91,95 @@ const Canvas = React.forwardRef(({ canvasState }: CanvasProps, ref: any) => {
9191 [ fontStrokeType , strokeColor ]
9292 ) ;
9393
94- const rotateCanvas = ( ctx : CanvasRenderingContext2D ) => {
95- const { offsetX, offsetY } = dragAndDropTextData ;
96- const centerX = + canvasWidth / 2 ;
97- const centerY = + canvasHeight / 2 ;
98- const moveX = offsetX ? offsetX : centerX ;
99- const moveY = offsetY ? offsetY : centerY ;
100-
101- ctx . translate ( moveX , moveY ) ;
102- ctx . rotate ( ( + angle * Math . PI ) / 180 ) ;
103- ctx . translate ( - moveX , - moveY ) ;
104- } ;
105-
106- const fillCanvasMultiLineText = (
107- ctx : CanvasRenderingContext2D ,
108- lines : string [ ]
109- ) => {
110- const size = + fontSize . replace ( 'px' , '' ) ;
111- const fontLineHeight = size + + lineHeight ;
112- let lineMaxWidth = 0 ;
113-
114- lines . forEach ( ( line ) => {
115- lineMaxWidth = Math . max ( lineMaxWidth , ctx . measureText ( line ) . width ) ;
116- } ) ;
117-
118- lines . forEach ( ( line , idx ) => {
119- const { x, y } = getMultiLinePosition (
120- lines . length ,
121- fontLineHeight ,
122- lineMaxWidth ,
123- idx
124- ) ;
125-
126- ctx . save ( ) ;
127- ctx . translate ( x , y ) ;
94+ const rotateCanvas = useCallback (
95+ ( ctx : CanvasRenderingContext2D ) => {
96+ const { offsetX, offsetY } = dragAndDropTextData ;
97+ const centerX = + canvasWidth / 2 ;
98+ const centerY = + canvasHeight / 2 ;
99+ const moveX = offsetX ? offsetX : centerX ;
100+ const moveY = offsetY ? offsetY : centerY ;
128101
129- setFontStroke ( ctx , line ) ;
102+ ctx . translate ( moveX , moveY ) ;
103+ ctx . rotate ( ( + angle * Math . PI ) / 180 ) ;
104+ ctx . translate ( - moveX , - moveY ) ;
105+ } ,
106+ [ dragAndDropTextData , canvasWidth , canvasHeight , angle ]
107+ ) ;
130108
131- ctx . fillStyle = fontColor . hex ;
132- ctx . fillText ( line , 0 , 0 ) ;
133- ctx . restore ( ) ;
134- } ) ;
135- } ;
109+ const fillCanvasMultiLineText = useCallback (
110+ ( ctx : CanvasRenderingContext2D , lines : string [ ] ) => {
111+ const size = + fontSize . replace ( 'px' , '' ) ;
112+ const fontLineHeight = size + + lineHeight ;
113+ let lineMaxWidth = 0 ;
114+
115+ lines . forEach ( ( line ) => {
116+ lineMaxWidth = Math . max ( lineMaxWidth , ctx . measureText ( line ) . width ) ;
117+ } ) ;
118+
119+ lines . forEach ( ( line , idx ) => {
120+ const { x, y } = getMultiLinePosition (
121+ lines . length ,
122+ fontLineHeight ,
123+ lineMaxWidth ,
124+ idx
125+ ) ;
126+
127+ ctx . save ( ) ;
128+ ctx . translate ( x , y ) ;
129+
130+ setFontStroke ( ctx , line ) ;
131+
132+ ctx . fillStyle = fontColor . hex ;
133+ ctx . fillText ( line , 0 , 0 ) ;
134+ ctx . restore ( ) ;
135+ } ) ;
136+ } ,
137+ [ fontColor , fontSize , lineHeight , getMultiLinePosition , setFontStroke ]
138+ ) ;
136139
137- const setCanvasText = ( ctx : CanvasRenderingContext2D ) => {
138- const lines = value . split ( '\n' ) ;
139- const size = + fontSize . replace ( 'px' , '' ) ;
140+ const setCanvasText = useCallback (
141+ ( ctx : CanvasRenderingContext2D ) => {
142+ const lines = value . split ( '\n' ) ;
143+ const size = + fontSize . replace ( 'px' , '' ) ;
140144
141- ctx . font = `${ size } px ${ fontFamily } ` ;
142- ctx . textAlign = textAlign ;
143- ctx . textBaseline = 'middle' ;
145+ ctx . font = `${ size } px ${ fontFamily } ` ;
146+ ctx . textAlign = textAlign ;
147+ ctx . textBaseline = 'middle' ;
144148
145- ctx . save ( ) ;
149+ ctx . save ( ) ;
146150
147- rotateCanvas ( ctx ) ;
148- fillCanvasMultiLineText ( ctx , lines ) ;
151+ rotateCanvas ( ctx ) ;
152+ fillCanvasMultiLineText ( ctx , lines ) ;
149153
150- ctx . restore ( ) ;
151- } ;
154+ ctx . restore ( ) ;
155+ } ,
156+ [
157+ value ,
158+ fontSize ,
159+ fontFamily ,
160+ textAlign ,
161+ rotateCanvas ,
162+ fillCanvasMultiLineText ,
163+ ]
164+ ) ;
152165
153- const fillBackground = ( canvas : HTMLCanvasElement ) => {
154- const ctx = canvas . getContext ( '2d' ) ;
166+ const fillBackground = useCallback (
167+ ( canvas : HTMLCanvasElement ) => {
168+ const ctx = canvas . getContext ( '2d' ) ;
155169
156- if ( ! ctx ) return ;
170+ if ( ! ctx ) return ;
157171
158- if ( selectedImage ) {
159- if ( isBlur ) ctx . filter = 'blur(5px)' ;
160- ctx . drawImage ( selectedImage , 0 , 0 ) ;
161- return ;
162- }
172+ if ( selectedImage ) {
173+ if ( isBlur ) ctx . filter = 'blur(5px)' ;
174+ ctx . drawImage ( selectedImage , 0 , 0 ) ;
175+ return ;
176+ }
163177
164- ctx . fillStyle = bgColor . hex ;
165- ctx . fillRect ( 0 , 0 , canvas . width , canvas . height ) ;
166- } ;
178+ ctx . fillStyle = bgColor . hex ;
179+ ctx . fillRect ( 0 , 0 , canvas . width , canvas . height ) ;
180+ } ,
181+ [ selectedImage , bgColor , isBlur ]
182+ ) ;
167183
168184 useEffect ( ( ) => {
169185 if ( ! ref . current ) return ;
0 commit comments