valaxy-theme-sakura
Version:
<h1 align="center">valaxy-theme-sakura</h1> <pre align="center"> 一个简单、个性化、可爱的动漫风格博客主题 ❥(ゝω・✿ฺ) </pre>
101 lines (81 loc) • 2.93 kB
text/typescript
import { useEventListener } from '@vueuse/core'
import { useSiteConfig } from 'valaxy'
import { computed, onMounted, ref, watchEffect } from 'vue'
import { loadAlgolia } from '../plugins/algolia'
// import type { UseFuseOptions } from '@vueuse/integrations/useFuse'
// import { useFuse } from '@vueuse/integrations/useFuse'
// import type { FuseListItem } from 'valaxy/types'
import { useSakuraAppStore } from '../stores'
export function useSearchHotKey(togglePopup: () => void) {
function handleSearchHotKey(event: KeyboardEvent) {
if (event.key.toLowerCase() === 'k' && (event.metaKey || event.ctrlKey)) {
event.preventDefault()
togglePopup()
}
}
onMounted(() => {
useEventListener('keydown', handleSearchHotKey)
})
}
const searchInitialized = ref(false)
export function useSearch() {
const sakuraApp = useSakuraAppStore()
const siteConfig = useSiteConfig()
const searchType = computed(() => siteConfig.value.search.type)
const initializeSearch = (searchPopup = sakuraApp.search) => {
const handlers: Record<string, () => void> = {
fuse: () => useSearchHotKey(searchPopup.toggle),
algolia: () => watchEffect(() => {
if (searchPopup.isOpen)
loadAlgolia()
}),
}
const handler = handlers[searchType.value] || (() => {
console.warn('Warning: Unsupported search type. Defaulting to Fuse search.')
return handlers.fuse()
})
handler()
}
if (!searchInitialized.value) {
initializeSearch()
searchInitialized.value = true
}
return sakuraApp.search
}
// export function useFuseSearch() {
// const siteConfig = useSiteConfig()
// const inputRef = ref('')
// const fuseListData = ref<FuseListItem[]>([])
// const keys = computed(() => {
// const ks = siteConfig.value.fuse.options.keys || []
// return ks.length === 0 ? ['title', 'tags', 'categories', 'excerpt'] : ks
// })
// const useFuseOptions = computed<UseFuseOptions<FuseListItem>>(() => ({
// fuseOptions: {
// includeMatches: true,
// findAllMatches: true,
// ...siteConfig.value.fuse.options,
// keys: keys.value,
// // threshold: 0.99,
// // ignoreLocation: true,
// },
// // resultLimit: resultLimit.value,
// // matchAllWhenSearchEmpty: matchAllWhenSearchEmpty.value,
// }))
// const ruse = useFuse(inputRef, fuseListData, useFuseOptions)
// async function fetchFuseListData(path?: string) {
// const fuseListDataPath = path
// || (siteConfig.value.fuse.dataPath.startsWith('http')
// ? siteConfig.value.fuse.dataPath
// : `${import.meta.env.BASE_URL}${siteConfig.value.fuse.dataPath}`)
// const res = await fetch(fuseListDataPath)
// const data = await res.json()
// if (Array.isArray(data))
// fuseListData.value = data
// }
// return {
// inputRef,
// ruse,
// fetchFuseListData,
// }
// }