Move analytics consent to new preferences store

This commit is contained in:
Fred Boniface 2025-10-13 00:36:48 +01:00
parent 2de4174eca
commit a725dfdc4d
8 changed files with 37 additions and 102 deletions

View File

@ -1,31 +1,50 @@
<script lang="ts"> <script lang="ts">
import { setTelemetryFalse, setTelemetryTrue } from "$lib/stores/SetTelemetryConsent"; import type { Preferences } from "$lib/stores/preferences";
import { telemetry } from "$lib/stores/telemetryConsent"; import { preferences } from "$lib/stores/preferences";
import { onMount } from "svelte"; import { onDestroy, onMount } from "svelte";
import { browser } from "$app/environment"; import { browser } from "$app/environment";
let pref: Preferences
const unsubscribe = preferences.subscribe((value => {
pref = value;
}))
onMount(() => { onMount(() => {
if (!localStorage.getItem("telemetryRequested")) { const threshold = Date.now() - 30*24*60*60*1000;
const lastRequested = pref.telemetryRequested?.getTime() ?? 0;
if (!pref.telemetry && lastRequested < threshold) {
document.querySelector<HTMLDialogElement>("#analytics-consent")?.showModal(); document.querySelector<HTMLDialogElement>("#analytics-consent")?.showModal();
} }
}) })
// Setting Function Calls onDestroy(() => {
unsubscribe();
})
// Setting Function Calls - Update to call new Store
function setAcceptAnalytics() { function setAcceptAnalytics() {
setTelemetryTrue(); preferences.update(current => ({
localStorage.setItem("telemetryRequested", "yes"); ...current,
telemetry: true,
telemetryRequested: new Date(),
}));
document.querySelector<HTMLDialogElement>("#analytics-consent")?.close(); document.querySelector<HTMLDialogElement>("#analytics-consent")?.close();
} }
function setDenyAnalytics() { function setDenyAnalytics() {
setTelemetryFalse(); preferences.update(current => ({
localStorage.setItem("telemetryRequested", "yes"); ...current,
telemetry: false,
telemetryRequested: new Date(),
}));
document.querySelector<HTMLDialogElement>("#analytics-consent")?.close(); document.querySelector<HTMLDialogElement>("#analytics-consent")?.close();
} }
// Reactively call telemetry script functions // Reactively call telemetry script functions - Update to call new Store
$: { $: {
if (browser) { if (browser) {
if ($telemetry) { if ($preferences.telemetry) {
loadTelemetryScript(); loadTelemetryScript();
} else { } else {
removeTelemetryScript(); removeTelemetryScript();

View File

@ -57,18 +57,21 @@ function migrateToV1() {
const oldQlRaw = localStorage.getItem('ql'); const oldQlRaw = localStorage.getItem('ql');
const oldLocationRaw = localStorage.getItem('location'); const oldLocationRaw = localStorage.getItem('location');
const oldTelemetryRaw = localStorage.getItem('telemetry'); const oldTelemetryRaw = localStorage.getItem('telemetry');
const oldTelemetryRequestedRaw = localStorage.getItem('telemetryRequested');
const ql: string[] = safeParseJSON(oldQlRaw, []); const ql: string[] = safeParseJSON(oldQlRaw, []);
const location: boolean = parseBool(oldLocationRaw, false); const location: boolean = parseBool(oldLocationRaw, false);
const telemetry: boolean = parseBool(oldTelemetryRaw, false); const telemetry: boolean = parseBool(oldTelemetryRaw, false);
const telemetryRequested: Date | null = oldTelemetryRequestedRaw === "yes" ? new Date() : null;
const migrated: Preferences = { ql, location, telemetry, format: 1 }; const migrated: Preferences = { ql, location, telemetry, telemetryRequested, format: 1 };
preferences.set(migrated); preferences.set(migrated);
localStorage.removeItem('ql'); localStorage.removeItem('ql');
localStorage.removeItem('location'); localStorage.removeItem('location');
localStorage.removeItem('telemetry'); localStorage.removeItem('telemetry');
localStorage.removeItem('telemetryRequested');
console.info('[Migration] Preferences migrated to version 1'); console.info('[Migration] Preferences migrated to version 1');
} }

View File

@ -1,14 +0,0 @@
import { get } from "svelte/store";
import { telemetry } from "./telemetryConsent";
export function setTelemetryTrue() {
telemetry.set(true);
}
export function setTelemetryFalse() {
telemetry.set(false);
}
export function getTelemetry(): boolean {
return get(telemetry);
}

View File

@ -1,25 +0,0 @@
// src/stores.js
import { writable, type Writable } from "svelte/store";
import { browser } from "$app/environment";
// Initialize the store with a boolean value from local storage
export const location: Writable<boolean> = writable(fromLocalStorage("location", false));
toLocalStorage(location, "location");
function fromLocalStorage(storageKey: string, fallback: boolean): boolean {
if (browser) {
const storedValue = localStorage.getItem(storageKey);
if (storedValue !== null && storedValue !== "undefined") {
return storedValue === "true";
}
}
return fallback;
}
function toLocalStorage(store: Writable<boolean>, storageKey: string) {
if (browser) {
store.subscribe((value: boolean) => {
localStorage.setItem(storageKey, String(value));
});
}
}

View File

@ -7,6 +7,7 @@ export interface Preferences {
ql: string[]; ql: string[];
location: boolean; location: boolean;
telemetry: boolean; telemetry: boolean;
telemetryRequested: Date | null;
format: number; format: number;
} }
@ -16,6 +17,7 @@ const DEFAULT_PREFERENCES: Preferences = {
ql: [], ql: [],
location: false, location: false,
telemetry: false, telemetry: false,
telemetryRequested: null,
format: PREFERENCE_FORMAT_VERSION, format: PREFERENCE_FORMAT_VERSION,
}; };

View File

@ -1,25 +0,0 @@
import { writable, type Writable } from "svelte/store";
import { browser } from "$app/environment";
export const ql = writable(fromLocalStorage("ql", []));
toLocalStorage(ql, "ql");
function fromLocalStorage(storageKey: string, fallback: string[]): string[] {
if (browser) {
const storedValue = localStorage.getItem(storageKey);
if (storedValue !== "undefined" && storedValue !== null) {
return typeof fallback === "object" ? JSON.parse(storedValue) : storedValue;
}
}
return fallback;
}
function toLocalStorage(store: Writable<string[]>, storageKey: string) {
if (browser) {
store.subscribe((value) => {
let storageValue = typeof value === "object" ? JSON.stringify(value.sort()) : value;
localStorage.setItem(storageKey, storageValue);
});
}
}

View File

@ -1,25 +0,0 @@
// src/stores.js
import { writable, type Writable } from "svelte/store";
import { browser } from "$app/environment";
// Initialize the store with a boolean value from local storage
export const telemetry: Writable<boolean> = writable(fromLocalStorage("telemetry", false));
toLocalStorage(telemetry, "telemetry");
function fromLocalStorage(storageKey: string, fallback: boolean): boolean {
if (browser) {
const storedValue = localStorage.getItem(storageKey);
if (storedValue !== null && storedValue !== "undefined") {
return storedValue === "true";
}
}
return fallback;
}
function toLocalStorage(store: Writable<boolean>, storageKey: string) {
if (browser) {
store.subscribe((value: boolean) => {
localStorage.setItem(storageKey, String(value));
});
}
}

View File

@ -1,2 +1,2 @@
export const version: string = "2025.05.1"; export const version: string = "2025.10.1";
export const versionTag: string = ""; export const versionTag: string = "";