@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
98 lines (96 loc) • 2.8 kB
JavaScript
import { useEffect, useMemo, useState } from 'react';
import { http, Endpoints } from '@selfcommunity/api-services';
import { Logger } from '@selfcommunity/utils';
import { SCOPE_SC_CORE } from '../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()
```
:::
*/
export default function useSCSettingsManager(user) {
const [data, setData] = useState(null);
const [loading, setLoading] = 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 = useMemo(() => () => {
if (user) {
setLoading(true);
http
.request({
url: Endpoints.UserSettings.url({ id: user.id }),
method: Endpoints.UserSettings.method,
})
.then((res) => {
setData(res.data);
setLoading(false);
})
.catch((e) => {
Logger.error(SCOPE_SC_CORE, 'Unable to load user settings.');
Logger.error(SCOPE_SC_CORE, e);
});
}
}, [user, data]);
/**
* Check if the component is loading
*/
const isLoading = useMemo(() => () => {
return loading;
}, [loading]);
/**
* Get a single preference
* @param p
*/
const get = useMemo(() => (p) => {
if (data && p in data) {
return data[p];
}
return null;
}, [data]);
/**
* Get all preferences
* @param p
*/
const all = useMemo(() => () => {
return data;
}, [data]);
/**
* Update a single preference
* @param p
*/
const update = useMemo(() => (p, v) => {
if (data && p in data) {
return http
.request({
url: Endpoints.UserSettingsPatch.url({ id: user.id }),
method: 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
useEffect(() => {
refresh();
}, [user]);
return { update, get, all, isLoading, refresh };
}