import { CONFIG, siteSearch } from '../globals/globalVars' import { transition } from '../library/anime' import { searchBox, configure, stats, hits, pagination } from 'instantsearch.js/es/widgets' import type { HitHighlightResult } from 'instantsearch.js/es/types/results' import instantsearch from 'instantsearch.js' import { liteClient as algoliasearch } from 'algoliasearch/lite' export function algoliaSearch () { const search = instantsearch({ indexName: CONFIG.search.indexName, searchClient: algoliasearch(CONFIG.search.appID, CONFIG.search.apiKey), // TODO 移除弃用函数 searchFunction (helper) { const searchInput = document.querySelector('.search-input') as HTMLInputElement if (searchInput.value) { helper.search() } } }) // Registering Widgets search.addWidgets([ configure({ hitsPerPage: CONFIG.search.hits.per_page || 10 }), searchBox({ container: '.search-input-container', placeholder: LOCAL.search.placeholder, // Hide default icons of algolia search showReset: false, showSubmit: false, showLoadingIndicator: false, cssClasses: { input: 'search-input' } }), stats({ container: '#search-stats', templates: { text (data) { const stats = LOCAL.search.stats .replace(/\$\{hits}/, data.nbHits.toString()) .replace(/\$\{time}/, data.processingTimeMS.toString()) return stats + '
' } } }), hits({ container: '#search-hits', templates: { item (data) { const cats = data.categories ? '' + data.categories.join('') + '' : '' return '' + cats + (data._highlightResult.title as HitHighlightResult).value + '' }, empty (data) { return '
' + LOCAL.search.empty.replace(/\$\{query}/, data.query) + '
' } }, cssClasses: { item: 'item' } }), pagination({ container: '#search-pagination', scrollTo: false, showFirst: false, showLast: false, templates: { first: '', last: '', previous: '', next: '' }, cssClasses: { root: 'pagination', item: 'pagination-item', link: 'page-number', selectedItem: 'current', disabledItem: 'disabled-item' } }) ]) search.start() // Monitor main search box const onPopupClose = () => { document.body.style.overflow = '' transition(siteSearch, 0) // "transition.shrinkOut" } siteSearch.addEventListener('click', (event) => { if (event.target === siteSearch) { onPopupClose() } }) document.querySelector('.close-btn').addEventListener('click', onPopupClose) window.addEventListener('keyup', (event) => { if (event.key === 'Escape') { onPopupClose() } }) }