instantsearch-ui-components
Version:
Common UI components for InstantSearch.
176 lines (174 loc) • 8.69 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "createChatPromptComponent", {
enumerable: true,
get: function() {
return createChatPromptComponent;
}
});
var _object_spread = require("@swc/helpers/_/_object_spread");
var _object_spread_props = require("@swc/helpers/_/_object_spread_props");
var _object_without_properties = require("@swc/helpers/_/_object_without_properties");
var _lib = require("../../lib");
var _Button = require("../Button");
var _icons = require("./icons");
function createChatPromptComponent(param) {
var createElement = param.createElement;
var Button = (0, _Button.createButtonComponent)({
createElement: createElement
});
var textAreaElement = null;
var lineHeight = 0;
var padding = 0;
var adjustHeight = function adjustHeight() {
if (!textAreaElement) return;
textAreaElement.style.height = 'auto';
var fullHeight = textAreaElement.scrollHeight;
if (textAreaElement.getAttribute('data-max-rows')) {
var maxRows = parseInt(textAreaElement.getAttribute('data-max-rows') || '0', 10);
if (maxRows > 0) {
var maxHeight = maxRows * lineHeight + padding;
textAreaElement.style.overflowY = fullHeight > maxHeight ? 'auto' : 'hidden';
textAreaElement.style.height = "".concat(Math.min(fullHeight, maxHeight), "px");
return;
}
}
textAreaElement.style.overflowY = 'hidden';
textAreaElement.style.height = "".concat(fullHeight, "px");
};
var setTextAreaRef = function setTextAreaRef(element, promptRef) {
textAreaElement = element;
if (promptRef) {
promptRef.current = element;
}
if (element) {
var styles = getComputedStyle(element);
lineHeight = parseFloat(styles.lineHeight);
var pt = parseFloat(styles.paddingTop);
var pb = parseFloat(styles.paddingBottom);
padding = pt + pb;
adjustHeight();
}
};
return function ChatPrompt(userProps) {
var _userProps_classNames = userProps.classNames, classNames = _userProps_classNames === void 0 ? {} : _userProps_classNames, HeaderComponent = userProps.headerComponent, FooterComponent = userProps.footerComponent, value = userProps.value, placeholder = userProps.placeholder, _userProps_status = userProps.status, status = _userProps_status === void 0 ? 'ready' : _userProps_status, _userProps_disabled = userProps.disabled, disabled = _userProps_disabled === void 0 ? false : _userProps_disabled, _userProps_maxRows = userProps.maxRows, maxRows = _userProps_maxRows === void 0 ? 5 : _userProps_maxRows, _userProps_autoFocus = userProps.autoFocus, autoFocus = _userProps_autoFocus === void 0 ? true : _userProps_autoFocus, userTranslations = userProps.translations, onInput = userProps.onInput, onSubmit = userProps.onSubmit, onKeyDown = userProps.onKeyDown, onStop = userProps.onStop, promptRef = userProps.promptRef, props = _object_without_properties._(userProps, [
"classNames",
"headerComponent",
"footerComponent",
"value",
"placeholder",
"status",
"disabled",
"maxRows",
"autoFocus",
"translations",
"onInput",
"onSubmit",
"onKeyDown",
"onStop",
"promptRef"
]);
var translations = _object_spread._({
textareaLabel: 'Type your message...',
textareaPlaceholder: 'Type your message...',
emptyMessageTooltip: 'Message is empty',
stopResponseTooltip: 'Stop response',
sendMessageTooltip: 'Send message',
disclaimer: 'AI can make mistakes. Verify responses.'
}, userTranslations);
var cssClasses = {
root: (0, _lib.cx)('ais-ChatPrompt', classNames.root),
header: (0, _lib.cx)('ais-ChatPrompt-header', classNames.header),
body: (0, _lib.cx)('ais-ChatPrompt-body', classNames.body),
textarea: (0, _lib.cx)('ais-ChatPrompt-textarea ais-Scrollbar', disabled && 'ais-ChatPrompt-textarea--disabled', classNames.textarea),
actions: (0, _lib.cx)('ais-ChatPrompt-actions', classNames.actions, disabled && 'ais-ChatPrompt-actions--disabled'),
submit: (0, _lib.cx)('ais-ChatPrompt-submit', classNames.submit),
footer: (0, _lib.cx)('ais-ChatPrompt-footer', classNames.footer)
};
var hasValue = typeof value === 'string' ? value.trim() !== '' : Boolean(value);
var canStop = status === 'submitted' || status === 'streaming';
var buttonDisabled = !hasValue && !canStop || disabled;
var submitIcon = canStop ? /*#__PURE__*/ createElement(_icons.StopIcon, {
createElement: createElement
}) : /*#__PURE__*/ createElement(_icons.ArrowUpIcon, {
createElement: createElement
});
return /*#__PURE__*/ createElement("form", {
className: (0, _lib.cx)(cssClasses.root, props.className),
onSubmit: function onSubmit1(event) {
event.preventDefault();
if (canStop) {
onStop === null || onStop === void 0 ? void 0 : onStop();
return;
}
if (!hasValue) {
return;
}
onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(event);
}
}, HeaderComponent && /*#__PURE__*/ createElement("div", {
className: (0, _lib.cx)(cssClasses.header)
}, /*#__PURE__*/ createElement(HeaderComponent, null)), /*#__PURE__*/ createElement("div", {
className: (0, _lib.cx)(cssClasses.body),
onClick: function onClick(e) {
if (e.target === textAreaElement) return;
textAreaElement === null || textAreaElement === void 0 ? void 0 : textAreaElement.focus();
}
}, /*#__PURE__*/ createElement("textarea", _object_spread_props._(_object_spread._({}, props), {
ref: function ref(element) {
return setTextAreaRef(element, promptRef);
},
"data-max-rows": maxRows,
className: (0, _lib.cx)(cssClasses.textarea),
value: value,
placeholder: placeholder || translations.textareaPlaceholder,
"aria-label": translations.textareaLabel,
disabled: disabled,
autoFocus: autoFocus,
onInput: function onInput1(event) {
adjustHeight();
onInput === null || onInput === void 0 ? void 0 : onInput(event);
},
onKeyDown: function onKeyDown1(event) {
onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
if (event.key === 'Enter' && !event.shiftKey) {
event.preventDefault();
if (canStop) {
onStop === null || onStop === void 0 ? void 0 : onStop();
return;
}
if (!hasValue) {
return;
}
onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(event);
}
if (event.key === 'Escape') {
if (event.currentTarget && event.currentTarget.blur) {
event.currentTarget.blur();
}
}
}
})), /*#__PURE__*/ createElement("div", {
className: (0, _lib.cx)(cssClasses.actions)
}, /*#__PURE__*/ createElement(Button, {
type: "submit",
variant: "primary",
size: "sm",
iconOnly: true,
className: (0, _lib.cx)(cssClasses.submit),
disabled: buttonDisabled,
"aria-label": function() {
if (buttonDisabled) return translations.emptyMessageTooltip;
if (canStop) return translations.stopResponseTooltip;
return translations.sendMessageTooltip;
}(),
"data-status": status
}, submitIcon))), /*#__PURE__*/ createElement("div", {
className: (0, _lib.cx)(cssClasses.footer)
}, FooterComponent ? /*#__PURE__*/ createElement(FooterComponent, null) : /*#__PURE__*/ createElement("div", {
className: "ais-ChatPrompt-disclaimer"
}, translations.disclaimer)));
};
}