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