react-concurrent-router
Version:
Performant routing embracing React concurrent UI patterns
44 lines (40 loc) • 1.52 kB
JavaScript
;
var _extends = require('@babel/runtime/helpers/extends');
var React = require('react');
var utils = require('./utils-BDbVHWV6.js');
var RouterContext = require('./RouterContext-BCgWDPs4.js');
require('@babel/runtime/helpers/objectWithoutPropertiesLoose');
require('history');
require('./SuspendableResource.js');
const useSearchParams = () => {
const {
get,
history,
subscribe
} = React.useContext(RouterContext.RouterContext);
const [searchParams, setSearchParams] = React.useState(utils.paramsStringToObject(get().location.search));
const handleSetSearchParams = React.useCallback((newParams, {
replace = false
} = {}) => {
const {
location
} = get();
const currentSearchParams = typeof newParams === 'function' && utils.paramsStringToObject(location.search);
const newSearchParams = typeof newParams === 'function' ? newParams(currentSearchParams) : newParams;
history[replace ? 'replace' : 'push']({
pathname: location.pathname,
search: utils.sortAndStringifyRequestParams(newSearchParams)
}, _extends({}, location.state, replace && {
skipRender: true
}));
}, []);
React.useEffect(() => {
const dispose = subscribe(async nextEntry => {
const newSearchParams = utils.paramsStringToObject(nextEntry.location.search);
setTimeout(() => setSearchParams(newSearchParams), 1);
});
return () => dispose();
}, []);
return [searchParams, handleSetSearchParams];
};
module.exports = useSearchParams;