17 Commits

Author SHA1 Message Date
9125dec45b 🚀Bumped version to 0.1.2 2021-04-08 17:34:52 +02:00
94ceca9454 🚀Bumped version to 0.1.1 2021-04-07 20:57:48 +02:00
2119e9b231 Merge branch 'main' of git.odit.services:lfk/beamershow into main
# Conflicts:
#	package.json
2021-04-07 20:57:00 +02:00
cfd64c2f19 Updated release-it config 2021-04-07 20:56:51 +02:00
a7e84c7d42 Updated release-it config 2021-04-07 20:56:21 +02:00
70bfbfcd53 Sorted translations 🌍
closes #1
2021-04-07 20:53:21 +02:00
c5e4facffa i18n run 2021-04-07 20:52:55 +02:00
b36764869b Added/updated settings translations 2021-04-07 20:46:29 +02:00
de7e96cd01 Implemented settings dialog 2021-04-07 20:44:24 +02:00
d5ce648a53 CNF now opens settings 2021-04-07 20:43:53 +02:00
fca7a99689 Formatting 2021-04-07 20:38:10 +02:00
cb559da57c removed unused stuff from the store
ref #1
2021-04-07 20:37:59 +02:00
abdc510305 Added track to config
ref #1
2021-04-07 20:35:46 +02:00
fe0cba9058 removed useless console log 2021-04-07 20:12:28 +02:00
64ce42d8a0 Added url validation fix 2021-04-07 19:58:52 +02:00
fdabe4b79c Merge branch 'main' of git.odit.services:lfk/beamershow into main 2021-04-07 19:49:23 +02:00
70e5f172a6 Added missing let
ref #1
2021-04-07 19:49:21 +02:00
10 changed files with 207 additions and 128 deletions

View File

@@ -1,4 +1,5 @@
{
"i18n-ally.localesPaths": "src/locales",
"i18n-ally.keystyle": "nested"
"i18n-ally.keystyle": "nested",
"i18n-ally.sourceLanguage": "de"
}

43
CHANGELOG.md Normal file
View File

@@ -0,0 +1,43 @@
### Changelog
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [0.1.2](https://git.odit.services/lfk/beamershow/compare/0.1.1...0.1.2)
#### 0.1.1
> 7 April 2021
- Sorted translations 🌍 [`#1`](https://git.odit.services/lfk/beamershow/issues/1)
- 🎉 initial commit [`b902b08`](https://git.odit.services/lfk/beamershow/commit/b902b081d7e2e80fdf167657f3c2fda79b888985)
- formatting... [`866436f`](https://git.odit.services/lfk/beamershow/commit/866436fa82882dffe6f2f45bd303effc67d92a37)
- Added/updated settings translations [`b367648`](https://git.odit.services/lfk/beamershow/commit/b36764869bf1e302713d457b3ba3ec804c5d38f7)
- 🚀Bumped version to 0.1.1 [`94ceca9`](https://git.odit.services/lfk/beamershow/commit/94ceca9454da77d29f975cf894d2304dcc60c481)
- i18n run [`c5e4fac`](https://git.odit.services/lfk/beamershow/commit/c5e4facffa19578db95315d53bd0befc936016e4)
- Added drone file for dev and tag build [`d809dcb`](https://git.odit.services/lfk/beamershow/commit/d809dcba799a94c6ed5a6cfac551d14c1a2cbadd)
- You can now go back to config by typeing cnf [`9135090`](https://git.odit.services/lfk/beamershow/commit/9135090e73ff6fc021b4f7f80b3780b3ff73ad02)
- Added top teams by distance page [`d78e896`](https://git.odit.services/lfk/beamershow/commit/d78e896fecf5f7975267f3a1c3faf8b5c8728c25)
- Added nginx conf for dockerfile [`b3b06bc`](https://git.odit.services/lfk/beamershow/commit/b3b06bc30e4043d3f7b874e939a090f85841a516)
- Implemented fix for url crashing [`7f6134d`](https://git.odit.services/lfk/beamershow/commit/7f6134d0efd1a6a1161acc2c8bc8c4496c529ffe)
- Added html/template for the top runenry by laptime [`3275ae2`](https://git.odit.services/lfk/beamershow/commit/3275ae2609ef966183ca66a0234ff7f570eaef81)
- Added release comand and config [`ca48959`](https://git.odit.services/lfk/beamershow/commit/ca489595812da8756629a498d673e3206cb66a2f)
- Added track to config [`abdc510`](https://git.odit.services/lfk/beamershow/commit/abdc5103055844da73438e8dfbb0eea2b41105d1)
- removed unused stuff from the store [`cb559da`](https://git.odit.services/lfk/beamershow/commit/cb559da57c58a1998f54beb83bee837e0a8b71e7)
- Implemented settings dialog [`de7e96c`](https://git.odit.services/lfk/beamershow/commit/de7e96cd01f70bfff80f42e7c709e67d44681920)
- Added js part of runners by laptime [`10b862d`](https://git.odit.services/lfk/beamershow/commit/10b862d43ac35122c1cc4eaed30e7ac8228d294f)
- User quickstart docs README [`19cc7d0`](https://git.odit.services/lfk/beamershow/commit/19cc7d0c28ff56481fc37cc98b341259566a39ed)
- Removed license export from drone pipelines [`e5c51b9`](https://git.odit.services/lfk/beamershow/commit/e5c51b956e210f3f4652f020edefb0de5bb789d9)
- Formatting [`fca7a99`](https://git.odit.services/lfk/beamershow/commit/fca7a99689469f8a8b281f643346b3281036ee40)
- added svelte transitions [`1f95b8b`](https://git.odit.services/lfk/beamershow/commit/1f95b8ba53e3152517d730ad6b3b39dc472bb386)
- Added 2-staged dockerfile [`c83ff39`](https://git.odit.services/lfk/beamershow/commit/c83ff39677c4575346a0b7eced95796de90d6fee)
- Precommit hooks doing their best to not die [`85b40c1`](https://git.odit.services/lfk/beamershow/commit/85b40c10bffa15ad381e51fee348bb014780d5d8)
- Renamed Firma -> Organsiation [`3e7b120`](https://git.odit.services/lfk/beamershow/commit/3e7b1201e25da7dcc2f6be2b4b826b90d616dd67)
- Added beamershow docker-compose [`b42684f`](https://git.odit.services/lfk/beamershow/commit/b42684f7fc8e40740a6511d895af03f7f110e2a4)
- Updated release-it config [`cfd64c2`](https://git.odit.services/lfk/beamershow/commit/cfd64c2f19dabd8aa758aefd02342935c54e20de)
- Renamed Firma -Y Organsiation [`662e31b`](https://git.odit.services/lfk/beamershow/commit/662e31b36674f66696a4a4bc3ca4abae3efd93bb)
- CNF now opens settings [`d5ce648`](https://git.odit.services/lfk/beamershow/commit/d5ce648a53bb70a1c4ad7f2b12c334e328e36448)
- Added missing let [`70e5f17`](https://git.odit.services/lfk/beamershow/commit/70e5f172a66dcad64353f8469ebb845a1b4895bb)
- Added missing let [`fa35ac8`](https://git.odit.services/lfk/beamershow/commit/fa35ac8254028570bd3e425276a008fe83887f09)
- Updated release-it config [`a7e84c7`](https://git.odit.services/lfk/beamershow/commit/a7e84c7d426525a5041f0ec260cd57dcfd107afb)
- Added url validation fix [`64ce42d`](https://git.odit.services/lfk/beamershow/commit/64ce42d8a04cc4b149db7f75be5ff0d9fbfb3a75)
- removed useless console log [`fe0cba9`](https://git.odit.services/lfk/beamershow/commit/fe0cba9058a1874058618ef3b697093fcfc78a99)

View File

@@ -1,6 +1,6 @@
{
"name": "@lfk/beamershow",
"version": "0.0.0",
"version": "0.1.2",
"scripts": {
"dev": "vite",
"build": "vite build",
@@ -31,18 +31,18 @@
"git": {
"commit": true,
"requireCleanWorkingDir": false,
"commitMessage": "🚀Bumped version to v${version}",
"requireBranch": "dev",
"commitMessage": "🚀Bumped version to ${version}",
"requireBranch": "main",
"push": false,
"tag": true,
"tagName": null,
"tagAnnotation": "v${version}"
"tagAnnotation": "${version}"
},
"npm": {
"publish": false
},
"hooks": {
"after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node order_i18n.js && git add src/locales"
"after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node order.js && git add src/locales"
}
}
}

View File

@@ -1,5 +1,5 @@
<script>
import { apikey, api_endpoint, lang, page, clear } from "./store.js";
import { apikey, api_endpoint, lang, clear, laptime_track } from "./store.js";
import { addMessages, init } from "svelte-i18n";
import en from "./locales/en.json";
import de from "./locales/de.json";
@@ -11,8 +11,13 @@
import Beamershow from "./Beamershow.svelte";
import Login from "./Login.svelte";
import Settings from "./Settings.svelte";
$: is_configured = $apikey && $apikey !== "null" && $apikey !== "";
$: settings_open = $page === "settings";
export let settings_open = false;
$: is_configured =
$apikey &&
$apikey !== "null" &&
$apikey !== "" &&
$laptime_track != 0 &&
$laptime_track != null;
init({
fallbackLocale: "en-US",
initialLocale: $lang,
@@ -35,9 +40,7 @@
} else if (command === "c" && e.key === "n") {
command += "n";
} else if (command === "cn" && e.key === "f") {
clear();
settings_open = true;
is_configured = true;
command = "";
} else {
command = "";
@@ -48,7 +51,7 @@
</script>
{#if settings_open && is_configured}
<Settings />
<Settings bind:settings_open />
{:else if is_configured}
<Beamershow />
{:else}

View File

@@ -1,8 +1,8 @@
<script>
import axios from "axios";
import { _ } from "svelte-i18n";
import { fade, slide } from "svelte/transition";
import { apikey, api_endpoint, page, stationinfo } from "./store.js";
import { slide } from "svelte/transition";
import { apikey, api_endpoint, laptime_track } from "./store.js";
function init(el) {
el.focus();
}
@@ -16,6 +16,7 @@
$: current_page = "general";
$: general = {};
$: runners = [];
$: runners_by_laptime = [];
$: orgs = [];
$: teams = [];
@@ -72,7 +73,8 @@
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/runners/laptime",
url:
$api_endpoint + "api/stats/runners/laptime?track=" + $laptime_track,
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
@@ -151,7 +153,7 @@
{general.total_runners}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
Läufer
{$_("laeufer")}
</h1>
</div>
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
@@ -159,7 +161,7 @@
{general.total_distance}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
Kilometer gesamt
{$_("kilometer-gesamt")}
</h1>
</div>
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
@@ -167,7 +169,7 @@
{general.total_donation}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
Spendensumme
{$_("spendensumme")}
</h1>
</div>
</div>
@@ -175,7 +177,7 @@
{:else if current_page === "runners_distance"}
<div transition:slide|local>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
Top-Läufer (Distanz)
{$_("top-laeufer")} ({$_("distanz")})
</h1>
<table class="table p-4 bg-white shadow rounded-lg w-full">
<thead>
@@ -183,22 +185,22 @@
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Platz
{$_("platz")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Läufer
{$_("laeufer")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Organisation
{$_("organisation")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Kilometer
{$_("kilometer")}
</th>
</tr>
</thead>
@@ -226,7 +228,7 @@
{:else if current_page === "runners_laptime"}
<div transition:slide|local>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
Top-Läufer (Rundenzeit)
{$_("top-laeufer")} ({$_("rundenzeit")})
</h1>
<table class="table p-4 bg-white shadow rounded-lg w-full">
<thead>
@@ -234,22 +236,22 @@
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Platz
{$_("platz")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Läufer
{$_("laeufer")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Organisation
{$_("organisation")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Schnellste Rundenzeit
{$_("schnellste-rundenzeit")}
</th>
</tr>
</thead>
@@ -277,7 +279,7 @@
{:else if current_page === "orgs_distance"}
<div transition:slide|local>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
Top-Organsiationen
{$_("top-organsiationen")}
</h1>
<table class="table p-4 bg-white shadow rounded-lg w-full">
<thead>
@@ -285,17 +287,17 @@
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Platz
{$_("platz")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Organsiation
{$_("organsiation")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Kilometer
{$_("kilometer")}
</th>
</tr>
</thead>
@@ -319,7 +321,7 @@
{:else if current_page === "teams_distance"}
<div transition:slide|local>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
Top-Teams
{$_("top-teams")}
</h1>
<table class="table p-4 bg-white shadow rounded-lg w-full">
<thead>
@@ -327,17 +329,17 @@
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Platz
{$_("platz")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Team
{$_("team")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
Kilometer
{$_("kilometer")}
</th>
</tr>
</thead>

View File

@@ -1,11 +1,12 @@
<script>
import { apikey, lang, stationinfo, api_endpoint } from "./store.js";
import { apikey, lang, api_endpoint, laptime_track } from "./store.js";
import isURL from "validator/lib/isURL";
import isUUID from "validator/lib/isUUID";
import axios from "axios";
import { _, locale } from "svelte-i18n";
let token;
let api_endpoint_input;
let api_endpoint_input = "";
let track;
$: error = false;
$: errormessage = "";
$: isTokenValid =
@@ -61,13 +62,11 @@
</div>
{/if}
{/if}
{#if $api_endpoint}
{#if $api_endpoint && !$apikey}
<form
class="flex flex-col pt-3 md:pt-8"
onsubmit="event.preventDefault();"
on:submit={() => {
console.log({ token });
// return
axios
.request({
method: "GET",
@@ -78,7 +77,6 @@
error = false;
errormessage = "";
apikey.set(token);
stationinfo.set(JSON.stringify(response.data));
})
.catch(function (e) {
error = true;
@@ -114,6 +112,37 @@
>{$_("configure")}</button
>
</form>
{:else if $api_endpoint && $apikey}
<form
class="flex flex-col pt-3 md:pt-8"
onsubmit="event.preventDefault();"
on:submit={() => {
laptime_track.set(track);
}}
>
<div class="flex flex-col pt-4">
<label for="track" class="text-lg">{$_("track_id")}</label>
<input
type="number"
id="track"
placeholder="Track"
bind:value={track}
class:border-red-500={!isTokenValid}
class:border-solid={!isTokenValid}
class:border-3={!isTokenValid}
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mt-1 leading-tight focus:outline-none focus:shadow-outline"
/>
</div>
<button
disabled={!track}
class:cursor-pointer={track}
class:opacity-50={!track}
id="configure"
type="submit"
class="bg-black text-white font-bold text-lg hover:bg-gray-700 p-2 mt-8 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
>{$_("configure")}</button
>
</form>
{:else}
<form
class="flex flex-col pt-3 md:pt-8"

View File

@@ -1,7 +1,7 @@
<script>
import { _ } from "svelte-i18n";
import { apikey, api_endpoint, lang, page, stationinfo } from "./store.js";
import { apikey, api_endpoint, lang, laptime_track, clear } from "./store.js";
export let settings_open = false;
</script>
<div class="p-5 min-h-screen">
@@ -9,34 +9,12 @@
Lauf Für Kaya! Beamershow
</h1>
<h1 class="text-3xl w-full text-center text-gray-900">{$_("settings")}</h1>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("api_endpoint")}</p>
<p class="block text-sm text-gray-700">{$api_endpoint}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("api_key")}</p>
<p class="block text-sm text-gray-700">{$apikey}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">
{$_("station_description")}
</p>
<p class="block text-sm text-gray-700">
{JSON.parse($stationinfo).description}
</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("station_id")}</p>
<p class="block text-sm text-gray-700">{JSON.parse($stationinfo).id}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_id")}</p>
<p class="block text-sm text-gray-700">{JSON.parse($stationinfo).track.id}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_name")}</p>
<p class="block text-sm text-gray-700">
{JSON.parse($stationinfo).track.name}
</p>
<p class="block text-sm font-bold text-gray-700 mt-2">
{$_("track_distance")}
</p>
<p class="block text-sm text-gray-700">
{JSON.parse($stationinfo).track.distance}
</p>
<p class="block text-sm font-bold text-gray-700 mt-2">
{$_("minimum_lap_time")}
</p>
<p class="block text-sm text-gray-700">
{JSON.parse($stationinfo).track.minimumLapTime}s
</p>
<p class="block text-sm text-gray-700">{$laptime_track}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("language")}</p>
<div class="w-full">
<div class="inline-block mr-2 mt-2">
@@ -95,16 +73,15 @@
<br />
<button
on:click={() => {
page.set("");
settings_open = false;
}}
class="mb-3 w-full py-3 border-black border-3 text-black focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
>{$_("back_to_scanner")}</button
>
<button
on:click={() => {
apikey.set("");
api_endpoint.set("");
page.set("");
clear();
settings_open = false;
}}
class="w-full py-3 bg-black text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
>{$_("log_out_from_this_client")}</button

View File

@@ -1,27 +1,41 @@
{
"api_endpoint": "API-Endpunkt",
"api_key": "API Key",
"back_to_scanner": "Zurück zum Scanner",
"back_to_scanner": "Zurück zur Beamershow",
"client_token": "Client Token",
"configuration": "Konfiguration",
"configure": "Konfigurieren",
"distanz": "Distanz",
"error": "Error!",
"kilometer": "Kilometer",
"kilometer-gesamt": "Kilometer gesamt",
"laeufer": "Läufer",
"language": "Sprache",
"log_out_from_this_client": "Von diesem Scanner abmelden",
"log_out_from_this_client": "Von dieser Beamershow abmelden",
"minimum_lap_time": "minimale Rundenzeit",
"organisation": "Organisation",
"organsiation": "Organsiation",
"platz": "Platz",
"please_check_your_token_and_try_again": "Bitte überprüfe den Token und versuche es erneut...",
"please_provide_a_valid_client_api_endpoint": "Bitte gebe einen gültigen API-Endpunkt an ...",
"please_provide_a_valid_client_token": "Bitte gebe einen gültigen Client-Token an ...",
"please_provide_the_scan_client_token": "Bitte gebe den Beamershow-Client-Token an.",
"please_scan_a_card": "Bitte scanne eine Karte ...",
"rundenzeit": "Rundenzeit",
"runner_card": "Läuferkarte",
"scan": "Scannen!",
"schnellste-rundenzeit": "Schnellste Rundenzeit",
"see_our_configuration_guide": "Siehe dir unsere Konfigurationsanleitung an.",
"settings": "Einstellungen",
"spendensumme": "Spendensumme",
"station_description": "Beschreibung der Scanstation",
"station_id": "Scanstations-ID",
"team": "Team",
"the_provided_scan_station_is_disabled": "Die angegebene Scanstation ist deaktiviert.",
"the_provided_scan_station_token_is_invalid": "Der angegebene Scanstation-Token ist ungültig.",
"top-laeufer": "Top-Läufer",
"top-organsiationen": "Top-Organsiationen",
"top-teams": "Top-Teams",
"track_distance": "Länge des Tracks",
"track_id": "Track ID",
"track_name": "Track Name"

View File

@@ -1,27 +1,41 @@
{
"api_endpoint": "API Endpoint",
"api_key": "API Key",
"back_to_scanner": "Back to Scanner",
"back_to_scanner": "Back to Beamershow",
"client_token": "Client Token",
"configuration": "Configuration",
"configure": "Configure",
"distanz": "distance",
"error": "Error!",
"kilometer": "Kilometers",
"kilometer-gesamt": "Kilometers total",
"laeufer": "Runners",
"language": "Language",
"log_out_from_this_client": "Log Out from this Client",
"minimum_lap_time": "minimum lap time",
"organisation": "Organization",
"organsiation": "Organization",
"platz": "Place",
"please_check_your_token_and_try_again": "Please check your token and try again...",
"please_provide_a_valid_client_api_endpoint": "Please provide a valid api endpoint...",
"please_provide_a_valid_client_token": "Please provide a valid client token...",
"please_provide_the_scan_client_token": "Please provide the scan client token.",
"please_scan_a_card": "please scan a card...",
"rundenzeit": "fastetst lap",
"runner_card": "Runner Card",
"scan": "Scan!",
"schnellste-rundenzeit": "Fastest lap",
"see_our_configuration_guide": "See our configuration guide.",
"settings": "Settings",
"spendensumme": "Donations",
"station_description": "Station Description",
"station_id": "Scanstation ID",
"team": "Team",
"the_provided_scan_station_is_disabled": "The provided scan station is disabled.",
"the_provided_scan_station_token_is_invalid": "The provided scan station token is invalid.",
"top-laeufer": "Top runners",
"top-organsiationen": "Top organizations",
"top-teams": "Top teams",
"track_distance": "Track Distance",
"track_id": "Track ID",
"track_name": "Track Name"

View File

@@ -10,15 +10,10 @@ export const apikey = writable(stored_apikey);
apikey.subscribe((value) => {
localStorage.setItem('apikey', value);
});
const stored_stationinfo = localStorage.getItem('stationinfo');
export const stationinfo = writable(stored_stationinfo);
stationinfo.subscribe((value) => {
localStorage.setItem('stationinfo', value);
});
const stored_page = localStorage.getItem('page');
export const page = writable(stored_page);
page.subscribe((value) => {
localStorage.setItem('page', value);
const stored_laptime_track = localStorage.getItem('laptime_track');
export const laptime_track = writable(stored_laptime_track);
laptime_track.subscribe((value) => {
localStorage.setItem('laptime_track', value);
});
const stored_lang = localStorage.getItem('lang') === 'null' ? navigator.language : localStorage.getItem('lang');
export const lang = writable(stored_lang);
@@ -29,5 +24,6 @@ lang.subscribe((value) => {
export function clear(){
api_endpoint.set(null)
apikey.set(null);
laptime_track.set(null)
localStorage.clear();
}