| @@ -1,5 +1,5 @@ | ||||
| <script> | ||||
|   console.log("app started with base url " + config.endpoint); | ||||
|   import { apikey, api_endpoint, lang, page } from "./store.js"; | ||||
|   import { addMessages, init } from "svelte-i18n"; | ||||
|   import en from "./locales/en.json"; | ||||
|   import de from "./locales/de.json"; | ||||
| @@ -11,13 +11,13 @@ | ||||
|   import Scanner from "./Scanner.svelte"; | ||||
|   import Login from "./Login.svelte"; | ||||
|   import Settings from "./Settings.svelte"; | ||||
|   import { apikey, lang, page } from "./store.js"; | ||||
|   $: is_configured = $apikey && $apikey !== "null" && $apikey !== ""; | ||||
|   $: settings_open = $page === "settings"; | ||||
|   init({ | ||||
|     fallbackLocale: "en-US", | ||||
|     initialLocale: $lang, | ||||
|   }); | ||||
|   console.log("app started with base url " + $api_endpoint); | ||||
| </script> | ||||
|  | ||||
| {#if settings_open && is_configured} | ||||
|   | ||||
							
								
								
									
										156
									
								
								src/Login.svelte
									
									
									
									
									
								
							
							
						
						
									
										156
									
								
								src/Login.svelte
									
									
									
									
									
								
							| @@ -1,16 +1,27 @@ | ||||
| <script> | ||||
|   import { apikey, lang, stationinfo } from "./store.js"; | ||||
|   import { apikey, lang, stationinfo, api_endpoint } from "./store.js"; | ||||
|   import axios from "axios"; | ||||
|   import { _, locale } from "svelte-i18n"; | ||||
|   let token; | ||||
|   let api_endpoint_input; | ||||
|   $: error = false; | ||||
|   $: errormessage = ""; | ||||
|   $: isTokenValid = | ||||
|     token?.length === 44 && | ||||
|     token.split(".")[0].length === 7 && | ||||
|     isUUID(token.split(".")[1]); | ||||
|   function isLocale(l) { | ||||
|     return $locale == l; | ||||
|   $: isEndpointValid = validURL(api_endpoint_input); | ||||
|   function validURL(str) { | ||||
|     var pattern = new RegExp( | ||||
|       "^(https?:\\/\\/)?" + // protocol | ||||
|         "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name | ||||
|         "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address | ||||
|         "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path | ||||
|         "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string | ||||
|         "(\\#[-a-z\\d_]*)?$", | ||||
|       "i" | ||||
|     ); // fragment locator | ||||
|     return !!pattern.test(str); | ||||
|   } | ||||
|   function isUUID(uuid) { | ||||
|     let s = "" + uuid; | ||||
| @@ -71,57 +82,96 @@ | ||||
|           </div> | ||||
|         {/if} | ||||
|       {/if} | ||||
|  | ||||
|       <form | ||||
|         class="flex flex-col pt-3 md:pt-8" | ||||
|         onsubmit="event.preventDefault();" | ||||
|         on:submit={() => { | ||||
|           axios | ||||
|             .request({ | ||||
|               method: "GET", | ||||
|               url: config.endpoint + "api/stations/me", | ||||
|               headers: { Authorization: "Bearer " + token }, | ||||
|             }) | ||||
|             .then(function (response) { | ||||
|               error = false; | ||||
|               errormessage = ""; | ||||
|               apikey.set(token); | ||||
|               stationinfo.set(JSON.stringify(response.data)); | ||||
|             }) | ||||
|             .catch(function (e) { | ||||
|               error = true; | ||||
|               errormessage = e.response.data.short; | ||||
|             }); | ||||
|         }} | ||||
|       > | ||||
|         <div class="flex flex-col pt-4"> | ||||
|           <label for="token" class="text-lg">{$_("client_token")}</label> | ||||
|           <input | ||||
|             type="text" | ||||
|             id="token" | ||||
|             placeholder={$_("client_token")} | ||||
|             bind:value={token} | ||||
|             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> | ||||
|         {#if !isTokenValid} | ||||
|           <span class="text-sm" | ||||
|             >{$_("please_provide_a_valid_client_token")}</span | ||||
|           > | ||||
|         {/if} | ||||
|         <button | ||||
|           disabled={!isTokenValid} | ||||
|           class:cursor-pointer={isTokenValid} | ||||
|           class:opacity-50={!isTokenValid} | ||||
|           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 | ||||
|       {#if $api_endpoint} | ||||
|         <form | ||||
|           class="flex flex-col pt-3 md:pt-8" | ||||
|           onsubmit="event.preventDefault();" | ||||
|           on:submit={() => { | ||||
|             axios | ||||
|               .request({ | ||||
|                 method: "GET", | ||||
|                 url: $api_endpoint + "api/stations/me", | ||||
|                 headers: { Authorization: "Bearer " + token }, | ||||
|               }) | ||||
|               .then(function (response) { | ||||
|                 error = false; | ||||
|                 errormessage = ""; | ||||
|                 apikey.set(token); | ||||
|                 stationinfo.set(JSON.stringify(response.data)); | ||||
|               }) | ||||
|               .catch(function (e) { | ||||
|                 error = true; | ||||
|                 errormessage = e.response.data.short; | ||||
|               }); | ||||
|           }} | ||||
|         > | ||||
|       </form> | ||||
|           <div class="flex flex-col pt-4"> | ||||
|             <label for="token" class="text-lg">{$_("client_token")}</label> | ||||
|             <input | ||||
|               type="text" | ||||
|               id="token" | ||||
|               placeholder={$_("client_token")} | ||||
|               bind:value={token} | ||||
|               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> | ||||
|           {#if !isTokenValid} | ||||
|             <span class="text-sm" | ||||
|               >{$_("please_provide_a_valid_client_token")}</span | ||||
|             > | ||||
|           {/if} | ||||
|           <button | ||||
|             disabled={!isTokenValid} | ||||
|             class:cursor-pointer={isTokenValid} | ||||
|             class:opacity-50={!isTokenValid} | ||||
|             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" | ||||
|           onsubmit="event.preventDefault();" | ||||
|           on:submit={() => { | ||||
|             api_endpoint.set(api_endpoint_input); | ||||
|           }} | ||||
|         > | ||||
|           <div class="flex flex-col pt-4"> | ||||
|             <label for="api_endpoint" class="text-lg" | ||||
|               >{$_("api_endpoint")}</label | ||||
|             > | ||||
|             <input | ||||
|               type="text" | ||||
|               id="api_endpoint" | ||||
|               placeholder={$_("api_endpoint")} | ||||
|               bind:value={api_endpoint_input} | ||||
|               class:border-red-500={!isEndpointValid} | ||||
|               class:border-solid={!isEndpointValid} | ||||
|               class:border-3={!isEndpointValid} | ||||
|               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> | ||||
|           {#if !isEndpointValid} | ||||
|             <span class="text-sm" | ||||
|               >{$_("please_provide_a_valid_client_api_endpoint")}</span | ||||
|             > | ||||
|           {/if} | ||||
|           <button | ||||
|             disabled={!isEndpointValid} | ||||
|             class:cursor-pointer={isEndpointValid} | ||||
|             class:opacity-50={!isEndpointValid} | ||||
|             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> | ||||
|       {/if} | ||||
|       <div class="text-center pt-12 pb-12"> | ||||
|         <p> | ||||
|           <svg | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <script> | ||||
|   import axios from "axios"; | ||||
|   import { _ } from "svelte-i18n"; | ||||
|   import { apikey, page, stationinfo } from "./store.js"; | ||||
|   import { apikey, api_endpoint, page, stationinfo } from "./store.js"; | ||||
|   function init(el) { | ||||
|     el.focus(); | ||||
|   } | ||||
| @@ -64,7 +64,7 @@ | ||||
|             axios | ||||
|               .request({ | ||||
|                 method: "POST", | ||||
|                 url: config.endpoint + "api/scans/trackscans", | ||||
|                 url: $api_endpoint + "api/scans/trackscans", | ||||
|                 headers: { Authorization: "Bearer " + $apikey }, | ||||
|                 data: { card }, | ||||
|               }) | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <script> | ||||
|   import { _ } from "svelte-i18n"; | ||||
|  | ||||
|   import { apikey, lang, page, stationinfo } from "./store.js"; | ||||
|   import { apikey, api_endpoint, lang, page, stationinfo } from "./store.js"; | ||||
| </script> | ||||
|  | ||||
| <div class="p-5 min-h-screen"> | ||||
| @@ -103,6 +103,7 @@ | ||||
|   <button | ||||
|     on:click={() => { | ||||
|       apikey.set(""); | ||||
|       api_endpoint.set(""); | ||||
|       page.set(""); | ||||
|     }} | ||||
|     class="w-full py-3 bg-black text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black" | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| { | ||||
|     "api_endpoint": "API-Endpunkt", | ||||
|     "api_key": "API Key", | ||||
|     "back_to_scanner": "Zurück zum Scanner", | ||||
|     "client_token": "Client Token", | ||||
| @@ -9,6 +10,7 @@ | ||||
|     "log_out_from_this_client": "Von diesem Scanner abmelden", | ||||
|     "minimum_lap_time": "minimale Rundenzeit", | ||||
|     "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 Scan-Client-Token an.", | ||||
|     "please_scan_a_card": "Bitte scanne eine Karte ...", | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| { | ||||
|     "api_endpoint": "API Endpoint", | ||||
|     "api_key": "API Key", | ||||
|     "back_to_scanner": "Back to Scanner", | ||||
|     "client_token": "Client Token", | ||||
| @@ -9,6 +10,7 @@ | ||||
|     "log_out_from_this_client": "Log Out from this Client", | ||||
|     "minimum_lap_time": "minimum lap time", | ||||
|     "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...", | ||||
|   | ||||
| @@ -1,5 +1,10 @@ | ||||
| import { writable } from 'svelte/store'; | ||||
|  | ||||
| const stored_api_endpoint = localStorage.getItem('api_endpoint')||""; | ||||
| export const api_endpoint = writable(stored_api_endpoint); | ||||
| api_endpoint.subscribe((value) => { | ||||
| 	localStorage.setItem('api_endpoint', value); | ||||
| }); | ||||
| const stored_apikey = localStorage.getItem('apikey'); | ||||
| export const apikey = writable(stored_apikey); | ||||
| apikey.subscribe((value) => { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user