feat(rtk-query): add counters on tags & subs tab buttons

This commit is contained in:
FaberVitale 2021-06-19 12:44:17 +02:00
parent d574358c5d
commit e649318adb
3 changed files with 37 additions and 4 deletions

View File

@ -50,6 +50,36 @@ export class QueryPreview extends React.PureComponent<QueryPreviewProps> {
this.labelRenderer = createTreeItemLabelRenderer(this.props.styling); this.labelRenderer = createTreeItemLabelRenderer(this.props.styling);
} }
renderLabelWithCounter = (label: React.ReactText, counter: number): string => {
let counterAsString = counter.toFixed(0);
if(counterAsString.length > 3) {
counterAsString = counterAsString.slice(0, 2) + '...';
}
return `${label} (${counterAsString})`
}
renderTabLabel = (tab: QueryPreviewTabOption): ReactNode => {
const { queryInfo, tags, querySubscriptions } = this.props;
if(queryInfo) {
if(tab.value === QueryPreviewTabs.queryTags && tags.length > 0) {
return this.renderLabelWithCounter(tab.label, tags.length);
}
if(tab.value === QueryPreviewTabs.querySubscriptions && querySubscriptions) {
const subsCount = Object.keys(querySubscriptions).length;
if(subsCount > 0) {
return this.renderLabelWithCounter(tab.label, subsCount);
}
}
}
return tab.label;
}
render(): ReactNode { render(): ReactNode {
const { const {
queryInfo, queryInfo,
@ -73,6 +103,7 @@ export class QueryPreview extends React.PureComponent<QueryPreviewProps> {
selectedTab={selectedTab} selectedTab={selectedTab}
onTabChange={onTabChange} onTabChange={onTabChange}
tabs={tabs} tabs={tabs}
renderTabLabel={this.renderTabLabel}
/> />
</div> </div>
)} )}
@ -89,6 +120,7 @@ export class QueryPreview extends React.PureComponent<QueryPreviewProps> {
selectedTab={selectedTab} selectedTab={selectedTab}
onTabChange={onTabChange} onTabChange={onTabChange}
tabs={tabs} tabs={tabs}
renderTabLabel={this.renderTabLabel}
/> />
<TabComponent <TabComponent
styling={styling} styling={styling}

View File

@ -7,6 +7,7 @@ export interface QueryPreviewHeaderProps {
tabs: ReadonlyArray<QueryPreviewTabOption>; tabs: ReadonlyArray<QueryPreviewTabOption>;
onTabChange: (tab: QueryPreviewTabs) => void; onTabChange: (tab: QueryPreviewTabs) => void;
selectedTab: QueryPreviewTabs; selectedTab: QueryPreviewTabs;
renderTabLabel?: (tab: QueryPreviewTabOption) => ReactNode;
} }
export class QueryPreviewHeader extends React.Component<QueryPreviewHeaderProps> { export class QueryPreviewHeader extends React.Component<QueryPreviewHeaderProps> {
@ -17,7 +18,7 @@ export class QueryPreviewHeader extends React.Component<QueryPreviewHeaderProps>
}; };
render(): ReactNode { render(): ReactNode {
const { tabs, selectedTab } = this.props; const { tabs, selectedTab, renderTabLabel } = this.props;
return ( return (
<StyleUtilsContext.Consumer> <StyleUtilsContext.Consumer>
@ -36,7 +37,7 @@ export class QueryPreviewHeader extends React.Component<QueryPreviewHeaderProps>
tab.value === selectedTab tab.value === selectedTab
)} )}
> >
{tab.label} {renderTabLabel ? renderTabLabel(tab) : tab.label}
</div> </div>
))} ))}
</div> </div>

View File

@ -1,8 +1,8 @@
export default function isIterable(obj: any) { export default function isIterable(obj: unknown): boolean {
return ( return (
obj !== null && obj !== null &&
typeof obj === 'object' && typeof obj === 'object' &&
!Array.isArray(obj) && !Array.isArray(obj) &&
typeof obj[window.Symbol.iterator] === 'function' typeof (obj as any)[window.Symbol.iterator] === 'function'
); );
} }