Skip to content

Commit 1d277d3

Browse files
committed
Add getSearchParamValues() util to simplify using sveltekit-search-params config to get values from URLSearchParams (particularly useful server side)
1 parent b7f4756 commit 1d277d3

File tree

3 files changed

+38
-26
lines changed

3 files changed

+38
-26
lines changed

frontend/src/lib/types/MetricType/MetricType.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { EncodeAndDecodeOptions } from 'sveltekit-search-params/sveltekit-search-params';
2+
import { getSearchParamValues } from '$lib/util/search-params';
23

34
export const METRIC_TYPES = ['jsd', 'hellinger', 'psi'] as const;
45
export type MetricType = (typeof METRIC_TYPES)[number];
@@ -30,7 +31,5 @@ export function getMetricTypeParamsConfig() {
3031

3132
export function getMetricTypeFromParams(searchParams: URLSearchParams): MetricType {
3233
const paramsConfig = getMetricTypeParamsConfig();
33-
const [paramName, paramConfig] = Object.entries(paramsConfig)[0]; // single `metric` config
34-
const value = searchParams.get(paramName);
35-
return paramConfig.decode(value) ?? paramConfig.defaultValue;
34+
return getSearchParamValues(searchParams, paramsConfig).metric;
3635
}

frontend/src/lib/util/date-ranges.ts

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,40 @@
1+
import { ssp } from 'sveltekit-search-params';
2+
13
import {
24
DATE_RANGE_PARAM,
35
DATE_RANGE_START_PARAM,
46
DATE_RANGE_END_PARAM,
57
PAST_1_WEEK,
68
getDateRangeByValue
79
} from '$lib/constants/date-ranges';
8-
import { ssp } from 'sveltekit-search-params';
10+
import { getSearchParamValues } from './search-params';
911

1012
export function getDateRange(range: string): [number, number] {
1113
const dateRange = getDateRangeByValue(range);
1214
return dateRange ? dateRange.getRange() : getDateRangeByValue(PAST_1_WEEK)!.getRange();
1315
}
1416

15-
export function parseDateRangeParams(searchParams: URLSearchParams) {
16-
const dateRangeValue = searchParams.get(DATE_RANGE_PARAM);
17-
const startParam = searchParams.get(DATE_RANGE_START_PARAM);
18-
const endParam = searchParams.get(DATE_RANGE_END_PARAM);
19-
20-
let startTimestamp: number;
21-
let endTimestamp: number;
22-
23-
if (startParam && endParam) {
24-
startTimestamp = Number(startParam);
25-
endTimestamp = Number(endParam);
26-
} else {
27-
[startTimestamp, endTimestamp] = getDateRange(dateRangeValue || PAST_1_WEEK);
28-
}
29-
30-
return {
31-
dateRangeValue: dateRangeValue || PAST_1_WEEK,
32-
startTimestamp,
33-
endTimestamp
34-
};
35-
}
36-
3717
export function getDateRangeParamsConfig() {
3818
return {
3919
[DATE_RANGE_PARAM]: ssp.string(PAST_1_WEEK),
4020
[DATE_RANGE_START_PARAM]: ssp.number(),
4121
[DATE_RANGE_END_PARAM]: ssp.number()
4222
};
4323
}
24+
25+
export function parseDateRangeParams(searchParams: URLSearchParams) {
26+
const paramsConfig = getDateRangeParamsConfig();
27+
const paramValues = getSearchParamValues(searchParams, paramsConfig);
28+
29+
if (paramValues[DATE_RANGE_START_PARAM] == null || paramValues[DATE_RANGE_END_PARAM] == null) {
30+
const [start, end] = getDateRange(paramValues[DATE_RANGE_PARAM] || PAST_1_WEEK);
31+
paramValues[DATE_RANGE_START_PARAM] = start;
32+
paramValues[DATE_RANGE_END_PARAM] = end;
33+
}
34+
35+
return {
36+
dateRangeValue: paramValues[DATE_RANGE_PARAM],
37+
startTimestamp: paramValues[DATE_RANGE_START_PARAM],
38+
endTimestamp: paramValues[DATE_RANGE_END_PARAM]
39+
};
40+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type { EncodeAndDecodeOptions } from 'sveltekit-search-params/sveltekit-search-params';
2+
3+
/** Get URLSearchParam values from `sveltekit-search-params` config.
4+
* Mostly useful server-side (use `queryParameters()` client side)
5+
**/
6+
export function getSearchParamValues(
7+
searchParams: URLSearchParams,
8+
paramsConfig: Record<string, EncodeAndDecodeOptions>
9+
) {
10+
const paramEntries = Object.entries(paramsConfig).map(([paramName, paramConfig]) => {
11+
const value = searchParams.get(paramName);
12+
let decodedValue = paramConfig.decode(value) ?? paramConfig.defaultValue;
13+
return [paramName, decodedValue];
14+
});
15+
return Object.fromEntries(paramEntries);
16+
}

0 commit comments

Comments
 (0)