MetricWidget bigger

This commit is contained in:
2026-07-02 15:58:39 +05:00
parent 95690f76ec
commit f60451ecb1
7 changed files with 153 additions and 93 deletions

View File

@@ -1,5 +1,38 @@
export type QueryParamValue = string | number | string[] | undefined;
function joinUrl(baseUrl: string, path: string): string {
const base = baseUrl.replace(/\/$/, '');
const endpoint = path.startsWith('/') ? path : `/${path}`;
return `${base}${endpoint}`;
}
function appendQueryParams(url: string, params?: Record<string, QueryParamValue>): string {
const searchParams = new URLSearchParams();
Object.entries(params ?? {}).forEach(([key, value]) => {
if (Array.isArray(value)) {
value.forEach((item) => searchParams.append(key, item));
return;
}
if (value !== undefined && value !== '') {
searchParams.set(key, String(value));
}
});
const query = searchParams.toString();
return query ? `${url}?${query}` : url;
}
/** Собирает URL API из base, пути и query-параметров. */
export function buildApiUrl(
baseUrl: string,
path: string,
params?: Record<string, QueryParamValue>,
): string {
return appendQueryParams(joinUrl(baseUrl, path), params);
}
/** Выполняет GET-запрос и добавляет query-параметры в едином формате для всех API. */
export async function getJson<T>(
baseUrl: string,
@@ -7,18 +40,7 @@ export async function getJson<T>(
params?: Record<string, QueryParamValue>,
init?: RequestInit,
): Promise<T> {
const url = new URL(path, baseUrl);
Object.entries(params ?? {}).forEach(([key, value]) => {
if (Array.isArray(value)) {
value.forEach((item) => url.searchParams.append(key, item));
return;
}
if (value !== undefined && value !== '') {
url.searchParams.set(key, String(value));
}
});
const url = buildApiUrl(baseUrl, path, params);
const response = await fetch(url, init);
if (!response.ok) {