react-emoji-popup-lister
Version:
React emoji search & select by colon syntax, with keyboard navigation
117 lines (115 loc) • 5.2 kB
JSX
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import React from "react";
import emojiSubstring from "../util/emoji-substring";
var EmojiInput = function (_a) {
var input = _a.input, value = _a.value, setValue = _a.setValue, active = _a.active, setActive = _a.setActive, list = _a.list, emoji = _a.emoji, setEmoji = _a.setEmoji, selStart = _a.selStart, setSelStart = _a.setSelStart, setMouseNav = _a.setMouseNav, placeholder = _a.placeholder, ariaLabel = _a.ariaLabel, strict = _a.strict, props = __rest(_a, ["input", "value", "setValue", "active", "setActive", "list", "emoji", "setEmoji", "selStart", "setSelStart", "setMouseNav", "placeholder", "ariaLabel", "strict"]);
var InputField = input;
// Main input event interactivity on Keydown
var handleKeyDown = function (e) {
var _a;
// User-passed event
(_a = props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, e);
setMouseNav(false);
if (!active)
return;
var prevent = ["Enter", "ArrowDown", "ArrowUp", "Tab", "Home", "End"];
if (prevent.indexOf(e.key) > -1)
e.preventDefault();
if (e.key === "ArrowUp") {
list.prev();
}
else if (e.key === "ArrowDown") {
list.next();
}
else if (e.key === "Enter" || e.key === "Tab") {
list.select();
}
else if (e.key === "Home") {
list.index(0);
}
else if (e.key === "End") {
list.index(emoji.list.length - 1);
}
else if (e.key === "Escape") {
setEmoji(__assign(__assign({}, emoji), { search: "" }));
setActive(false);
}
};
// Determine emoji search and visibility on Keyup
var handleKeyUp = function (e) {
var _a;
// User-passed event
(_a = props.onKeyUp) === null || _a === void 0 ? void 0 : _a.call(props, e);
setMouseNav(false);
var start = selStart - 1;
var _active = active;
if (e.key === "Escape") {
setEmoji(__assign(__assign({}, emoji), { search: "" }));
setActive(false);
return;
}
// Possible state change cases
if (e.key === ":") {
_active = true;
}
else if (e.key === " ") {
_active = false;
}
else if (e.key === "Backspace" && value && value[start] === ":") {
_active = false;
}
var str = emojiSubstring(value, start, strict);
_active = str.length ? true : false;
setEmoji(__assign(__assign({}, emoji), { search: str }));
setActive(_active);
};
// Controlled input change
var handleChange = function (e) {
var _a;
// User-passed event
(_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, e);
if (e.target.selectionStart)
setSelStart(e.target.selectionStart);
setValue(e.target.value);
};
// User-passed event only
var handleClick = function (e) {
var _a;
(_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, e);
};
var handleFocus = function (e) {
var _a;
(_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
};
var handleBlur = function (e) {
var _a;
(_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
};
return (<>
{input ? (<InputField value={value} onClick={handleClick} onChange={handleChange} onKeyUp={handleKeyUp} onKeyDown={handleKeyDown} onFocus={handleFocus} onBlur={handleBlur} placeholder={placeholder || ""} aria-label={ariaLabel || "Generic input with emoji support"} className="input"/>) : (<input value={value} onClick={handleClick} onChange={handleChange} onKeyUp={handleKeyUp} onKeyDown={handleKeyDown} placeholder={placeholder || ""} aria-label={ariaLabel || "Generic input with emoji support"} onFocus={handleFocus} onBlur={handleBlur} className="input"></input>)}
<style>{"\n\t\t\t\t.input,\n\t\t\t\t.wrapper > input,\n\t\t\t\t.wrapper > textarea {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\tfont-size: inherit;\n\t\t\t\t\tfont-family: inherit;\n\t\t\t\t}\n\t\t\t"}</style>
</>);
};
export default EmojiInput;
//# sourceMappingURL=EmojiInput.jsx.map