Skip to content

Commit 486d94a

Browse files
committed
onPick method additional
1 parent 7a15a9e commit 486d94a

File tree

10 files changed

+124
-60
lines changed

10 files changed

+124
-60
lines changed

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
"extract-text-webpack-plugin": "^2.1.2",
2626
"file-loader": "^0.11.2",
2727
"html-webpack-plugin": "^2.28.0",
28-
"immutable": "^3.8.1",
2928
"node-sass": "^4.5.3",
3029
"sass-loader": "^6.0.6",
3130
"style-loader": "^0.18.2",
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

src/components/image.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React, { Component } from 'react'
2+
import PropTypes from 'prop-types'
3+
import imgCheck from '../assets/images/check.png'
4+
5+
const ImageStyle = (width, height) => {
6+
return {
7+
width,
8+
height,
9+
objectFit: "cover"
10+
}
11+
}
12+
13+
export default class Image extends Component {
14+
constructor(props) {
15+
super(props)
16+
}
17+
18+
render() {
19+
const { src, isSelected, onImageClick } = this.props
20+
return (
21+
<div className={`responsive${isSelected ? " selected" : ""}`}
22+
onClick={onImageClick}>
23+
<img src={src}
24+
className={`thumbnail${isSelected ? " selected" : ""}`}
25+
style={ImageStyle(150, 150)}
26+
/>
27+
<div className="checked">
28+
<img src={imgCheck} style={{ width: 75, height: 75, objectFit: "cover" }}/>
29+
</div>
30+
</div>
31+
)
32+
}
33+
}
34+
35+
Image.propTypes = {
36+
src: PropTypes.string,
37+
isSelected: PropTypes.bool
38+
}

src/index.js

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,34 @@
11
import React, { Component } from 'react'
22
import { render } from 'react-dom'
3-
import { Map } from 'immutable'
4-
import './index.scss'
3+
import ImagePicker from './react-image-picker'
54

6-
import img1 from './images/kitten/200.jpg'
7-
import img2 from './images/kitten/201.jpg'
8-
import img3 from './images/kitten/202.jpg'
9-
import img4 from './images/kitten/203.jpg'
10-
import imgCheck from './images/check.png'
5+
import img1 from './assets/images/kitten/200.jpg'
6+
import img2 from './assets/images/kitten/201.jpg'
7+
import img3 from './assets/images/kitten/202.jpg'
8+
import img4 from './assets/images/kitten/203.jpg'
119

1210
const imageList = [img1, img2, img3, img4]
1311

14-
class ImagePicker extends Component {
15-
constructor(props) {
16-
super(props)
17-
this.state = {
18-
selected: Map()
19-
}
20-
this.handleImageClick = this.handleImageClick.bind(this)
21-
this.renderImage = this.renderImage.bind(this)
12+
class Demo extends Component {
13+
constructor() {
14+
super()
15+
this.state = {image: {}}
2216
}
2317

24-
handleImageClick(key) {
25-
const multiple = this.props.multiple || false
26-
const prevSelected = multiple ? this.state.selected : Map()
27-
28-
const selected = prevSelected.set(key, !this.state.selected.get(key) || false)
29-
return () => {
30-
this.setState({ selected })
31-
}
32-
}
33-
34-
renderImage(image, key) {
35-
const selected = this.state.selected.get(key) || false
36-
return (
37-
<div key={key}
38-
className={`responsive${selected ? " selected" : ""}`}
39-
onClick={this.handleImageClick(key)}>
40-
<img src={image}
41-
className={`thumbnail${selected ? " selected" : ""}`}
42-
style={{ width: 150, height: 150, objectFit: "cover" }}
43-
/>
44-
<div className="checked">
45-
<img src={imgCheck} style={{ width: 75, height: 75, objectFit: "cover" }}/>
46-
</div>
47-
</div>
48-
)
18+
onPick(image) {
19+
this.setState({image})
4920
}
5021

5122
render() {
52-
const { images } = this.props
5323
return (
54-
<div className="image_picker">
55-
{ images.map(this.renderImage) }
24+
<div>
25+
<ImagePicker images={imageList.map((image, i) => ({src: image, value: i}))}
26+
onPick={this.onPick.bind(this)}
27+
/>
28+
<button type="button" onClick={() => console.log(this.state.image)}>OK</button>
5629
</div>
5730
)
5831
}
5932
}
6033

61-
render(
62-
<ImagePicker images={imageList}
63-
64-
/>, document.querySelector('#root')
65-
)
66-
67-
export default ImagePicker
34+
render(<Demo/>, document.querySelector('#root'))

src/index.scss

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,6 @@
77
float: left;
88
opacity: 1;
99

10-
@media only screen and (max-width: 700px){
11-
width: 49.99999%;
12-
margin: 6px 0;
13-
}
14-
15-
@media only screen and (max-width: 500px){
16-
width: 100%;
17-
}
18-
1910
.thumbnail {
2011
border: 1px solid #ddd; /* Gray border */
2112
border-radius: 4px; /* Rounded border */
@@ -52,4 +43,8 @@
5243
right: 0;
5344
}
5445
}
46+
47+
.clear {
48+
clear: both;
49+
}
5550
}

src/react-image-picker.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import React, { Component } from 'react'
2+
import PropTypes from 'prop-types'
3+
4+
import Image from './components/image'
5+
import './index.scss'
6+
7+
class ImagePicker extends Component {
8+
constructor(props) {
9+
super(props)
10+
this.state = { selected: [] }
11+
this.getSelected = this.getSelected.bind(this)
12+
this.handleImageClick = this.handleImageClick.bind(this)
13+
this.renderImage = this.renderImage.bind(this)
14+
}
15+
16+
componentDidUpdate(prevProps, prevState) {
17+
const { images, onPick } = this.props
18+
if (prevProps.images !== images) {
19+
this.setState(Array(this.props.images.length).fill(false))
20+
}
21+
if (prevState.selected !== this.state.selected) {
22+
onPick(this.getSelected())
23+
}
24+
}
25+
26+
getSelected() {
27+
const { images, multiple } = this.props
28+
const selected = []
29+
images.map((image, i) => {
30+
if (this.state.selected[i]) {
31+
selected.push(images[i])
32+
}
33+
})
34+
35+
return multiple ? selected : selected[0]
36+
}
37+
38+
handleImageClick(i) {
39+
const { images, multiple } = this.props
40+
const selected = multiple ? this.state.selected : Array(images.length).fill(false)
41+
selected[i] = !selected[i]
42+
this.setState({selected: selected})
43+
}
44+
45+
renderImage(image, i) {
46+
return <Image src={image.src} isSelected={this.state.selected[i]} onImageClick={() => this.handleImageClick(i)} key={i}/>
47+
}
48+
49+
render() {
50+
const { images, buttonOK } = this.props
51+
return (
52+
<div className="image_picker">
53+
{ images.map(this.renderImage) }
54+
<div className="clear"/>
55+
</div>
56+
)
57+
}
58+
}
59+
60+
ImagePicker.propTypes = {
61+
images: PropTypes.array,
62+
multiple: PropTypes.bool
63+
}
64+
65+
export default ImagePicker

0 commit comments

Comments
 (0)