1
0
mirror of https://github.com/kremalicious/blog.git synced 2024-06-16 17:43:14 +02:00
blog/src/components/atoms/Exif.jsx

101 lines
2.8 KiB
React
Raw Normal View History

2018-09-14 00:35:40 +02:00
import React, { Fragment, PureComponent } from 'react'
2018-09-07 13:08:01 +02:00
import PropTypes from 'prop-types'
2018-09-14 00:35:40 +02:00
import Map from 'pigeon-maps'
2018-11-13 23:30:16 +01:00
import Marker from 'pigeon-marker'
2018-09-07 01:45:53 +02:00
import styles from './Exif.module.scss'
2018-09-14 00:35:40 +02:00
const MAPBOX_ACCESS_TOKEN =
'pk.eyJ1Ijoia3JlbWFsaWNpb3VzIiwiYSI6ImNqbTE2NHpkYjJmNm8zcHF4eDVqZzk3ejEifQ.1uwPzM6MSTgL2e1Hxcmuqw'
2018-09-16 14:53:26 +02:00
const retina =
typeof window !== 'undefined' && window.devicePixelRatio >= 2 ? '@2x' : ''
const mapbox = (mapboxId, accessToken) => (x, y, z) =>
`https://api.mapbox.com/styles/v1/mapbox/${mapboxId}/tiles/256/${z}/${x}/${y}${retina}?access_token=${accessToken}`
2018-09-14 00:35:40 +02:00
const providers = {
osm: (x, y, z) => {
const s = String.fromCharCode(97 + ((x + y + z) % 3))
return `https://${s}.tile.openstreetmap.org/${z}/${x}/${y}.png`
},
2018-09-16 14:53:26 +02:00
wikimedia: (x, y, z) =>
`https://maps.wikimedia.org/osm-intl/${z}/${x}/${y}${retina}.png`,
stamen: (x, y, z) =>
`https://stamen-tiles.a.ssl.fastly.net/terrain/${z}/${x}/${y}${retina}.jpg`,
2018-09-14 00:35:40 +02:00
streets: mapbox('streets-v10', MAPBOX_ACCESS_TOKEN),
satellite: mapbox('satellite-streets-v10', MAPBOX_ACCESS_TOKEN),
outdoors: mapbox('outdoors-v10', MAPBOX_ACCESS_TOKEN),
light: mapbox('light-v9', MAPBOX_ACCESS_TOKEN),
dark: mapbox('dark-v9', MAPBOX_ACCESS_TOKEN)
2018-09-07 13:08:01 +02:00
}
2018-09-16 14:53:26 +02:00
class ExifMap extends PureComponent {
2018-11-07 00:38:15 +01:00
state = { zoom: 12 }
2018-09-16 14:53:26 +02:00
2018-09-14 00:35:40 +02:00
static propTypes = {
gps: PropTypes.object
}
2018-09-16 14:53:26 +02:00
zoomIn = () => {
this.setState({
2018-11-07 00:38:15 +01:00
zoom: Math.min(this.state.zoom + 4, 20)
2018-09-16 14:53:26 +02:00
})
}
2018-09-14 00:35:40 +02:00
render() {
const { latitude, longitude } = this.props.gps
return (
<Map
center={[latitude, longitude]}
2018-09-16 14:53:26 +02:00
zoom={this.state.zoom}
2018-09-14 00:35:40 +02:00
height={160}
attribution={false}
provider={providers['light']}
2018-09-16 14:53:26 +02:00
metaWheelZoom={true}
metaWheelZoomWarning={'META+wheel to zoom'}
2018-09-14 00:35:40 +02:00
>
2018-09-16 14:53:26 +02:00
<Marker
anchor={[latitude, longitude]}
payload={1}
onClick={this.zoomIn}
/>
2018-09-14 00:35:40 +02:00
</Map>
)
}
2018-09-07 01:45:53 +02:00
}
2018-09-07 13:08:01 +02:00
2018-09-14 00:35:40 +02:00
export default class Exif extends PureComponent {
static propTypes = {
exif: PropTypes.object
}
render() {
const {
iso,
model,
fstop,
shutterspeed,
focalLength,
exposure,
gps
} = this.props.exif
return (
<Fragment>
<aside className={styles.exif}>
<div className={styles.data}>
{model && <span title="Camera model">{model}</span>}
{fstop && <span title="Aperture">{fstop}</span>}
{shutterspeed && <span title="Shutter speed">{shutterspeed}</span>}
{exposure && <span title="Exposure">{exposure}</span>}
{iso && <span title="ISO">{iso}</span>}
{focalLength && <span title="Focal length">{focalLength}</span>}
</div>
2018-09-16 14:53:26 +02:00
<div className={styles.map}>{gps && <ExifMap gps={gps} />}</div>
2018-09-14 00:35:40 +02:00
</aside>
</Fragment>
)
}
}