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
JavaScript
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