diff options
| author | Adam Harvey <adam@ahprojects.com> | 2019-04-03 14:35:41 +0200 |
|---|---|---|
| committer | Adam Harvey <adam@ahprojects.com> | 2019-04-03 14:35:41 +0200 |
| commit | 0224090a9dcc79de897871cfa573f99cf8f005a5 (patch) | |
| tree | ec5967fa3d6ca197af1ac12092fe168fdf499d48 /client/modalImage/modalImage.container.js | |
| parent | 04677d60e9e867a6d02fa2c99f07f83dff6e6005 (diff) | |
| parent | df707e4316c79375499974fb2a3443f1c049b93c (diff) | |
.
Diffstat (limited to 'client/modalImage/modalImage.container.js')
| -rw-r--r-- | client/modalImage/modalImage.container.js | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/client/modalImage/modalImage.container.js b/client/modalImage/modalImage.container.js new file mode 100644 index 00000000..5479ca5f --- /dev/null +++ b/client/modalImage/modalImage.container.js @@ -0,0 +1,93 @@ +import React, { Component } from 'react' +import { bindActionCreators } from 'redux' +import { connect } from 'react-redux' +import { ReactTabulator } from 'react-tabulator' + +import { toArray, toTuples, domainFromUrl } from '../util' +import { Loader } from '../common' + +import csv from 'parse-csv' + +class ModalImage extends Component { + state = { + visible: false, + images: [], + index: 0, + } + + componentDidMount() { + const images = toArray(document.querySelectorAll('.image img')) + // console.log(images) + images.forEach((img, i) => { + img.addEventListener('click', () => this.loadImage(i)) + }) + this.setState({ images }) + document.body.addEventListener('keydown', e => { + if (document.activeElement && document.activeElement !== document.body) { + return null + } + console.log(e.keyCode) + switch (e.keyCode) { + case 27: // esc + this.close() + break + case 37: // left + this.prev() + break + case 39: // right + this.next() + break + default: + break + } + }) + } + + loadImage(index) { + const { images } = this.state + if (!images.length) return + if (index < 0 || index >= images.length) return + this.setState({ visible: true, index }) + } + + prev() { + const { index, images } = this.state + if (!images.length) return + this.setState({ index: (images.length + index - 1) % images.length }) + } + + next() { + const { index, images } = this.state + if (!images.length) return + this.setState({ index: (index + 1) % images.length }) + } + + close() { + this.setState({ visible: false }) + } + + render() { + const { images, index, visible } = this.state + if (!images.length) return null + const img = images[index] + let caption = null + const sib = img.nextSibling + if (sib && sib.classList.contains('caption')) { + caption = sib.innerText + } + return ( + <div className={visible ? 'modal visible' : 'modal'}> + <div className='inner'> + <div className='centered'> + <img src={img.src} /> + {caption && <div class='caption'>{caption}</div>} + </div> + </div> + <div onClick={() => this.prev()}className='prev'><span>{'<'}</span></div> + <div onClick={() => this.next()} className='next'><span>{'>'}</span></div> + <div onClick={() => this.close()} className='close'><span>{'×'}</span></div> + </div> + ) + } +} +export default ModalImage |
