From e67395d1ee0e83634a0f8b241fde4f1293ec4f47 Mon Sep 17 00:00:00 2001 From: Eva Decker Date: Wed, 22 Nov 2023 13:36:24 -0500 Subject: [PATCH] fix: Do not overwrite search query when input is focused (#132) --- src/routes/+page.svelte | 51 ++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 4170694..357a26a 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -7,11 +7,20 @@ import SearchIcon from '~icons/ri/search-line'; import CloseCircleIcon from '~icons/ri/close-circle-fill'; import { scale } from 'svelte/transition'; - import type { FormEventHandler, KeyboardEventHandler } from 'svelte/elements.js'; + import type { + FocusEventHandler, + FormEventHandler, + KeyboardEventHandler + } from 'svelte/elements.js'; export let data; - $: currentQuery = $page.url.searchParams.get('q') || ''; + let isFocused = false; + let currentQuery = ''; + + $: if (!isFocused) { + currentQuery = $page.url.searchParams.get('q') || ''; + } $: currentPage = Number($page.url.searchParams.get('page')) || 1; $: currentTag = $page.url.searchParams.get('tag') as Enums<'tags'> | null; @@ -36,31 +45,39 @@ debounceTimer = setTimeout(callback, 250); }; + const handleSearch: FormEventHandler = (e) => { + currentQuery = e.currentTarget.value; + const newURL = new URL($page.url); + newURL.searchParams.delete('page'); + + if (currentQuery) { + newURL.searchParams.set('q', currentQuery); + } else { + newURL.searchParams.delete('q'); + } + + debounce(() => goto(newURL, { keepFocus: true, replaceState: true })); + }; + const handleClearSearch = () => { const newURL = new URL($page.url); newURL.searchParams.delete('tag'); newURL.searchParams.delete('q'); - goto(newURL, { keepFocus: true }); + goto(newURL, { keepFocus: true, replaceState: true }); }; - const handleSearchKeydown: KeyboardEventHandler = (e) => { + const handleKeydown: KeyboardEventHandler = (e) => { if (e.key === 'Backspace' && currentQuery === '') { handleClearSearch(); } }; - const handleSearch: FormEventHandler = (e) => { - currentQuery = e.currentTarget.value; - const newURL = new URL($page.url); - newURL.searchParams.delete('page'); - - if (currentQuery) { - newURL.searchParams.set('q', currentQuery); - } else { - newURL.searchParams.delete('q'); - } + const handleFocus: FocusEventHandler = () => { + isFocused = true; + }; - debounce(() => goto(newURL, { keepFocus: true })); + const handleBlur: FocusEventHandler = () => { + isFocused = false; }; const handleTagClick = (tag: Enums<'tags'> | null) => { @@ -127,7 +144,9 @@ placeholder="Search covers…" value={currentQuery} on:input={handleSearch} - on:keydown={handleSearchKeydown} + on:keydown={handleKeydown} + on:focus={handleFocus} + on:blur={handleBlur} /> {#if currentQuery.length > 0}