Skip to content

Commit 4eb8438

Browse files
committed
fix: suggestion menu on click outside
1 parent e51a7d8 commit 4eb8438

File tree

3 files changed

+11
-22
lines changed

3 files changed

+11
-22
lines changed

components/AppHeader.vue

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<input
2424
class="w-full bg-transparent py-2 outline-none placeholder:text-[#757575] placeholder:dark:text-neutral-500"
2525
v-model="searchQuery"
26-
@click.stop="suggestionMenu = true"
26+
@click="suggestionMenu = !suggestionMenu"
2727
:placeholder="route.query.category ? `Search in ${route.query.category}` : 'Search'" />
2828
</div>
2929
<div v-if="searchQuery || suggestionMenu" class="flex cursor-pointer text-black dark:text-neutral-500 transition-all" @click="clearSearch">
@@ -32,7 +32,7 @@
3232
</div>
3333
</div>
3434
</form>
35-
<div v-if="suggestionMenu" id="suggestionMenu" class="absolute top-full left-0 right-0 z-50 bg-white rounded-b-2xl w-full">
35+
<div v-if="suggestionMenu" ref="suggestionMenuRef" class="absolute top-full left-0 right-0 z-50 bg-white rounded-b-2xl w-full">
3636
<div class="m-8">
3737
<!-- Loading State -->
3838
<div v-if="loading">Loading...</div>
@@ -81,6 +81,7 @@
8181
import getSearchProducts from '~/gql/queries/getSearchProducts.gql';
8282
8383
const suggestionMenu = ref(false);
84+
const suggestionMenuRef = ref(null);
8485
const router = useRouter();
8586
const route = useRoute();
8687
const searchQuery = ref(route.query.q);
@@ -98,22 +99,10 @@ const clearSearch = () => {
9899
setSearch();
99100
};
100101
101-
const hidesuggestionMenu = () => {
102-
suggestionMenu.value = false;
103-
searchQuery.value = route.query.q;
104-
};
105-
106-
const outsideClickHandler = (event) => {
107-
if (!event.target.closest('#suggestionMenu')) {
108-
hidesuggestionMenu();
102+
useOnClickOutside(suggestionMenuRef, () => {
103+
if (suggestionMenu.value) {
104+
suggestionMenu.value = false;
105+
searchQuery.value = route.query.q;
109106
}
110-
};
111-
112-
onMounted(() => {
113-
window.addEventListener('click', outsideClickHandler);
114-
});
115-
116-
onUnmounted(() => {
117-
window.removeEventListener('click', outsideClickHandler);
118107
});
119108
</script>

components/ButtonSelectCategory.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<template>
2-
<div class="relative cursor-pointer select-none items-center justify-center text-base font-semibold" ref="dropdownRef" @click="isDropdownVisible = !isDropdownVisible">
2+
<div class="relative cursor-pointer select-none items-center justify-center text-base font-semibold" @click="isDropdownVisible = !isDropdownVisible">
33
<div
44
class="box-border flex items-center rounded-full py-3.5 pl-5 pr-4 transition-all active:scale-95"
55
:class="{ 'bg-black text-white hover:bg-black': isDropdownVisible, 'bg-[#efefef] hover:bg-[#e2e2e2]': !isDropdownVisible }">
66
<span class="mr-1.5">{{ route.query.category || 'All Categories' }}</span>
77
<Icon name="iconamoon:arrow-down-2" size="24" />
88
</div>
99
<Transition>
10-
<div v-if="isDropdownVisible" id="dropdown" class="absolute top-full z-10 mt-[18px] rounded-2xl text-base font-semibold bg-white shadow-[0_0_8px_rgba(0,0,0,.1)]">
10+
<div v-if="isDropdownVisible" ref="dropdownRef" class="absolute top-full z-10 mt-[18px] rounded-2xl text-base font-semibold bg-white shadow-[0_0_8px_rgba(0,0,0,.1)]">
1111
<div class="m-2 w-44">
1212
<div @click="setCategory()" class="rounded-lg px-3 py-2 transition-all duration-300 hover:bg-[#e9e9e9]">
1313
<div class="flex items-center justify-between">

components/ButtonSortBy.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<template>
2-
<div class="relative cursor-pointer select-none items-center justify-center text-base font-semibold" ref="dropdownRef" @click="isDropdownVisible = !isDropdownVisible">
2+
<div class="relative cursor-pointer select-none items-center justify-center text-base font-semibold" @click="isDropdownVisible = !isDropdownVisible">
33
<div
44
class="box-border flex items-center rounded-full py-3.5 pl-5 pr-4 transition-all active:scale-95"
55
:class="{ 'bg-black text-white hover:bg-black': isDropdownVisible, 'bg-[#efefef] hover:bg-[#e2e2e2]': !isDropdownVisible }">
66
<span class="mr-1.5">{{ selectedSort }}</span>
77
<Icon name="iconamoon:arrow-down-2" size="24" />
88
</div>
99
<Transition>
10-
<div v-if="isDropdownVisible" id="dropdown" class="absolute top-full right-0 z-10 mt-[18px] rounded-2xl text-base font-semibold bg-white shadow-[0_0_8px_rgba(0,0,0,.1)]">
10+
<div v-if="isDropdownVisible" ref="dropdownRef" class="absolute top-full right-0 z-10 mt-[18px] rounded-2xl text-base font-semibold bg-white shadow-[0_0_8px_rgba(0,0,0,.1)]">
1111
<div class="m-2 w-48">
1212
<div v-for="(option, i) in options" :key="i" @click="setSort(option.value)" class="rounded-lg px-3 py-2 transition-all duration-300 hover:bg-[#e9e9e9]">
1313
<div class="flex items-center justify-between">

0 commit comments

Comments
 (0)