UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

54 lines (51 loc) 2.15 kB
import React__default, { useMemo } from 'react'; import { suggestionsCalculator } from './index.js'; import { ActionList } from '../../../ActionList/index.js'; import { score } from 'fzy.js'; import Text from '../../../Text/Text.js'; const trigger = { triggerChar: '#', multiWord: true }; const referenceToSuggestion = reference => ({ value: reference.id, render: props => /*#__PURE__*/React__default.createElement(ActionList.Item, props, reference.iconHtml && /*#__PURE__*/React__default.createElement(ActionList.LeadingVisual, null, /*#__PURE__*/React__default.createElement("span", { dangerouslySetInnerHTML: { __html: reference.iconHtml } })), /*#__PURE__*/React__default.createElement(Text, { sx: { fontWeight: 'bold', whiteSpace: 'nowrap', textOverflow: 'ellipsis', display: 'block', overflow: 'hidden', maxWidth: 400 } }, /*#__PURE__*/React__default.createElement("span", { dangerouslySetInnerHTML: { __html: reference.titleHtml } })), ' ', /*#__PURE__*/React__default.createElement(ActionList.Description, null, "#", reference.id)) }); const scoreSuggestion = (query, reference) => { // fzy unituitively returns Infinity if the length of the item is less than or equal to the length of the query const fzyScore = score(query, `${reference.id} ${reference.titleText}`); // Here, unlike for mentionables, we don't need to check for equality because the user's query // can never equal the search string (we don't do filtering if the query is in "#123 some text" form) return fzyScore === Infinity ? -Infinity : fzyScore; }; const useReferenceSuggestions = references => { const calculateSuggestions = useMemo(() => { const calculator = suggestionsCalculator(references, scoreSuggestion, referenceToSuggestion); return async query => { if (/^\d+\s/.test(query)) return []; // don't return anything if the query is in the form #123 ..., assuming they already have the number they want return calculator(query); }; }, [references]); return { calculateSuggestions, trigger }; }; export { useReferenceSuggestions };