| @@ -1,11 +1,21 @@ | ||
| 1 | 1 | import { addQueryArgs } from '@wordpress/url' |
| 2 | 2 | |
| 3 | +export type UrlQueryArgs = Record<string, boolean | number | string | undefined | null> | |
| 4 | + | |
| 3 | 5 | export const fetchQueryParam = (name: string): string | undefined => { |
| 4 | 6 | const urlParams = new URLSearchParams(window.location.search) |
| 5 | 7 | return urlParams.get(name) ?? undefined |
| 6 | 8 | } |
| 7 | 9 | |
| 10 | +export const fetchConstQueryParam = <T extends string>(name: string, values: readonly T[]): T | undefined => { | |
| 11 | + const isT = (value: string): value is T => | |
| 12 | + (<readonly string[]> values).includes(value) | |
| 13 | + | |
| 14 | + const value = fetchQueryParam(name) | |
| 15 | + return value && isT(value) ? value : undefined | |
| 16 | +} | |
| 17 | + | |
| 8 | 18 | export const updateQueryParams = (params: Record<string, string | number | undefined>) => { |
| 9 | 19 | if ('URLSearchParams' in window) { |
| 10 | 20 | const searchParams = new URLSearchParams(window.location.search) |
| 11 | 21 | |
| @@ -38,11 +48,32 @@ | ||
| 38 | 48 | throw new Error(`Unsupported query arg type: ${typeof value}`) |
| 39 | 49 | } |
| 40 | 50 | } |
| 41 | 51 | |
| 52 | +export const buildAdminUrl = ( | |
| 53 | + queryArgs?: UrlQueryArgs, | |
| 54 | + preserveQueryArgs: string[] = [] | |
| 55 | +) => { | |
| 56 | + const searchParams = new URLSearchParams(window.location.search) | |
| 57 | + | |
| 58 | + if (queryArgs) { | |
| 59 | + for (const queryArgName of ['page', ...preserveQueryArgs]) { | |
| 60 | + const value = searchParams.get(queryArgName) | |
| 61 | + if (value && queryArgs[queryArgName] === undefined) { | |
| 62 | + queryArgs[queryArgName] = value | |
| 63 | + } | |
| 64 | + } | |
| 65 | + } | |
| 66 | + | |
| 67 | + return buildUrl( | |
| 68 | + `${window.location.origin}${window.location.pathname}`, | |
| 69 | + { page: searchParams.get('page'), ...queryArgs } | |
| 70 | + ) | |
| 71 | +} | |
| 72 | + | |
| 42 | 73 | export const buildUrl = ( |
| 43 | 74 | base: string | undefined, |
| 44 | - queryArgs: Record<string, boolean | number | string | undefined | null> | |
| 75 | + queryArgs: UrlQueryArgs | |
| 45 | 76 | ): string => { |
| 46 | 77 | const processedArgs: Record<string, string> = {} |
| 47 | 78 | |
| 48 | 79 | for (const [key, value] of Object.entries(queryArgs)) { |