feat: initial support for saving routes
This commit is contained in:
@ -11,7 +11,8 @@
|
||||
"home": "Home",
|
||||
"school": "School",
|
||||
"work": "Work",
|
||||
"no-location": "No {name} location saved."
|
||||
"no-location": "No {name} location saved.",
|
||||
"saved-routes": "Saved Routes"
|
||||
},
|
||||
"location": {
|
||||
"unlock": "Unlock Location",
|
||||
@ -130,5 +131,6 @@
|
||||
"choose-lang": "Choose your language",
|
||||
"first-vehicle": "Let's create your first vehicle."
|
||||
}
|
||||
}
|
||||
},
|
||||
"unsave": "Unsave"
|
||||
}
|
||||
|
||||
@ -9,6 +9,8 @@
|
||||
import RequiresCapability from "../RequiresCapability.svelte";
|
||||
import { saved } from "$lib/saved.svelte";
|
||||
import { m } from "$lang/messages";
|
||||
import { getSaved } from "$lib/services/lnv";
|
||||
import { view } from "../view.svelte";
|
||||
</script>
|
||||
|
||||
<div
|
||||
@ -96,6 +98,22 @@
|
||||
|
||||
<VehicleSelector />
|
||||
|
||||
{#await getSaved() then saved}
|
||||
{#if saved.length != 0}
|
||||
<div>
|
||||
<h2 style="margin: 5px; margin-left: 0; font-size: 1.2em;">Saved Routes</h2>
|
||||
|
||||
<div style="display: flex; flex-direction: column; gap: 10px;">
|
||||
{#each saved as save}
|
||||
<Button variant="secondary" onclick={() => {
|
||||
view.switch("trip", { route: JSON.parse(save.data) })
|
||||
}}>{save.name}</Button>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{/await}
|
||||
|
||||
<RequiresCapability capability="post">
|
||||
<div>
|
||||
<h2>In your area</h2>
|
||||
|
||||
@ -10,6 +10,8 @@
|
||||
import { RouteIcon, SaveIcon, SendIcon } from "@lucide/svelte";
|
||||
import { map } from "../map.svelte";
|
||||
import { m } from "$lang/messages";
|
||||
import { deleteSaved, isSaved, putSaved } from "$lib/services/lnv";
|
||||
import { view } from "../view.svelte";
|
||||
|
||||
let {
|
||||
route,
|
||||
@ -43,10 +45,21 @@
|
||||
<RouteIcon />
|
||||
{m["sidebar.trip.start"]()}
|
||||
</Button>
|
||||
<Button variant="secondary" disabled>
|
||||
{#await isSaved($state.snapshot(route)) then saved}
|
||||
<Button variant="secondary" onclick={async () => {
|
||||
if(saved) {
|
||||
await deleteSaved(saved);
|
||||
view.back();
|
||||
} else {
|
||||
const name = prompt("Trip name?");
|
||||
if(!name) return;
|
||||
await putSaved(name, route);
|
||||
}
|
||||
}}>
|
||||
<SaveIcon />
|
||||
{m["sidebar.trip.save"]()}
|
||||
{saved ? m.unsave() : m["sidebar.trip.save"]()}
|
||||
</Button>
|
||||
{/await}
|
||||
<Button variant="secondary" disabled>
|
||||
<SendIcon />
|
||||
{m["sidebar.trip.send"]()}
|
||||
|
||||
@ -80,12 +80,23 @@ export async function refreshToken() {
|
||||
localStorage.setItem("lnv-refresh", data.refresh_token);
|
||||
}
|
||||
|
||||
export async function authFetch(url: string, params: RequestInit): ReturnType<typeof fetch> {
|
||||
let res = await fetch(url, params);
|
||||
if(res.status == 401) {
|
||||
await refreshToken();
|
||||
export async function authFetch(url: string, params?: RequestInit): ReturnType<typeof fetch> {
|
||||
let res = await fetch(url, {
|
||||
headers: {
|
||||
"Authorization": "Bearer " + localStorage.getItem("lnv-token")
|
||||
},
|
||||
...params
|
||||
});
|
||||
if(res.status != 401) {
|
||||
return res;
|
||||
}
|
||||
res = await fetch(url, params);
|
||||
await refreshToken();
|
||||
res = await fetch(url, {
|
||||
headers: {
|
||||
"Authorization": "Bearer " + localStorage.getItem("lnv-token")
|
||||
},
|
||||
...params
|
||||
});
|
||||
if(res.status == 401) {
|
||||
console.error("Server is misconfigured.");
|
||||
}
|
||||
@ -160,3 +171,34 @@ export async function ai(query: string, location?: WorldLocation) {
|
||||
}
|
||||
return await res.text();
|
||||
}
|
||||
|
||||
export function getSaved(): Promise<{ name: string; data: string; }[]> {
|
||||
return authFetch(LNV_SERVER + "/saved").then(res => res.json());
|
||||
}
|
||||
|
||||
export function putSaved(name: string, data: object) {
|
||||
return authFetch(LNV_SERVER + "/saved", {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({
|
||||
name,
|
||||
data: JSON.stringify(data)
|
||||
})
|
||||
}).then(res => res.json());
|
||||
}
|
||||
|
||||
export function deleteSaved(name: string) {
|
||||
return authFetch(LNV_SERVER + "/saved", {
|
||||
method: "DELETE",
|
||||
body: JSON.stringify({
|
||||
name
|
||||
})
|
||||
}).then(res => res.text());
|
||||
}
|
||||
|
||||
export async function isSaved(data: Trip) {
|
||||
const res = await getSaved();
|
||||
console.log(res, data);
|
||||
const filtered = res.filter(s => JSON.parse(s.data).legs[0].shape == data.legs[0].shape);
|
||||
if(filtered.length == 0) return false;
|
||||
return filtered[0].name;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user