diff --git a/src/lib/client/alerts/store.ts b/src/lib/client/alerts/store.ts index 1e2c336..759cba2 100644 --- a/src/lib/client/alerts/store.ts +++ b/src/lib/client/alerts/store.ts @@ -1,4 +1,5 @@ import { writable } from 'svelte/store'; +import { uuid } from '$shared/uuid'; export type AlertType = 'success' | 'error' | 'warning' | 'info'; @@ -15,7 +16,7 @@ function createAlertStore() { return { subscribe, add: (type: AlertType, message: string, duration = 5000) => { - const id = crypto.randomUUID(); + const id = uuid(); const alert: Alert = { id, type, message, duration }; update((alerts) => [...alerts, alert]); diff --git a/src/lib/shared/filters.ts b/src/lib/shared/filters.ts index 6308359..8b12455 100644 --- a/src/lib/shared/filters.ts +++ b/src/lib/shared/filters.ts @@ -3,6 +3,8 @@ * Defines all available filter fields for upgrade filtering */ +import { uuid } from './uuid.ts'; + export interface FilterOperator { id: string; label: string; @@ -294,7 +296,7 @@ export function createEmptyGroup(): FilterGroup { */ export function createEmptyFilterConfig(name: string = 'New Filter'): FilterConfig { return { - id: crypto.randomUUID(), + id: uuid(), name, enabled: true, group: createEmptyGroup(), diff --git a/src/lib/shared/uuid.ts b/src/lib/shared/uuid.ts new file mode 100644 index 0000000..4534f41 --- /dev/null +++ b/src/lib/shared/uuid.ts @@ -0,0 +1,16 @@ +/** + * Generate a UUID v4, with fallback for non-secure contexts (HTTP) + * crypto.randomUUID() requires HTTPS or localhost + */ +export function uuid(): string { + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { + return crypto.randomUUID(); + } + + // Fallback for non-secure contexts + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = (Math.random() * 16) | 0; + const v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +} diff --git a/src/routes/arr/[id]/upgrades/components/FilterSettings.svelte b/src/routes/arr/[id]/upgrades/components/FilterSettings.svelte index 9beda27..d98e65e 100644 --- a/src/routes/arr/[id]/upgrades/components/FilterSettings.svelte +++ b/src/routes/arr/[id]/upgrades/components/FilterSettings.svelte @@ -11,6 +11,7 @@ Trash2 } from 'lucide-svelte'; import { createEmptyFilterConfig, type FilterConfig } from '$lib/shared/filters'; + import { uuid } from '$shared/uuid'; import { selectors } from '$lib/shared/selectors'; import { createSearchStore } from '$lib/client/stores/search'; import FilterGroupComponent from './FilterGroup.svelte'; @@ -123,7 +124,7 @@ if (filter) { const duplicate: FilterConfig = { ...structuredClone(filter), - id: crypto.randomUUID(), + id: uuid(), name: `${filter.name} (Copy)` }; filters = [...filters, duplicate];