UNPKG

@selfcommunity/react-core

Version:

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

84 lines (81 loc) 3.46 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { FeatureService, PreferenceService } from '@selfcommunity/api-services'; import { Logger } from '@selfcommunity/utils'; import { createContext, useContext, useEffect, useState } from 'react'; import { SCOPE_SC_CORE } from '../../../constants/Errors'; import { useSCContext } from '../SCContextProvider'; /** * Creates Preferences/Features Context * :::tip Context can be consumed in one of the following ways: ```jsx 1. <SCPreferencesContext.Consumer>{(preferences) => (...)}</SCPreferencesContext.Consumer> ``` ```jsx 2. const scPreferences: SCPreferencesType = useContext(SCPreferencesContext); ``` ```jsx 3. const scPreferences: SCPreferencesType = useSCPreferences(); ```` ::: */ export const SCPreferencesContext = createContext({}); /** * #### Description: * This component imports all preferences and features enabled. * @param children * @return * ```jsx * <SCPreferencesContext.Provider value={{preferences, features}}>{!loading && children}</SCPreferencesContext.Provider> * ``` */ export default function SCPreferencesProvider({ children = null }) { const scContext = useSCContext(); const [preferences, setPreferences] = useState(scContext.settings.preferences.preferences); const [features, setFeatures] = useState(scContext.settings.preferences.features); const [, setError] = useState(); const [loading, setLoading] = useState(!(Object.keys(scContext.settings.preferences.preferences).length && scContext.settings.preferences.features.length)); /** * Load all dynamic preferences and features enabled * to manages configurations of the project */ useEffect(() => { Promise.all([PreferenceService.getAllPreferences(), FeatureService.getAllFeatures()]) .then(function ([preferences, features]) { setPreferences(preferences['results'].reduce((obj, p) => (Object.assign(Object.assign({}, obj), { [`${p.section}.${p.name}`]: p })), {})); setFeatures(features['results'].filter((f) => f.enabled).map((f) => f.name)); setLoading(false); }) .catch((_error) => { Logger.error(SCOPE_SC_CORE, _error); setError(_error); // setLoading(false); }); }, []); /** * Force refresh of preferences & features */ const refresh = () => { Promise.all([PreferenceService.getAllPreferences(), FeatureService.getAllFeatures()]) .then(function ([preferences, features]) { setPreferences(preferences['results'].reduce((obj, p) => (Object.assign(Object.assign({}, obj), { [`${p.section}.${p.name}`]: p })), {})); setFeatures(features['results'].filter((f) => f.enabled).map((f) => f.name)); }) .catch((_error) => { Logger.error(SCOPE_SC_CORE, _error); setError(_error); }); }; /** * Nesting all necessary providers * All child components will use help contexts to works */ return (_jsx(SCPreferencesContext.Provider, Object.assign({ value: { preferences, features, setPreferences, setFeatures, refresh } }, { children: !loading && children }))); } /** * Let's only export the `useSCPreferences` hook instead of the context. * We only want to use the hook directly and never the context component. */ export function useSCPreferences() { return useContext(SCPreferencesContext); }