UNPKG

@selfcommunity/react-core

Version:

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

120 lines (116 loc) 5.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useSCRouting = exports.SCRoutingContext = void 0; const tslib_1 = require("tslib"); const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = require("react"); const SCContextProvider_1 = require("../SCContextProvider"); const SCPreferencesProvider_1 = require("../SCPreferencesProvider"); const SCPreferences = tslib_1.__importStar(require("../../../constants/Preferences")); const Routes_1 = require("../../../constants/Routes"); /** * Creates Global Context * :::tip Context can be consumed in one of the following ways: ```jsx 1. <SCRoutingContext.Consumer>{(routerLink, routes, url) => (...)}</SCRoutingContext.Consumer> ``` ```jsx 2. const scRoutingContext: SCRoutingContextType = useContext(SCRoutingContext); ``` ```jsx 3. const scRoutingContext: SCRoutingContextType = useSCRouting(); ```` ::: */ exports.SCRoutingContext = (0, react_1.createContext)({}); /** * #### Description: * This component provides routing context. * @param children * @return * ```jsx * <SCRoutingContext.Provider value={contextValue}>{children}</SCRoutingContext.Provider> * ``` */ function SCRoutingProvider({ children = null }) { const scPreferencesContext = (0, react_1.useContext)(SCPreferencesProvider_1.SCPreferencesContext); const scContext = (0, SCContextProvider_1.useSCContext)(); const router = scContext.settings.router ? scContext.settings.router : {}; const routerLink = router.routerLink ? router.routerLink : null; const _routes = Object.assign(getPreferencesRoutes(), Routes_1.defaultRoutes); const routes = router.routes ? Object.assign(Object.assign({}, _routes), router.routes) : Routes_1.defaultRoutes; /** * Normalize template url (preferences) */ function normalizeUrl(url) { let tpl = url; const re = /\{([^/]+)?\}/g; let match = re.exec(url); while (match) { tpl = tpl.replace(match[0], `:${match[1]}`); re.lastIndex = 0; match = re.exec(tpl); } return tpl; } /** * Get override routes from community preferences */ function getPreferencesRoutes() { if (Object.keys(scPreferencesContext.preferences).length) { return { [Routes_1.POST_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_POST].value), [Routes_1.DISCUSSION_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_DISCUSSION].value), [Routes_1.STATUS_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_STATUS].value), [Routes_1.COMMENT_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_COMMENT].value), [Routes_1.CATEGORY_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_CATEGORY].value), [Routes_1.CATEGORIES_LIST_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_CATEGORIES_LIST].value), [Routes_1.USER_PROFILE_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_USER_PROFILE].value), [Routes_1.USER_PROFILE_SETTINGS_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_USER_PROFILE_SETTINGS].value), [Routes_1.USER_NOTIFICATIONS_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_NOTIFICATIONS].value), [Routes_1.USER_PRIVATE_MESSAGES_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_USER_PRIVATE_MESSAGES].value), [Routes_1.INCUBATOR_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_INCUBATOR].value), [Routes_1.LIVESTREAM_ROUTE_NAME]: normalizeUrl(scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_URL_TEMPLATE_LIVE_STREAM].value), }; } return {}; } /** * Generate path */ function url(name = '', params = {}) { const replacer = (tpl, data) => { const re = /:([^/|^?|^#]+)?/g; let _tpl = tpl; let match = re.exec(tpl); const hasParams = Object.keys(data).length > 0; while (match) { _tpl = hasParams ? _tpl.replace(match[0], data[match[1]]) : _tpl.split(match[0])[0]; re.lastIndex = 0; match = re.exec(_tpl); } if (router.handleRoute) { // Handle override url return router.handleRoute(name, _tpl, params, tpl); } return _tpl; }; return replacer(routes[name], params); } const contextValue = (0, react_1.useMemo)(() => ({ routerLink, routes, url, }), [routerLink, routes]); return (0, jsx_runtime_1.jsx)(exports.SCRoutingContext.Provider, Object.assign({ value: contextValue }, { children: children })); } exports.default = SCRoutingProvider; /** * Let's only export the `useSCTheme` hook instead of the context. * We only want to use the hook directly and never the context component. */ function useSCRouting() { return (0, react_1.useContext)(exports.SCRoutingContext); } exports.useSCRouting = useSCRouting;