cozy-search
Version:
UI components about search bar and IA assistant
216 lines (178 loc) • 7.15 kB
JavaScript
;
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;