handle errors on config update
This commit is contained in:
parent
70d71ce14e
commit
c5dcc2e50a
@ -1,3 +1,7 @@
|
|||||||
@tailwind base;
|
@tailwind base;
|
||||||
@tailwind components;
|
@tailwind components;
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
|
.btn-alert-error {
|
||||||
|
@apply bg-transparent hover:bg-[#cd5a5a] border border-error-content text-error-content
|
||||||
|
}
|
||||||
|
@ -10,19 +10,37 @@
|
|||||||
export let max = null;
|
export let max = null;
|
||||||
export let decimal = false;
|
export let decimal = false;
|
||||||
|
|
||||||
let error = null;
|
|
||||||
let localValue = value.toString();
|
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
function validate(event) {
|
|
||||||
|
$: localValue = value.toString();
|
||||||
|
let lastInputTime = null;
|
||||||
|
function debounce(event) {
|
||||||
|
lastInputTime = Date.now();
|
||||||
localValue = localValue.replace(/[^-0-9.]/g, '');
|
localValue = localValue.replace(/[^-0-9.]/g, '');
|
||||||
|
|
||||||
|
const eventTime = lastInputTime;
|
||||||
|
const pendingValue = localValue;
|
||||||
|
window.setTimeout(
|
||||||
|
() => {
|
||||||
|
// if no other inputs have occured since then
|
||||||
|
if (eventTime === lastInputTime) {
|
||||||
|
updateValue(pendingValue);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
500
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
let error = null;
|
||||||
|
function updateValue(newValue) {
|
||||||
// Don't update the value, but also don't error, if it's empty
|
// Don't update the value, but also don't error, if it's empty
|
||||||
// or if it could be the start of a negative or decimal number
|
// or if it could be the start of a negative or decimal number
|
||||||
if (localValue.match(/^$|^-$|^\.$/) !== null) {
|
if (newValue.match(/^$|^-$|^\.$/) !== null) {
|
||||||
error = null;
|
error = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let num = parseFloat(localValue);
|
const num = parseFloat(newValue);
|
||||||
if (num % 1 !== 0 && !decimal) {
|
if (num % 1 !== 0 && !decimal) {
|
||||||
error = `${num} is not a whole number`;
|
error = `${num} is not a whole number`;
|
||||||
}
|
}
|
||||||
@ -53,7 +71,7 @@
|
|||||||
size="{Math.max(5, localValue.length)}"
|
size="{Math.max(5, localValue.length)}"
|
||||||
class:input-error={error}
|
class:input-error={error}
|
||||||
bind:value={localValue}
|
bind:value={localValue}
|
||||||
on:input="{validate}"
|
on:input="{debounce}"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -5,11 +5,18 @@
|
|||||||
import Nav from '../ui/Nav.svelte';
|
import Nav from '../ui/Nav.svelte';
|
||||||
import Link from '../ui/Link.svelte';
|
import Link from '../ui/Link.svelte';
|
||||||
import ErrorAlert from '../ui/ErrorAlert.svelte';
|
import ErrorAlert from '../ui/ErrorAlert.svelte';
|
||||||
// import Setting from '../ui/settings/Setting.svelte';
|
|
||||||
import { Setting, ToggleSetting, NumericSetting } from '../ui/settings';
|
import { Setting, ToggleSetting, NumericSetting } from '../ui/settings';
|
||||||
|
|
||||||
|
|
||||||
|
let error = null;
|
||||||
async function save() {
|
async function save() {
|
||||||
await invoke('save_config', {config: $appState.config});
|
try {
|
||||||
|
await invoke('save_config', {config: $appState.config});
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
error = e;
|
||||||
|
$appState.config = await invoke('get_config');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -57,3 +64,17 @@
|
|||||||
</Setting>
|
</Setting>
|
||||||
</div>
|
</div>
|
||||||
{/await}
|
{/await}
|
||||||
|
|
||||||
|
{#if error}
|
||||||
|
<div class="toast">
|
||||||
|
<div class="alert alert-error">
|
||||||
|
<div>
|
||||||
|
<span>{error}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<button class="btn btn-sm btn-alert-error" on:click={() => error = null}>Ok</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
@ -49,9 +49,7 @@
|
|||||||
{error}
|
{error}
|
||||||
<svelte:fragment slot="buttons">
|
<svelte:fragment slot="buttons">
|
||||||
<Link target="Home">
|
<Link target="Home">
|
||||||
<button class="btn btn-sm bg-transparent hover:bg-[#cd5a5a] border border-error-content text-error-content">
|
<button class="btn btn-sm btn-alert-error" on:click={() => navigate('Home')}>Ok</button>
|
||||||
Ok
|
|
||||||
</button>
|
|
||||||
</Link>
|
</Link>
|
||||||
</svelte:fragment>
|
</svelte:fragment>
|
||||||
</ErrorAlert>
|
</ErrorAlert>
|
||||||
|
@ -38,9 +38,7 @@
|
|||||||
{error}
|
{error}
|
||||||
<svelte:fragment slot="buttons">
|
<svelte:fragment slot="buttons">
|
||||||
<Link target="Home">
|
<Link target="Home">
|
||||||
<button class="btn btn-sm bg-transparent hover:bg-[#cd5a5a] border border-error-content text-error-content" on:click="{() => navigate('Home')}">
|
<button class="btn btn-sm btn-alert-error" on:click={() => navigate('Home')}>Ok</button>
|
||||||
Ok
|
|
||||||
</button>
|
|
||||||
</Link>
|
</Link>
|
||||||
</svelte:fragment>
|
</svelte:fragment>
|
||||||
</ErrorAlert>
|
</ErrorAlert>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user