Skip to content

Commit 51470b6

Browse files
committed
all features working
1 parent 0074b04 commit 51470b6

File tree

7 files changed

+94
-64
lines changed

7 files changed

+94
-64
lines changed

package-lock.json

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"fabric": "^4.2.0",
1717
"get-image-orientation": "0.0.4",
1818
"get-orientation": "^1.1.2",
19+
"jquery": "^3.5.1",
1920
"material-ui": "^0.20.2",
2021
"node-sass": "^4.14.1",
2122
"react": "^16.8.6",

src/App.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ const App = () => {
1313

1414
const [stage, setStage] = React.useState("upload"),
1515
[photoTaken, photoTakenEncoded] = React.useState(null),
16-
[aspectRatio, setAspectRatio] = React.useState(null);
16+
[dimensions, setDimensions] = React.useState(null);
1717

1818
return (
1919
<div>
2020
{stage === "landing" && <Landing {...{ setStage }} { ...{stage} }/>}
2121
{stage === "layout" && <Layout {...{ setStage }} { ...{stage} }/>}
2222
{stage === "mode" && <Mode {...{ setStage }} { ...{stage} }/>}
23-
{stage === "upload" && <Upload {...{ setStage }} {...{ photoTakenEncoded }} {...{ setAspectRatio }} { ...{stage} }/>}
23+
{stage === "upload" && <Upload {...{ setStage }} {...{ photoTakenEncoded }} {...{ setDimensions }} { ...{stage} }/>}
2424
{stage === "photo" && <Photo {...{ setStage }} {...{ photoTakenEncoded }} { ...{stage} } />}
2525
{stage === "filter" && <Filter {...{ setStage }} {...{ photoTakenEncoded }} {...{ photoTaken }} { ...{stage} }/>}
26-
{stage === "decorate" && <Decorate {...{ setStage }} {...{ photoTakenEncoded }} {...{ photoTaken }} {...{ aspectRatio }} { ...{stage} }/>}
27-
{stage === "share" && <Share {...{ setStage }} { ...{stage} } />}
26+
{stage === "decorate" && <Decorate {...{ setStage }} {...{ photoTakenEncoded }} {...{ photoTaken }} {...{ dimensions }} { ...{stage} }/>}
27+
{stage === "share" && <Share {...{ setStage }} {...{ photoTaken }} { ...{stage} } />}
2828
</div>
2929
)}
3030

src/app.scss

+7-2
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,16 @@ video {
4242

4343
.decorate-page .main-container {
4444
float: left;
45+
width: 800px;
4546
}
46-
.decorate-page.main-container {
47-
max-width: 600px;
47+
.main-container {
48+
max-width: 800px;
4849
}
4950

5051
img.decoration {
5152
width: 100px;
53+
}
54+
55+
.main-container.secondary.window {
56+
width: 250px;
5257
}

src/decorate/Decorate.js

+67-55
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,58 @@ import React from 'react'
22
import { useSpring, animated } from 'react-spring'
33
import { fabric } from "fabric"
44

5-
// this was very helpful in figuring out how to get fabric in react https://codesandbox.io/s/react-fabric-example-87hh4
5+
const Decorate = ({ stage, setStage, photoTaken, photoTakenEncoded, dimensions }) => {
66

7+
const opacity = useSpring({ opacity: 1, from: { opacity: 0 } });
78

8-
const Decorate = ( {stage, setStage, photoTaken, photoTakenEncoded, aspectRatio, ...props}) => {
9-
// I would suggest against calling a variable "props", that's sort of reserved.
10-
const opacity = useSpring({opacity: 1, from: {opacity: 0}});
11-
// Also note my use of "...props" above. Now there is a variable called props which is
12-
// an object that contains anything we didn't destructure above.
13-
// ex. if you had called this component thusly: <Decorate stage={something} setStage={somethingElse} herp="derp" hoop="doop" />
14-
// `props` would equal { herp: 'derp', hoop: 'doop' }
15-
169
// Set up a persistent canvas
1710
let canvas;
1811

12+
const updateState = () => {
13+
canvas.discardActiveObject();
14+
const filteredImage = document.getElementById('my-fabric-canvas'),
15+
dataURL = filteredImage.toDataURL();
16+
photoTakenEncoded(dataURL);
17+
}
18+
1919
React.useEffect(() => {
20-
canvas = new fabric.Canvas("my-fabric-canvas");
21-
canvas.setDimensions({
22-
width: aspectRatio.width,
23-
height: aspectRatio.height
24-
});
25-
console.log(aspectRatio)
26-
}, []);
20+
canvas = new fabric.Canvas("my-fabric-canvas");
21+
canvas.setDimensions({
22+
width: dimensions.width,
23+
height: dimensions.height
24+
});
25+
console.log(dimensions)
26+
}, [canvas]);
2727

2828

29-
const addBackground = (photoTaken) =>
30-
fabric.Image.fromURL(photoTaken, (oImg) =>
31-
canvas.setBackgroundImage(oImg, canvas.renderAll.bind(canvas), {
29+
const addBackground = (photoTaken) =>
30+
fabric.Image.fromURL(photoTaken, (oImg) =>
31+
canvas.setBackgroundImage(oImg, canvas.renderAll.bind(canvas), {
3232
// Optionally add an opacity lvl to the image
3333
backgroundImageOpacity: 0.5,
3434
// should the image be resized to fit the container?
3535
backgroundImageStretch: false,
3636
scaleX: canvas.width / oImg.width,
3737
scaleY: canvas.height / oImg.height
38-
})
39-
);
38+
})
39+
);
4040

41-
addBackground(photoTaken)
42-
43-
// These two functions are equivalent, just sharing how to arrow-syntax for fun
44-
const decorateImage = (url) =>
45-
fabric.Image.fromURL(url, (oImg) =>
46-
canvas.add(oImg)
47-
);
41+
const removeItem = () => {
42+
let object = canvas.getActiveObject();
43+
if (!object){
44+
alert('Please select the element to remove');
45+
return '';
46+
}
47+
canvas.remove(object);
48+
}
49+
50+
addBackground(photoTaken)
4851

49-
// function decorateImage (url) {
50-
// fabric.Image.fromURL(url, function(oImg) {
51-
// canvas.add(oImg);
52-
// });
53-
// }
52+
// These two functions are equivalent, just sharing how to arrow-syntax for fun
53+
const decorateImage = (url) =>
54+
fabric.Image.fromURL(url, (oImg) =>
55+
canvas.add(oImg)
56+
);
5457

5558
return (
5659
<animated.div style={opacity} className="decorate-page">
@@ -81,7 +84,8 @@ const Decorate = ( {stage, setStage, photoTaken, photoTakenEncoded, aspectRatio,
8184
type="button"
8285
className="btn"
8386
onClick={() => {
84-
setStage("share")
87+
setStage("share")
88+
updateState()
8589
}}>
8690
Let's Share!
8791
</button>
@@ -117,31 +121,39 @@ const Decorate = ( {stage, setStage, photoTaken, photoTakenEncoded, aspectRatio,
117121
</div>
118122
<div className="container-inner decoration-container">
119123
<p>Let's decorate:</p>
120-
<img
121-
className="decoration"
122-
src="images/panda_ears.png"
123-
alt="panda bear ears"
124-
onClick={e => decorateImage(e.target.src)}
124+
<button
125+
type="button"
126+
className="btn"
127+
onClick={() => {
128+
removeItem()
129+
}}>
130+
Remove Active Object
131+
</button>
132+
<img
133+
className="decoration"
134+
src="images/panda_ears.png"
135+
alt="panda bear ears"
136+
onClick={e => decorateImage(e.target.src)}
125137
></img>
126-
<img
127-
className="decoration"
128-
src="images/cat-ears.png"
129-
alt="cat ears"
130-
onClick={e => decorateImage(e.target.src)}
138+
<img
139+
className="decoration"
140+
src="images/cat-ears.png"
141+
alt="cat ears"
142+
onClick={e => decorateImage(e.target.src)}
131143
></img>
132-
<img
133-
className="decoration"
134-
src="images/sparkles.png"
135-
alt="sparkles"
136-
onClick={e => decorateImage(e.target.src)}
144+
<img
145+
className="decoration"
146+
src="images/sparkles.png"
147+
alt="sparkles"
148+
onClick={e => decorateImage(e.target.src)}
137149
></img>
138-
<img
139-
className="decoration"
140-
src="images/devil.png"
141-
alt="devil horns"
142-
onClick={e => decorateImage(e.target.src)}
150+
<img
151+
className="decoration"
152+
src="images/devil.png"
153+
alt="devil horns"
154+
onClick={e => decorateImage(e.target.src)}
143155
></img>
144-
156+
145157
</div>
146158
<div className="statusbar">
147159
<div className="left">3 object(s)</div>

src/share/Share.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'
22
import { useSpring, animated } from 'react-spring'
33

4-
const Share = ( {stage, setStage} ) => {
4+
const Share = ( {stage, setStage, photoTaken} ) => {
55
const props = useSpring({opacity: 1, from: {opacity: 0}})
66

77
return (
@@ -29,6 +29,13 @@ const Share = ( {stage, setStage} ) => {
2929
<div className="container-inner">
3030
<p>this is the share page</p>
3131
<p>the end</p>
32+
{photoTaken && (
33+
<img
34+
src={photoTaken}
35+
alt="photobooth snapshot"
36+
className="photoPreview"
37+
/>
38+
)}
3239

3340
</div>
3441
<div className="statusbar">

src/upload/Upload.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from "react";
22
import { useSpring, animated } from 'react-spring'
33
import ImageUploader from "react-images-upload";
44

5-
const Upload = ({ stage, setStage, photoTakenEncoded, setAspectRatio }) => {
5+
const Upload = ({ stage, setStage, photoTakenEncoded, setDimensions }) => {
66
const props = useSpring({ opacity: 1, from: { opacity: 0 } });
77

88

@@ -21,7 +21,7 @@ const Upload = ({ stage, setStage, photoTakenEncoded, setAspectRatio }) => {
2121
width: imageUploaded.naturalWidth,
2222
height: imageUploaded.naturalHeight
2323
};
24-
setAspectRatio(image);
24+
setDimensions(image);
2525
}
2626

2727

0 commit comments

Comments
 (0)