diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index da64930..f6899f2 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -39,6 +39,7 @@ jobs: submodules: recursive - uses: actions/setup-node@v4 with: + token: ${{ secrets.GH_TOKEN }} node-version: lts/* cache: yarn cache-dependency-path: '**/yarn.lock' @@ -49,9 +50,6 @@ jobs: ~/node_modules ~/.cache/ms-playwright key: ${{ runner.os }}-pio-playwright-${{ hashFiles('**/yarn.lock') }} - - uses: actions/setup-python@v5 - with: - python-version: '>=3.10' - name: Get current date id: dateAndTime run: echo "dateAndTime=$(date +'%Y-%m-%d-%H:%M')" >> $GITHUB_OUTPUT @@ -120,7 +118,7 @@ jobs: output/littlefs.bin - name: Create release if: github.event_name == 'push' && github.ref == 'refs/heads/main' - uses: https://code.forgejo.org/actions/forgejo-release@v2.5.1 + uses: https://code.forgejo.org/actions/forgejo-release@v2.6.0 with: url: 'https://git.btclock.dev/' repo: '${{ github.repository }}' diff --git a/package.json b/package.json index f2bd1b0..8596a5c 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,5 @@ "es5-ext": ">=0.10.64", "ws": ">=8.18.0", "micromatch": ">=4.0.8" - }, - "packageManager": "yarn@1.22.21+sha1.1959a18351b811cdeedbd484a8f86c3cc3bbaf72" + } } diff --git a/patches/@sveltejs+kit+2.15.0+001+initial.patch b/patches/@sveltejs+kit+2.16.0+001+initial.patch similarity index 52% rename from patches/@sveltejs+kit+2.15.0+001+initial.patch rename to patches/@sveltejs+kit+2.16.0+001+initial.patch index 0f933b2..7fb98b1 100644 --- a/patches/@sveltejs+kit+2.15.0+001+initial.patch +++ b/patches/@sveltejs+kit+2.16.0+001+initial.patch @@ -1,30 +1,17 @@ diff --git a/node_modules/@sveltejs/kit/src/exports/vite/index.js b/node_modules/@sveltejs/kit/src/exports/vite/index.js -index 21bc3d4..eef2db3 100644 +index ddbe746..1d926a4 100644 --- a/node_modules/@sveltejs/kit/src/exports/vite/index.js +++ b/node_modules/@sveltejs/kit/src/exports/vite/index.js -@@ -648,9 +648,9 @@ async function kit({ svelte_config }) { +@@ -658,9 +658,9 @@ async function kit({ svelte_config }) { output: { format: inline ? 'iife' : 'esm', name: `__sveltekit_${version_hash}.app`, - entryFileNames: ssr ? '[name].js' : `${prefix}/[name].[hash].${ext}`, -- chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[name].[hash].${ext}`, +- chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[hash].${ext}`, - assetFileNames: `${prefix}/assets/[name].[hash][extname]`, + entryFileNames: ssr ? '[name].js' : `${prefix}/[hash].${ext}`, -+ chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[hash].${ext}`, -+ assetFileNames: `${prefix}/assets/[hash][extname]`, ++ chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/c[hash].${ext}`, ++ assetFileNames: `${prefix}/a[hash][extname]`, hoistTransitiveImports: false, sourcemapIgnoreList, manualChunks: split ? undefined : () => 'bundle', -@@ -665,9 +665,9 @@ async function kit({ svelte_config }) { - worker: { - rollupOptions: { - output: { -- entryFileNames: `${prefix}/workers/[name]-[hash].js`, -- chunkFileNames: `${prefix}/workers/chunks/[name]-[hash].js`, -- assetFileNames: `${prefix}/workers/assets/[name]-[hash][extname]`, -+ entryFileNames: `${prefix}/workers/[hash].js`, -+ chunkFileNames: `${prefix}/workers/chunks/[hash].js`, -+ assetFileNames: `${prefix}/workers/assets/[hash][extname]`, - hoistTransitiveImports: false - } - } diff --git a/src/lib/components/SettingsInput.svelte b/src/lib/components/SettingsInput.svelte index a298ba1..01738e6 100644 --- a/src/lib/components/SettingsInput.svelte +++ b/src/lib/components/SettingsInput.svelte @@ -25,10 +25,10 @@ export let invalid: boolean | undefined = undefined; export let minlength: string | undefined = undefined; export let onChange: (() => void) | undefined = undefined; - export let onInput: (() => void) | undefined = undefined; + export let onInput: ((e: Event) => void) | undefined = undefined; - const onInputHandler = () => { - onInput?.(); + const onInputHandler = (e: Event) => { + onInput?.(e); }; diff --git a/src/lib/components/settings/DisplaySettings.svelte b/src/lib/components/settings/DisplaySettings.svelte index 7981688..0edaad0 100644 --- a/src/lib/components/settings/DisplaySettings.svelte +++ b/src/lib/components/settings/DisplaySettings.svelte @@ -33,6 +33,8 @@ : font.charAt(0).toUpperCase() + font.slice(1), font ]); + + let timePerScreen = $settings.timePerScreen; @@ -61,7 +63,8 @@ ($settings.timePerScreen = Number(e.target.value))} type="number" min={1} step={1} @@ -69,7 +72,6 @@ suffix={$_('time.minutes')} size={$uiSettings.inputSize} /> - - + {#if $settings.hasLightLevel} + + {/if} {/if} diff --git a/src/lib/components/settings/ExtraFeaturesSettings.svelte b/src/lib/components/settings/ExtraFeaturesSettings.svelte index bea0033..95cc470 100644 --- a/src/lib/components/settings/ExtraFeaturesSettings.svelte +++ b/src/lib/components/settings/ExtraFeaturesSettings.svelte @@ -13,6 +13,7 @@ export let miningPoolMap: Map; let validBitaxe = false; + let validLocalPool = false; const testBitaxe = async () => { try { const response = await fetch(`http://${$settings.bitaxeHostname}/api/system/info`); @@ -61,6 +62,49 @@ miningPoolMap.get(pool) || pool, pool ]); + + const testLocalPool = async () => { + try { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 1000); + + const response = await fetch( + `http://${$settings.localPoolEndpoint}/api/client/${$settings.miningPoolUser}`, + { signal: controller.signal } + ); + clearTimeout(timeoutId); + + if (!response.ok) { + dispatch('showToast', { + color: 'danger', + text: `Failed to connect to local pool! status: ${response.status}` + }); + validLocalPool = false; + throw new Error(); + } + + const poolInfo = await response.json(); + dispatch('showToast', { + color: 'success', + text: `Can connect to local public pool, ${poolInfo.workersCount} workers` + }); + validLocalPool = true; + } catch (error) { + if (error.name === 'AbortError') { + dispatch('showToast', { + color: 'danger', + text: `Connection to local pool timed out after 1 second` + }); + } else { + dispatch('showToast', { + color: 'danger', + text: `Failed to connect to local pool, check the endpoint and make sure you are connected to the same network.` + }); + } + console.error('Failed to fetch local pool info:', error); + validLocalPool = false; + } + }; @@ -178,6 +222,21 @@ size={$uiSettings.inputSize} selectClass={$uiSettings.selectClass} /> + {#if $settings.miningPoolName === 'local_public_pool'} + + + + {/if} {/if} + + + - {#if $settings.actCurrencies && $settings.useNostr !== true} + {#if $settings.actCurrencies && $settings.dataSource == DataSourceType.BTCLOCK_SOURCE}
{$_('section.settings.currencies')}
{$_('restartRequired')} diff --git a/src/lib/components/settings/SystemSettings.svelte b/src/lib/components/settings/SystemSettings.svelte index 5f12e2d..f774c8f 100644 --- a/src/lib/components/settings/SystemSettings.svelte +++ b/src/lib/components/settings/SystemSettings.svelte @@ -6,36 +6,21 @@ import { uiSettings } from '$lib/uiSettings'; import EyeIcon from 'svelte-bootstrap-icons/lib/Eye.svelte'; import EyeSlashIcon from 'svelte-bootstrap-icons/lib/EyeSlash.svelte'; + import TimezoneSelector from './TimezoneSelector.svelte'; export let settings; export let isOpen = false; let showPassword = false; - - const getTzOffsetFromSystem = () => { - const dt = new Date(); - let diffTZ = dt.getTimezoneOffset(); - $settings.tzOffset = diffTZ * -1; - }; - ($settings.tzString = value)} size={$uiSettings.inputSize} - > - - + /> {#if $settings.httpAuthEnabled} + import { _ } from 'svelte-i18n'; + import { Row, Button, Col, Label, InputGroup, Input, FormText } from '@sveltestrap/sveltestrap'; + import { onMount } from 'svelte'; + + export let value: string; + export let onChange: (value: string) => void; + export let size: string = 'sm'; + + let timezones: string[] = []; + let selectedTimezone: string = ''; + + onMount(async () => { + const response = await fetch('/zones.json'); + const zones = await response.json(); + + // Convert zones data into array of {name, offset} objects + timezones = Object.keys(zones); + + // Set the selected timezone to the current value + selectedTimezone = value; + }); + + function handleTimezoneChange(event: Event) { + const select = event.target as HTMLSelectElement; + onChange(select.value); + } + + function getTzOffsetFromSystem() { + const detectedTzString = Intl.DateTimeFormat().resolvedOptions().timeZone; + + onChange(detectedTzString); + selectedTimezone = detectedTzString; + } + + + + + + + + {#each timezones as tz} + + {/each} + + + + {$_('section.settings.tzOffsetHelpText')} + + diff --git a/src/lib/locales/de.json b/src/lib/locales/de.json index 2044e49..6671619 100644 --- a/src/lib/locales/de.json +++ b/src/lib/locales/de.json @@ -73,7 +73,8 @@ "dndStartHour": "Startstunde", "dndStartMinute": "Startminute", "dndEndHour": "Endstunde", - "dndEndMinute": "Schlussminute" + "dndEndMinute": "Schlussminute", + "screenRestoreZap": "Vorherigen Bildschirmzustand nach Zap wieder herstellen (Verwendet {setting} Einstellung)" }, "control": { "systemInfo": "Systeminfo", @@ -88,7 +89,8 @@ "hostname": "Hostname", "frontlight": "Displaybeleuchtung", "turnOn": "Einschalten", - "flashFrontlight": "Blinken" + "flashFrontlight": "Blinken", + "fwCommitMismatch": "Die Firmware -Version unterscheidet sich von der WebUI -Version, dies kann zu Problemen führen." }, "status": { "title": "Status", diff --git a/src/lib/locales/en.json b/src/lib/locales/en.json index 302de09..40476d8 100644 --- a/src/lib/locales/en.json +++ b/src/lib/locales/en.json @@ -78,7 +78,7 @@ "dataSource": { "label": "Data Source", "btclock": "BTClock Data Source", - "thirdParty": "mempool.space/coincap.io", + "thirdParty": "mempool.space/Kraken", "nostr": "Nostr publisher", "custom": "Custom Endpoint" }, @@ -90,7 +90,8 @@ "dndStartHour": "Start hour", "dndStartMinute": "Start minute", "dndEndHour": "End hour", - "dndEndMinute": "End minute" + "dndEndMinute": "End minute", + "screenRestoreZap": "Restore previous screen state after zap (Uses {setting} setting)" }, "control": { "systemInfo": "System info", @@ -107,7 +108,8 @@ "turnOn": "Turn on", "flashFrontlight": "Flash", "firmwareUpdate": "Firmware update", - "fwCommit": "Firmware commit" + "fwCommit": "Firmware commit", + "fwCommitMismatch": "The firmware version is different from the WebUI version, this might cause problems. " }, "status": { "title": "Status", diff --git a/src/lib/locales/es.json b/src/lib/locales/es.json index 4033cab..e9edba5 100644 --- a/src/lib/locales/es.json +++ b/src/lib/locales/es.json @@ -47,7 +47,7 @@ "section": { "displaysAndLed": "Pantallas y LED", "screenSettings": "Específico de la pantalla", - "dataSource": "fuente de datos", + "dataSource": "Fuente de datos", "extraFeatures": "Funciones adicionales", "system": "Sistema" }, @@ -72,7 +72,8 @@ "dndStartHour": "Hora de inicio", "dndStartMinute": "Minuto de inicio", "dndEndHour": "Hora final", - "dndEndMinute": "Minuto final" + "dndEndMinute": "Minuto final", + "screenRestoreZap": "Restaurar el estado de pantalla anterior después de Zap (Usa la configuración {setting})" }, "control": { "turnOff": "Apagar", @@ -87,7 +88,8 @@ "hostname": "Nombre del host", "turnOn": "Encender", "frontlight": "Luz de la pantalla", - "flashFrontlight": "Luz intermitente" + "flashFrontlight": "Luz intermitente", + "fwCommitMismatch": "La versión de firmware es diferente de la versión WebUI, esto podría causar problemas." }, "status": { "memoryFree": "Memoria RAM libre", diff --git a/src/lib/locales/nl.json b/src/lib/locales/nl.json index b239905..8b6bd64 100644 --- a/src/lib/locales/nl.json +++ b/src/lib/locales/nl.json @@ -64,7 +64,8 @@ "dndStartHour": "Begin uur", "dndStartMinute": "Beginminuut", "dndEndHour": "Eind uur", - "dndEndMinute": "Einde minuut" + "dndEndMinute": "Einde minuut", + "screenRestoreZap": "Herstel vorige schermstatus na zap (Gebruikt {setting} instelling)" }, "control": { "systemInfo": "Systeeminformatie", @@ -78,7 +79,8 @@ "title": "Besturing", "frontlight": "Displaylicht", "turnOn": "Aanzetten", - "flashFrontlight": "Knipper" + "flashFrontlight": "Knipper", + "fwCommitMismatch": "De firmwareversie verschilt van de WebUI -versie, dit kan problemen veroorzaken." }, "status": { "title": "Status", diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 8199c48..5971a12 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -13,9 +13,8 @@ import { uiSettings } from '$lib/uiSettings'; let settings = writable({ - fgColor: '0', - bgColor: '0', - isLoaded: false + isLoaded: false, + timePerScreen: 0 }); let status = writable({ diff --git a/src/routes/Control.svelte b/src/routes/Control.svelte index fc3d76e..c4e96c1 100644 --- a/src/routes/Control.svelte +++ b/src/routes/Control.svelte @@ -13,7 +13,8 @@ Form, Input, Label, - Row + Row, + Alert } from '@sveltestrap/sveltestrap'; import FirmwareUpdater from './FirmwareUpdater.svelte'; import { uiSettings } from '$lib/uiSettings'; @@ -226,6 +227,11 @@
  • WebUI commit:
  • {$_('section.control.hostname')}:
  • + {#if $settings.gitRev != $settings.fsRev} + + ⚠️ {$_('warning')}: {$_('section.control.fwCommitMismatch')} + + {/if}