8 Commits

Author SHA1 Message Date
ca1c96b252 Docker copy all 2023-03-29 20:06:46 +02:00
d284e8184c pinned dependencies 2023-03-29 20:06:26 +02:00
701aae9ed4 Switched dockerfile over to pnpm + cache
And bumped build image to fresh node
2023-03-29 20:05:12 +02:00
7f7b743f41 🚀Bumped version to 0.1.4 2023-02-05 13:30:11 +01:00
ee6af3e069 add rst command 2023-02-05 13:29:35 +01:00
ea08127927 bullet-proof login ux 2023-02-05 13:25:22 +01:00
e0f400a800 Settings: reload on lang change 2023-02-05 13:10:53 +01:00
c485898b7d cleanup invalid track stuff (leftovers from scanclient) 2023-02-05 13:10:03 +01:00
8 changed files with 2721 additions and 76 deletions

View File

@@ -2,8 +2,18 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [0.1.4](https://git.odit.services/lfk/beamershow/compare/0.1.3...0.1.4)
- cleanup invalid track stuff (leftovers from scanclient) [`c485898`](https://git.odit.services/lfk/beamershow/commit/c485898b7db7ae09f6e405e12aa6d458833f2dcf)
- bullet-proof login ux [`ea08127`](https://git.odit.services/lfk/beamershow/commit/ea08127927e2b1ebcbcd7907fbf51a66a43da421)
- add rst command [`ee6af3e`](https://git.odit.services/lfk/beamershow/commit/ee6af3e06921ef33651076b8767149c2df3a1f2d)
- Settings: reload on lang change [`e0f400a`](https://git.odit.services/lfk/beamershow/commit/e0f400a800f2652cf3edf2ac0a5f802b65d0c460)
#### [0.1.3](https://git.odit.services/lfk/beamershow/compare/0.1.2...0.1.3) #### [0.1.3](https://git.odit.services/lfk/beamershow/compare/0.1.2...0.1.3)
> 8 April 2021
- 🚀Bumped version to 0.1.3 [`80f5c38`](https://git.odit.services/lfk/beamershow/commit/80f5c38c364c02d70a99f0e06ea9153e10438bfb)
- Fixed image name [`205e09e`](https://git.odit.services/lfk/beamershow/commit/205e09e2fc6a2a49251278a8ead31e1718ac7e44) - Fixed image name [`205e09e`](https://git.odit.services/lfk/beamershow/commit/205e09e2fc6a2a49251278a8ead31e1718ac7e44)
#### [0.1.2](https://git.odit.services/lfk/beamershow/compare/0.1.1...0.1.2) #### [0.1.2](https://git.odit.services/lfk/beamershow/compare/0.1.1...0.1.2)

View File

@@ -1,12 +1,12 @@
FROM node:15.11.0-alpine3.13 FROM registry.odit.services/hub/library/node:19.8.1-alpine3.16 as build
ARG NPM_REGISTRY_URL=https://registry.npmjs.org
WORKDIR /app WORKDIR /app
COPY . .
RUN yarn COPY . ./
RUN yarn build RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@8 && pnpm i
RUN pnpm build
# final image # final image
FROM alpine FROM registry.odit.services/library/nginx-brotli:3.15 as final
COPY --from=0 /app/dist /app COPY --from=build /app/dist /usr/share/nginx/html
FROM fholzer/nginx-brotli:v1.19.1
COPY --from=1 /app /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/nginx.conf COPY ./nginx.conf /etc/nginx/nginx.conf

View File

@@ -1,6 +1,6 @@
{ {
"name": "@lfk/beamershow", "name": "@lfk/beamershow",
"version": "0.1.3", "version": "0.1.4",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
@@ -10,20 +10,20 @@
"release": "release-it --only-version" "release": "release-it --only-version"
}, },
"devDependencies": { "devDependencies": {
"@odit/license-exporter": "^0.0.11", "@odit/license-exporter": "0.0.11",
"@svitejs/vite-plugin-svelte": "^0.11.1", "@svitejs/vite-plugin-svelte": "0.11.1",
"@tsconfig/svelte": "^1.0.10", "@tsconfig/svelte": "1.0.10",
"@types/html-minifier": "^4.0.0", "@types/html-minifier": "4.0.0",
"axios": "^0.21.1", "axios": "0.21.1",
"html-minifier": "^4.0.0", "html-minifier": "4.0.0",
"husky": "^5.1.3", "husky": "5.1.3",
"prettier": "^2.2.1", "prettier": "2.2.1",
"prettier-plugin-svelte": "^2.2.0", "prettier-plugin-svelte": "2.2.0",
"release-it": "14.5.0", "release-it": "14.5.0",
"svelte": "3.36.0", "svelte": "3.36.0",
"svelte-i18n": "3.3.9", "svelte-i18n": "3.3.9",
"svelte-preprocess": "4.7.0", "svelte-preprocess": "4.7.0",
"validator": "^13.5.2", "validator": "13.5.2",
"vite": "2.1.4", "vite": "2.1.4",
"vite-plugin-windicss": "0.11.2" "vite-plugin-windicss": "0.11.2"
}, },

2644
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -12,12 +12,10 @@
import Login from "./Login.svelte"; import Login from "./Login.svelte";
import Settings from "./Settings.svelte"; import Settings from "./Settings.svelte";
export let settings_open = false; export let settings_open = false;
$: is_configured = $: is_configured = $apikey?.length === 44 && $api_endpoint?.includes("://");
$apikey && // &&
$apikey !== "null" && // $laptime_track != 0 &&
$apikey !== "" && // $laptime_track != null;
$laptime_track != 0 &&
$laptime_track != null;
init({ init({
fallbackLocale: "en-US", fallbackLocale: "en-US",
initialLocale: $lang, initialLocale: $lang,
@@ -29,12 +27,12 @@
if (e.key === "Escape") { if (e.key === "Escape") {
modal_open = false; modal_open = false;
} }
if (e.keyCode === 13) { // if (e.keyCode === 13) {
if (createbtnenabled === true) { // if (createbtnenabled === true) {
createbtnenabled = false; // createbtnenabled = false;
submit(); // submit();
} // }
} // }
if (command === "" && e.key === "c") { if (command === "" && e.key === "c") {
command = "c"; command = "c";
} else if (command === "c" && e.key === "n") { } else if (command === "c" && e.key === "n") {

View File

@@ -1,5 +1,5 @@
<script> <script>
import { apikey, lang, api_endpoint, laptime_track } from "./store.js"; import { apikey, lang, api_endpoint, laptime_track, clear } from "./store.js";
import isURL from "validator/lib/isURL"; import isURL from "validator/lib/isURL";
import isUUID from "validator/lib/isUUID"; import isUUID from "validator/lib/isUUID";
import axios from "axios"; import axios from "axios";
@@ -10,10 +10,12 @@
$: error = false; $: error = false;
$: errormessage = ""; $: errormessage = "";
$: isTokenValid = $: isTokenValid =
token?.length === 44 && token === "rst" ||
token.split(".")[0].length === 7 && (token?.length === 44 &&
isUUID(token.split(".")[1]); token.split(".")[0].length === 7 &&
$: isEndpointValid = isURL(api_endpoint_input); isUUID(token.split(".")[1]));
$: isEndpointValid =
api_endpoint_input === "rst" || isURL(api_endpoint_input);
</script> </script>
<div class="w-full flex flex-wrap"> <div class="w-full flex flex-wrap">
@@ -62,11 +64,15 @@
</div> </div>
{/if} {/if}
{/if} {/if}
{#if $api_endpoint && !$apikey} {#if $api_endpoint?.includes("://") && (!$apikey || $apikey == null)}
<form <form
class="flex flex-col pt-3 md:pt-8" class="flex flex-col pt-3 md:pt-8"
onsubmit="event.preventDefault();" onsubmit="event.preventDefault();"
on:submit={() => { on:submit={() => {
if (token === "rst") {
clear();
return;
}
axios axios
.request({ .request({
method: "GET", method: "GET",
@@ -112,42 +118,19 @@
>{$_("configure")}</button >{$_("configure")}</button
> >
</form> </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} {:else}
<form <form
class="flex flex-col pt-3 md:pt-8" class="flex flex-col pt-3 md:pt-8"
onsubmit="event.preventDefault();" onsubmit="event.preventDefault();"
on:submit={() => { on:submit={() => {
if (api_endpoint_input === "rst") {
clear();
api_endpoint_input = "";
return;
}
if (api_endpoint_input.includes("api/")) {
api_endpoint_input = api_endpoint_input.replace("api/", "");
}
if (api_endpoint_input.substr(-1) !== "/") { if (api_endpoint_input.substr(-1) !== "/") {
api_endpoint_input = api_endpoint_input + "/"; api_endpoint_input = api_endpoint_input + "/";
} }

View File

@@ -13,14 +13,13 @@
<p class="block text-sm text-gray-700">{$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 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 text-gray-700">{$apikey}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_id")}</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> <p class="block text-sm font-bold text-gray-700 mt-2">{$_("language")}</p>
<div class="w-full"> <div class="w-full">
<div class="inline-block mr-2 mt-2"> <div class="inline-block mr-2 mt-2">
<button <button
on:click={() => { on:click={() => {
lang.set("de-DE"); lang.set("de-DE");
location.reload();
}} }}
type="button" type="button"
class:bg-blue-700={$lang === "de-DE"} class:bg-blue-700={$lang === "de-DE"}
@@ -46,6 +45,7 @@
<button <button
on:click={() => { on:click={() => {
lang.set("en-EN"); lang.set("en-EN");
location.reload();
}} }}
type="button" type="button"
class:bg-blue-700={$lang === "en-EN"} class:bg-blue-700={$lang === "en-EN"}

View File

@@ -1,29 +1,39 @@
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
const stored_api_endpoint = localStorage.getItem('api_endpoint')||""; const stored_api_endpoint = localStorage.getItem('api_endpoint');
export const api_endpoint = writable(stored_api_endpoint); export const api_endpoint = writable(stored_api_endpoint);
api_endpoint.subscribe((value) => { api_endpoint.subscribe((value) => {
localStorage.setItem('api_endpoint', value); if (value != null) {
localStorage.setItem('api_endpoint', value);
}
}); });
const stored_apikey = localStorage.getItem('apikey'); const stored_apikey = localStorage.getItem('apikey');
export const apikey = writable(stored_apikey); export const apikey = writable(stored_apikey);
apikey.subscribe((value) => { apikey.subscribe((value) => {
localStorage.setItem('apikey', value); if (value != null) {
localStorage.setItem('apikey', value);
}
}); });
const stored_laptime_track = localStorage.getItem('laptime_track'); const stored_laptime_track = localStorage.getItem('laptime_track');
export const laptime_track = writable(stored_laptime_track); export const laptime_track = writable(stored_laptime_track);
laptime_track.subscribe((value) => { laptime_track.subscribe((value) => {
localStorage.setItem('laptime_track', value); if (value != null) {
localStorage.setItem('laptime_track', value);
}
}); });
const stored_lang = localStorage.getItem('lang') === 'null' ? navigator.language : localStorage.getItem('lang'); const stored_lang = localStorage.getItem('lang') === 'null' ? navigator.language : localStorage.getItem('lang');
export const lang = writable(stored_lang); export const lang = writable(stored_lang);
lang.subscribe((value) => { lang.subscribe((value) => {
localStorage.setItem('lang', value); if (value != null) {
localStorage.setItem('lang', value);
}
}); });
export function clear(){ export function clear() {
api_endpoint.set(null) api_endpoint.set(null)
api_endpoint.set("")
apikey.set(null); apikey.set(null);
apikey.set("");
laptime_track.set(null) laptime_track.set(null)
localStorage.clear(); localStorage.clear();
} }