Lots of frontend changes
This commit is contained in:
parent
ec29631c44
commit
555ba7cf53
38 changed files with 1508 additions and 648 deletions
|
|
@ -1,25 +1,29 @@
|
|||
import type { FeatureMeta, FeatureFilters } from '../types';
|
||||
|
||||
const INITIAL_RETRY_MS = 1000;
|
||||
const MAX_RETRY_MS = 10000;
|
||||
|
||||
// Error handling utilities
|
||||
function isAbortError(error: unknown): boolean {
|
||||
return error instanceof Error && error.name === 'AbortError';
|
||||
}
|
||||
import { INITIAL_RETRY_MS, MAX_RETRY_MS } from './consts';
|
||||
import pb from './pocketbase';
|
||||
|
||||
export function logNonAbortError(label: string, error: unknown): void {
|
||||
if (!isAbortError(error)) {
|
||||
console.error(`${label}:`, error);
|
||||
if (error instanceof Error && error.name === 'AbortError') {
|
||||
return;
|
||||
}
|
||||
|
||||
console.error(`${label}:`, error);
|
||||
}
|
||||
|
||||
export function authHeaders(init?: RequestInit): RequestInit {
|
||||
const headers: Record<string, string> = {};
|
||||
if (pb.authStore.isValid && pb.authStore.token) {
|
||||
headers['Authorization'] = `Bearer ${pb.authStore.token}`;
|
||||
}
|
||||
if (!init) return { headers };
|
||||
const existing = init.headers as Record<string, string> | undefined;
|
||||
return { ...init, headers: { ...existing, ...headers } };
|
||||
}
|
||||
|
||||
// API URL helper
|
||||
export function apiUrl(endpoint: string, params?: URLSearchParams): string {
|
||||
const base = getApiBaseUrl();
|
||||
const path = endpoint.startsWith('/') ? endpoint : `/api/${endpoint}`;
|
||||
const query = params?.toString();
|
||||
return query ? `${base}${path}?${query}` : `${base}${path}`;
|
||||
return query ? `${path}?${query}` : path;
|
||||
}
|
||||
|
||||
export async function fetchWithRetry<T>(
|
||||
|
|
@ -30,7 +34,7 @@ export async function fetchWithRetry<T>(
|
|||
let delay = INITIAL_RETRY_MS;
|
||||
while (!signal.aborted) {
|
||||
try {
|
||||
const res = await fetch(url, { signal });
|
||||
const res = await fetch(url, authHeaders({ signal }));
|
||||
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||
const json = await res.json();
|
||||
onSuccess(json);
|
||||
|
|
@ -44,26 +48,6 @@ export async function fetchWithRetry<T>(
|
|||
}
|
||||
}
|
||||
|
||||
export function getApiBaseUrl(): string {
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
return '';
|
||||
}
|
||||
|
||||
const { pathname, href } = window.location;
|
||||
|
||||
const pathMatch = pathname.match(/^(\/proxy\/)(\d+)/);
|
||||
if (pathMatch) {
|
||||
return `${pathMatch[1]}8001`;
|
||||
}
|
||||
|
||||
const hrefMatch = href.match(/(\/proxy\/)\d+/);
|
||||
if (hrefMatch) {
|
||||
return `${hrefMatch[1]}8001`;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
export function buildFilterString(filters: FeatureFilters, features: FeatureMeta[]): string {
|
||||
const entries = Object.entries(filters);
|
||||
if (entries.length === 0) return '';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue