From 53234d283eaec32ef8e08dfdc45140dbbee84c26 Mon Sep 17 00:00:00 2001
From: Aden Lindsay <140392385+AdenMGB@users.noreply.github.com>
Date: Fri, 24 Jan 2025 12:31:59 +1030
Subject: [PATCH] feat(settings): Made save button include user feedback & only
allow numeric characters
---
pages/settings/downloads.vue | 57 ++++++++++++++++++++++++++++++++----
1 file changed, 51 insertions(+), 6 deletions(-)
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();
+ }
}