frontend: Fix attributions and reuse map code

This commit is contained in:
Paul Bienkowski 2021-11-21 17:22:39 +01:00
parent 7add8caaa1
commit f54fe701e7
2 changed files with 23 additions and 35 deletions

View file

@ -7,36 +7,12 @@ import {map, switchMap} from 'rxjs/operators'
import api from 'api' import api from 'api'
import {Stats, Page} from 'components' import {Stats, Page} from 'components'
import {useConfig, MapSource} from 'config'
import {TrackListItem} from './TracksPage' import {TrackListItem} from './TracksPage'
import {RoadsMap} from './MapPage'
import styles from './HomePage.module.scss' import styles from './HomePage.module.scss'
import 'ol/ol.css' import 'ol/ol.css'
import {obsRoads} from '../mapstyles'
import ReactMapGl from 'react-map-gl'
function WelcomeMap({mapSource}: {mapSource: MapSource}) {
const mapStyle = React.useMemo(() => obsRoads(mapSource), [mapSource])
const config = useConfig()
const [viewport, setViewport] = React.useState({
longitude: 0,
latitude: 0,
zoom: 0,
})
React.useEffect(() => {
if (config?.mapHome) {
setViewport(config.mapHome)
}
}, [config])
return (
<div className={styles.welcomeMap}>
<ReactMapGl mapStyle={mapStyle} width="100%" height="100%" onViewportChange={setViewport} {...viewport} />
</div>
)
}
function MostRecentTrack() { function MostRecentTrack() {
const track: Track | null = useObservable( const track: Track | null = useObservable(
@ -67,14 +43,14 @@ function MostRecentTrack() {
} }
export default function HomePage() { export default function HomePage() {
const {obsMapSource: mapSource} = useConfig() || {}
return ( return (
<Page> <Page>
<Grid stackable> <Grid stackable>
<Grid.Row> <Grid.Row>
<Grid.Column width={10}> <Grid.Column width={10}>
{mapSource ? <WelcomeMap {...{mapSource}} /> : null} <div className={styles.welcomeMap}>
<RoadsMap />
</div>
</Grid.Column> </Grid.Column>
<Grid.Column width={6}> <Grid.Column width={6}>
<Stats /> <Stats />

View file

@ -9,9 +9,9 @@ import styles from './MapPage.module.scss'
import 'ol/ol.css' import 'ol/ol.css'
import {obsRoads} from '../mapstyles' import {obsRoads} from '../mapstyles'
import ReactMapGl from 'react-map-gl' import ReactMapGl, {AttributionControl } from 'react-map-gl'
function BigMap({mapSource, config}: {mapSource: string ,config: Config}) { function RoadsMapInner({mapSource, config}: {mapSource: string ,config: Config}) {
const mapStyle = React.useMemo(() => mapSource && obsRoads(mapSource), [mapSource]) const mapStyle = React.useMemo(() => mapSource && obsRoads(mapSource), [mapSource])
const [viewport, setViewport] = React.useState({ const [viewport, setViewport] = React.useState({
longitude: 0, longitude: 0,
@ -30,22 +30,34 @@ function BigMap({mapSource, config}: {mapSource: string ,config: Config}) {
} }
return ( return (
<div className={styles.mapContainer}> <ReactMapGl mapStyle={mapStyle} width="100%" height="100%" onViewportChange={setViewport} {...viewport}>
<ReactMapGl mapStyle={mapStyle} width="100%" height="100%" onViewportChange={setViewport} {...viewport} /> <AttributionControl style={{right: 0, bottom: 0}} customAttribution={[
</div> '<a href="https://openstreetmap.org/copyright" target="_blank" rel="nofollow noopener">© OpenStreetMap contributors</a>',
'<a href="https://openmaptiles.org/" target="_blank" rel="nofollow noopener">© OpenMapTiles</a>',
'<a href="https://openbikesensor.org/" target="_blank" rel="nofollow noopener">© OpenBikeSensor</a>',
]} />
</ReactMapGl>
) )
} }
export default function MapPage() { export function RoadsMap(props) {
const config = useConfig() || {} const config = useConfig() || {}
if (!config) return null; if (!config) return null;
const {obsMapSource: mapSource} = config const {obsMapSource: mapSource} = config
if (!mapSource) return null; if (!mapSource) return null;
return (
<RoadsMapInner {...{mapSource, config}} {...props} />
)
}
export default function MapPage() {
return ( return (
<Page fullScreen> <Page fullScreen>
<BigMap {...{mapSource, config}} /> <div className={styles.mapContainer}>
<RoadsMap />
</div>
</Page> </Page>
) )
} }