UNPKG

@selfcommunity/react-core

Version:

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

101 lines (99 loc) 3.11 kB
"use strict"; 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;