UNPKG

@selfcommunity/react-core

Version:

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

91 lines (88 loc) 3.48 kB
"use strict"; 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;