UNPKG

@selfcommunity/react-core

Version:

React Core Components useful for integrating UI Community components (react-ui).

89 lines (86 loc) 3.3 kB
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;