zmp-react
Version:
Build full featured iOS & Android apps using ZMP & React
230 lines (195 loc) • 9.05 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireWildcard(require("react"));
var _useIsomorphicLayoutEffect = require("../shared/use-isomorphic-layout-effect");
var _utils = require("../shared/utils");
var _mixins = require("../shared/mixins");
var _link = _interopRequireDefault(require("./link"));
var _input = _interopRequireDefault(require("./input"));
var _zmp = require("../shared/zmp");
var _watchProp = require("../shared/watch-prop");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
var Messagebar = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
var _zmpMessagebar = (0, _react.useRef)(null);
var updateSheetVisible = (0, _react.useRef)(false);
var updateAttachmentsVisible = (0, _react.useRef)(false);
var className = props.className,
id = props.id,
style = props.style,
sheetVisible = props.sheetVisible,
attachmentsVisible = props.attachmentsVisible,
top = props.top,
_props$resizable = props.resizable,
resizable = _props$resizable === void 0 ? true : _props$resizable,
_props$bottomOffset = props.bottomOffset,
bottomOffset = _props$bottomOffset === void 0 ? 0 : _props$bottomOffset,
_props$topOffset = props.topOffset,
topOffset = _props$topOffset === void 0 ? 0 : _props$topOffset,
maxHeight = props.maxHeight,
_props$resizePage = props.resizePage,
resizePage = _props$resizePage === void 0 ? true : _props$resizePage,
sendLink = props.sendLink,
value = props.value,
disabled = props.disabled,
readonly = props.readonly,
textareaId = props.textareaId,
name = props.name,
_props$placeholder = props.placeholder,
placeholder = _props$placeholder === void 0 ? 'Message' : _props$placeholder,
_props$init = props.init,
init = _props$init === void 0 ? true : _props$init;
var extraAttrs = (0, _utils.getExtraAttrs)(props);
var elRef = (0, _react.useRef)(null);
var areaElRef = (0, _react.useRef)(null);
var onChange = function onChange(event) {
(0, _utils.emit)(props, 'change', event);
};
var onInput = function onInput(event) {
(0, _utils.emit)(props, 'input', event);
};
var onFocus = function onFocus(event) {
(0, _utils.emit)(props, 'focus', event);
};
var onBlur = function onBlur(event) {
(0, _utils.emit)(props, 'blur', event);
};
var onClick = function onClick(event) {
var inputValue = areaElRef.current.el.value;
var clear = _zmpMessagebar.current ? function () {
_zmpMessagebar.current.clear();
} : function () {};
(0, _utils.emit)(props, 'submit', inputValue, clear);
(0, _utils.emit)(props, 'send', inputValue, clear);
(0, _utils.emit)(props, 'click', event);
};
var onAttachmentDelete = function onAttachmentDelete(instance, attachmentEl, attachmentElIndex) {
(0, _utils.emit)(props, 'messagebarAttachmentDelete', instance, attachmentEl, attachmentElIndex);
};
var onAttachmentClick = function onAttachmentClick(instance, attachmentEl, attachmentElIndex) {
(0, _utils.emit)(props, 'messagebarAttachmentClick', instance, attachmentEl, attachmentElIndex);
};
var onResizePage = function onResizePage(instance) {
(0, _utils.emit)(props, 'messagebarResizePage', instance);
};
(0, _react.useImperativeHandle)(ref, function () {
return {
el: elRef.current,
zmpMessagebar: function zmpMessagebar() {
return _zmpMessagebar.current;
}
};
});
(0, _watchProp.watchProp)(sheetVisible, function () {
if (!resizable || !_zmpMessagebar.current) return;
updateSheetVisible.current = true;
});
(0, _watchProp.watchProp)(attachmentsVisible, function () {
if (!resizable || !_zmpMessagebar.current) return;
updateAttachmentsVisible.current = true;
});
(0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(function () {
if (!_zmpMessagebar.current) return;
if (updateSheetVisible.current) {
updateSheetVisible.current = false;
_zmpMessagebar.current.sheetVisible = sheetVisible;
_zmpMessagebar.current.resizePage();
}
if (updateAttachmentsVisible.current) {
updateAttachmentsVisible.current = false;
_zmpMessagebar.current.attachmentsVisible = attachmentsVisible;
_zmpMessagebar.current.resizePage();
}
});
var onMount = function onMount() {
if (!init) return;
if (!elRef.current) return;
var params = (0, _utils.noUndefinedProps)({
el: elRef.current,
top: top,
resizePage: resizePage,
bottomOffset: bottomOffset,
topOffset: topOffset,
maxHeight: maxHeight,
on: {
attachmentDelete: onAttachmentDelete,
attachmentClick: onAttachmentClick,
resizePage: onResizePage
}
});
(0, _zmp.zmpready)(function () {
_zmpMessagebar.current = _zmp.zmp.messagebar.create(params);
});
};
var onDestroy = function onDestroy() {
if (_zmpMessagebar.current && _zmpMessagebar.current.destroy) _zmpMessagebar.current.destroy();
_zmpMessagebar.current = null;
};
(0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(function () {
onMount();
return onDestroy;
}, []);
var slots = (0, _utils.getSlots)(props);
var slotsDefault = slots.default,
slotsBeforeInner = slots['before-inner'],
slotsAfterInner = slots['after-inner'],
slotsSendLink = slots['send-link'],
slotsInnerStart = slots['inner-start'],
slotsInnerEnd = slots['inner-end'],
slotsBeforeArea = slots['before-area'],
slotsAfterArea = slots['after-area'];
var innerEndEls = [];
var messagebarAttachmentsEl;
var messagebarSheetEl;
if (slotsDefault) {
slotsDefault.forEach(function (child) {
if (typeof child === 'undefined') return;
var tag = child.type && (child.type.displayName || child.type.name);
if (tag && (tag.indexOf('messagebar-attachments') >= 0 || tag === 'ZMPMessagebarAttachments' || tag === 'zmp-messagebar-attachments')) {
messagebarAttachmentsEl = child;
} else if (tag && (tag.indexOf('messagebar-sheet') >= 0 || tag === 'ZMPMessagebarSheet' || tag === 'zmp-messagebar-sheet')) {
messagebarSheetEl = child;
} else {
innerEndEls.push(child);
}
});
}
var valueProps = {};
if ('value' in props) valueProps.value = value;
var classes = (0, _utils.classNames)(className, 'toolbar', 'messagebar', {
'messagebar-attachments-visible': attachmentsVisible,
'messagebar-sheet-visible': sheetVisible
}, (0, _mixins.colorClasses)(props));
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
id: id,
style: style,
className: classes,
ref: elRef
}, extraAttrs), slotsBeforeInner, /*#__PURE__*/_react.default.createElement("div", {
className: "toolbar-inner"
}, slotsInnerStart, /*#__PURE__*/_react.default.createElement("div", {
className: "messagebar-area"
}, slotsBeforeArea, messagebarAttachmentsEl, /*#__PURE__*/_react.default.createElement(_input.default, (0, _extends2.default)({
id: textareaId,
ref: areaElRef,
type: "textarea",
wrap: false,
placeholder: placeholder,
disabled: disabled,
name: name,
readonly: readonly,
resizable: resizable,
onInput: onInput,
onChange: onChange,
onFocus: onFocus,
onBlur: onBlur
}, valueProps)), slotsAfterArea), (sendLink && sendLink.length > 0 || slotsSendLink) && /*#__PURE__*/_react.default.createElement(_link.default, {
onClick: onClick
}, slotsSendLink || sendLink), slotsInnerEnd, innerEndEls), slotsAfterInner, messagebarSheetEl);
});
Messagebar.displayName = 'zmp-messagebar';
var _default = Messagebar;
exports.default = _default;