UNPKG

@selfcommunity/react-core

Version:

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

72 lines (71 loc) 2.73 kB
import { useEffect, useMemo, useState } from 'react'; import { SCOPE_SC_CORE } from '../constants/Errors'; import { Endpoints, http } from '@selfcommunity/api-services'; import { CacheStrategies, Logger, LRUCache, objectWithoutProperties } from '@selfcommunity/utils'; import { getGroupObjectCacheKey } from '../constants/Cache'; import { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect'; import { useSCUser } from '../components/provider/SCUserProvider'; /** :::info This custom hook is used to fetch a group object. ::: * @param object * @param object.id * @param object.group * @param object.cacheStrategy */ export default function useSCFetchGroup({ id = null, group = null, cacheStrategy = CacheStrategies.CACHE_FIRST, }) { const __groupId = group ? group.id : id; // CONTEXT const scUserContext = useSCUser(); const authUserId = scUserContext.user ? scUserContext.user.id : null; // CACHE const __groupCacheKey = getGroupObjectCacheKey(__groupId); const __group = authUserId ? group : objectWithoutProperties(group, ['subscription_status']); const [scGroup, setScGroup] = useState(cacheStrategy !== CacheStrategies.NETWORK_ONLY ? LRUCache.get(__groupCacheKey, __group) : null); const [error, setError] = useState(null); const setSCGroup = (group) => { const _c = authUserId ? group : objectWithoutProperties(group, ['subscription_status']); setScGroup(_c); LRUCache.set(__groupCacheKey, _c); }; /** * Memoized fetchTag */ const fetchGroup = useMemo(() => () => { return http .request({ url: Endpoints.GetGroupInfo.url({ id: __groupId }), method: Endpoints.GetGroupInfo.method, }) .then((res) => { if (res.status >= 300) { return Promise.reject(res); } return Promise.resolve(res.data); }); }, [__groupId]); /** * If id attempt to get the group by id */ useEffect(() => { if (__groupId && (!scGroup || (scGroup && __groupId !== scGroup.id))) { fetchGroup() .then((obj) => { setSCGroup(obj); }) .catch((err) => { LRUCache.delete(__groupCacheKey); setError(`Group with id ${id} not found`); Logger.error(SCOPE_SC_CORE, `Group with id ${id} not found`); Logger.error(SCOPE_SC_CORE, err.message); }); } }, [__groupId, authUserId]); useDeepCompareEffectNoCheck(() => { if (group) { setSCGroup(group); } }, [group, authUserId]); return { scGroup, setSCGroup, error }; }