Skip to content

Commit

Permalink
♻️ refactor: 移除 use-merge-value 依赖,避免依赖安装报 peer 错误
Browse files Browse the repository at this point in the history
close #27
  • Loading branch information
arvinxx committed Mar 1, 2023
1 parent aa9d826 commit ed12778
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 5 deletions.
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,12 @@
]
},
"dependencies": {
"@babel/runtime": "^7.20",
"@babel/runtime": "^7",
"@emotion/cache": "^11",
"@emotion/css": "^11",
"@emotion/react": "^11",
"@emotion/serialize": "^1",
"@emotion/utils": "^1",
"use-merge-value": "^1"
"@emotion/utils": "^1"
},
"devDependencies": {
"@ant-design/cssinjs": "^1",
Expand Down Expand Up @@ -133,6 +132,7 @@
"ts-jest": "^29",
"ts-node": "^10",
"typescript": "^4",
"use-merge-value": "^1",
"zustand": "^4"
},
"peerDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions src/factories/createThemeProvider/ThemeSwitcher.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useMergeValue } from '@/utils/useMergeValue';
import { FC, memo, ReactNode, useEffect, useLayoutEffect, useMemo, useState } from 'react';
import useControlledState from 'use-merge-value';

import { ThemeModeContext } from '@/context';
import { ThemeAppearance, ThemeMode, UseTheme } from '@/types';
Expand Down Expand Up @@ -79,7 +79,7 @@ const ThemeSwitcher: FC<ThemeSwitcherProps> = memo(
[themeModeProps, upperThemeMode],
);

const [appearance, setAppearance] = useControlledState<ThemeAppearance>('light', {
const [appearance, setAppearance] = useMergeValue<ThemeAppearance>('light', {
value: appearanceProp,
defaultValue: defaultAppearance ?? upperAppearance,
onChange: onAppearanceChange,
Expand Down
38 changes: 38 additions & 0 deletions src/utils/useMergeValue.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import React from 'react';

export const useMergeValue = <T, R = T>(
defaultStateValue: T | (() => T),
option?: {
defaultValue?: T | (() => T);
value?: T;
onChange?: (value: T, prevValue: T) => void;
postState?: (value: T) => T;
},
): [R, (value: T) => void] => {
const { defaultValue, value, onChange, postState } = option || {};
const [innerValue, setInnerValue] = React.useState<T>(() => {
if (value !== undefined) {
return value;
}
if (defaultValue !== undefined) {
return typeof defaultValue === 'function' ? (defaultValue as any)() : defaultValue;
}
return typeof defaultStateValue === 'function'
? (defaultStateValue as any)()
: defaultStateValue;
});

let mergedValue = value !== undefined ? value : innerValue;
if (postState) {
mergedValue = postState(mergedValue);
}

function triggerChange(newValue: T) {
setInnerValue(newValue);
if (mergedValue !== newValue && onChange) {
onChange(newValue, mergedValue);
}
}

return [mergedValue as unknown as R, triggerChange];
};

0 comments on commit ed12778

Please sign in to comment.