mirror of
https://github.com/reduxjs/redux-devtools.git
synced 2025-07-27 00:19:55 +03:00
Data tab added
This commit is contained in:
parent
5c4721acf0
commit
b31b83010a
|
@ -0,0 +1,53 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { createSelector, Selector } from '@reduxjs/toolkit';
|
||||||
|
import { QueryStatus } from '@reduxjs/toolkit/dist/query';
|
||||||
|
import { RtkResourceInfo } from '../types';
|
||||||
|
import { TreeView } from './TreeView';
|
||||||
|
import { identity } from '../utils/object';
|
||||||
|
|
||||||
|
type FormattedQuery =
|
||||||
|
| { status: QueryStatus.fulfilled; data: unknown }
|
||||||
|
| {
|
||||||
|
status: QueryStatus.rejected;
|
||||||
|
error: unknown;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
status: QueryStatus.uninitialized | QueryStatus.pending;
|
||||||
|
};
|
||||||
|
|
||||||
|
const selectFormattedQuery: Selector<RtkResourceInfo, FormattedQuery> =
|
||||||
|
createSelector<
|
||||||
|
[(identity: RtkResourceInfo) => RtkResourceInfo],
|
||||||
|
FormattedQuery
|
||||||
|
>(identity, ({ state }: RtkResourceInfo): FormattedQuery => {
|
||||||
|
if (state.status === 'fulfilled') {
|
||||||
|
return {
|
||||||
|
status: state.status,
|
||||||
|
data: state.data,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.status === 'rejected') {
|
||||||
|
return {
|
||||||
|
status: state.status,
|
||||||
|
error: state.error,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: state.status,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
export interface QueryPreviewDataProps {
|
||||||
|
resInfo: RtkResourceInfo;
|
||||||
|
isWideLayout: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
function QueryPreviewData({ resInfo, isWideLayout }: QueryPreviewDataProps) {
|
||||||
|
const formattedQuery = selectFormattedQuery(resInfo);
|
||||||
|
|
||||||
|
return <TreeView data={formattedQuery} isWideLayout={isWideLayout} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default QueryPreviewData;
|
|
@ -33,6 +33,9 @@ import {
|
||||||
QueryPreviewActionsProps,
|
QueryPreviewActionsProps,
|
||||||
} from '../components/QueryPreviewActions';
|
} from '../components/QueryPreviewActions';
|
||||||
import { isTabVisible } from '../utils/tabs';
|
import { isTabVisible } from '../utils/tabs';
|
||||||
|
import QueryPreviewData, {
|
||||||
|
QueryPreviewDataProps,
|
||||||
|
} from '../components/QueryPreviewData';
|
||||||
|
|
||||||
export interface QueryPreviewProps<S = unknown> {
|
export interface QueryPreviewProps<S = unknown> {
|
||||||
readonly selectedTab: QueryPreviewTabs;
|
readonly selectedTab: QueryPreviewTabs;
|
||||||
|
@ -61,6 +64,11 @@ const MappedQueryPreviewTags = mapProps<
|
||||||
isWideLayout,
|
isWideLayout,
|
||||||
}))(QueryPreviewTags);
|
}))(QueryPreviewTags);
|
||||||
|
|
||||||
|
const MappedQueryPreviewData = mapProps<
|
||||||
|
QueryPreviewTabProps,
|
||||||
|
QueryPreviewDataProps
|
||||||
|
>(({ resInfo, isWideLayout }) => ({ resInfo, isWideLayout }))(QueryPreviewData);
|
||||||
|
|
||||||
const MappedQueryPreviewInfo = mapProps<
|
const MappedQueryPreviewInfo = mapProps<
|
||||||
QueryPreviewTabProps,
|
QueryPreviewTabProps,
|
||||||
QueryPreviewInfoProps
|
QueryPreviewInfoProps
|
||||||
|
@ -93,6 +101,16 @@ const MappedQueryPreviewActions = mapProps<
|
||||||
const tabs: ReadonlyArray<
|
const tabs: ReadonlyArray<
|
||||||
TabOption<QueryPreviewTabs, QueryPreviewTabProps, RtkResourceInfo['type']>
|
TabOption<QueryPreviewTabs, QueryPreviewTabProps, RtkResourceInfo['type']>
|
||||||
> = [
|
> = [
|
||||||
|
{
|
||||||
|
label: 'Data',
|
||||||
|
value: QueryPreviewTabs.queryData,
|
||||||
|
component: MappedQueryPreviewData,
|
||||||
|
visible: {
|
||||||
|
query: true,
|
||||||
|
mutation: true,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'Query',
|
label: 'Query',
|
||||||
value: QueryPreviewTabs.queryinfo,
|
value: QueryPreviewTabs.queryinfo,
|
||||||
|
|
|
@ -20,7 +20,7 @@ const initialState: RtkQueryMonitorState = {
|
||||||
queryFilter: QueryFilters.queryKey,
|
queryFilter: QueryFilters.queryKey,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
selectedPreviewTab: QueryPreviewTabs.queryinfo,
|
selectedPreviewTab: QueryPreviewTabs.queryData,
|
||||||
selectedQueryKey: null,
|
selectedQueryKey: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -262,6 +262,7 @@ export function createInspectorSelectors<S>(): InspectorSelectors<S> {
|
||||||
[QueryPreviewTabs.querySubscriptions]: Object.keys(subscriptions ?? {})
|
[QueryPreviewTabs.querySubscriptions]: Object.keys(subscriptions ?? {})
|
||||||
.length,
|
.length,
|
||||||
[QueryPreviewTabs.apiConfig]: 0,
|
[QueryPreviewTabs.apiConfig]: 0,
|
||||||
|
[QueryPreviewTabs.queryData]: 0,
|
||||||
[QueryPreviewTabs.queryinfo]: 0,
|
[QueryPreviewTabs.queryinfo]: 0,
|
||||||
[QueryPreviewTabs.actions]: actions.length,
|
[QueryPreviewTabs.actions]: actions.length,
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,6 +8,7 @@ import type { QueryComparators } from './utils/comparators';
|
||||||
import type { QueryFilters } from './utils/filters';
|
import type { QueryFilters } from './utils/filters';
|
||||||
|
|
||||||
export enum QueryPreviewTabs {
|
export enum QueryPreviewTabs {
|
||||||
|
queryData,
|
||||||
queryinfo,
|
queryinfo,
|
||||||
apiConfig,
|
apiConfig,
|
||||||
querySubscriptions,
|
querySubscriptions,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user