Skip to content

Commit ec865c1

Browse files
Some refactoring done
1 parent cc9768a commit ec865c1

File tree

6 files changed

+104
-82
lines changed

6 files changed

+104
-82
lines changed
File renamed without changes.

src/components/App.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { useRef, useEffect, useState } from 'react';
2+
import { Canvas, PencilBrush } from 'fabric';
3+
import Toolbox from './Toolbox';
4+
import EditorCanvas from './EditorCanvas';
5+
import './App.css';
6+
7+
function App() {
8+
const canvasRef = useRef(null);
9+
const [canvas, setCanvas] = useState(null);
10+
const [currentFilter, setCurrentFilter] = useState(null);
11+
12+
useEffect(() => {
13+
const c = new Canvas(canvasRef.current, {backgroundColor: 'white'});
14+
c.setDimensions({width: 1000, height: 500});
15+
const brush = new PencilBrush(c);
16+
brush.color = 'black';
17+
brush.width = 4;
18+
c.freeDrawingBrush = brush;
19+
setCanvas(c);
20+
21+
return () => c.dispose();
22+
23+
}, [canvasRef, setCanvas]);
24+
25+
return (
26+
<div className="editor">
27+
<Toolbox canvas={canvas} currentFilter={currentFilter} setCurrentFilter={setCurrentFilter}/>
28+
<EditorCanvas ref={canvasRef} canvas={canvas} setCurrentFilter={setCurrentFilter}/>
29+
</div>
30+
);
31+
}
32+
33+
export default App;
File renamed without changes.

src/components/EditorCanvas.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { useEffect, forwardRef } from 'react';
2+
3+
const EditorCanvas = forwardRef(({ canvas, setCurrentFilter }, ref) =>{
4+
5+
useEffect(() => {
6+
if(!canvas) return;
7+
8+
function handlekeyPress(e) {
9+
if(e.key === 'Delete') {
10+
for(const obj of canvas.getActiveObjects()) {
11+
canvas.remove(obj);
12+
canvas.discardActiveObject();
13+
}
14+
}
15+
}
16+
17+
function handleSelection(e) {
18+
const obj = e?.selected?.length === 1 ? e.selected[0] : null;
19+
const filter = obj?.filters?.at(0);
20+
console.log(filter);
21+
setCurrentFilter(filter ? filter.type.toLowerCase(): null);
22+
}
23+
24+
document.addEventListener('keydown', handlekeyPress, false);
25+
canvas.on({
26+
'selection:created': handleSelection,
27+
'selection:updated': handleSelection,
28+
'selection:cleared': handleSelection
29+
});
30+
31+
return () => {
32+
document.removeEventListener('keydown', handlekeyPress, false);
33+
canvas.off({
34+
'selection:created': handleSelection,
35+
'selection:updated': handleSelection,
36+
'selection:cleared': handleSelection
37+
});
38+
}
39+
40+
}, [canvas, setCurrentFilter]);
41+
42+
return(
43+
<div className="canvasbox">
44+
<canvas ref={ref}></canvas>
45+
</div>
46+
);
47+
});
48+
49+
export default EditorCanvas;

src/App.js renamed to src/components/Toolbox.js

Lines changed: 13 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,7 @@
1-
import { useRef, useEffect, forwardRef, useState } from 'react';
2-
import { Canvas, Image, IText, PencilBrush, filters } from 'fabric';
1+
import { useEffect, useState } from 'react';
2+
import { Image, IText, filters } from 'fabric';
33
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4-
import './App.css';
5-
6-
const EditorCanvas = forwardRef(({ canvas, setCurrentFilter }, ref) =>{
7-
8-
useEffect(() => {
9-
if(!canvas) return;
10-
11-
function handlekeyPress(e) {
12-
if(e.key === 'Delete') {
13-
for(const obj of canvas.getActiveObjects()) {
14-
canvas.remove(obj);
15-
canvas.discardActiveObject();
16-
}
17-
}
18-
}
19-
20-
function handleSelection(e) {
21-
const obj = e?.selected?.length === 1 ? e.selected[0] : null;
22-
const filter = obj?.filters?.at(0);
23-
console.log(filter);
24-
setCurrentFilter(filter ? filter.type.toLowerCase(): null);
25-
}
26-
27-
document.addEventListener('keydown', handlekeyPress, false);
28-
canvas.on({
29-
'selection:created': handleSelection,
30-
'selection:updated': handleSelection,
31-
'selection:cleared': handleSelection
32-
});
33-
34-
return () => {
35-
document.removeEventListener('keydown', handlekeyPress, false);
36-
canvas.off({
37-
'selection:created': handleSelection,
38-
'selection:updated': handleSelection,
39-
'selection:cleared': handleSelection
40-
});
41-
}
42-
43-
}, [canvas, setCurrentFilter]);
44-
45-
return(
46-
<div className="canvasbox">
47-
<canvas ref={ref}></canvas>
48-
</div>
49-
);
50-
});
51-
4+
console.log(filters);
525
const Toolbox = ({ canvas, currentFilter, setCurrentFilter }) => {
536
const [drawingMode, setDrawingMode] = useState(false);
547

@@ -61,10 +14,14 @@ const Toolbox = ({ canvas, currentFilter, setCurrentFilter }) => {
6114
switch(currentFilter) {
6215
case 'sepia':
6316
return new filters.Sepia();
64-
case 'blur':
65-
return new filters.Blur({blur: 0.2});
17+
case 'vintage':
18+
return new filters.Vintage();
6619
case 'invert':
6720
return new filters.Invert();
21+
case 'polaroid':
22+
return new filters.Polaroid();
23+
case 'grayscale':
24+
return new filters.Grayscale();
6825
default:
6926
return null;
7027
}
@@ -144,9 +101,11 @@ const Toolbox = ({ canvas, currentFilter, setCurrentFilter }) => {
144101
</button>
145102
{currentFilter &&
146103
<select onChange={(e) => setCurrentFilter(e.target.value)} value={currentFilter}>
147-
<option value="blur">Blur</option>
148104
<option value="sepia">Sepia</option>
105+
<option value="vintage">Vintage</option>
149106
<option value="invert">Invert</option>
107+
<option value="polaroid">Polaroid</option>
108+
<option value="grayscale">Grayscale</option>
150109
</select>
151110
}
152111
<button title="Clear all" onClick={clearAll}>
@@ -159,30 +118,4 @@ const Toolbox = ({ canvas, currentFilter, setCurrentFilter }) => {
159118
);
160119
};
161120

162-
function App() {
163-
const canvasRef = useRef(null);
164-
const [canvas, setCanvas] = useState(null);
165-
const [currentFilter, setCurrentFilter] = useState(null);
166-
167-
useEffect(() => {
168-
const c = new Canvas(canvasRef.current, {backgroundColor: 'white'});
169-
c.setDimensions({width: 1000, height: 500});
170-
const brush = new PencilBrush(c);
171-
brush.color = 'black';
172-
brush.width = 4;
173-
c.freeDrawingBrush = brush;
174-
setCanvas(c);
175-
176-
return () => c.dispose();
177-
178-
}, [canvasRef, setCanvas]);
179-
180-
return (
181-
<div className="editor">
182-
<Toolbox canvas={canvas} currentFilter={currentFilter} setCurrentFilter={setCurrentFilter}/>
183-
<EditorCanvas ref={canvasRef} canvas={canvas} setCurrentFilter={setCurrentFilter}/>
184-
</div>
185-
);
186-
}
187-
188-
export default App;
121+
export default Toolbox;

src/index.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom/client';
33
import { library } from '@fortawesome/fontawesome-svg-core';
4-
import { faImage, faFont, faPencil, faFilter, faTrash, faDownload } from '@fortawesome/free-solid-svg-icons';
4+
import {
5+
faImage,
6+
faFont,
7+
faPencil,
8+
faFilter,
9+
faTrash,
10+
faDownload
11+
} from '@fortawesome/free-solid-svg-icons';
512

613
import './index.css';
7-
import App from './App';
14+
import App from './components/App';
815
import reportWebVitals from './reportWebVitals';
916

1017
library.add(faImage, faFont, faPencil, faFilter, faTrash, faDownload);

0 commit comments

Comments
 (0)