UNPKG

@algolia/autocomplete-core

Version:

Core primitives for building autocomplete experiences.

77 lines (75 loc) 2.33 kB
// We don't have access to the autocomplete source when we call `onKeyDown` // or `onClick` because those are native browser events. // However, we can get the source from the suggestion index. function getCollectionFromActiveItemId(state) { // Given 3 sources with respectively 1, 2 and 3 suggestions: [1, 2, 3] // We want to get the accumulated counts: // [1, 1 + 2, 1 + 2 + 3] = [1, 3, 3 + 3] = [1, 3, 6] var accumulatedCollectionsCount = state.collections.map(function (collections) { return collections.items.length; }).reduce(function (acc, collectionsCount, index) { var previousValue = acc[index - 1] || 0; var nextValue = previousValue + collectionsCount; acc.push(nextValue); return acc; }, []); // Based on the accumulated counts, we can infer the index of the suggestion. var collectionIndex = accumulatedCollectionsCount.reduce(function (acc, current) { if (current <= state.activeItemId) { return acc + 1; } return acc; }, 0); return state.collections[collectionIndex]; } /** * Gets the highlighted index relative to a suggestion object (not the absolute * highlighted index). * * Example: * [['a', 'b'], ['c', 'd', 'e'], ['f']] * ↑ * (absolute: 3, relative: 1) */ function getRelativeActiveItemId(_ref) { var state = _ref.state, collection = _ref.collection; var isOffsetFound = false; var counter = 0; var previousItemsOffset = 0; while (isOffsetFound === false) { var currentCollection = state.collections[counter]; if (currentCollection === collection) { isOffsetFound = true; break; } previousItemsOffset += currentCollection.items.length; counter++; } return state.activeItemId - previousItemsOffset; } export function getActiveItem(state) { var collection = getCollectionFromActiveItemId(state); if (!collection) { return null; } var item = collection.items[getRelativeActiveItemId({ state: state, collection: collection })]; var source = collection.source; var itemInputValue = source.getItemInputValue({ item: item, state: state }); var itemUrl = source.getItemUrl({ item: item, state: state }); return { item: item, itemInputValue: itemInputValue, itemUrl: itemUrl, source: source }; }