UNPKG

cozy-search

Version:

UI components about search bar and IA assistant

225 lines (186 loc) 9.08 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _react = require("react"); var _cozyClient = require("cozy-client"); var _cozyMinilog = _interopRequireDefault(require("cozy-minilog")); var _useRealtime2 = _interopRequireDefault(require("cozy-realtime/dist/useRealtime")); var _constants = require("../components/constants"); var _queries = require("../components/queries"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } var log = (0, _cozyMinilog.default)('[useFetchConversations]'); /** * We use `client.query` manually instead of the `useQuery` hook from cozy-client * because `useQuery` currently drops the `included` array from its output state. * Without `included`, we cannot easily map the `assistant` relationship to each conversation. * * For more details on the cozy-client issue, see: * https://github.com/linagora/cozy-client/issues/1083 * * @typedef {Object} Assistant * @property {string} _id * @property {string} name * @property {string} [icon] * * @typedef {Object} ConversationWithAssistant * @property {string} _id * @property {Array} messages * @property {Assistant} assistant - The assistant object bolted on from the query's `included` relationships, or the DEFAULT_ASSISTANT fallback. * * @param {Object} [props={}] * @param {Object} [props.query={}] - Optional query filters to pass to `where()` * * @returns {{ * conversations: ConversationWithAssistant[], * hasMore: boolean, * bookmark: string|null, * isLoading: boolean, * fetchMore: function(): Promise<void>, * fetchConversations: function(string|null, Object): Promise<void> * }} */ var useFetchConversations = function useFetchConversations() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$query = _ref.query, query = _ref$query === void 0 ? {} : _ref$query; var client = (0, _cozyClient.useClient)(); var _useState = (0, _react.useState)([]), _useState2 = (0, _slicedToArray2.default)(_useState, 2), conversations = _useState2[0], setConversations = _useState2[1]; var _useState3 = (0, _react.useState)(false), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), hasMore = _useState4[0], setHasMore = _useState4[1]; var _useState5 = (0, _react.useState)(null), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), bookmark = _useState6[0], setBookmark = _useState6[1]; var _useState7 = (0, _react.useState)(false), _useState8 = (0, _slicedToArray2.default)(_useState7, 2), isLoading = _useState8[0], setIsLoading = _useState8[1]; var previousQueryRef = (0, _react.useRef)(); var latestRequestIdRef = (0, _react.useRef)(0); var conversationsQuery = (0, _react.useMemo)(function () { return (0, _queries.buildChatConversationsQuery)(); }, []); var fetchConversations = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { var bookmark, fetchQuery, requestId, _response$data, response, combinedData, _args = arguments; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: bookmark = _args.length > 0 && _args[0] !== undefined ? _args[0] : null; fetchQuery = _args.length > 1 ? _args[1] : undefined; requestId = ++latestRequestIdRef.current; setIsLoading(true); _context.prev = 4; _context.next = 7; return client.query(conversationsQuery.definition({ bookmark: bookmark, query: fetchQuery })); case 7: response = _context.sent; if (!(requestId !== latestRequestIdRef.current)) { _context.next = 10; break; } return _context.abrupt("return"); case 10: combinedData = ((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.map(function (conversation) { var _response$included; return _objectSpread(_objectSpread({}, conversation), {}, { assistant: ((_response$included = response.included) === null || _response$included === void 0 ? void 0 : _response$included.find(function (included) { var _conversation$relatio, _conversation$relatio2, _conversation$relatio3; return included._id === ((_conversation$relatio = conversation.relationships) === null || _conversation$relatio === void 0 ? void 0 : (_conversation$relatio2 = _conversation$relatio.assistant) === null || _conversation$relatio2 === void 0 ? void 0 : (_conversation$relatio3 = _conversation$relatio2.data) === null || _conversation$relatio3 === void 0 ? void 0 : _conversation$relatio3._id); })) || _constants.DEFAULT_ASSISTANT }); })) || []; setConversations(function (prev) { return !bookmark ? combinedData : [].concat((0, _toConsumableArray2.default)(prev), (0, _toConsumableArray2.default)(combinedData)); }); setHasMore(response.next); setBookmark(response.bookmark); _context.next = 19; break; case 16: _context.prev = 16; _context.t0 = _context["catch"](4); log.error('Error fetching conversations:', _context.t0); case 19: _context.prev = 19; if (requestId === latestRequestIdRef.current) { setIsLoading(false); } return _context.finish(19); case 22: case "end": return _context.stop(); } } }, _callee, null, [[4, 16, 19, 22]]); })), [client, conversationsQuery]); (0, _react.useEffect)(function () { if (!(0, _isEqual.default)(previousQueryRef.current, query)) { setConversations([]); setHasMore(false); setBookmark(null); previousQueryRef.current = query; fetchConversations(null, query); } }, [query, fetchConversations]); var refreshConversations = (0, _react.useCallback)(function () { fetchConversations(null, previousQueryRef.current); }, [fetchConversations]); (0, _useRealtime2.default)(client, (0, _defineProperty2.default)({}, _queries.CHAT_CONVERSATIONS_DOCTYPE, { created: refreshConversations, updated: refreshConversations, deleted: refreshConversations }), [refreshConversations]); var fetchMore = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() { return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!hasMore) { _context2.next = 3; break; } _context2.next = 3; return fetchConversations(bookmark, previousQueryRef.current); case 3: case "end": return _context2.stop(); } } }, _callee2); })), [hasMore, bookmark, fetchConversations]); return { conversations: conversations, hasMore: hasMore, bookmark: bookmark, isLoading: isLoading, fetchMore: fetchMore, fetchConversations: fetchConversations }; }; var _default = useFetchConversations; exports.default = _default;