Chore: Fixed ServerURL & AppPin on WebUI

This commit is contained in:
Youwes09
2026-06-13 02:25:12 -05:00
parent baece20f46
commit 09d794da96
7 changed files with 80 additions and 80 deletions
+1 -1
View File
@@ -251,7 +251,7 @@ modules:
sources:
- type: git
url: https://github.com/moku-project/Moku.git
commit: b170a151f0213d1ade81b7543270fbe46bd2e8c5
commit: baece20f467d2c7d4cebaa9ea8892980aa93aa10
- type: file
path: packaging/frontend-dist.tar.gz
sha256: 676ec2273ffd9a69248849c5d51dc4d59a5d5b68fbba7a4fe7e7b572a5f25f14
+8 -16
View File
@@ -9,15 +9,6 @@ import { historyState } from '$lib/state/history.svelt
import { readerState } from '$lib/state/reader.svelte'
import { seriesState } from '$lib/state/series.svelte'
const KEY_URL = 'moku_server_url'
const KEY_AUTH = 'moku_auth_config'
interface SavedAuth {
mode: 'NONE' | 'BASIC_AUTH' | 'UI_LOGIN'
user?: string
pass?: string
}
async function boot() {
try {
const platformAdapter = detectAdapter()
@@ -43,20 +34,21 @@ async function boot() {
readerState.markers = libraryData.markers
historyState.load(libraryData.sessions, libraryData.dailyReadCounts)
const savedUrl = (await platformAdapter.getCredential(KEY_URL)) ?? 'http://127.0.0.1:4567'
const savedAuthRaw = await platformAdapter.getCredential(KEY_AUTH)
const savedAuth: SavedAuth = savedAuthRaw ? JSON.parse(savedAuthRaw) : { mode: 'NONE' }
const savedUrl = settingsState.settings.serverUrl ?? 'http://127.0.0.1:4567'
const authMode = settingsState.settings.serverAuthMode ?? 'NONE'
const authUser = settingsState.settings.serverAuthUser || undefined
const authPass = settingsState.settings.serverAuthPass || undefined
appState.serverUrl = savedUrl
appState.authMode = savedAuth.mode
appState.authMode = authMode === 'SIMPLE_LOGIN' ? 'UI_LOGIN' : authMode
configureAuth(savedUrl, savedAuth.mode, savedAuth.user, savedAuth.pass)
configureAuth(savedUrl, authMode, authUser, authPass)
await serverAdapter.connect({
baseUrl: savedUrl,
credentials:
savedAuth.mode === 'BASIC_AUTH' && savedAuth.user && savedAuth.pass
? { username: savedAuth.user, password: savedAuth.pass }
authMode === 'BASIC_AUTH' && authUser && authPass
? { username: authUser, password: authPass }
: undefined,
})
@@ -91,10 +91,11 @@
const PHASE2_MS = 10000
function triggerExit(cb?: () => void) {
if (exitLock) return
console.log('[splash] triggerExit called — exitLock:', exitLock, 'mode:', mode, 'cb:', cb?.name ?? String(cb))
if (exitLock) { console.log('[splash] triggerExit blocked by exitLock'); return }
exitLock = true
exiting = true
setTimeout(() => cb?.(), EXIT_MS)
setTimeout(() => { console.log('[splash] triggerExit timeout — calling cb'); cb?.() }, EXIT_MS)
}
let animFrame = 0
@@ -125,11 +126,13 @@
})
$effect(() => {
console.log('[splash] ringFull effect — ringFull:', ringFull, 'mode:', mode, 'exitLock:', exitLock)
if (!ringFull || mode === 'locked') { exitLock = false; exiting = false; return }
cancelAnimationFrame(animFrame)
animFrame = 0
ringProg = 1
setTimeout(() => triggerExit(onReady), 650)
const t = setTimeout(() => { console.log('[splash] ringFull timeout firing — calling triggerExit(onReady)'); triggerExit(onReady) }, 650)
return () => { console.log('[splash] ringFull effect cleanup — cancelling timeout'); clearTimeout(t) }
})
function submitPin() {
+1 -1
View File
@@ -19,7 +19,7 @@
const entries = $derived(
historyState.sessions
.filter((s, i, arr) => arr.findIndex(x => x.mangaId === s.mangaId) === i)
.slice(0, 10)
.slice(0, 5)
)
</script>
+2
View File
@@ -35,6 +35,8 @@ export const appState = $state({
history: [] as unknown[],
toasts: [] as unknown[],
appDir: '',
authUser: '',
authPass: '',
idleSplash: false,
devSplash: false,
})
+4 -14
View File
@@ -33,11 +33,8 @@ export async function initPlatform(): Promise<void> {
}
function pinLockEnabled(): boolean {
return (
settingsState.settings.appLockEnabled === true &&
typeof settingsState.settings.appLockPin === 'string' &&
settingsState.settings.appLockPin.length >= 4
)
const pin = settingsState.settings.appLockPin
return typeof pin === 'string' && pin.length >= 4
}
function handleProbeSuccess(gen: number) {
@@ -56,6 +53,7 @@ function handleAuthRequired(
pass: string,
) {
if (gen !== probeGeneration) return
if (boot.skipped) return
boot.failed = false
appState.authMode = authMode
@@ -93,13 +91,6 @@ export async function startProbe(
const baseUrl = settingsState.settings.serverUrl ?? 'http://127.0.0.1:4567'
configureAuth(baseUrl, authMode, user || undefined, pass || undefined)
if (appState.platform === 'web') {
boot.failed = true
appState.status = 'error'
startBackgroundProbe(gen, authMode, user, pass)
return
}
let tries = 0
async function probe() {
@@ -191,10 +182,9 @@ export function bypassBoot(
user = '',
pass = '',
) {
const gen = probeGeneration
boot.loginRequired = false
boot.sessionExpired = false
boot.skipped = true
appState.status = 'ready'
startBackgroundProbe(gen, authMode, user, pass)
startBackgroundProbe(probeGeneration, authMode, user, pass)
}
+58 -45
View File
@@ -1,7 +1,7 @@
<script lang="ts">
import { onMount } from 'svelte'
import { page } from '$app/stores'
import { appState, app } from '$lib/state/app.svelte'
import { appState, app, type AppStatus } from '$lib/state/app.svelte'
import { boot } from '$lib/state/boot.svelte'
import { notifications } from '$lib/state/notifications.svelte'
import { settingsState, loadSettingsIntoState, updateSettings } from '$lib/state/settings.svelte'
@@ -34,16 +34,23 @@
const isTauri = typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window
let splashDismissed = $state(false)
let themeEditorOpen = $state(false)
let themeEditorId = $state<string | null>(null)
appState.status = 'booting' as AppStatus
let splashDismissed = $state(false)
let settingsLoaded = $state(false)
let themeEditorOpen = $state(false)
let themeEditorId = $state<string | null>(null)
const splashVisible = $derived(
!splashDismissed ||
appState.status === 'booting' ||
appState.status === 'locked' ||
appState.status === 'error' ||
appState.status === 'auth'
appState.status === 'auth' ||
(appState.status === 'ready' && !splashDismissed)
)
const splashMode = $derived(
appState.status === 'locked' && settingsLoaded ? 'locked' : 'loading'
)
const ringFull = $derived(appState.status === 'ready')
@@ -62,51 +69,57 @@
const readerContainerized = $derived(settingsState.settings.readerContainerized ?? false)
const strippedLayout = $derived(isReaderRoute && !readerContainerized)
onMount(async () => {
const { detectAdapter } = await import('$lib/platform-adapters')
const { initPlatformService } = await import('$lib/platform-service')
const { loadSettings } = await import('$lib/core/persistence/persist')
const { startProbe } = await import('$lib/state/boot.svelte')
onMount(() => {
async function init() {
const { detectAdapter } = await import('$lib/platform-adapters')
const { initPlatformService } = await import('$lib/platform-service')
const { loadSettings } = await import('$lib/core/persistence/persist')
const { startProbe } = await import('$lib/state/boot.svelte')
const adapter = detectAdapter()
initPlatformService(adapter)
await adapter.init()
appState.platform = adapter.platform
appState.version = await platformService.getVersion().catch(() => '')
appState.appDir = await platformService.getAppDir().catch(() => '')
const adapter = detectAdapter()
initPlatformService(adapter)
await adapter.init()
appState.platform = adapter.platform
appState.version = await platformService.getVersion().catch(() => '')
appState.appDir = await platformService.getAppDir().catch(() => '')
const persisted = await loadSettings()
const raw = persisted?.settings ?? persisted ?? null
await loadSettingsIntoState(raw)
const persisted = await loadSettings()
const raw = persisted?.settings ?? persisted ?? null
await loadSettingsIntoState(raw)
const s = (raw ?? {}) as Record<string, unknown>
appState.serverUrl = (s.serverUrl as string) ?? ''
appState.authMode = (s.serverAuthMode as 'NONE' | 'BASIC_AUTH' | 'UI_LOGIN') ?? 'NONE'
appState.authUser = (s.serverAuthUser as string) ?? ''
appState.authPass = (s.serverAuthPass as string) ?? ''
const s = (raw ?? {}) as Record<string, unknown>
appState.serverUrl = (s.serverUrl as string) ?? ''
appState.authMode = (s.serverAuthMode as 'NONE' | 'BASIC_AUTH' | 'UI_LOGIN') ?? 'NONE'
appState.authUser = (s.serverAuthUser as string) ?? ''
appState.authPass = (s.serverAuthPass as string) ?? ''
applyTheme(
settingsState.settings.theme ?? 'dark',
settingsState.settings.customThemes ?? [],
)
settingsLoaded = true
if (isTauri && settingsState.settings.autoStartServer) {
platformService.launchServer({
binary: settingsState.settings.serverBinary,
binaryArgs: settingsState.settings.serverBinaryArgs,
webUiEnabled: settingsState.settings.suwayomiWebUI,
}).catch(() => {})
applyTheme(
settingsState.settings.theme ?? 'dark',
settingsState.settings.customThemes ?? [],
)
if (isTauri && settingsState.settings.autoStartServer) {
platformService.launchServer({
binary: settingsState.settings.serverBinary,
binaryArgs: settingsState.settings.serverBinaryArgs,
webUiEnabled: settingsState.settings.suwayomiWebUI,
}).catch(() => {})
}
startProbe(
appState.authMode ?? 'NONE',
appState.authUser ?? '',
appState.authPass ?? '',
isTauri && settingsState.settings.autoStartServer ? 2000 : 100,
)
polling = true
pollLoop()
}
startProbe(
appState.authMode ?? 'NONE',
appState.authUser ?? '',
appState.authPass ?? '',
isTauri && settingsState.settings.autoStartServer ? 2000 : 100,
)
polling = true
pollLoop()
init()
return () => {
polling = false
@@ -191,7 +204,7 @@
{#if splashVisible}
<SplashScreen
mode={appState.status === 'locked' ? 'locked' : 'loading'}
mode={splashMode}
{ringFull}
failed={appState.status === 'error'}
notConfigured={boot.notConfigured}