154 lines
3.5 KiB
Svelte
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>
|