@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
120 lines (116 loc) • 5.64 kB
JavaScript
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;
;