UNPKG

@selfcommunity/react-core

Version:

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

98 lines (96 loc) 2.8 kB
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 }; }