UNPKG

cozy-search

Version:

UI components about search bar and IA assistant

216 lines (178 loc) 7.15 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useFetchResult = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _react = require("react"); var _reactRouterDom = require("react-router-dom"); var _cozyClient = require("cozy-client"); var _cozyDataproxyLib = require("cozy-dataproxy-lib"); var _cozyMinilog = _interopRequireDefault(require("cozy-minilog")); var _getIconForSearchResult = require("./getIconForSearchResult"); var _excluded = ["maxRetries", "delay"]; var log = (0, _cozyMinilog.default)('🔍 [useFetchResult]'); var searchWithRetry = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(dataProxy, searchValue) { var options, _options$maxRetries, maxRetries, _options$delay, delay, searchOptions, currentDelay, attempt, searchResults, _args = arguments; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: options = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}; _options$maxRetries = options.maxRetries, maxRetries = _options$maxRetries === void 0 ? 5 : _options$maxRetries, _options$delay = options.delay, delay = _options$delay === void 0 ? 500 : _options$delay, searchOptions = (0, _objectWithoutProperties2.default)(options, _excluded); currentDelay = delay; // Make several search attemps in case it is not ready yet attempt = 0; case 4: if (!(attempt < maxRetries)) { _context.next = 17; break; } _context.next = 7; return dataProxy.search(searchValue, searchOptions); case 7: searchResults = _context.sent; if (!searchResults) { _context.next = 10; break; } return _context.abrupt("return", searchResults); case 10: log.info("Search attempt ".concat(attempt + 1, " failed, retrying in ").concat(currentDelay, " ms...")); _context.next = 13; return new Promise(function (resolve) { return setTimeout(resolve, currentDelay); }); case 13: currentDelay *= 2; // Exponential backoff case 14: attempt++; _context.next = 4; break; case 17: log.error("Search failed after ".concat(maxRetries, " attempts")); return _context.abrupt("return", []); case 19: case "end": return _context.stop(); } } }, _callee); })); return function searchWithRetry(_x, _x2) { return _ref.apply(this, arguments); }; }(); var useFetchResult = function useFetchResult(searchValue) { var searchOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var client = (0, _cozyClient.useClient)(); var navigate = (0, _reactRouterDom.useNavigate)(); var _useState = (0, _react.useState)({ isLoading: true, results: null, searchValue: null }), _useState2 = (0, _slicedToArray2.default)(_useState, 2), state = _useState2[0], setState = _useState2[1]; var dataProxy = (0, _cozyDataproxyLib.useDataProxy)(); (0, _react.useEffect)(function () { var fetch = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(searchValue, searchOptions) { var searchResults, results; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (dataProxy.dataProxyServicesAvailable) { _context2.next = 3; break; } log.log('DataProxy services are not available. Skipping search...'); return _context2.abrupt("return"); case 3: setState({ isLoading: true, results: null, searchValue: searchValue }); _context2.next = 6; return searchWithRetry(dataProxy, searchValue, searchOptions); case 6: searchResults = _context2.sent; results = searchResults.map(function (r) { // Begin Retrocompatibility code, to be removed when following PR is merged: https://github.com/cozy/cozy-web-data-proxy/pull/10 r.slug = r.slug || r.type; r.subTitle = r.subTitle || r.name; // End Retrocompatibility code var icon = (0, _getIconForSearchResult.getIconForSearchResult)(r); return { id: r.doc._id, icon: icon, slug: r.slug, url: r.url, secondaryUrl: r.secondaryUrl, primary: r.title, secondary: r.subTitle, onClick: function onClick() { if (r.slug === client.appMetadata.slug) { try { var url = new URL(r.url); var hash = url.hash.replace('#', ''); navigate(hash); } catch (_unused) { window.open(r.url); } } else { window.open(r.url); } } }; }); setState({ isLoading: false, results: results, searchValue: searchValue }); case 9: case "end": return _context2.stop(); } } }, _callee2); })); return function fetch(_x3, _x4) { return _ref2.apply(this, arguments); }; }(); if (searchValue) { if (searchValue !== state.searchValue) { fetch(searchValue, searchOptions); } } else { // eslint-disable-next-line react-hooks/set-state-in-effect setState({ isLoading: true, results: null, searchValue: null }); } }, [dataProxy, searchValue, state.searchValue, setState]); return { isLoading: state.isLoading, results: state.results }; }; exports.useFetchResult = useFetchResult;