Skip to content

Commit

Permalink
refactor(useRouter): sw-625 combine routerContext (#1045)
Browse files Browse the repository at this point in the history
  • Loading branch information
cdcabrera committed Feb 20, 2023
1 parent d4f0d4f commit f09907c
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 103 deletions.
5 changes: 2 additions & 3 deletions src/components/authentication/authenticationContext.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import React, { useContext, useState } from 'react';
import { useMount, useUnmount } from 'react-use';
import { reduxActions, storeHooks } from '../../redux';
import { routerHooks } from '../../hooks/useRouter';
import { helpers } from '../../common';
import { routerHelpers } from '../router';
import { routerContext, routerHelpers } from '../router';

/**
* Base context.
Expand Down Expand Up @@ -44,7 +43,7 @@ const useGetAuthorization = ({
onNavigation = reduxActions.platform.onNavigation,
setAppName = reduxActions.platform.setAppName,
useDispatch: useAliasDispatch = storeHooks.reactRedux.useDispatch,
useHistory: useAliasHistory = routerHooks.useHistory,
useHistory: useAliasHistory = routerContext.useHistory,
useSelectorsResponse: useAliasSelectorsResponse = storeHooks.reactRedux.useSelectorsResponse
} = {}) => {
const [unregister, setUnregister] = useState(() => helpers.noop);
Expand Down
4 changes: 2 additions & 2 deletions src/components/productView/productView.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { useRouteDetail } from '../../hooks/useRouter';
import { routerContext } from '../router';
import { ProductViewContext } from './productViewContext';
import { PageLayout, PageHeader, PageSection, PageToolbar, PageMessages, PageColumns } from '../pageLayout/pageLayout';
import { GraphCard } from '../graphCard/graphCard';
Expand Down Expand Up @@ -112,7 +112,7 @@ ProductView.propTypes = {
*/
ProductView.defaultProps = {
t: translate,
useRouteDetail
useRouteDetail: routerContext.useRouteDetail
};

export { ProductView as default, ProductView };
5 changes: 2 additions & 3 deletions src/components/productView/productViewMissing.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import { Button, Card, CardBody, CardFooter, CardTitle, Gallery, Title, PageSect
import { ArrowRightIcon } from '@patternfly/react-icons';
import { useMount } from 'react-use';
import { PageLayout, PageHeader } from '../pageLayout/pageLayout';
import { routerHelpers } from '../router';
import { routerHooks } from '../../hooks/useRouter';
import { routerContext, routerHelpers } from '../router';
import { helpers } from '../../common';
import { translate } from '../i18n/i18n';

Expand Down Expand Up @@ -111,7 +110,7 @@ ProductViewMissing.propTypes = {
ProductViewMissing.defaultProps = {
availableProductsRedirect: 4,
t: translate,
useHistory: routerHooks.useHistory
useHistory: routerContext.useHistory
};

export { ProductViewMissing as default, ProductViewMissing };
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,23 @@ exports[`RouterContext should apply a hook for return routeDetail: route details
}
`;

exports[`RouterContext should apply a hook for useHistory: history push 1`] = `
[
[
"/dolor/sit",
undefined,
],
[
"/rhel",
undefined,
],
[
"/rhel",
undefined,
],
]
`;

exports[`RouterContext should return specific properties: specific properties 1`] = `
{
"DEFAULT_CONTEXT": [
Expand Down Expand Up @@ -57,7 +74,11 @@ exports[`RouterContext should return specific properties: specific properties 1`
],
"_threadCount": 0,
},
"useHistory": [Function],
"useLocation": [Function],
"useParams": [Function],
"useRouteDetail": [Function],
"useRouteMatch": [Function],
"useRouterContext": [Function],
}
`;
17 changes: 16 additions & 1 deletion src/components/router/__tests__/routerContext.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { context, useRouteDetail } from '../routerContext';
import { context, useHistory, useRouteDetail } from '../routerContext';

describe('RouterContext', () => {
it('should return specific properties', () => {
Expand All @@ -16,4 +16,19 @@ describe('RouterContext', () => {
const { result } = shallowHook(() => useRouteDetail({ useRouterContext: mockUseRouterContext }));
expect(result).toMatchSnapshot('route details');
});

it('should apply a hook for useHistory', () => {
const mockHistoryPush = jest.fn();
const { result: mockUseHistory } = shallowHook(() =>
useHistory({
useHistory: () => ({ push: mockHistoryPush })
})
);

mockUseHistory.push('/dolor/sit');
mockUseHistory.push('rhel');
mockUseHistory.push('insights');

expect(mockHistoryPush.mock.calls).toMatchSnapshot('history push');
});
});
3 changes: 2 additions & 1 deletion src/components/router/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Redirect } from './redirect';
import { Router } from './router';
import { context as routerContext } from './routerContext';
import { routerHelpers } from './routerHelpers';

export { Redirect, Router, routerHelpers };
export { Redirect, Router, routerContext, routerHelpers };
50 changes: 47 additions & 3 deletions src/components/router/routerContext.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import React, { useContext } from 'react';
import { useHistory as useHistoryRRD, useLocation, useParams, useRouteMatch } from 'react-router-dom';
import { routerHelpers } from './routerHelpers';
import { helpers } from '../../common/helpers';

/**
Expand Down Expand Up @@ -32,11 +34,53 @@ const useRouteDetail = ({ useRouterContext: useAliasRouterContext = useRouterCon
return routeDetail;
};

/**
* Pass useHistory methods. Proxy useHistory push with Platform specific navigation update.
*
* @param {object} options
* @param {Function} options.useHistory
* @returns {object}
*/
const useHistory = ({ useHistory: useAliasHistory = useHistoryRRD } = {}) => {
const history = useAliasHistory();

return {
...history,
push: (pathLocation, historyState) => {
const pathName = (typeof pathLocation === 'string' && pathLocation) || pathLocation?.pathname;
const { firstMatch } = routerHelpers.getRouteConfigByPath({ pathName });
const { hash, search } = window.location;

return history?.push(
(firstMatch?.productPath && `${routerHelpers.pathJoin('/', firstMatch?.productPath)}${search}${hash}`) ||
(pathName && `${pathName}${search}${hash}`) ||
pathLocation,
historyState
);
}
};
};

const context = {
RouterContext,
DEFAULT_CONTEXT,
useRouterContext,
useRouteDetail
useHistory,
useLocation,
useParams,
useRouteDetail,
useRouteMatch,
useRouterContext
};

export { context as default, context, RouterContext, DEFAULT_CONTEXT, useRouterContext, useRouteDetail };
export {
context as default,
context,
RouterContext,
DEFAULT_CONTEXT,
useHistory,
useLocation,
useParams,
useRouteDetail,
useRouteMatch,
useRouterContext
};
28 changes: 0 additions & 28 deletions src/hooks/__tests__/__snapshots__/useRouter.test.js.snap

This file was deleted.

22 changes: 0 additions & 22 deletions src/hooks/__tests__/useRouter.test.js

This file was deleted.

40 changes: 0 additions & 40 deletions src/hooks/useRouter.js

This file was deleted.

0 comments on commit f09907c

Please sign in to comment.