Skip to content

Commit 0071e91

Browse files
author
k.golikov
committed
Fix routes title change, remove console logs
1 parent 069dd2d commit 0071e91

14 files changed

+125
-48
lines changed

src/App.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,23 @@ import { HashRouter } from 'react-router-dom';
88
import ErudaLayout from './layouts/ErudaLayout';
99
import ThemeProvider from './layouts/ThemeProvider';
1010
import AppLoadingLayout from './layouts/appLoadingLayout/AppLoadingLayout';
11+
import RouteContextProvider from './layouts/RouteContextProvider';
12+
import RouteContextConsumer from './layouts/RouteContextConsumer';
1113

1214
const App: FunctionComponent = () => (
1315
<ThemeProvider>
1416
<ErudaLayout>
1517
<AppLoadingLayout>
1618
<Provider store={store}>
17-
<HashRouter>
18-
<AppLayout>
19-
<AppRouter />
20-
</AppLayout>
21-
</HashRouter>
19+
<RouteContextProvider>
20+
<RouteContextConsumer>
21+
<HashRouter>
22+
<AppLayout>
23+
<AppRouter />
24+
</AppLayout>
25+
</HashRouter>
26+
</RouteContextConsumer>
27+
</RouteContextProvider>
2228
</Provider>
2329
</AppLoadingLayout>
2430
</ErudaLayout>

src/AppRouter.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import { Routes, Route } from 'react-router-dom';
33
import { routesList } from './constants/router/routes';
44
import NotFoundPage from './pages/notFoundPage/NotFoundPage';
5-
import RouteWrapper from './layouts/RouteWrapper';
5+
import RouteContextInitializer from './layouts/RouteContextInitializer';
66

77
const AppRouter = () => (
88
<Routes>
@@ -13,9 +13,9 @@ const AppRouter = () => (
1313
<Route
1414
path="*"
1515
element={
16-
<RouteWrapper title="Not Found">
16+
<RouteContextInitializer title="Not Found" key="@NOT_FOUND">
1717
<NotFoundPage />
18-
</RouteWrapper>
18+
</RouteContextInitializer>
1919
}
2020
/>
2121
</Routes>

src/constants/router/routes.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import HtmlEditorPage from '../../pages/htmlEditorPage/HtmlEditorPage';
2828
import Base64Page from '../../pages/base64Page/Base64Page';
2929
import DataUrlPage from '../../pages/dataUrlPage/DataUrlPage';
3030
import DataUrlViewPage from '../../pages/dataUrlViewPage/DataUrlViewPage';
31-
import RouteWrapper from '../../layouts/RouteWrapper';
31+
import RouteContextInitializer from '../../layouts/RouteContextInitializer';
3232

3333
export interface AppRoute extends Omit<RouteProps, 'element'> {
3434
path: string;
@@ -202,7 +202,11 @@ export const routes: AppRoutesMap = {
202202

203203
export const convertAppRoute = ({ component, title, ...route }: AppRoute): RouteProps => ({
204204
...route,
205-
element: <RouteWrapper title={title}>{renderComponent(component)}</RouteWrapper>
205+
element: (
206+
<RouteContextInitializer title={title} key={route.path}>
207+
{renderComponent(component)}
208+
</RouteContextInitializer>
209+
)
206210
});
207211

208212
export const appRoutesList: AppRoute[] = values(routes);

src/context/RouteContext.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
import { createContext, Dispatch, SetStateAction } from 'react';
22

3-
export interface RouteContextType {
3+
export interface RouteContextState {
44
title: string;
55
}
66

7-
const RouteContext = createContext<[RouteContextType, Dispatch<SetStateAction<RouteContextType>>]>([] as any);
7+
export interface RouteContextMeta {
8+
isInitialized: boolean;
9+
}
10+
11+
export interface RouteContextType {
12+
state: [RouteContextState, Dispatch<SetStateAction<RouteContextState>>];
13+
meta: [RouteContextMeta, Dispatch<SetStateAction<RouteContextMeta>>];
14+
}
15+
16+
const RouteContext = createContext<RouteContextType>({} as any);
817

918
export default RouteContext;

src/hooks/useMutationObserver.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ const useMutationObserver = (
2424
}
2525

2626
observerRef.current = new MutationObserver((mutations, observer1) => {
27-
console.log('OBSERVER');
2827
memoizedCallback(mutations, observer1);
2928
});
3029
observerRef.current.observe(current, options);

src/hooks/useRouteContext.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
import { useContext } from 'react';
1+
import { useContext, useMemo } from 'react';
22
import RouteContext from '../context/RouteContext';
33

44
const useRouteContext = () => useContext(RouteContext);
55

6+
export const useRouteContextState = () => {
7+
const { state } = useRouteContext();
8+
9+
return useMemo(() => state, [state]);
10+
};
11+
612
export default useRouteContext;

src/hooks/useRouteContextEffect.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import useRouteContext from './useRouteContext';
2+
import { DependencyList, useEffect } from 'react';
3+
import { RouteContextType } from '../context/RouteContext';
4+
5+
declare const UNDEFINED_VOID_ONLY: unique symbol;
6+
type Destructor = () => void | { [UNDEFINED_VOID_ONLY]: never };
7+
type RouteContextEffectCallback = (setState: RouteContextType['state'][1]) => void | Destructor;
8+
9+
const useRouteContextEffect = (effect: RouteContextEffectCallback, deps: DependencyList) => {
10+
const {
11+
state: [, setState],
12+
meta: [meta]
13+
} = useRouteContext();
14+
15+
useEffect(() => {
16+
if (meta.isInitialized) {
17+
effect(setState);
18+
}
19+
}, [...deps, meta]);
20+
};
21+
22+
export default useRouteContextEffect;

src/layouts/RouteContextConsumer.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import React, { FunctionComponent, useEffect } from 'react';
2-
import useRouteContext from '../hooks/useRouteContext';
2+
import { useRouteContextState } from '../hooks/useRouteContext';
33

44
const RouteContextConsumer: FunctionComponent = ({ children }) => {
5-
const [{ title }] = useRouteContext();
5+
const [routeContext] = useRouteContextState();
6+
7+
const { title } = routeContext;
68

79
useEffect(() => {
810
if (title) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import React, { FunctionComponent, useEffect } from 'react';
2+
import { RouteContextState } from '../context/RouteContext';
3+
import useRouteContext from '../hooks/useRouteContext';
4+
5+
const RouteContextInitializer: FunctionComponent<RouteContextState> = ({ children, ...contextValue }) => {
6+
const {
7+
state: [, setState],
8+
meta: [, setMeta]
9+
} = useRouteContext();
10+
11+
useEffect(() => {
12+
setState(contextValue);
13+
setMeta((meta) => ({
14+
...meta,
15+
isInitialized: true
16+
}));
17+
}, []);
18+
19+
return <>{children}</>;
20+
};
21+
22+
export default RouteContextInitializer;

src/layouts/RouteContextProvider.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React, { FunctionComponent, useMemo, useState } from 'react';
2+
import RouteContext, { RouteContextMeta, RouteContextState, RouteContextType } from '../context/RouteContext';
3+
4+
const initialContextState: RouteContextState = {
5+
title: 'MRGRD56'
6+
};
7+
8+
const initialContextMeta: RouteContextMeta = {
9+
isInitialized: false
10+
};
11+
12+
const RouteContextProvider: FunctionComponent = ({ children }) => {
13+
const contextState = useState<RouteContextState>(initialContextState);
14+
const contextMeta = useState<RouteContextMeta>(initialContextMeta);
15+
16+
const contextValue = useMemo<RouteContextType>(() => {
17+
return {
18+
state: contextState,
19+
meta: contextMeta
20+
};
21+
}, [contextState, contextMeta]);
22+
23+
return <RouteContext.Provider value={contextValue}>{children}</RouteContext.Provider>;
24+
};
25+
26+
export default RouteContextProvider;

0 commit comments

Comments
 (0)