From 3d1bbb58a73db237fd1340f260da194f48566ea5 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Fri, 19 Jun 2020 14:00:22 -0400 Subject: [PATCH] fix(routerId): if routerId present, include in copied URL --- lib/actions/ui.js | 13 +++++++++---- lib/components/app/responsive-webapp.js | 10 +++++----- lib/components/narrative/trip-tools.js | 18 ++++++++++++++++-- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/lib/actions/ui.js b/lib/actions/ui.js index bf28845b7..c4f386244 100644 --- a/lib/actions/ui.js +++ b/lib/actions/ui.js @@ -70,13 +70,14 @@ export function matchContentToUrl (location) { // Parse comma separated params (ensuring numbers are parsed correctly). let [lat, lon, zoom, routerId] = id ? idToParams(id) : [] if (!lat || !lon) { - // Attempt to parse path. (Legacy UI otp.js used slashes in the - // pathname to specify lat, lon, etc.) + // Attempt to parse path if lat/lon not found. (Legacy UI otp.js used + // slashes in the pathname to specify lat, lon, etc.) [,, lat, lon, zoom, routerId] = idToParams(location.pathname, '/') } + console.log(lat, lon, zoom, routerId) // Update map location/zoom and optionally override router ID. - dispatch(setMapCenter({ lat, lon })) - dispatch(setMapZoom({ zoom })) + if (+lat && +lon) dispatch(setMapCenter({ lat, lon })) + if (+zoom) dispatch(setMapZoom({ zoom })) // If router ID is provided, override the default routerId. if (routerId) dispatch(setRouterId(routerId)) dispatch(setMainPanelContent(null)) @@ -89,6 +90,10 @@ export function matchContentToUrl (location) { } } +/** + * Split the path id into its parts (according to specified delimiter). Parse + * numbers if detected. + */ function idToParams (id, delimiter = ',') { return id.split(delimiter).map(s => isNaN(s) ? s : +s) } diff --git a/lib/components/app/responsive-webapp.js b/lib/components/app/responsive-webapp.js index 9705cd327..92d98be1f 100644 --- a/lib/components/app/responsive-webapp.js +++ b/lib/components/app/responsive-webapp.js @@ -105,20 +105,20 @@ class ResponsiveWebapp extends Component { { enableHighAccuracy: true } ) } - + // Handle routing to a specific part of the app (e.g. stop viewer) on page + // load. (This happens prior to routing request in case special routerId is + // set from URL.) + this.props.matchContentToUrl(this.props.location) if (location && location.search) { // Set search params and plan trip if routing enabled and a query exists // in the URL. this.props.parseUrlQueryString() } - // Handle routing to a specific part of the app (e.g. stop viewer) on page - // load. - this.props.matchContentToUrl(this.props.location) } componentWillUnmount () { // Remove on back button press listener. - window.removeEventListener('popstate') + window.removeEventListener('popstate', this.props.handleBackButtonPress) } render () { diff --git a/lib/components/narrative/trip-tools.js b/lib/components/narrative/trip-tools.js index 150dfa1fe..2717bf26f 100644 --- a/lib/components/narrative/trip-tools.js +++ b/lib/components/narrative/trip-tools.js @@ -77,10 +77,24 @@ class CopyUrlButton extends Component { this.state = { showCopied: false } } + _resetState = () => this.setState({ showCopied: false }) + _onClick = () => { - copyToClipboard(window.location.href) + // If special routerId has been set in session storage, construct copy URL + // for itinerary with #/start/ prefix to set routerId on page load. + const routerId = window.sessionStorage.getItem('routerId') + let url = window.location.href + if (routerId) { + const parts = url.split('#') + if (parts.length === 2) { + url = `${parts[0]}#/start/x/x/x/${routerId}${parts[1]}` + } else { + console.warn('URL not formatted as expected, copied URL will not contain session routerId.', routerId) + } + } + copyToClipboard(url) this.setState({ showCopied: true }) - setTimeout(() => { this.setState({ showCopied: false }) }, 2000) + window.setTimeout(this._resetState, 2000) } render () {