@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
89 lines (86 loc) • 3.86 kB
JavaScript
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;
;