diff --git a/searchlib/components/SearchApp/LandingPageApp.jsx b/searchlib/components/SearchApp/LandingPageApp.jsx index 5e19669d6..853a65a1a 100644 --- a/searchlib/components/SearchApp/LandingPageApp.jsx +++ b/searchlib/components/SearchApp/LandingPageApp.jsx @@ -1,12 +1,33 @@ +import React from 'react'; import BasicSearchApp from './BasicSearchApp'; +import { useSearchDriver } from '@eeacms/search/lib/hocs'; +import { stateToQueryString } from '@eeacms/search'; function BoostrapLandingPageView(props) { - const { appConfig, registry } = props; + const { appConfig, registry, onSubmitSearch } = props; const InitialViewComponent = appConfig.initialView?.factory && registry.resolve[appConfig.initialView.factory].component; + const driver = useSearchDriver(); + const timerRef = React.useRef(); + + React.useEffect(() => { + function handler(state) { + timerRef.current && clearTimeout(timerRef.current); + timerRef.current = setTimeout(() => { + onSubmitSearch(stateToQueryString(state)); + }, 200); + } + + if (driver && onSubmitSearch) { + driver.subscriptions.push(handler); + } + + return () => timerRef.current && clearTimeout(timerRef.current); + }, [driver, onSubmitSearch]); + return ; } diff --git a/searchlib/components/SearchApp/useSearchApp.js b/searchlib/components/SearchApp/useSearchApp.js index e8bc6fcb3..fdee34e5c 100644 --- a/searchlib/components/SearchApp/useSearchApp.js +++ b/searchlib/components/SearchApp/useSearchApp.js @@ -85,6 +85,10 @@ export default function useSearchApp({ : {}), ...(initialState || {}), }, + // we don't want to track the URL if our search app is configured as + // a simple separate app (for ex. search input or landing page that + // trampolines to another instance) + trackUrlState: appConfig.url ? false : appConfig.trackUrlState, }), [appConfig, onAutocomplete, onSearch, locationSearchTerm, initialState], ); diff --git a/searchlib/index.js b/searchlib/index.js index 419e368b2..b604020f6 100644 --- a/searchlib/index.js +++ b/searchlib/index.js @@ -7,6 +7,7 @@ export * from './lib/utils'; export * from './lib/hocs'; export * from './lib/search'; export * from './lib/models'; +export * from './lib/serialize'; export * from './state'; export * from './constants'; diff --git a/src/SearchBlock/templates/LandingPageView.jsx b/src/SearchBlock/templates/LandingPageView.jsx index f02f32276..9ef3ecdf4 100644 --- a/src/SearchBlock/templates/LandingPageView.jsx +++ b/src/SearchBlock/templates/LandingPageView.jsx @@ -1,10 +1,26 @@ import React from 'react'; import { LandingPageApp } from '@eeacms/search'; +import { useHistory } from 'react-router-dom'; +import { flattenToAppURL } from '@plone/volto/helpers'; function LandingPageView(props) { + const history = useHistory(); + const { registry, appName } = props; + const appConfig = registry.searchui[appName]; + const url = flattenToAppURL(appConfig.url || ''); + return ( <> - + { + history.push(`${url}?${qs}`); + } + : null + } + /> {props.children} ); @@ -15,6 +31,7 @@ LandingPageView.schemaEnhancer = ({ schema }) => { schema.properties.url = { title: 'Results page', widget: 'url', + configPath: 'url', }; return schema;