2018-06-26 14:59:35 +00:00
|
|
|
/** @format */
|
|
|
|
/**
|
|
|
|
* External dependencies
|
|
|
|
*/
|
2019-06-13 19:58:21 +00:00
|
|
|
import { createBrowserHistory } from 'history';
|
|
|
|
import { parse } from 'qs';
|
2018-06-26 14:59:35 +00:00
|
|
|
|
|
|
|
// See https://github.com/ReactTraining/react-router/blob/master/FAQ.md#how-do-i-access-the-history-object-outside-of-components
|
|
|
|
|
2019-02-06 19:28:29 +00:00
|
|
|
let _history;
|
|
|
|
|
2019-06-13 19:58:21 +00:00
|
|
|
/**
|
|
|
|
* Recreate `history` to coerce React Router into accepting path arguments found in query
|
|
|
|
* parameter `path`, allowing a url hash to be avoided. Since hash portions of the url are
|
|
|
|
* not sent server side, full route information can be detected by the server.
|
|
|
|
*
|
|
|
|
* `<Router />` and `<Switch />` components use `history.location()` to match a url with a route.
|
|
|
|
* Since they don't parse query arguments, recreate `get location` to return a `pathname` with the
|
|
|
|
* query path argument's value.
|
|
|
|
*
|
|
|
|
* @returns {object} React-router history object with `get location` modified.
|
|
|
|
*/
|
2019-02-06 19:28:29 +00:00
|
|
|
function getHistory() {
|
|
|
|
if ( ! _history ) {
|
2019-06-13 19:58:21 +00:00
|
|
|
const path = document.location.pathname;
|
|
|
|
const browserHistory = createBrowserHistory( {
|
|
|
|
basename: path.substring( 0, path.lastIndexOf( '/' ) ),
|
|
|
|
} );
|
|
|
|
_history = {
|
|
|
|
get length() {
|
|
|
|
return browserHistory.length;
|
|
|
|
},
|
|
|
|
get action() {
|
|
|
|
return browserHistory.action;
|
|
|
|
},
|
|
|
|
get location() {
|
|
|
|
const { location } = browserHistory;
|
|
|
|
const query = parse( location.search.substring( 1 ) );
|
|
|
|
const pathname = query.path || '/';
|
|
|
|
|
|
|
|
return {
|
|
|
|
...location,
|
|
|
|
pathname,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
createHref: ( ...args ) => browserHistory.createHref.apply( browserHistory, args ),
|
|
|
|
push: ( ...args ) => browserHistory.push.apply( browserHistory, args ),
|
|
|
|
replace: ( ...args ) => browserHistory.replace.apply( browserHistory, args ),
|
|
|
|
go: ( ...args ) => browserHistory.go.apply( browserHistory, args ),
|
|
|
|
goBack: ( ...args ) => browserHistory.goBack.apply( browserHistory, args ),
|
|
|
|
goForward: ( ...args ) => browserHistory.goForward.apply( browserHistory, args ),
|
|
|
|
block: ( ...args ) => browserHistory.block.apply( browserHistory, args ),
|
|
|
|
listen: function( listener ) {
|
|
|
|
return browserHistory.listen( () => {
|
|
|
|
listener( this.location, this.action );
|
|
|
|
} );
|
|
|
|
},
|
|
|
|
};
|
2019-02-06 19:28:29 +00:00
|
|
|
}
|
|
|
|
return _history;
|
|
|
|
}
|
|
|
|
|
|
|
|
export { getHistory };
|