113 lines
3.5 KiB
JavaScript
113 lines
3.5 KiB
JavaScript
/** @format */
|
|
/**
|
|
* External dependencies
|
|
*/
|
|
import history from 'lib/history';
|
|
import { parse, stringify } from 'qs';
|
|
import { isEmpty, pick, uniq } from 'lodash';
|
|
|
|
/**
|
|
* Returns a string with the site's wp-admin URL appended. JS version of `admin_url`.
|
|
*
|
|
* @param {String} path Relative path.
|
|
* @return {String} Full admin URL.
|
|
*/
|
|
export const getAdminLink = path => wcSettings.adminUrl + path;
|
|
|
|
/**
|
|
* Get the current path from history.
|
|
*
|
|
* @return {String} Current path.
|
|
*/
|
|
export const getPath = () => history.location.pathname;
|
|
|
|
/**
|
|
* Converts a query object to a query string.
|
|
*
|
|
* @param {Object} query parameters to be converted.
|
|
* @return {String} Query string.
|
|
*/
|
|
export const stringifyQuery = query => ( isEmpty( query ) ? '' : '?' + stringify( query ) );
|
|
|
|
/**
|
|
* Gets time related parameters from a query.
|
|
*
|
|
* @param {Object} query Query containing the parameters.
|
|
* @return {Object} Object containing the time related queries.
|
|
*/
|
|
export const getTimeRelatedQuery = query =>
|
|
pick( query, [ 'period', 'compare', 'before', 'after' ] );
|
|
|
|
/**
|
|
* Get an array of IDs from a comma-separated query parameter.
|
|
*
|
|
* @param {string} queryString string value extracted from URL.
|
|
* @return {Array} List of IDs converted to numbers.
|
|
*/
|
|
export function getIdsFromQuery( queryString = '' ) {
|
|
return uniq(
|
|
queryString
|
|
.split( ',' )
|
|
.map( id => parseInt( id, 10 ) )
|
|
.filter( Boolean )
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Return a URL with set query parameters.
|
|
*
|
|
* @param {Object} query object of params to be updated.
|
|
* @param {String} path Relative path (defaults to current path).
|
|
* @param {Object} currentQuery object of current query params (defaults to current querystring).
|
|
* @return {String} Updated URL merging query params into existing params.
|
|
*/
|
|
export function getNewPath( query, path = getPath(), currentQuery = getQuery() ) {
|
|
const queryString = stringifyQuery( { ...currentQuery, ...query } );
|
|
return `${ path }${ queryString }`;
|
|
}
|
|
|
|
/**
|
|
* Get the current query string, parsed into an object, from history.
|
|
*
|
|
* @return {Object} Current query object, defaults to empty object.
|
|
*/
|
|
export function getQuery() {
|
|
const search = history.location.search;
|
|
if ( search.length ) {
|
|
return parse( search.substring( 1 ) ) || {};
|
|
}
|
|
return {};
|
|
}
|
|
|
|
/**
|
|
* This function returns an event handler for the given `param`
|
|
*
|
|
* @param {string} param The parameter in the querystring which should be updated (ex `page`, `per_page`)
|
|
* @param {string} path Relative path (defaults to current path).
|
|
* @param {string} query object of current query params (defaults to current querystring).
|
|
* @return {function} A callback which will update `param` to the passed value when called.
|
|
*/
|
|
export function onQueryChange( param, path = getPath(), query = getQuery() ) {
|
|
switch ( param ) {
|
|
case 'sort':
|
|
return ( key, dir ) => updateQueryString( { orderby: key, order: dir }, path, query );
|
|
case 'compare':
|
|
return ( key, ids ) =>
|
|
updateQueryString( { filter: `compare-${ key }`, [ key ]: ids }, path, query );
|
|
default:
|
|
return value => updateQueryString( { [ param ]: value }, path, query );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Updates the query parameters of the current page.
|
|
*
|
|
* @param {Object} query object of params to be updated.
|
|
* @param {String} path Relative path (defaults to current path).
|
|
* @param {Object} currentQuery object of current query params (defaults to current querystring).
|
|
*/
|
|
export function updateQueryString( query, path = getPath(), currentQuery = getQuery() ) {
|
|
const newPath = getNewPath( query, path, currentQuery );
|
|
history.push( newPath );
|
|
}
|