diff --git a/packages/redux-devtools-rtk-query-inspector-monitor/demo/package.json b/packages/redux-devtools-rtk-query-inspector-monitor/demo/package.json index 8cb0070d..766c0d6e 100644 --- a/packages/redux-devtools-rtk-query-inspector-monitor/demo/package.json +++ b/packages/redux-devtools-rtk-query-inspector-monitor/demo/package.json @@ -18,7 +18,8 @@ "react-scripts": "4.0.2", "redux": "^4.0.5", "redux-devtools-themes": "^1.0.0", - "react-json-tree": "^0.15.0" + "react-json-tree": "^0.15.0", + "lodash.debounce": "^4.0.8" }, "devDependencies": { "@types/react": "17.0.0", diff --git a/packages/redux-devtools-rtk-query-inspector-monitor/package.json b/packages/redux-devtools-rtk-query-inspector-monitor/package.json index c2a55620..50b9391f 100644 --- a/packages/redux-devtools-rtk-query-inspector-monitor/package.json +++ b/packages/redux-devtools-rtk-query-inspector-monitor/package.json @@ -46,7 +46,8 @@ "prop-types": "^15.7.2", "redux-devtools-themes": "^1.0.0", "devui": "^1.0.0-8", - "react-json-tree": "^0.15.0" + "react-json-tree": "^0.15.0", + "lodash.debounce": "^4.0.8" }, "devDependencies": { "@redux-devtools/core": "^3.9.0", diff --git a/packages/redux-devtools-rtk-query-inspector-monitor/src/RtkQueryInspector.tsx b/packages/redux-devtools-rtk-query-inspector-monitor/src/RtkQueryInspector.tsx index 68db8990..3c551197 100644 --- a/packages/redux-devtools-rtk-query-inspector-monitor/src/RtkQueryInspector.tsx +++ b/packages/redux-devtools-rtk-query-inspector-monitor/src/RtkQueryInspector.tsx @@ -3,16 +3,20 @@ import { AnyAction, Dispatch, Action } from 'redux'; import { LiftedAction, LiftedState } from '@redux-devtools/core'; import * as themes from 'redux-devtools-themes'; import { Base16Theme } from 'react-base16-styling'; -import { QueryInfo, RtkQueryInspectorMonitorState } from './types'; +import { + QueryFormValues, + QueryInfo, + RtkQueryInspectorMonitorState, +} from './types'; import { createInspectorSelectors, computeSelectorSource } from './selectors'; -import { selectQueryKey } from './reducers'; +import { changeQueryFormValues, selectQueryKey } from './reducers'; import { QueryList } from './components/QueryList'; import { StyleUtils } from './styles/createStylingFromTheme'; import { QueryForm } from './components/QueryForm'; import { QueryPreview } from './components/QueryPreview'; type SelectorsSource = { - currentState: S | null; + userState: S | null; monitorState: RtkQueryInspectorMonitorState; }; @@ -47,7 +51,7 @@ class RtkQueryInspector> extends Component< }; } - static wideLayout = 500; + static wideLayout = 650; static getDerivedStateFromProps( props: RtkQueryInspectorProps>, @@ -80,18 +84,22 @@ class RtkQueryInspector> extends Component< } }; - componentDidMount() { + componentDidMount(): void { this.updateSizeMode(); this.isWideIntervalRef = setInterval(this.updateSizeMode, 200); } - componentWillUnmount() { + componentWillUnmount(): void { if (this.isWideIntervalRef) { clearTimeout(this.isWideIntervalRef as any); } } + handleQueryFormValuesChange = (values: Partial): void => { + this.props.dispatch(changeQueryFormValues(values) as AnyAction); + }; + handleSelectQuery = (queryInfo: QueryInfo): void => { this.props.dispatch(selectQueryKey(queryInfo) as AnyAction); }; @@ -102,7 +110,7 @@ class RtkQueryInspector> extends Component< styleUtils: { styling }, } = this.props; const apiStates = this.selectors.selectApiStates(selectorsSource); - const allSortedQueries = this.selectors.selectAllSortedQueries( + const allVisibleQueries = this.selectors.selectAllVisbileQueries( selectorsSource ); @@ -112,7 +120,7 @@ class RtkQueryInspector> extends Component< console.log('inspector', { apiStates, - allSortedQueries, + allVisibleQueries, selectorsSource, currentQueryInfo, }); @@ -129,14 +137,12 @@ class RtkQueryInspector> extends Component< > diff --git a/packages/redux-devtools-rtk-query-inspector-monitor/src/components/QueryForm.tsx b/packages/redux-devtools-rtk-query-inspector-monitor/src/components/QueryForm.tsx index 34205a4b..e59efad7 100644 --- a/packages/redux-devtools-rtk-query-inspector-monitor/src/components/QueryForm.tsx +++ b/packages/redux-devtools-rtk-query-inspector-monitor/src/components/QueryForm.tsx @@ -1,19 +1,20 @@ -import React, { ReactNode, FormEvent, MouseEvent } from 'react'; -import { RtkQueryInspectorMonitorState } from '../types'; +import React, { ReactNode, FormEvent, MouseEvent, ChangeEvent } from 'react'; +import { QueryFormValues } from '../types'; import { StyleUtilsContext } from '../styles/createStylingFromTheme'; import { Select } from 'devui'; +import { SelectOption } from '../types'; import { AnyAction } from 'redux'; +import debounce from 'lodash.debounce'; import { sortQueryOptions, QueryComparators } from '../utils/comparators'; -import { - changeIsAscendingQueryComparatorOrder, - changeQueryComparator, -} from '../reducers'; -export interface QueryFormProps - extends Pick< - RtkQueryInspectorMonitorState, - 'isAscendingQueryComparatorOrder' | 'queryComparator' - > { + +export interface QueryFormProps { dispatch: (action: AnyAction) => void; + values: QueryFormValues; + onFormValuesChange: (values: Partial) => void; +} + +interface QueryFormState { + searchValue: string; } const ascId = 'rtk-query-rb-asc'; @@ -23,37 +24,71 @@ const searchId = 'rtk-query-search-query'; const searchPlaceholder = 'filter query...'; -export class QueryForm extends React.PureComponent { +export class QueryForm extends React.PureComponent< + QueryFormProps, + QueryFormState +> { + constructor(props: QueryFormProps) { + super(props); + + this.state = { + searchValue: props.values.searchValue, + }; + } + + inputSearchRef = React.createRef(); + handleSubmit = (evt: FormEvent): void => { evt.preventDefault(); }; handleButtonGroupClick = ({ target }: MouseEvent): void => { - const { isAscendingQueryComparatorOrder: isAsc, dispatch } = this.props; + const { + values: { isAscendingQueryComparatorOrder: isAsc }, + onFormValuesChange, + } = this.props; const targetId = (target as HTMLElement)?.id ?? null; if (targetId === ascId && !isAsc) { - dispatch(changeIsAscendingQueryComparatorOrder(true)); + onFormValuesChange({ isAscendingQueryComparatorOrder: true }); } else if (targetId === descId && isAsc) { - this.props.dispatch(changeIsAscendingQueryComparatorOrder(false)); + onFormValuesChange({ isAscendingQueryComparatorOrder: false }); } }; - handleSelectComparator = (option: { value: string }): void => { - const { dispatch } = this.props; - + handleSelectComparator = ( + option: SelectOption | undefined | null + ): void => { if (typeof option?.value === 'string') { - dispatch(changeQueryComparator(option.value as QueryComparators)); + this.props.onFormValuesChange({ queryComparator: option.value }); } }; - getSelectedOption = (option: { value: string }): string => option?.value; + restoreCaretPosition = (start: number | null, end: number | null): void => { + window.requestAnimationFrame(() => { + if (this.inputSearchRef.current) { + this.inputSearchRef.current.selectionStart = start; + this.inputSearchRef.current.selectionEnd = end; + } + }); + }; + + invalidateSearchValueFromProps = debounce(() => { + this.props.onFormValuesChange({ + searchValue: this.state.searchValue, + }); + }, 150); + + handleSearchChange = (evt: ChangeEvent): void => { + const searchValue = evt.target.value.trim(); + this.setState({ searchValue }); + this.invalidateSearchValueFromProps(); + }; render(): ReactNode { const { - isAscendingQueryComparatorOrder: isAsc, - queryComparator, + values: { isAscendingQueryComparatorOrder: isAsc, queryComparator }, } = this.props; const isDesc = !isAsc; @@ -72,24 +107,25 @@ export class QueryForm extends React.PureComponent { filter query
-