@nutgaard/use-fetch
Version:
A useFetch hook to be used with react@^16.8.0
76 lines • 2.98 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
var use_async_1 = require("@nutgaard/use-async");
var react_1 = require("react");
var fetch_cache_1 = require("./fetch-cache");
var fetch_cache_2 = require("./fetch-cache");
exports.cache = fetch_cache_2.default;
__export(require("@nutgaard/use-async"));
function createCacheKey(url, option) {
var method = (option && option.method) || 'GET';
var body = (option && option.body && option.body.toString()) || '';
var headers = (option && option.headers && JSON.stringify(option.headers)) || '';
return [url, method.toUpperCase(), body, headers].join('||');
}
exports.createCacheKey = createCacheKey;
function setCacheKeyGenerator(keygenerator) {
cacheKeyCreator = keygenerator;
}
exports.setCacheKeyGenerator = setCacheKeyGenerator;
var cacheKeyCreator = createCacheKey;
function handleResponse(response, setStatusCode, cacheKey) {
return response
.then(function (resp) {
setStatusCode(resp.status);
if (!resp.ok) {
throw new Error(resp.statusText);
}
if ([200, 201, 203, 206].includes(resp.status)) {
return resp.json();
}
return;
})
.then(function (json) {
fetch_cache_1.default.putResolved(cacheKey, json);
return json;
});
}
function useFetch(url, option, config) {
if (config === void 0) { config = {
lazy: false,
cacheKey: undefined
}; }
var _a = react_1.useState(-1), statusCode = _a[0], setStatusCode = _a[1];
var cacheKey = config.cacheKey || cacheKeyCreator(url, option);
var source = react_1.useCallback(function (isRerun) {
setStatusCode(-1);
var response = isRerun ? fetch(url, option) : fetch_cache_1.default.fetch(cacheKey, url, option);
if (isRerun) {
fetch_cache_1.default.put(cacheKey, response);
}
return handleResponse(response, setStatusCode, cacheKey);
}, [url, option, cacheKey]);
var initialConfig = fetch_cache_1.default.hasKeyResolved(cacheKey)
? { status: use_async_1.Status.OK, data: fetch_cache_1.default.getResolved(cacheKey) }
: undefined;
var asyncResult = use_async_1.default(source, config.lazy, [source], initialConfig);
return react_1.useMemo(function () {
return __assign({}, asyncResult, { statusCode: statusCode });
}, [asyncResult, statusCode]);
}
exports.default = useFetch;
//# sourceMappingURL=use-fetch.js.map