@kgdata/use-chat
Version:
use-chat
429 lines (357 loc) • 12.3 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function () {
var self = this,
args = arguments;
return new Promise(function (resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
function _iterableToArrayLimit(arr, i) {
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
if (_i == null) return;
var _arr = [];
var _n = true;
var _d = false;
var _s, _e;
try {
for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
return arr2;
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var BasicStorage = /*#__PURE__*/function () {
function BasicStorage(_ref) {
var initMessageList = _ref.initMessageList;
_classCallCheck(this, BasicStorage);
this.messageList = [];
this.messageList = initMessageList;
}
_createClass(BasicStorage, [{
key: "setMessageList",
value:
/**
* 更新list
* @param messageList
* @return void
*/
function setMessageList(messageList) {
this.messageList = messageList;
return JSON.parse(JSON.stringify(this.messageList));
}
/*
* add list
*/
}, {
key: "addMessageList",
value: function addMessageList(message) {
var addType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'push';
var addMessage = Array.isArray(message) ? message : [message];
if (addType === 'push') {
this.messageList = [].concat(_toConsumableArray(this.messageList), _toConsumableArray(addMessage));
}
if (addType === 'unshift') {
this.messageList = [].concat(_toConsumableArray(addMessage), _toConsumableArray(this.messageList));
}
return JSON.parse(JSON.stringify(this.messageList));
}
/*
*获取 list
*/
}, {
key: "getMessageItem",
value: function getMessageItem(key) {
var keyx = this.messageList.findIndex(function (message) {
return message.key === key;
});
if (keyx !== -1) {
return [this.messageList[keyx], keyx];
} else {
return [undefined, undefined];
}
}
}, {
key: "getMessageList",
value: function getMessageList() {
return this.messageList;
}
/**
* Replace message in message collection
* @param message
*/
}, {
key: "updateMessageItem",
value: function updateMessageItem(message) {
var _this$getMessageItem = this.getMessageItem(message.key),
_this$getMessageItem2 = _slicedToArray(_this$getMessageItem, 2),
foundMessage = _this$getMessageItem2[0],
idx = _this$getMessageItem2[1];
if (foundMessage) {
this.messageList = this.messageList.concat(this.messageList.slice(0, idx)).concat(message).concat(this.messageList.slice(idx + 1));
}
return JSON.parse(JSON.stringify(this.messageList));
}
}, {
key: "removeMessageList",
value: function removeMessageList(keys) {
var removMessage = Array.isArray(keys) ? keys : [keys];
this.messageList = this.messageList.filter(function (item) {
return !removMessage.includes(item.key);
});
return JSON.parse(JSON.stringify(this.messageList));
}
}]);
return BasicStorage;
}();
var ChatContext = /*#__PURE__*/React.createContext(undefined);
ChatContext.displayName = 'ChatContext';
var useChat = function useChat() {
var context = React.useContext(ChatContext);
if (!context) {
throw new Error('useChat must be within ChatProvider');
}
return context;
};
var useStorage = function useStorage(_ref) {
var _ref$initMessageList = _ref.initMessageList,
initMessageList = _ref$initMessageList === void 0 ? [] : _ref$initMessageList;
var Storage = new BasicStorage({
initMessageList: initMessageList
});
return [Storage];
};
var ChatProvider = function ChatProvider(_ref2) {
var children = _ref2.children,
storage = _ref2.storage,
config = _ref2.config;
var initChatRequestType = config.initChatRequestType,
requests = config.requests,
wsRequest = config.wsRequest;
var _useState = React.useState(storage.getMessageList()),
_useState2 = _slicedToArray(_useState, 2),
state = _useState2[0],
setState = _useState2[1];
var _useState3 = React.useState(initChatRequestType || 'http'),
_useState4 = _slicedToArray(_useState3, 2),
chatRequestType = _useState4[0],
setChatRequestType = _useState4[1];
var wsRequestRef = React.useRef();
/**
* @description
* @param params 发送的参数
*
*
* **/
var sendMessage = React.useCallback( /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(params) {
var data, newMessageList, _wsRequestRef$current, _newMessageList;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(chatRequestType === 'http')) {
_context.next = 7;
break;
}
storage.addMessageList(params);
_context.next = 4;
return requests.send(params);
case 4:
data = _context.sent;
newMessageList = storage.addMessageList(data);
setState(newMessageList);
case 7:
if (chatRequestType === 'ws') {
_newMessageList = storage.addMessageList(params);
(_wsRequestRef$current = wsRequestRef.current) === null || _wsRequestRef$current === void 0 ? void 0 : _wsRequestRef$current.send(params);
setState(_newMessageList);
}
case 8:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function (_x) {
return _ref3.apply(this, arguments);
};
}(), [chatRequestType]);
/**
*
* @param message 添加的数据;
* @param addType 添加的类型 默认为push (push | unshift)
**/
var addMessageList = function addMessageList(message) {
var addType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'push';
var messageList = storage.addMessageList(message, addType);
setState(messageList);
};
/**
* @param message 更新的数据
* **/
var upDateMessageItem = function upDateMessageItem(message) {
var messageList = storage.updateMessageItem(message);
setState(messageList);
};
/**
*
*
*/
var getMessageItem = function getMessageItem(key, callback) {
callback(storage.getMessageItem(key)[0]);
};
var setMessageList = function setMessageList(message) {
var messageList = storage.setMessageList(message);
setState(messageList);
};
var removeMessageList = function removeMessageList(keys) {
var messageList = storage.removeMessageList(keys);
setState(messageList);
};
var handleRequest = /*#__PURE__*/function () {
var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(params, service, callback) {
var data;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return service(params);
case 2:
data = _context2.sent;
callback(data);
case 4:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return function handleRequest(_x2, _x3, _x4) {
return _ref4.apply(this, arguments);
};
}();
React.useEffect(function () {
if (chatRequestType === 'ws') {
wsRequestRef.current = wsRequest && wsRequest({
addMessageList: addMessageList,
upDateMessageItem: upDateMessageItem
});
}
return function () {
if (wsRequestRef.current) {
wsRequestRef.current.close();
wsRequestRef.current = undefined;
}
};
}, [chatRequestType]);
return /*#__PURE__*/React__default['default'].createElement(ChatContext.Provider, {
value: {
messagesList: state,
chatRequestType: chatRequestType,
sendMessage: sendMessage,
addMessageList: addMessageList,
upDateMessageItem: upDateMessageItem,
removeMessageList: removeMessageList,
setChatRequestType: setChatRequestType,
getMessageItem: getMessageItem,
setMessageList: setMessageList,
handleRequest: handleRequest
}
}, children);
};
exports.BasicStorage = BasicStorage;
exports.ChatProvider = ChatProvider;
exports.useChat = useChat;
exports.useStorage = useStorage;