@kwiz/fluentui 1.0.62 → 1.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/controls/search.d.ts +3 -2
- package/dist/controls/search.js +18 -26
- package/dist/controls/search.js.map +1 -1
- package/dist/helpers/hooks.d.ts +5 -0
- package/dist/helpers/hooks.js +9 -0
- package/dist/helpers/hooks.js.map +1 -1
- package/package.json +1 -1
- package/src/controls/search.tsx +20 -29
- package/src/helpers/hooks.tsx +10 -0
@@ -1,12 +1,13 @@
|
|
1
1
|
import { InputProps } from '@fluentui/react-components';
|
2
2
|
import React from 'react';
|
3
|
-
interface IProps extends InputProps {
|
3
|
+
interface IProps extends Omit<InputProps, "onChange"> {
|
4
4
|
main?: boolean;
|
5
|
+
/** number of seconds to debounce the deferred event */
|
5
6
|
delay?: number;
|
6
7
|
/** if changing the value in the caller - change this prop to reset */
|
7
8
|
resetValue?: string;
|
8
9
|
onChangeDeferred?: (newValue: string) => void;
|
9
|
-
|
10
|
+
onChange?: (newValue: string) => void;
|
10
11
|
}
|
11
12
|
/** value is set on first load. to change the value after it was first set - change the compoenet's key. */
|
12
13
|
export declare const Search: React.FunctionComponent<React.PropsWithChildren<IProps>>;
|
package/dist/controls/search.js
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
2
2
|
import { Input, makeStyles, mergeClasses } from '@fluentui/react-components';
|
3
3
|
import { DismissRegular, SearchRegular } from "@fluentui/react-icons";
|
4
|
-
import { debounce,
|
5
|
-
import React, {
|
4
|
+
import { debounce, isNullOrEmptyString } from '@kwiz/common';
|
5
|
+
import React, { useRef } from 'react';
|
6
6
|
import { GetLogger } from '../_modules/config';
|
7
|
-
import { useStateEX } from '../helpers';
|
8
7
|
import { mixins } from '../styles/styles';
|
9
8
|
const logger = GetLogger("Search");
|
10
9
|
const useStyles = makeStyles({
|
@@ -16,35 +15,28 @@ const useStyles = makeStyles({
|
|
16
15
|
/** value is set on first load. to change the value after it was first set - change the compoenet's key. */
|
17
16
|
export const Search = (props) => {
|
18
17
|
const cssNames = useStyles();
|
19
|
-
const [resetKey, setResetKey] = useState(1);
|
20
18
|
let delay = props.delay || 1;
|
19
|
+
let refonChangeDeferred = useRef(props.onChangeDeferred);
|
20
|
+
//keep updating the ref
|
21
|
+
React.useEffect(() => { refonChangeDeferred.current = props.onChangeDeferred; }, [props.onChangeDeferred]);
|
21
22
|
//cannot call debounce every render, since it won't be the same debounced instance...
|
22
23
|
var notifyParent = React.useMemo(() => debounce(v => {
|
24
|
+
var _a;
|
23
25
|
logger.log(`Set: ${v}`);
|
24
|
-
|
26
|
+
//Call the latest ref - we don't want to call an old version of this function
|
27
|
+
(_a = refonChangeDeferred.current) === null || _a === void 0 ? void 0 : _a.call(refonChangeDeferred, v);
|
25
28
|
}, delay * 1000), [delay]);
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
return newValue;
|
33
|
-
}
|
34
|
-
});
|
35
|
-
//once props change, reset this control value to match
|
36
|
-
React.useEffect(() => {
|
37
|
-
if (!isUndefined(props.resetValue))
|
38
|
-
setValue(props.resetValue);
|
39
|
-
//todo: bug: setting value does not sync into the text box
|
40
|
-
setResetKey(resetKey + 1);
|
41
|
-
}, [props.resetValue]);
|
42
|
-
return (_jsx(Input, Object.assign({}, props, { value: value, onChange: (e, data) => setValue(data.value), className: mergeClasses(cssNames.root, props.main && cssNames.main), contentBefore: !isNullOrEmptyString(value) ? undefined : _jsx(SearchRegular, { className: cssNames.searchIcon }), contentAfter: isNullOrEmptyString(value)
|
29
|
+
const currentValue = props.value || "";
|
30
|
+
return (_jsx(Input, Object.assign({}, props, { value: currentValue, onChange: (e, data) => {
|
31
|
+
var _a;
|
32
|
+
(_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, data.value);
|
33
|
+
notifyParent(data.value);
|
34
|
+
}, className: mergeClasses(cssNames.root, props.main && cssNames.main), contentBefore: !isNullOrEmptyString(currentValue) ? undefined : _jsx(SearchRegular, { className: cssNames.searchIcon }), contentAfter: isNullOrEmptyString(currentValue)
|
43
35
|
? undefined
|
44
36
|
: _jsx(DismissRegular, { className: cssNames.clickable, onClick: () => {
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
} }) })
|
37
|
+
var _a;
|
38
|
+
(_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, "");
|
39
|
+
notifyParent("");
|
40
|
+
} }) })));
|
49
41
|
};
|
50
42
|
//# sourceMappingURL=search.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/controls/search.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAc,UAAU,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/controls/search.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAc,UAAU,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEnC,MAAM,SAAS,GAAG,UAAU,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,IAAI,EAAE,EACL;IACD,UAAU,EAAE,EACX;CACJ,CAAC,CAAA;AAYF,2GAA2G;AAC3G,MAAM,CAAC,MAAM,MAAM,GAA6D,CAAC,KAAK,EAAE,EAAE;IACtF,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAE7B,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IAE7B,IAAI,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACzD,uBAAuB;IACvB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAAC,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE3G,qFAAqF;IACrF,IAAI,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;QAChD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxB,6EAA6E;QAC7E,MAAA,mBAAmB,CAAC,OAAO,oEAAG,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAEvC,OAAO,CACH,KAAC,KAAK,oBAAK,KAAK,IAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;;YACzD,MAAA,KAAK,CAAC,QAAQ,sDAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,EACG,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,EACnE,aAAa,EAAE,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAC,aAAa,IAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAI,EACjH,YAAY,EAAE,mBAAmB,CAAC,YAAY,CAAC;YAC3C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAC,cAAc,IAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE;;oBAC3D,MAAA,KAAK,CAAC,QAAQ,sDAAG,EAAE,CAAC,CAAC;oBACrB,YAAY,CAAC,EAAE,CAAC,CAAC;gBACrB,CAAC,GAAI,IACL,CACX,CAAC;AACN,CAAC,CAAA"}
|
package/dist/helpers/hooks.d.ts
CHANGED
@@ -11,3 +11,8 @@ export declare function useStateEX<ValueType>(initialValue: ValueType, options?:
|
|
11
11
|
(newValue: SetStateAction<ValueType>) => Promise<ValueType>,
|
12
12
|
MutableRefObject<ValueType>
|
13
13
|
];
|
14
|
+
export declare function useRefWithState<T>(initialValue?: T): {
|
15
|
+
asRef: MutableRefObject<T>;
|
16
|
+
asState: T;
|
17
|
+
setRef: (newValue: T) => void;
|
18
|
+
};
|
package/dist/helpers/hooks.js
CHANGED
@@ -86,4 +86,13 @@ export function useStateEX(initialValue, options) {
|
|
86
86
|
}), []);
|
87
87
|
return [value, setValue, currentValue];
|
88
88
|
}
|
89
|
+
export function useRefWithState(initialValue) {
|
90
|
+
let asRef = useRef(initialValue);
|
91
|
+
let [asState, setState] = useState(initialValue);
|
92
|
+
let setRef = useCallback((newValue) => {
|
93
|
+
asRef.current = newValue;
|
94
|
+
setState(newValue);
|
95
|
+
}, useEffectOnlyOnMount);
|
96
|
+
return { asRef, asState, setRef };
|
97
|
+
}
|
89
98
|
//# sourceMappingURL=hooks.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/helpers/hooks.tsx"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/helpers/hooks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrK,OAAO,EAAoC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,uIAAuI;AACvI,MAAM,UAAU,UAAU,CAAY,YAAuB,EAAE,OAM9D;IAEG,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAEhC,IAAI,MAAM,GAAG,SAAS,CAAC,oBAAoB,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1F,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAElC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnC,wFAAwF;IACxF,MAAM,YAAY,GAAG,MAAM,CAA6B,EAAE,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACX,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAEzB,OAAO,GAAG,EAAE;YACR,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC9B,CAAC,CAAC;IACN,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAEzB,SAAS,eAAe;QACpB,IAAI,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,IAAI,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7C,YAAY,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA,OAAO;YACjC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAAA,CAAC;IACF,SAAS,CAAC,GAAG,EAAE;QACX,eAAe,EAAE,CAAC;QAClB,IAAI,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACpC,IAAI,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7C,YAAY,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA,OAAO;YACjC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACjC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAElC,SAAS,iBAAiB,CAAC,QAAmB;QAC1C,OAAO,MAAM,CAAC,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC,EAAE;YAC/C,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC5C,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnD,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3C,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,QAAkB,EAAE,YAAY,CAAC,OAAiB,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,eAAe,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YAChB,CAAC;iBACI,CAAC;gBACF,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBACvB,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAAA,CAAC;IAEF,IAAI,iBAAiB,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAmB,EAAE,EAAE;QAC1F,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,cAAc,EAAE,CAAC;YACjB,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;aACI,CAAC;YACF,eAAe,EAAE,CAAC;QACtB,CAAC;IACL,CAAC,CAAA;IAGD,IAAI,kBAAkB,GAAG,YAAY,CAAC,iBAAiB,EAAE;QACrD,MAAM,EAAE,CAAC,QAAmB,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;QAClI,KAAK,EAAE,CAAC,QAAmB,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC;YACrG,CAAC,CAAC,QAAQ;YACV,0CAA0C;YAC1C,oFAAoF;YACpF,qEAAqE;YACrE,sEAAsE;YACtE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAc;KACzC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,QAAmB,EAAE,EAAE,CAAC,IAAI,OAAO,CAAY,OAAO,CAAC,EAAE;QACnF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACrB,6BAA6B;YAC7B,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACpC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;aACI,CAAC;YACF,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACL,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAER,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,YAAgB;IAC/C,IAAI,KAAK,GAAG,MAAM,CAAI,YAAY,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAI,YAAY,CAAC,CAAC;IACpD,IAAI,MAAM,GAAG,WAAW,CAAC,CAAC,QAAW,EAAE,EAAE;QACrC,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC"}
|
package/package.json
CHANGED
package/src/controls/search.tsx
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
import { Input, InputProps, makeStyles, mergeClasses } from '@fluentui/react-components';
|
2
2
|
import { DismissRegular, SearchRegular } from "@fluentui/react-icons";
|
3
|
-
import { debounce,
|
4
|
-
import React, {
|
3
|
+
import { debounce, isNullOrEmptyString } from '@kwiz/common';
|
4
|
+
import React, { useRef } from 'react';
|
5
5
|
import { GetLogger } from '../_modules/config';
|
6
|
-
import { useStateEX } from '../helpers';
|
7
6
|
import { mixins } from '../styles/styles';
|
8
7
|
const logger = GetLogger("Search");
|
9
8
|
|
@@ -16,55 +15,47 @@ const useStyles = makeStyles({
|
|
16
15
|
},
|
17
16
|
})
|
18
17
|
|
19
|
-
interface IProps extends InputProps {
|
18
|
+
interface IProps extends Omit<InputProps, "onChange"> {
|
20
19
|
main?: boolean;
|
20
|
+
/** number of seconds to debounce the deferred event */
|
21
21
|
delay?: number;
|
22
22
|
/** if changing the value in the caller - change this prop to reset */
|
23
23
|
resetValue?: string;
|
24
24
|
onChangeDeferred?: (newValue: string) => void;
|
25
|
-
|
25
|
+
onChange?: (newValue: string) => void;
|
26
26
|
}
|
27
27
|
|
28
28
|
/** value is set on first load. to change the value after it was first set - change the compoenet's key. */
|
29
29
|
export const Search: React.FunctionComponent<React.PropsWithChildren<IProps>> = (props) => {
|
30
30
|
const cssNames = useStyles();
|
31
31
|
|
32
|
-
const [resetKey, setResetKey] = useState(1);
|
33
|
-
|
34
32
|
let delay = props.delay || 1;
|
35
33
|
|
34
|
+
let refonChangeDeferred = useRef(props.onChangeDeferred);
|
35
|
+
//keep updating the ref
|
36
|
+
React.useEffect(() => { refonChangeDeferred.current = props.onChangeDeferred; }, [props.onChangeDeferred]);
|
37
|
+
|
36
38
|
//cannot call debounce every render, since it won't be the same debounced instance...
|
37
39
|
var notifyParent = React.useMemo(() => debounce(v => {
|
38
40
|
logger.log(`Set: ${v}`);
|
39
|
-
|
41
|
+
//Call the latest ref - we don't want to call an old version of this function
|
42
|
+
refonChangeDeferred.current?.(v);
|
40
43
|
}, delay * 1000), [delay]);
|
41
44
|
|
42
|
-
|
43
|
-
onChange: newValue => {
|
44
|
-
if (isFunction(props.onChangeSync)) props.onChangeSync(newValue as string);
|
45
|
-
if (isFunction(props.onChangeDeferred)) notifyParent(newValue);
|
46
|
-
return newValue;
|
47
|
-
}
|
48
|
-
});
|
49
|
-
|
50
|
-
//once props change, reset this control value to match
|
51
|
-
React.useEffect(() => {
|
52
|
-
if (!isUndefined(props.resetValue))
|
53
|
-
setValue(props.resetValue);
|
54
|
-
//todo: bug: setting value does not sync into the text box
|
55
|
-
setResetKey(resetKey + 1)
|
56
|
-
}, [props.resetValue]);
|
45
|
+
const currentValue = props.value || "";
|
57
46
|
|
58
47
|
return (
|
59
|
-
<Input
|
48
|
+
<Input {...props} value={currentValue} onChange={(e, data) => {
|
49
|
+
props.onChange?.(data.value);
|
50
|
+
notifyParent(data.value);
|
51
|
+
}}
|
60
52
|
className={mergeClasses(cssNames.root, props.main && cssNames.main)}
|
61
|
-
contentBefore={!isNullOrEmptyString(
|
62
|
-
contentAfter={isNullOrEmptyString(
|
53
|
+
contentBefore={!isNullOrEmptyString(currentValue) ? undefined : <SearchRegular className={cssNames.searchIcon} />}
|
54
|
+
contentAfter={isNullOrEmptyString(currentValue)
|
63
55
|
? undefined
|
64
56
|
: <DismissRegular className={cssNames.clickable} onClick={() => {
|
65
|
-
|
66
|
-
|
67
|
-
setResetKey(resetKey + 1)
|
57
|
+
props.onChange?.("");
|
58
|
+
notifyParent("");
|
68
59
|
}} />
|
69
60
|
} />
|
70
61
|
);
|
package/src/helpers/hooks.tsx
CHANGED
@@ -104,4 +104,14 @@ export function useStateEX<ValueType>(initialValue: ValueType, options?: {
|
|
104
104
|
}), []);
|
105
105
|
|
106
106
|
return [value, setValue, currentValue];
|
107
|
+
}
|
108
|
+
|
109
|
+
export function useRefWithState<T>(initialValue?: T) {
|
110
|
+
let asRef = useRef<T>(initialValue);
|
111
|
+
let [asState, setState] = useState<T>(initialValue);
|
112
|
+
let setRef = useCallback((newValue: T) => {
|
113
|
+
asRef.current = newValue;
|
114
|
+
setState(newValue);
|
115
|
+
}, useEffectOnlyOnMount);
|
116
|
+
return { asRef, asState, setRef };
|
107
117
|
}
|