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}