PluginProbe
Code Snippets / trunk
Code Snippets vtrunk
4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 All 65 releases
← All changes | js/utils/urls.ts +32 -1 4.0.0-beta.1 → trunk View file →
@@ -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)) {