@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
91 lines (88 loc) • 3.48 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const react_1 = require("react");
const api_services_1 = require("@selfcommunity/api-services");
const utils_1 = require("@selfcommunity/utils");
const Cache_1 = require("../constants/Cache");
const Errors_1 = require("../constants/Errors");
/**
* Initial base url to fetch the broadcast messages
*/
const broadcastMessagesRefreshUrl = `${api_services_1.Endpoints.BroadcastMessagesList.url()}?limit=3`;
/**
* Define the key to cache results
*/
const broadcastMessagesCacheKey = (0, Cache_1.getBroadcastMessagesObjectCacheKey)();
/**
* Initial state
*/
const initialData = { results: [], next: broadcastMessagesRefreshUrl, previous: null, count: 0 };
/**
:::info
This custom hook is used to fetch broadcast messages.
:::tip Context can be consumed in this way:
```jsx
const {messages, isLoading} = useSCFetchBroadcastMessages();
```
:::
* @param props
*/
const useSCFetchBroadcastMessages = (props) => {
// PROPS
const { cacheStrategy = utils_1.CacheStrategies.CACHE_FIRST } = props || {};
// STATE
const cachedData = cacheStrategy !== utils_1.CacheStrategies.NETWORK_ONLY ? utils_1.LRUCache.get(broadcastMessagesCacheKey, null) : null;
const [data, setData] = (0, react_1.useState)(cachedData !== null ? cachedData : initialData);
const [loading, setLoading] = (0, react_1.useState)(cachedData ? false : null);
/**
* Fetch broadcast messages
* Loads until the messages are already seen
*/
const performFetchMessages = (next) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const response = yield api_services_1.http.request({
url: next,
method: api_services_1.Endpoints.BroadcastMessagesList.method,
});
const data = response.data;
if (data.next && !data.results[data.results.length - 1]['viewed_at']) {
const _data = yield performFetchMessages(data.next);
return { results: data.results.concat(_data.results), next: _data.next, previous: null, count: _data.count };
}
return data;
});
/**
* Fetch broadcast messages
*/
const fetchMessages = (refresh = false) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
setLoading(true);
return performFetchMessages(refresh ? broadcastMessagesRefreshUrl : data.next)
.then((res) => {
const _data = refresh ? res : { results: [...data.results, ...res.results], next: res.next, count: res.count, previous: res.previous };
setData(_data);
setLoading(false);
utils_1.LRUCache.set(broadcastMessagesCacheKey, _data);
return Promise.resolve(res);
})
.catch((error) => {
utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, error);
return Promise.reject();
});
});
/**
* Set broadcast messages
*/
const setMessages = (messages) => {
let _data = {
results: [...messages],
next: data.next,
count: Math.max(data.count - (data.results.length - messages.length), 0),
previous: data.previous,
};
setData(_data);
utils_1.LRUCache.set(broadcastMessagesCacheKey, _data);
return _data;
};
return { data, loading, fetchMessages, setMessages };
};
exports.default = useSCFetchBroadcastMessages;
;