UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

174 lines 6.27 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.createTextComposerEmojiMiddleware = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _mergeWith = _interopRequireDefault(require("lodash/mergeWith")); var _streamChat = require("stream-chat"); class EmojiSearchSource extends _streamChat.BaseSearchSource { type = 'emoji'; constructor(emojiSearchIndex, options) { super(options); this.emojiSearchIndex = emojiSearchIndex; } query(searchQuery) { var _this = this; return (0, _asyncToGenerator2.default)(function* () { var _yield$_this$emojiSea; if (searchQuery.length === 0) { return { items: [], next: null }; } var emojis = (_yield$_this$emojiSea = yield _this.emojiSearchIndex.search(searchQuery)) != null ? _yield$_this$emojiSea : []; return { items: emojis.filter(Boolean).slice(0, 7).map(({ emoticons = [], id, name, native, skins = [] }) => { var _skins = (0, _slicedToArray2.default)(skins, 1), firstSkin = _skins[0]; return { emoticons, id, name, native: native != null ? native : firstSkin.native }; }), next: null }; })(); } filterQueryResults(items) { return items.map(item => ({ ...item, ...(0, _streamChat.getTokenizedSuggestionDisplayName)({ displayName: item.id, searchToken: this.searchQuery }) })); } } var DEFAULT_OPTIONS = { minChars: 1, trigger: ':' }; var createTextComposerEmojiMiddleware = ({ emojiSearchIndex, options }) => { var finalOptions = (0, _mergeWith.default)(DEFAULT_OPTIONS, options != null ? options : {}); var emojiSearchSource = new EmojiSearchSource(emojiSearchIndex); emojiSearchSource.activate(); return { handlers: { onChange: function () { var _ref = (0, _asyncToGenerator2.default)(function* ({ complete, forward, next, state }) { if (!state.selection) { return forward(); } var triggerWithToken = (0, _streamChat.getTriggerCharWithToken)({ acceptTrailingSpaces: false, text: state.text.slice(0, state.selection.end), trigger: finalOptions.trigger }); var triggerWasRemoved = !triggerWithToken || triggerWithToken.length < finalOptions.minChars; if (triggerWasRemoved) { var _state$suggestions; var hasSuggestionsForTrigger = ((_state$suggestions = state.suggestions) == null ? void 0 : _state$suggestions.trigger) === finalOptions.trigger; var newState = { ...state }; if (hasSuggestionsForTrigger && newState.suggestions) { delete newState.suggestions; } return next(newState); } var newSearchTriggerred = triggerWithToken && triggerWithToken === finalOptions.trigger; if (newSearchTriggerred) { emojiSearchSource.resetStateAndActivate(); } var textWithReplacedWord = yield (0, _streamChat.replaceWordWithEntity)({ caretPosition: state.selection.end, getEntityString: function () { var _ref2 = (0, _asyncToGenerator2.default)(function* (word) { var _emoji$skins, _emoji$native; var _yield$emojiSearchSou = yield emojiSearchSource.query(word), items = _yield$emojiSearchSou.items; var emoji = items.filter(Boolean).slice(0, 10).find(({ emoticons }) => !!(emoticons != null && emoticons.includes(word))); if (!emoji) { return null; } var _ref3 = (_emoji$skins = emoji.skins) != null ? _emoji$skins : [], _ref4 = (0, _slicedToArray2.default)(_ref3, 1), firstSkin = _ref4[0]; return (_emoji$native = emoji.native) != null ? _emoji$native : firstSkin.native; }); return function getEntityString(_x2) { return _ref2.apply(this, arguments); }; }(), text: state.text }); if (textWithReplacedWord !== state.text) { return complete({ ...state, suggestions: undefined, text: textWithReplacedWord }); } return complete({ ...state, suggestions: { query: triggerWithToken.slice(1), searchSource: emojiSearchSource, trigger: finalOptions.trigger } }); }); return function onChange(_x) { return _ref.apply(this, arguments); }; }(), onSuggestionItemSelect: ({ complete, forward, state }) => { var _state$change, _state$suggestions2; var _ref5 = (_state$change = state.change) != null ? _state$change : {}, selectedSuggestion = _ref5.selectedSuggestion; if (!selectedSuggestion || ((_state$suggestions2 = state.suggestions) == null ? void 0 : _state$suggestions2.trigger) !== finalOptions.trigger) { return forward(); } emojiSearchSource.resetStateAndActivate(); return complete({ ...state, ...(0, _streamChat.insertItemWithTrigger)({ insertText: `${'native' in selectedSuggestion ? selectedSuggestion.native : ''} `, selection: state.selection, text: state.text, trigger: finalOptions.trigger }), suggestions: undefined }); } }, id: 'stream-io/react-native-sdk/emoji-middleware' }; }; exports.createTextComposerEmojiMiddleware = createTextComposerEmojiMiddleware; //# sourceMappingURL=emojiControl.js.map