// @jsx h import { h } from 'dom-chef' import classnames from 'classnames' let alreadyRunning = false const store = {} const cachedFetch = (url) => store[url] ? new Promise((resolve) => { resolve(store[url]) store[url] = store[url].clone() }) : new Promise((resolve) => fetch(url).then((response) => { resolve(response) store[url] = response.clone() }) ) export const mount = (formEl, args = {}) => ((t, c) => c(t))( { clickOutsideHandler: (e) => ({ mode: 'inline', ...args }.mode !== 'modal' && !formEl.contains(e.target) && fadeOutAndRemove(formEl.querySelector('.ct-search-results'))), maybeEl: formEl.querySelector('input[type="search"]'), }, ({ clickOutsideHandler, maybeEl }) => { const options = { postType: 'ct_forced_any', // inline | modal mode: 'inline', perPage: 5, ...args, } if (!maybeEl) { return } options.postType = formEl.querySelector('[name="post_type"]') ? `ct_forced_${ formEl.querySelector('[name="post_type"]').value }` : formEl.querySelector('[name="ct_post_type"]') ? `ct_forced_${ formEl.querySelector('[name="ct_post_type"]').value }` : 'ct_forced_any' if (!window.fetch) return let listener = debounce((e) => { document.removeEventListener('click', clickOutsideHandler) document.addEventListener('click', clickOutsideHandler) if (e.target.value.trim().length === 0) { fadeOutAndRemove(formEl.querySelector('.ct-search-results')) return } formEl.classList.add('ct-searching') cachedFetch( `${ct_localizations.rest_url}wp/v2/posts${ ct_localizations.rest_url.indexOf('?') > -1 ? '&' : '?' }_embed=1&post_type=${options.postType}&per_page=${ options.perPage }&search=${e.target.value}` ).then((response) => { let totalAmountOfPosts = parseInt( response.headers.get('X-WP-Total'), 10 ) response.json().then((posts) => { if (alreadyRunning) { return } formEl.classList.remove('ct-searching') let itHadSearchResultsBefore = !!formEl.querySelector( '.ct-search-results' ) alreadyRunning = true let searchResults = formEl.querySelector( '.ct-search-results' ) let { height: heightBeforeRemoval } = searchResults ? searchResults.getBoundingClientRect() : 0 if ( searchResults && !( e.target.value.trim().length === 0 || posts.length === 0 ) ) { /** * Should just quickly replace the list * when results are available */ searchResults && formEl.removeChild(searchResults) } else { if ( e.target.value.trim().length === 0 || posts.length === 0 ) { fadeOutAndRemove(searchResults) } } if ( posts.length > 0 && e.target.value.trim().length > 0 ) { let searchResultsEl = (