fix: Fix UI state issues with integration settings

This commit is contained in:
Aleksi Lassila
2024-06-14 00:14:46 +03:00
parent f5220e21e0
commit 6cd7d5ffbf
4 changed files with 59 additions and 51 deletions

View File

@@ -4,31 +4,26 @@
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import SelectField from '../SelectField.svelte'; import SelectField from '../SelectField.svelte';
import { jellyfinApi, type JellyfinUser } from '../../apis/jellyfin/jellyfin-api'; import { jellyfinApi, type JellyfinUser } from '../../apis/jellyfin/jellyfin-api';
import { get } from 'svelte/store'; import { derived, get } from 'svelte/store';
const dispatch = createEventDispatcher<{ const dispatch = createEventDispatcher<{
change: { baseUrl: string; apiKey: string; stale: boolean }; change: { baseUrl: string; apiKey: string; stale: boolean };
'click-user': { user: JellyfinUser | undefined; users: JellyfinUser[] }; 'click-user': { user: JellyfinUser | undefined; users: JellyfinUser[] };
}>(); }>();
export let baseUrl = ''; export let baseUrl = get(user)?.settings.jellyfin.baseUrl || '';
export let apiKey = ''; export let apiKey = get(user)?.settings.jellyfin.apiKey || '';
let originalBaseUrl: string | undefined; let originalBaseUrl = derived(user, (user) => user?.settings.jellyfin.baseUrl || '');
let originalApiKey: string | undefined; let originalApiKey = derived(user, (user) => user?.settings.jellyfin.apiKey || '');
let timeout: ReturnType<typeof setTimeout>; let timeout: ReturnType<typeof setTimeout>;
let error = ''; let error = '';
let jellyfinUsers: Promise<JellyfinUser[]> | undefined = undefined; let jellyfinUsers: Promise<JellyfinUser[]> | undefined = undefined;
export let jellyfinUser: JellyfinUser | undefined; export let jellyfinUser: JellyfinUser | undefined;
user.subscribe((user) => { $: {
baseUrl = baseUrl || user?.settings.jellyfin.baseUrl || ''; if ($originalBaseUrl !== baseUrl && $originalApiKey !== apiKey) handleChange();
apiKey = apiKey || user?.settings.jellyfin.apiKey || ''; else dispatch('change', { baseUrl, apiKey, stale: false });
}
originalBaseUrl = baseUrl;
originalApiKey = apiKey;
handleChange();
});
$: if (jellyfinUser) $: if (jellyfinUser)
dispatch('change', { dispatch('change', {
@@ -38,6 +33,8 @@
baseUrl && apiKey ? jellyfinUser?.Id !== get(user)?.settings.jellyfin.userId : !jellyfinUser baseUrl && apiKey ? jellyfinUser?.Id !== get(user)?.settings.jellyfin.userId : !jellyfinUser
}); });
handleChange();
function handleChange() { function handleChange() {
clearTimeout(timeout); clearTimeout(timeout);
error = ''; error = '';
@@ -50,7 +47,11 @@
dispatch('change', { dispatch('change', {
baseUrl: '', baseUrl: '',
apiKey: '', apiKey: '',
stale: baseUrl === '' && apiKey === '' && jellyfinUser === undefined stale:
baseUrl === '' &&
apiKey === '' &&
jellyfinUser === undefined &&
(baseUrl !== $originalBaseUrl || apiKey !== $originalApiKey)
}); });
if (baseUrlCopy === '' || apiKeyCopy === '') return; if (baseUrlCopy === '' || apiKeyCopy === '') return;
@@ -62,9 +63,9 @@
if (baseUrlCopy !== baseUrl || apiKeyCopy !== apiKey) return; if (baseUrlCopy !== baseUrl || apiKeyCopy !== apiKey) return;
if (users.length) { if (users.length) {
jellyfinUser = users.find((u) => u.Id === get(appState).user?.settings.jellyfin.userId); jellyfinUser = users.find((u) => u.Id === get(user)?.settings.jellyfin.userId);
const stale = const stale =
(baseUrlCopy !== originalBaseUrl || apiKeyCopy !== originalApiKey) && (baseUrlCopy !== $originalBaseUrl || apiKeyCopy !== $originalApiKey) &&
jellyfinUser !== undefined; jellyfinUser !== undefined;
dispatch('change', { baseUrl: baseUrlCopy, apiKey: apiKeyCopy, stale }); dispatch('change', { baseUrl: baseUrlCopy, apiKey: apiKeyCopy, stale });
} else { } else {
@@ -91,13 +92,17 @@
<TextField <TextField
bind:value={baseUrl} bind:value={baseUrl}
isValid={jellyfinUsers?.then((u) => !!u?.length)} isValid={jellyfinUsers?.then((u) => !!u?.length)}
on:change={handleChange}>Base Url</TextField on:change={handleChange}
> >
Base Url
</TextField>
<TextField <TextField
bind:value={apiKey} bind:value={apiKey}
isValid={jellyfinUsers?.then((u) => !!u?.length)} isValid={jellyfinUsers?.then((u) => !!u?.length)}
on:change={handleChange}>API Key</TextField on:change={handleChange}
> >
API Key
</TextField>
</div> </div>
{#await jellyfinUsers then users} {#await jellyfinUsers then users}

View File

@@ -3,28 +3,26 @@
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import { radarrApi } from '../../apis/radarr/radarr-api'; import { radarrApi } from '../../apis/radarr/radarr-api';
import { user } from '../../stores/user.store'; import { user } from '../../stores/user.store';
import { derived, get } from 'svelte/store';
const dispatch = createEventDispatcher<{ const dispatch = createEventDispatcher<{
change: { baseUrl: string; apiKey: string; stale: boolean }; change: { baseUrl: string; apiKey: string; stale: boolean };
}>(); }>();
export let baseUrl = ''; export let baseUrl = get(user)?.settings.radarr.baseUrl || '';
export let apiKey = ''; export let apiKey = get(user)?.settings.radarr.apiKey || '';
let originalBaseUrl: string | undefined; const originalBaseUrl = derived(user, (user) => user?.settings.radarr.baseUrl || '');
let originalApiKey: string | undefined; const originalApiKey = derived(user, (user) => user?.settings.radarr.apiKey || '');
let timeout: ReturnType<typeof setTimeout>; let timeout: ReturnType<typeof setTimeout>;
let error = ''; let error = '';
let healthCheck: Promise<boolean> | undefined; let healthCheck: Promise<boolean> | undefined;
user.subscribe((user) => { $: {
baseUrl = baseUrl || user?.settings.radarr.baseUrl || ''; if ($originalBaseUrl !== baseUrl && $originalApiKey !== apiKey) handleChange();
apiKey = apiKey || user?.settings.radarr.apiKey || ''; else dispatch('change', { baseUrl, apiKey, stale: false });
}
originalBaseUrl = baseUrl; handleChange();
originalApiKey = apiKey;
handleChange();
});
function handleChange() { function handleChange() {
clearTimeout(timeout); clearTimeout(timeout);
@@ -33,12 +31,12 @@
const baseUrlCopy = baseUrl; const baseUrlCopy = baseUrl;
const apiKeyCopy = apiKey; const apiKeyCopy = apiKey;
const stale = baseUrlCopy !== originalBaseUrl || apiKeyCopy !== originalApiKey; const stale = baseUrlCopy !== $originalBaseUrl || apiKeyCopy !== $originalApiKey;
dispatch('change', { dispatch('change', {
baseUrl: '', baseUrl: '',
apiKey: '', apiKey: '',
stale: baseUrl === '' && apiKey === '' stale: baseUrl === '' && apiKey === '' && stale
}); });
if (baseUrlCopy === '' || apiKeyCopy === '') return; if (baseUrlCopy === '' || apiKeyCopy === '') return;
@@ -66,8 +64,9 @@
</script> </script>
<div class="space-y-4 mb-4"> <div class="space-y-4 mb-4">
<TextField bind:value={baseUrl} isValid={healthCheck} on:change={handleChange}>Base Url</TextField <TextField bind:value={baseUrl} isValid={healthCheck} on:change={handleChange}>
> Base Url
</TextField>
<TextField bind:value={apiKey} isValid={healthCheck} on:change={handleChange}>API Key</TextField> <TextField bind:value={apiKey} isValid={healthCheck} on:change={handleChange}>API Key</TextField>
</div> </div>

View File

@@ -3,42 +3,42 @@
import { sonarrApi } from '../../apis/sonarr/sonarr-api'; import { sonarrApi } from '../../apis/sonarr/sonarr-api';
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import { user } from '../../stores/user.store'; import { user } from '../../stores/user.store';
import { derived, get } from 'svelte/store';
const dispatch = createEventDispatcher<{ const dispatch = createEventDispatcher<{
change: { baseUrl: string; apiKey: string; stale: boolean }; change: { baseUrl: string; apiKey: string; stale: boolean };
}>(); }>();
export let baseUrl = ''; export let baseUrl = get(user)?.settings.sonarr.baseUrl || '';
export let apiKey = ''; export let apiKey = get(user)?.settings.sonarr.apiKey || '';
let originalBaseUrl: string | undefined; const originalBaseUrl = derived(user, (u) => u?.settings.sonarr.baseUrl || '');
let originalApiKey: string | undefined; const originalApiKey = derived(user, (u) => u?.settings.sonarr.apiKey || '');
let timeout: ReturnType<typeof setTimeout>; let timeout: ReturnType<typeof setTimeout>;
let error = ''; let error = '';
let healthCheck: Promise<boolean> | undefined; let healthCheck: Promise<boolean> | undefined;
user.subscribe((user) => { $: {
baseUrl = baseUrl || user?.settings.sonarr.baseUrl || ''; if ($originalBaseUrl !== baseUrl && $originalApiKey !== apiKey) handleChange();
apiKey = apiKey || user?.settings.sonarr.apiKey || ''; else dispatch('change', { baseUrl, apiKey, stale: false });
}
originalBaseUrl = baseUrl; handleChange();
originalApiKey = apiKey;
handleChange();
});
function handleChange() { function handleChange() {
console.log('handleChange', $originalBaseUrl, baseUrl, $originalApiKey, apiKey);
clearTimeout(timeout); clearTimeout(timeout);
error = ''; error = '';
healthCheck = undefined; healthCheck = undefined;
const baseUrlCopy = baseUrl; const baseUrlCopy = baseUrl;
const apiKeyCopy = apiKey; const apiKeyCopy = apiKey;
const stale = baseUrlCopy !== originalBaseUrl || apiKeyCopy !== originalApiKey; const stale = baseUrlCopy !== $originalBaseUrl || apiKeyCopy !== $originalApiKey;
dispatch('change', { dispatch('change', {
baseUrl: '', baseUrl: '',
apiKey: '', apiKey: '',
stale: baseUrl === '' && apiKey === '' stale: baseUrl === '' && apiKey === '' && stale
}); });
if (baseUrlCopy === '' || apiKeyCopy === '') return; if (baseUrlCopy === '' || apiKeyCopy === '') return;
@@ -66,8 +66,9 @@
</script> </script>
<div class="space-y-4 mb-4"> <div class="space-y-4 mb-4">
<TextField bind:value={baseUrl} isValid={healthCheck} on:change={handleChange}>Base Url</TextField <TextField bind:value={baseUrl} isValid={healthCheck} on:change={handleChange}>
> Base Url
</TextField>
<TextField bind:value={apiKey} isValid={healthCheck} on:change={handleChange}>API Key</TextField> <TextField bind:value={apiKey} isValid={healthCheck} on:change={handleChange}>API Key</TextField>
</div> </div>

View File

@@ -310,6 +310,9 @@
</Tab> </Tab>
<Tab {...tab} tab={Tabs.About}> <Tab {...tab} tab={Tabs.About}>
<div>
Version: {REIVERR_VERSION}
</div>
User agent: {window?.navigator?.userAgent} User agent: {window?.navigator?.userAgent}
<div>Last key code: {lastKeyCode}</div> <div>Last key code: {lastKeyCode}</div>
<div>Last key: {lastKey}</div> <div>Last key: {lastKey}</div>