This repository has been archived on 2025-11-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
trafficcue-client/src/lib/components/lnv/sidebar/settings/DeveloperSidebar.svelte
Jannik f5e1e23cdd
Some checks failed
TrafficCue CI / check (push) Failing after 1m58s
TrafficCue CI / build-android (push) Has been cancelled
TrafficCue CI / build (push) Has started running
feat: improve OIDC login flow and stores handling
2025-09-29 18:54:12 +02:00

154 lines
3.5 KiB
Svelte

<script>
import {
CloudUploadIcon,
HandIcon,
MapIcon,
PackageMinusIcon,
PackagePlusIcon,
PackageXIcon,
RefreshCcwIcon,
SpeechIcon,
ToggleLeftIcon,
} from "@lucide/svelte";
import SidebarHeader from "../SidebarHeader.svelte";
import SettingsButton from "./SettingsButton.svelte";
import say from "$lib/services/navigation/TTS";
import { downloadPMTiles } from "$lib/services/OfflineTiles";
import { getDeveloperToggle } from "./developer.svelte";
import { view } from "../../view.svelte";
import { m } from "$lang/messages";
import { setOnboardingState } from "$lib/onboarding.svelte";
import { getDB, stores, syncStores, updateStore } from "$lib/services/stores.svelte";
const dev = getDeveloperToggle();
const locationStores = stores("location");
</script>
<SidebarHeader>{m["sidebar.developer.header"]()}</SidebarHeader>
<div id="sections">
<section>
<h2>Test</h2>
<SettingsButton
icon={SpeechIcon}
text="Test TTS"
onclick={async () => {
await say("Test");
}}
/>
<SettingsButton
icon={MapIcon}
disabled={!window.__TAURI__}
text="Download tiles from URL{window.__TAURI__ ? '' : ' (Unavailable)'}"
onclick={async () => {
const name = prompt("Name?");
if (!name) return;
const url = prompt("URL?");
if (!url) return;
await downloadPMTiles(url, name);
}}
/>
</section>
<section>
<h2>Open</h2>
<SettingsButton icon={HandIcon} text="Start onboarding" view="onboarding" />
<SettingsButton
icon={HandIcon}
text="Reset onboarding"
onclick={() => {
setOnboardingState("start");
}}
/>
<SettingsButton
icon={RefreshCcwIcon}
text="Reload"
onclick={() => {
location.reload();
}}
/>
</section>
<section>
<h2>Stores</h2>
<SettingsButton
icon={CloudUploadIcon}
text="Sync Stores"
onclick={async () => {
syncStores();
}}
/>
<SettingsButton
icon={PackagePlusIcon}
text="Update Store"
onclick={async () => {
const name = prompt("Store Name?");
if (!name) return;
const type = prompt("Store Type? (route, location, vehicle)");
if (type !== "route" && type !== "location" && type !== "vehicle") {
alert("Invalid type");
return;
}
const data = prompt("Data? (JSON)");
if (!data) return;
await updateStore({ name, type }, JSON.parse(data));
}}
/>
<SettingsButton
icon={PackageMinusIcon}
text="Delete Store"
onclick={async () => {
const name = prompt("Store Name?");
if (!name) return;
const type = prompt("Store Type? (route, location, vehicle)");
if (type !== "route" && type !== "location" && type !== "vehicle") {
alert("Invalid type");
return;
}
await updateStore({ name, type }, null);
}}
/>
<SettingsButton
icon={PackageXIcon}
text="Nuke all Stores"
onclick={async () => {
if (!confirm("Are you sure?")) return;
const db = await getDB();
const tx = db.transaction(["stores", "changes"], "readwrite");
await tx.objectStore("stores").clear();
await tx.objectStore("changes").clear();
await tx.done;
alert("Nuked all stores");
}}
/>
<span>LOCATION STORES: {JSON.stringify(locationStores.current)}</span>
</section>
<section>
<h2>Other</h2>
<SettingsButton
icon={ToggleLeftIcon}
text="Disable Developer Options"
onclick={async () => {
dev.current = "false";
view.back();
}}
/>
</section>
</div>
<style>
section {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
#sections {
display: flex;
flex-direction: column;
gap: 1rem;
}
</style>