diff --git a/pages/settings/downloads.vue b/pages/settings/downloads.vue index 4a68cd5..c03fa78 100644 --- a/pages/settings/downloads.vue +++ b/pages/settings/downloads.vue @@ -79,6 +79,8 @@ min="1" max="32" v-model="downloadThreads" + @keypress="validateNumberInput" + @paste="validatePaste" class="block w-full rounded-md border-0 py-1.5 text-zinc-100 shadow-sm ring-1 ring-inset ring-zinc-700 bg-zinc-800 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-blue-600 sm:text-sm sm:leading-6" /> @@ -92,9 +94,16 @@ @@ -223,6 +232,11 @@ const dirs = ref>([]); const settings = await invoke("fetch_settings"); const downloadThreads = ref(settings?.maxDownloadThreads ?? 4); +const saveState = reactive({ + loading: false, + success: false +}); + async function updateDirs() { const newDirs = await invoke>("fetch_download_dir_stats"); dirs.value = newDirs; @@ -280,9 +294,40 @@ async function deleteDirectory(index: number) { } async function saveDownloadThreads() { - //Would save download threads downloadThreads.value); - await invoke("update_settings", { - newSettings: { maxDownloadThreads: downloadThreads.value }, - }); + try { + saveState.loading = true; + await invoke("update_settings", { + newSettings: { maxDownloadThreads: downloadThreads.value }, + }); + + // Show success state + saveState.success = true; + + // Reset back to normal state after 2 seconds + setTimeout(() => { + saveState.success = false; + }, 2000); + + } catch (error) { + console.error('Failed to save settings:', error); + } finally { + saveState.loading = false; + } +} + +function validateNumberInput(event: KeyboardEvent) { + // Allow only numbers and basic control keys + if (!/^\d$/.test(event.key) && + !['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight'].includes(event.key)) { + event.preventDefault(); + } +} + +function validatePaste(event: ClipboardEvent) { + // Prevent paste if content contains non-numeric characters + const pastedData = event.clipboardData?.getData('text'); + if (pastedData && !/^\d+$/.test(pastedData)) { + event.preventDefault(); + } }