@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
101 lines (99 loc) • 3.11 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = require("react");
const api_services_1 = require("@selfcommunity/api-services");
const utils_1 = require("@selfcommunity/utils");
const Errors_1 = require("../constants/Errors");
/**
:::info
This custom hook is used to manage user settings.
:::
:::tip How to use it:
Follow these steps:
```jsx
1. const scUserContext: SCUserContextType = useSCUser();
2. const scSettingsManager: SCSettingsManagerType = scUserContext.manager.settings;
3. scSettingsManager.all()
```
:::
*/
function useSCSettingsManager(user) {
const [data, setData] = (0, react_1.useState)(null);
const [loading, setLoading] = (0, react_1.useState)(false);
/**
* Memoized refresh all settings data
* It makes a single request to the server and retrieves
* all the settings single solution
* It might be useful for multi-tab sync
*/
const refresh = (0, react_1.useMemo)(() => () => {
if (user) {
setLoading(true);
api_services_1.http
.request({
url: api_services_1.Endpoints.UserSettings.url({ id: user.id }),
method: api_services_1.Endpoints.UserSettings.method,
})
.then((res) => {
setData(res.data);
setLoading(false);
})
.catch((e) => {
utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, 'Unable to load user settings.');
utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, e);
});
}
}, [user, data]);
/**
* Check if the component is loading
*/
const isLoading = (0, react_1.useMemo)(() => () => {
return loading;
}, [loading]);
/**
* Get a single preference
* @param p
*/
const get = (0, react_1.useMemo)(() => (p) => {
if (data && p in data) {
return data[p];
}
return null;
}, [data]);
/**
* Get all preferences
* @param p
*/
const all = (0, react_1.useMemo)(() => () => {
return data;
}, [data]);
/**
* Update a single preference
* @param p
*/
const update = (0, react_1.useMemo)(() => (p, v) => {
if (data && p in data) {
return api_services_1.http
.request({
url: api_services_1.Endpoints.UserSettingsPatch.url({ id: user.id }),
method: api_services_1.Endpoints.UserSettingsPatch.method,
data: { [p]: v },
})
.then((res) => {
const _data = Object.assign({}, data, { [p]: v });
setData(_data);
return Promise.resolve(_data);
})
.catch((error) => {
console.log(error);
});
}
return Promise.reject();
}, [data]);
// EFFECTS
(0, react_1.useEffect)(() => {
refresh();
}, [user]);
return { update, get, all, isLoading, refresh };
}
exports.default = useSCSettingsManager;
;