UNPKG

@selfcommunity/react-core

Version:

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

89 lines (86 loc) 3.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useSCPreferences = exports.SCPreferencesContext = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const api_services_1 = require("@selfcommunity/api-services"); const utils_1 = require("@selfcommunity/utils"); const react_1 = require("react"); const Errors_1 = require("../../../constants/Errors"); const SCContextProvider_1 = require("../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(); ```` ::: */ exports.SCPreferencesContext = (0, react_1.createContext)({}); /** * #### Description: * This component imports all preferences and features enabled. * @param children * @return * ```jsx * <SCPreferencesContext.Provider value={{preferences, features}}>{!loading && children}</SCPreferencesContext.Provider> * ``` */ function SCPreferencesProvider({ children = null }) { const scContext = (0, SCContextProvider_1.useSCContext)(); const [preferences, setPreferences] = (0, react_1.useState)(scContext.settings.preferences.preferences); const [features, setFeatures] = (0, react_1.useState)(scContext.settings.preferences.features); const [, setError] = (0, react_1.useState)(); const [loading, setLoading] = (0, react_1.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 */ (0, react_1.useEffect)(() => { Promise.all([api_services_1.PreferenceService.getAllPreferences(), api_services_1.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) => { utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, _error); setError(_error); // setLoading(false); }); }, []); /** * Force refresh of preferences & features */ const refresh = () => { Promise.all([api_services_1.PreferenceService.getAllPreferences(), api_services_1.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) => { utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, _error); setError(_error); }); }; /** * Nesting all necessary providers * All child components will use help contexts to works */ return ((0, jsx_runtime_1.jsx)(exports.SCPreferencesContext.Provider, Object.assign({ value: { preferences, features, setPreferences, setFeatures, refresh } }, { children: !loading && children }))); } exports.default = SCPreferencesProvider; /** * Let's only export the `useSCPreferences` hook instead of the context. * We only want to use the hook directly and never the context component. */ function useSCPreferences() { return (0, react_1.useContext)(exports.SCPreferencesContext); } exports.useSCPreferences = useSCPreferences;