Skip to content

Commit

Permalink
Improve search functionality with Fuse.js for better accuracy and UX (#…
Browse files Browse the repository at this point in the history
…76)

* Improve search functionality with Fuse.js

* Centralized social media links in `data/index.ts`

* Fix formatting

Signed-off-by: nurRiyad <asadnurriyad@gmail.com>

* Update dependency

Signed-off-by: nurRiyad <asadnurriyad@gmail.com>

* Fix formatting

Signed-off-by: nurRiyad <asadnurriyad@gmail.com>

---------

Signed-off-by: nurRiyad <asadnurriyad@gmail.com>
Co-authored-by: nurRiyad <asadnurriyad@gmail.com>
  • Loading branch information
Nicolhetti and nurRiyad authored Jan 10, 2025
1 parent 0c17603 commit 8fc4675
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 27 deletions.
10 changes: 5 additions & 5 deletions components/footer/developer.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { footerData } from '~/data'
import { footerData, socialLinks } from '~/data'
</script>

<template>
Expand All @@ -12,31 +12,31 @@ import { footerData } from '~/data'
</p>
<div class="my-3 space-x-3 pb-3">
<NuxtLink
to="https://github.com/nurRiyad"
:to="socialLinks.githubLink"
target="_blank"
class="p-2 bg-gray-300 text-gray-800 rounded-md dark:bg-sky-700 dark:text-[#F1F2F4]"
aria-label="Github"
>
<Icon name="fa:github" size="1em" />
</NuxtLink>
<NuxtLink
to="https://www.linkedin.com/in/nur-riyad/"
:to="socialLinks.linkedinLink"
target="_blank"
class="p-2 bg-gray-300 text-gray-800 rounded-md dark:bg-sky-700 dark:text-[#F1F2F4]"
aria-label="LinkedIn"
>
<Icon name="fa:linkedin-square" size="1em" />
</NuxtLink>
<NuxtLink
to="https://twitter.com/qdnvubp"
:to="socialLinks.twitterLink"
target="_blank"
class="p-2 bg-gray-300 text-gray-800 rounded-md dark:bg-sky-700 dark:text-[#F1F2F4]"
aria-label="Twitter"
>
<Icon name="fa:twitter-square" size="1em" />
</NuxtLink>
<NuxtLink
to="https://stackoverflow.com/users/16781395/nur-riyad"
:to="socialLinks.stackoverflowLink"
target="_blank"
class="p-2 bg-gray-300 text-gray-800 rounded-md dark:bg-sky-700 dark:text-[#F1F2F4]"
aria-label="StackOverflow"
Expand Down
7 changes: 7 additions & 0 deletions data/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ export const seoData = {
mailAddress: 'asadnurriyad@gmail.com',
}

export const socialLinks = {
githubLink: 'https://github.com/nurRiyad',
linkedinLink: 'https://www.linkedin.com/in/nur-riyad/',
twitterLink: 'https://twitter.com/qdnvubp',
stackoverflowLink: 'https://stackoverflow.com/users/16781395/nur-riyad',
}

export const siteMetaData = [
{
name: 'description',
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"@vueuse/nuxt": "^10.9.0",
"eslint-config-prettier": "^9.1.0",
"feed": "^4.2.2",
"fuse.js": "^7.0.0",
"nuxt": "^3.14.159",
"nuxt-icon": "^0.6.8",
"nuxt-og-image": "^3.0.0-rc.38",
Expand Down
10 changes: 5 additions & 5 deletions pages/about.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { aboutPage, footerData, navbarData } from '~/data'
import { aboutPage, footerData, navbarData, socialLinks } from '~/data'
useHead({
title: 'About',
Expand Down Expand Up @@ -31,31 +31,31 @@ defineOgImageComponent('About', {

<div class="my-3 space-x-2 md:space-x-3 pb-10">
<NuxtLink
to="https://github.com/nurRiyad"
:to="socialLinks.githubLink"
target="_blank"
class="px-2 py-1 lg:px-3 lg:py-2 bg-gray-300 text-gray-800 rounded-md dark:bg-slate-700 dark:text-[#F1F2F4]"
aria-label="Github"
>
<Icon name="fa:github" size="1em" />
</NuxtLink>
<NuxtLink
to="https://www.linkedin.com/in/nur-riyad/"
:to="socialLinks.linkedinLink"
target="_blank"
class="px-2 py-1 lg:px-3 lg:py-2 bg-gray-300 text-gray-800 rounded-md dark:bg-slate-700 dark:text-[#F1F2F4]"
aria-label="LinkedIn"
>
<Icon name="fa:linkedin-square" size="1em" />
</NuxtLink>
<NuxtLink
to="https://twitter.com/qdnvubp"
:to="socialLinks.twitterLink"
target="_blank"
class="px-2 py-1 lg:px-3 lg:py-2 bg-gray-300 text-gray-800 rounded-md dark:bg-slate-700 dark:text-[#F1F2F4]"
aria-label="Twitter"
>
<Icon name="fa:twitter-square" size="1em" />
</NuxtLink>
<NuxtLink
to="https://stackoverflow.com/users/16781395/nur-riyad"
:to="socialLinks.stackoverflowLink"
target="_blank"
class="px-2 py-1 lg:px-3 lg:py-2 bg-gray-300 text-gray-800 rounded-md dark:bg-slate-700 dark:text-[#F1F2F4]"
aria-label="StackOverflow"
Expand Down
37 changes: 20 additions & 17 deletions pages/blogs/index.vue
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<script lang="ts" setup>
import Fuse from 'fuse.js'
const { data } = await useAsyncData('home', () => queryContent('/blogs').sort({ _id: -1 }).find())
const elementPerPage = ref(5)
Expand All @@ -23,26 +25,28 @@ const formattedData = computed(() => {
)
})
const fuse = computed(() => {
return new Fuse(formattedData.value, {
keys: ['title', 'description'],
threshold: 0.4,
includeScore: false,
})
})
const searchData = computed(() => {
return (
formattedData.value.filter((data) => {
const lowerTitle = data.title.toLocaleLowerCase()
if (lowerTitle.search(searchTest.value) !== -1) return true
else return false
}) || []
)
if (!searchTest.value.trim()) {
return formattedData.value
}
const results = fuse.value.search(searchTest.value)
return results.map((result) => result.item)
})
const paginatedData = computed(() => {
return (
searchData.value.filter((data, idx) => {
const startInd = (pageNumber.value - 1) * elementPerPage.value
const endInd = pageNumber.value * elementPerPage.value - 1
const startInd = (pageNumber.value - 1) * elementPerPage.value
const endInd = pageNumber.value * elementPerPage.value
if (idx >= startInd && idx <= endInd) return true
else return false
}) || []
)
return searchData.value.slice(startInd, endInd)
})
function onPreviousPageClick() {
Expand All @@ -51,8 +55,7 @@ function onPreviousPageClick() {
const totalPage = computed(() => {
const ttlContent = searchData.value.length || 0
const totalPage = Math.ceil(ttlContent / elementPerPage.value)
return totalPage
return Math.ceil(ttlContent / elementPerPage.value)
})
function onNextPageClick() {
Expand Down
12 changes: 12 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 8fc4675

Please sign in to comment.