@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
79 lines (78 loc) • 3.07 kB
JavaScript
import { useEffect, useMemo, useState } from 'react';
import { Endpoints, http } from '@selfcommunity/api-services';
import { CacheStrategies, Logger, LRUCache } from '@selfcommunity/utils';
import { SCOPE_SC_CORE } from '../constants/Errors';
import { SCContributionType } from '@selfcommunity/types';
import { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect';
import { getFeedObjectCacheKey } from '../constants/Cache';
/**
:::info
This custom hook is used to fetch a feed object.
:::
* @param object
* @param object.id
* @param object.feedObject
* @param object.feedObjectType
* @param object.cacheStrategy
*/
export default function useSCFetchFeedObject({ id = null, feedObject = null, feedObjectType = SCContributionType.POST || SCContributionType.DISCUSSION || SCContributionType.STATUS, cacheStrategy = CacheStrategies.CACHE_FIRST, }) {
const __feedObjectId = feedObject ? feedObject.id : id;
const __feedObjectType = feedObject ? feedObject.type : feedObjectType;
// CACHE
const __feedObjectCacheKey = getFeedObjectCacheKey(__feedObjectId, __feedObjectType);
const [obj, setObj] = useState(cacheStrategy !== CacheStrategies.NETWORK_ONLY ? LRUCache.get(__feedObjectCacheKey, feedObject) : feedObject);
const [error, setError] = useState(null);
/**
* Memoized fetchFeedObject
*/
const fetchFeedObject = useMemo(() => () => {
return http
.request({
url: Endpoints.FeedObject.url({ type: __feedObjectType, id: __feedObjectId }),
method: Endpoints.FeedObject.method,
})
.then((res) => {
if (res.status >= 300) {
return Promise.reject(res);
}
return Promise.resolve(res.data);
});
}, [__feedObjectId, __feedObjectType]);
/**
* If id and feedObjectType resolve feedObject
*/
useEffect(() => {
if (__feedObjectId && __feedObjectType && !feedObject) {
fetchFeedObject()
.then((obj) => {
setObj(obj);
LRUCache.set(__feedObjectCacheKey, obj);
})
.catch((err) => {
LRUCache.delete(__feedObjectCacheKey);
setError(`FeedObject with id ${id} not found`);
Logger.error(SCOPE_SC_CORE, `FeedObject with id ${id} not found`);
Logger.error(SCOPE_SC_CORE, err.message);
});
}
}, [__feedObjectId, __feedObjectType]);
useDeepCompareEffectNoCheck(() => {
if (feedObject) {
if (cacheStrategy === CacheStrategies.NETWORK_ONLY) {
setObj(feedObject);
LRUCache.set(__feedObjectCacheKey, feedObject);
}
else {
setObj(LRUCache.get(__feedObjectCacheKey, feedObject));
}
}
}, [feedObject]);
return {
obj,
setObj: (newObj) => {
LRUCache.set(__feedObjectCacheKey, newObj);
setObj(Object.assign({}, newObj));
},
error,
};
}