UNPKG

ze-react-component-library

Version:
472 lines (405 loc) 16.5 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; require("antd/lib/button/style"); var _button = _interopRequireDefault(require("antd/lib/button")); require("antd/lib/input/style"); var _input = _interopRequireDefault(require("antd/lib/input")); require("antd/lib/auto-complete/style"); var _autoComplete = _interopRequireDefault(require("antd/lib/auto-complete")); require("antd/lib/message/style"); var _message2 = _interopRequireDefault(require("antd/lib/message")); var _react = _interopRequireWildcard(require("react")); var _hooks = require("@umijs/hooks"); var _zeroetpApiSdk = require("zeroetp-api-sdk"); var _ZEHistory = _interopRequireDefault(require("../../ZEHistory")); var _weixinJsSdk = _interopRequireDefault(require("weixin-js-sdk")); require("./index.less"); var _keyboardIcon = _interopRequireDefault(require("./assets/keyboardIcon.png")); var _voiceIcon = _interopRequireDefault(require("./assets/voiceIcon.png")); var _util = require("../util"); var _index2 = require("../index"); var _request = require("../../request"); var _useLocale = _interopRequireDefault(require("../../hooks/useLocale")); var _AutoKeywords = _interopRequireWildcard(require("../AutoKeywords")); var _useRecorder = _interopRequireDefault(require("../../hooks/useRecorder")); 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; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var __spreadArray = void 0 && (void 0).__spreadArray || function (to, from) { for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) { to[j] = from[i]; } return to; }; var InputBar = function InputBar(_a) { var srcPlaceholder = _a.placeholder, loading = _a.loading, onSubmit = _a.onSubmit, onTouchStart = _a.onTouchStart, onTouchEnd = _a.onTouchEnd, questionToEdit = _a.questionToEdit; var t = (0, _useLocale.default)().t; var recorder = (0, _useRecorder.default)(); var _b = (0, _hooks.useLocalStorageState)("histories", []), history = _b[0], setHistory = _b[1]; var popRef = (0, _react.useRef)(); var _c = (0, _react.useState)(), value = _c[0], setValue = _c[1]; var _d = (0, _react.useState)(false), isRecording = _d[0], setIsRecording = _d[1]; var _e = (0, _react.useState)(0), posStart = _e[0], setPosStart = _e[1]; var recordingButton = (0, _react.useRef)(null); var _f = (0, _react.useState)("text"), mode = _f[0], setMode = _f[1]; // textByVoice指的是先voice后,变成修改模式。然后提交完后要再变为voice模式 var _g = (0, _index2.useSuggestions)(), suggestions = _g.suggestions, setSuggestions = _g.setSuggestions, getSuggestions = _g.getSuggestions; var _h = (0, _react.useState)(false), open = _h[0], setOpen = _h[1]; var _j = (0, _AutoKeywords.useInputCursor)({ text: value }), cursorText = _j.cursorText, onCursorChange = _j.onCursorChange, getNewWord = _j.getNewWord, inputRef = _j.inputRef; var saveValueToHistory = function saveValueToHistory() { if (value) { // 存储最新10条 var arr = __spreadArray([], history).filter(function (h) { return h !== value; }); if (history.length >= 10) { arr.shift(); } setHistory(__spreadArray(__spreadArray([], arr), [value])); } }; (0, _react.useEffect)(function () { window.oncontextmenu = function (e) { //取消默认的浏览器自带右键 很重要!! // TODO:测试下会不会复制文字不行了 e.preventDefault(); }; if (recordingButton === null || recordingButton === void 0 ? void 0 : recordingButton.current) { (recordingButton === null || recordingButton === void 0 ? void 0 : recordingButton.current).addEventListener("contextmenu", function (e) { e.preventDefault(); }); } setTimeout(function () { tryRecord(); // 先试一下,主要用于第一次的时候出现一个提示 }, 500); }, []); (0, _react.useEffect)(function () { if ((value === null || value === void 0 ? void 0 : value.trim().length) > 0 && mode === "voice") { submit(); } }, [value, mode]); (0, _react.useEffect)(function () { if (questionToEdit) { setMode("text"); setValue(questionToEdit); } }, [questionToEdit]); var setVoiceText = function setVoiceText(s) { var newS = s; if (newS) { newS = newS.replace(/(病痛啥|并通商)/g, "丙通沙"); newS = newS.replace(/(夏凡宁|夏凡尼)/g, "夏帆宁"); newS = newS.replace(/(或是为|卧室伟)/g, "沃士韦"); newS = newS.replace(/(威力的|韦立德)/g, "韦立得"); newS = newS.replace(/(捷夫康)/g, "捷扶康"); newS = newS.replace(/(B所为|B拖尾)/g, "必妥维"); newS = newS.replace(/(大可灰|大可会)/g, "达可挥"); newS = newS.replace(/(抒发太)/g, "舒发泰"); } setValue(newS); }; var tryRecord = function tryRecord() { try { if ((0, _util.isWeixin)()) { _weixinJsSdk.default.startRecord({ success: function success() { setTimeout(function () { _weixinJsSdk.default.stopRecord(); }, 500); }, cancel: function cancel() { _message2.default.info("用户拒绝授权"); }, fail: function fail(res) {// message.info(JSON.stringify(res)); } }); } else if ((0, _util.isLark)()) {// do nothing } else { recorder.start(); setTimeout(function () { recorder.stop(); }, 500); } } catch (error) { _message2.default.error("无法打开录音设备,请确保浏览器权限设置正确"); } }; var startRecording = function startRecording() { if (isRecording) return; setIsRecording(true); try { onTouchStart === null || onTouchStart === void 0 ? void 0 : onTouchStart(); if ((0, _util.isWeixin)()) { // 微信环境 _weixinJsSdk.default.startRecord(); } else if ((0, _util.isLark)()) { var recorderManager = window.tt.getRecorderManager(); recorderManager.onStop(function (res) { // message.info("录音结束"); var tempFilePath = res.tempFilePath; var fileSystemManager = window.tt.getFileSystemManager(); fileSystemManager.readFile({ filePath: tempFilePath, success: function success(fileRes) { // message.info("文件上传中"); try { var formData = new FormData(); formData.append("voice", new Blob([new Uint8Array(fileRes.data).buffer], { type: (0, _util.isIOS)() ? "audio/aac" : "audio/wav" })); formData.append("ua", navigator.userAgent); (0, _zeroetpApiSdk.voice)(formData).then(function (voiceRes) { if (voiceRes.result.length > 0) { setVoiceText(voiceRes.result); } }).catch(function (error) { return _message2.default.error(error.message); }); } catch (eee) { _message2.default.error(eee.message); } }, fail: function fail(failRes) { _message2.default.error("\u5F55\u97F3\u6587\u4EF6\u8BFB\u53D6\u9519\u8BEF\uFF1A" + JSON.stringify(failRes)); } }); }); recorderManager.onStart(function () {// message.info("录音开始"); }); recorderManager.onError(function (errMsg) { _message2.default.error(errMsg); }); recorderManager.start({ duration: 10000, sampleRate: 16000, numberOfChannels: 1 }); } else { recorder.start(); } } catch (error) { _message2.default.error("无法打开录音设备,请确保浏览器权限设置正确"); setIsRecording(false); } }; var stopRecording = function stopRecording(endY) { if (!isRecording) return; setIsRecording(false); onTouchEnd === null || onTouchEnd === void 0 ? void 0 : onTouchEnd(); // @ts-ignore if ((0, _util.isWeixin)()) { _weixinJsSdk.default.stopRecord({ success: function success(res) { var localId = res.localId; if (localId) { if ((0, _util.isWXWork)()) { _weixinJsSdk.default.uploadVoice({ localId: localId, isShowProgressTips: 0, success: function success(res2) { var serverId = res2.serverId; var formData = new FormData(); formData.append("platform", "wxwork"); formData.append("media_id", serverId); (0, _request.requestSuggestByVoice)(formData).then(function (res) { setVoiceText(res.result); // console.log("l666", res.result); // message.info(res.result); }).catch(function (e) {// message.error(e.message); }); }, fail: function fail(res2) {// message.error(JSON.stringify(res2)); } }); } else { _weixinJsSdk.default.translateVoice({ localId: localId, isShowProgressTips: 1, success: function success(res2) { setVoiceText(res2.translateResult); }, fail: function fail(r) { _message2.default.error(JSON.stringify(r)); } }); } } else { _message2.default.error("未获取到录音文件,可能是录音权限被关闭"); } }, fail: function fail(res) {// message.info(JSON.stringify(res)); } }); } else if ((0, _util.isLark)()) { var recorderManager = window.tt.getRecorderManager(); recorderManager.stop(); } else { recorder.stop(function (blob) { var formData = new FormData(); formData.append("voice", blob); (0, _zeroetpApiSdk.voice)(formData).then(function (res) { if (res.result.length > 0) { setVoiceText(res.result); } }).catch(function (error) { return _message2.default.error(error.message); }); }); } }; var onInputChange = function onInputChange(v) { setSuggestions([]); v.trim().length > 0 && getSuggestions(v.trim()); setValue(v); }; var submit = function submit() { saveValueToHistory(); if (value && value.trim().length > 0) { onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(value.trim()); } }; var renderDropdownContent = function renderDropdownContent(menu) { if (suggestions.length > 0 || cursorText) { return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, suggestions.length > 0 && /*#__PURE__*/_react.default.createElement("div", { style: { marginBottom: 12 } }, /*#__PURE__*/_react.default.createElement("p", { className: "ze-search-bar-history-pop-content-title" }, t("nlq.hot")), menu), cursorText && /*#__PURE__*/_react.default.createElement(_AutoKeywords.default, { question: cursorText, onClick: function onClick(w) { onInputChange(getNewWord(w)); } })); } return /*#__PURE__*/_react.default.createElement(_ZEHistory.default, { onClick: function onClick(q) { setOpen(false); setValue(q); onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(q); } }); }; var placeholder = t("nlq.searchbar.placeholder"); if (srcPlaceholder) { placeholder = srcPlaceholder; } return /*#__PURE__*/_react.default.createElement("div", { className: "inputBarContainer", ref: popRef }, /*#__PURE__*/_react.default.createElement("img", { className: "icon", src: mode === "voice" ? _keyboardIcon.default : _voiceIcon.default, onClick: function onClick() { if (mode.startsWith("text")) { setVoiceText(undefined); setMode("voice"); localStorage.setItem("inputMode", "voice"); } else { setMode("text"); localStorage.setItem("inputMode", "text"); } } }), /*#__PURE__*/_react.default.createElement("div", { className: "input" }, mode === "text" && /*#__PURE__*/_react.default.createElement(_autoComplete.default, { open: open, dropdownRender: renderDropdownContent, backfill: true, allowClear: true, options: suggestions.length > 0 ? suggestions.map(function (s) { return { label: s, value: s }; }) : // placeholder,用来触发popup展示,因为默认options为空时不会触发popup [{ label: "@@@@", value: "@@@@" }], getPopupContainer: function getPopupContainer() { return popRef.current; }, dropdownMatchSelectWidth: false, value: value, popupClassName: "ze-search-bar-history-pop-content", onChange: function onChange(v, option) { // option选中时 if (!Array.isArray(option) && (option === null || option === void 0 ? void 0 : option.value)) { setSuggestions([]); setValue(v); } }, onSearch: onInputChange, onDropdownVisibleChange: setOpen }, /*#__PURE__*/_react.default.createElement(_input.default.Search, { ref: inputRef, style: { height: "100%" }, placeholder: placeholder, onSearch: function onSearch() { return submit(); }, onKeyUp: onCursorChange, onMouseUp: onCursorChange })), mode === "voice" && /*#__PURE__*/_react.default.createElement("div", { ref: recordingButton, className: "recordingButton", onTouchStart: function onTouchStart(e) { setPosStart(e.targetTouches[0].pageY); startRecording(); }, onTouchEnd: function onTouchEnd(e) { // setPosEnd(e.changedTouches[0].pageY); stopRecording(e.changedTouches[0].pageY); }, // onTouchMove={(e) => { // 用来改UI上面的文案的,暂时不调了 // }} onMouseDown: function onMouseDown() { startRecording(); }, onMouseUp: function onMouseUp() { stopRecording(); } }, /*#__PURE__*/_react.default.createElement("div", { className: "text" }, isRecording ? "松开 结束" : "按住 说话"))), /*#__PURE__*/_react.default.createElement(_button.default, { loading: loading, type: "primary", className: "sendButton", onClick: function onClick() { submit(); } }, "\u53D1\u9001")); }; var _default = InputBar; exports.default = _default;