diff --git a/packages/react-instantsearch/src/core/indexUtils.js b/packages/react-instantsearch/src/core/indexUtils.js index 59575331e2..66a1758d1f 100644 --- a/packages/react-instantsearch/src/core/indexUtils.js +++ b/packages/react-instantsearch/src/core/indexUtils.js @@ -187,31 +187,64 @@ export function getCurrentRefinementValue( } export function cleanUpValue(searchState, context, id) { - const index = getIndex(context); + const indexName = getIndex(context); const { namespace, attributeName } = getNamespaceAndAttributeName(id); + if (hasMultipleIndex(context) && Boolean(searchState.indices)) { - const searchStateIndex = searchState.indices[index]; - return namespace && searchStateIndex - ? { - ...searchState, - indices: { - ...searchState.indices, - [index]: { - ...searchStateIndex, - [namespace]: omit( - searchStateIndex[namespace], - `${attributeName}` - ), - }, - }, - } - : omit(searchState, `indices.${index}.${id}`); - } else { - return namespace - ? { - ...searchState, - [namespace]: omit(searchState[namespace], `${attributeName}`), - } - : omit(searchState, `${id}`); + return cleanUpValueWithMutliIndex({ + attribute: attributeName, + searchState, + indexName, + id, + namespace, + }); } + + return cleanUpValueWithSingleIndex({ + attribute: attributeName, + searchState, + id, + namespace, + }); +} + +function cleanUpValueWithSingleIndex({ + searchState, + id, + namespace, + attribute, +}) { + if (namespace) { + return { + ...searchState, + [namespace]: omit(searchState[namespace], attribute), + }; + } + + return omit(searchState, id); +} + +function cleanUpValueWithMutliIndex({ + searchState, + indexName, + id, + namespace, + attribute, +}) { + const index = searchState.indices[indexName]; + + if (namespace && index) { + return { + ...searchState, + indices: { + ...searchState.indices, + [indexName]: { + ...index, + [namespace]: omit(index[namespace], attribute), + }, + }, + }; + } + + return omit(searchState, `indices.${indexName}.${id}`); }