Skip to content

Commit 362816b

Browse files
author
k.golikov
committed
Refactoring
1 parent 0071e91 commit 362816b

File tree

3 files changed

+26
-24
lines changed

3 files changed

+26
-24
lines changed

src/hooks/useStateProducer.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,9 @@
11
import { Dispatch, SetStateAction, useCallback } from 'react';
2-
import produce, { Draft } from 'immer';
3-
import { Nothing } from 'immer/src/internal';
4-
5-
type ValidRecipeReturnType<State> = State | void | undefined | (State extends undefined ? Nothing : never);
6-
7-
type RecipeReturnType<State> = ValidRecipeReturnType<State> | Promise<ValidRecipeReturnType<State>>;
8-
9-
type Recipe<S> = (draft: Draft<S>) => RecipeReturnType<Draft<S>>;
10-
11-
export const produceState = <S extends object>(
12-
setState: Dispatch<SetStateAction<S>>,
13-
recipe: Recipe<S>
14-
): void | Promise<void> => {
15-
setState((state) => {
16-
return produce(state, recipe as any);
17-
});
18-
};
2+
import produceState, { StateProducerRecipe } from '../utils/produceState';
193

204
const useStateProducer = <S extends object>(setState: Dispatch<SetStateAction<S>>) => {
215
return useCallback(
22-
(recipe: Recipe<S>) => {
6+
(recipe: StateProducerRecipe<S>) => {
237
produceState(setState, recipe);
248
},
259
[setState]

src/pages/dataUrlViewPage/DataUrlViewPage.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import styles from './DataUrlViewPage.module.scss';
44
import { Navigate } from 'react-router-dom';
55
import { routes } from '../../constants/router/routes';
66
import useRouteContextEffect from '../../hooks/useRouteContextEffect';
7+
import produceState from '../../utils/produceState';
78

89
export interface DataUrlViewPageQueryParams {
910
data?: string;
@@ -19,12 +20,9 @@ const DataUrlViewPage: FunctionComponent = () => {
1920

2021
useRouteContextEffect(
2122
(setRouteContentState) => {
22-
const newTitle = title ?? routes.dataUrlView.title;
23-
24-
setRouteContentState((context) => ({
25-
...context,
26-
title: newTitle
27-
}));
23+
produceState(setRouteContentState, (context) => {
24+
context.title = title ?? routes.dataUrlView.title;
25+
});
2826
},
2927
[title]
3028
);

src/utils/produceState.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Dispatch, SetStateAction } from 'react';
2+
import produce, { Draft } from 'immer';
3+
import { Nothing } from 'immer/src/internal';
4+
5+
type ValidRecipeReturnType<State> = State | void | undefined | (State extends undefined ? Nothing : never);
6+
7+
type RecipeReturnType<State> = ValidRecipeReturnType<State> | Promise<ValidRecipeReturnType<State>>;
8+
9+
export type StateProducerRecipe<S> = (draft: Draft<S>) => RecipeReturnType<Draft<S>>;
10+
11+
const produceState = <S extends object>(
12+
setState: Dispatch<SetStateAction<S>>,
13+
recipe: StateProducerRecipe<S>
14+
): void | Promise<void> => {
15+
setState((state) => {
16+
return produce(state, recipe as any);
17+
});
18+
};
19+
20+
export default produceState;

0 commit comments

Comments
 (0)