Skip to content

Commit e33b378

Browse files
committed
Fix Multiple Pick Selection Feature
Documentation update
1 parent 2cae772 commit e33b378

File tree

7 files changed

+92
-41
lines changed

7 files changed

+92
-41
lines changed

README.md

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,56 @@ The image picker is used for selecting single or multiple images from gallery.
99
## Features
1010
- jQuery Free
1111
- Single or multiple images selection
12-
- ...
12+
- Styling (...in progress)
13+
- ...
14+
15+
## Installation
16+
```
17+
npm install react-image-picker
18+
```
19+
20+
### Examples
21+
![React Image Picker Demo](https://raw.githubusercontent.com/bagongkia/react-image-picker/master/docs/img/react-image-picker-demo.jpg)
22+
23+
```javascript
24+
//ES6
25+
import React, { Component } from 'react'
26+
import ImagePicker from 'react-image-picker'
27+
import 'react-image-picker/dist/index.css'
28+
29+
//import images from local
30+
import img1 from './images/kitten/200.jpg'
31+
import img2 from './images/kitten/201.jpg'
32+
import img3 from './images/kitten/202.jpg'
33+
import img4 from './images/kitten/203.jpg'
34+
35+
const imageList = [img1, img2, img3, img4]
36+
37+
class App extends Component {
38+
constructor(props) {
39+
super(props)
40+
this.state = {
41+
image: null
42+
}
43+
this.onPick = this.onPick.bind(this)
44+
}
45+
46+
onPick(image) {
47+
this.setState({image})
48+
}
49+
50+
render() {
51+
return (
52+
<div>
53+
<ImagePicker
54+
images={imageList.map((image, i) => ({src: image, value: i}))}
55+
onPick={this.onPick}
56+
/>
57+
<button type="button" onClick={() => console.log(this.state.image)}>OK</button>
58+
</div>
59+
)
60+
}
61+
}
62+
63+
export default App
64+
```

dist/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<!DOCTYPE html><html><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>React Image Picker Demo</title><link href="index.css?a7016ddaf2aae12930c3" rel="stylesheet"></head><body><div id="root"></div><script type="text/javascript" src="./index.js?a7016ddaf2aae12930c3"></script></body></html>
1+
<!DOCTYPE html><html><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>React Image Picker Demo</title><link href="index.css?9c38db6b8b4267090e19" rel="stylesheet"></head><body><div id="root"></div><script type="text/javascript" src="./index.js?9c38db6b8b4267090e19"></script></body></html>

dist/index.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/img/react-image-picker-demo.jpg

104 KB
Loading

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"extract-text-webpack-plugin": "^2.1.2",
2929
"file-loader": "^0.11.2",
3030
"html-webpack-plugin": "^2.28.0",
31+
"immutable": "^3.8.1",
3132
"mocha": "^3.4.2",
3233
"node-sass": "^4.5.3",
3334
"sass-loader": "^6.0.6",

src/index.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import img4 from './assets/images/kitten/203.jpg'
1010
const imageList = [img1, img2, img3, img4]
1111

1212
class Demo extends Component {
13-
constructor() {
14-
super()
15-
this.state = {image: {}}
13+
constructor(props) {
14+
super(props)
15+
this.state = {image: null}
1616
}
1717

1818
onPick(image) {
@@ -22,7 +22,8 @@ class Demo extends Component {
2222
render() {
2323
return (
2424
<div>
25-
<ImagePicker images={imageList.map((image, i) => ({src: image, value: i}))}
25+
<ImagePicker
26+
images={imageList.map((image, i) => ({src: image, value: i}))}
2627
onPick={this.onPick.bind(this)}
2728
/>
2829
<button type="button" onClick={() => console.log(this.state.image)}>OK</button>

src/react-image-picker.js

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,49 @@
11
import React, { Component } from 'react'
22
import PropTypes from 'prop-types'
3+
import { Map } from 'immutable'
34

4-
import Image from './components/image'
55
import './index.scss'
6+
import Image from './components/image'
67

78
class ImagePicker extends Component {
89
constructor(props) {
910
super(props)
10-
this.state = { selected: [] }
11-
this.getSelected = this.getSelected.bind(this)
11+
this.state = {
12+
picked: Map()
13+
}
1214
this.handleImageClick = this.handleImageClick.bind(this)
1315
this.renderImage = this.renderImage.bind(this)
1416
}
1517

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})
18+
handleImageClick(image) {
19+
const { multiple, onPick } = this.props
20+
const pickedImage = multiple ? this.state.picked : Map()
21+
const newerPickedImage =
22+
pickedImage.has(image.value) ?
23+
pickedImage.delete(image.value) :
24+
pickedImage.set(image.value, image.src)
25+
26+
this.setState({picked: newerPickedImage})
27+
28+
const pickedImageToArray = []
29+
newerPickedImage.map((image, i) => pickedImageToArray.push({src: image, value: i}))
30+
31+
onPick(multiple ? pickedImageToArray : pickedImageToArray[0])
4332
}
4433

4534
renderImage(image, i) {
46-
return <Image src={image.src} isSelected={this.state.selected[i]} onImageClick={() => this.handleImageClick(i)} key={i}/>
35+
return (
36+
<Image
37+
src={image.src}
38+
isSelected={this.state.picked.has(image.value)}
39+
onImageClick={() => this.handleImageClick(image)}
40+
key={i}
41+
/>
42+
)
4743
}
4844

4945
render() {
50-
const { images, buttonOK } = this.props
46+
const { images } = this.props
5147
return (
5248
<div className="image_picker">
5349
{ images.map(this.renderImage) }
@@ -59,7 +55,8 @@ class ImagePicker extends Component {
5955

6056
ImagePicker.propTypes = {
6157
images: PropTypes.array,
62-
multiple: PropTypes.bool
58+
multiple: PropTypes.bool,
59+
onPick: PropTypes.func
6360
}
6461

6562
export default ImagePicker

0 commit comments

Comments
 (0)