From 57aff49fde01c44ba3423479213bef0ffa61b9dd Mon Sep 17 00:00:00 2001 From: Gordon Date: Tue, 19 Feb 2019 15:36:29 -0600 Subject: [PATCH] Fix createConnector getProvidedProps 3rd param --- types/react-instantsearch-core/index.d.ts | 20 +++++++- .../react-instantsearch-core-tests.tsx | 46 ++++++++++++++++++- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/types/react-instantsearch-core/index.d.ts b/types/react-instantsearch-core/index.d.ts index 0f2ec9ce61..a4bc0b194a 100644 --- a/types/react-instantsearch-core/index.d.ts +++ b/types/react-instantsearch-core/index.d.ts @@ -32,6 +32,14 @@ export function createInstantSearch( */ export function createIndex(defaultRoot: object): React.ComponentClass; +export interface ConnectorSearchResults { + results: AllSearchResults; + searching: boolean; + searchingForFacetValues: boolean; + isSearchStalled: boolean; + error: any; +} + export interface ConnectorDescription { displayName: string; propTypes?: any; @@ -50,7 +58,7 @@ export interface ConnectorDescription { this: React.Component, props: TExposed, searchState: SearchState, - searchResults: SearchResults, + searchResults: ConnectorSearchResults, metadata: any, resultsFacetValues: any, ): TProvided; @@ -495,7 +503,7 @@ export interface StateResultsProvided { */ searchResults: SearchResults; /** In case of multiple indices you can retrieve all the results */ - allSearchResults: { [index: string]: SearchResults }; + allSearchResults: AllSearchResults; /** If there is a search in progress. */ searching: boolean; /** Flag that indicates if React InstantSearch has detected that searches are stalled. */ @@ -616,6 +624,14 @@ export interface SearchResults { automaticRadius?: string; } +/** + * The shape of the searchResults object when used in a multi-index search + * https://community.algolia.com/react-instantsearch/connectors/connectStateResults.html#default-props-entry-connectStateResults-searchResults + */ +export type AllSearchResults = { + [index: string]: SearchResults; +} & SearchResults; + /** * All the records that match the search parameters. * Each record is augmented with a new attribute `_highlightResult` which is an diff --git a/types/react-instantsearch-core/react-instantsearch-core-tests.tsx b/types/react-instantsearch-core/react-instantsearch-core-tests.tsx index c115873470..76cc26f2a4 100644 --- a/types/react-instantsearch-core/react-instantsearch-core-tests.tsx +++ b/types/react-instantsearch-core/react-instantsearch-core-tests.tsx @@ -22,7 +22,10 @@ import { TranslatableProvided, translatable, ConnectorProvided, - StateResultsProvided + StateResultsProvided, + ConnectorSearchResults, + BasicDoc, + AllSearchResults } from 'react-instantsearch-core'; () => { @@ -662,3 +665,44 @@ import * as Autosuggest from 'react-autosuggest'; onSubmit={(evt) => { console.log('submitted', evt); }} />; }; + +// can we recreate connectStateResults from source using the createConnector typedef? +() => { + function getIndexId(context: any): string { + return context && context.multiIndexContext + ? context.multiIndexContext.targetedIndex + : context.ais.mainTargetedIndex; + } + + function getResults(searchResults: { results: AllSearchResults }, context: any): SearchResults | null | undefined { + const {results} = searchResults; + if (results && !results.hits) { + return results[getIndexId(context)] + ? results[getIndexId(context)] + : null; + } else { + return results ? results : null; + } + } + + const csr = createConnector({ + displayName: 'AlgoliaStateResults', + + getProvidedProps(props, searchState, searchResults) { + const results = getResults(searchResults, this.context); + + return { + searchState, + searchResults: results, + allSearchResults: searchResults.results, + searching: searchResults.searching, + isSearchStalled: searchResults.isSearchStalled, + error: searchResults.error, + searchingForFacetValues: searchResults.searchingForFacetValues, + props, + }; + }, + }); + + const asConnectStateResults: typeof connectStateResults = csr; +};