@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
89 lines (86 loc) • 3.3 kB
JavaScript
import { __awaiter } from "tslib";
import { useState } from 'react';
import { Endpoints, http } from '@selfcommunity/api-services';
import { CacheStrategies, Logger, LRUCache } from '@selfcommunity/utils';
import { getBroadcastMessagesObjectCacheKey } from '../constants/Cache';
import { SCOPE_SC_CORE } from '../constants/Errors';
/**
* Initial base url to fetch the broadcast messages
*/
const broadcastMessagesRefreshUrl = `${Endpoints.BroadcastMessagesList.url()}?limit=3`;
/**
* Define the key to cache results
*/
const broadcastMessagesCacheKey = 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 = CacheStrategies.CACHE_FIRST } = props || {};
// STATE
const cachedData = cacheStrategy !== CacheStrategies.NETWORK_ONLY ? LRUCache.get(broadcastMessagesCacheKey, null) : null;
const [data, setData] = useState(cachedData !== null ? cachedData : initialData);
const [loading, setLoading] = useState(cachedData ? false : null);
/**
* Fetch broadcast messages
* Loads until the messages are already seen
*/
const performFetchMessages = (next) => __awaiter(void 0, void 0, void 0, function* () {
const response = yield http.request({
url: next,
method: 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) => __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);
LRUCache.set(broadcastMessagesCacheKey, _data);
return Promise.resolve(res);
})
.catch((error) => {
Logger.error(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);
LRUCache.set(broadcastMessagesCacheKey, _data);
return _data;
};
return { data, loading, fetchMessages, setMessages };
};
export default useSCFetchBroadcastMessages;