Skip to content

Commit 4842170

Browse files
authored
chore(query-bar): refactor query bar plugin to new interface, provide hooks to access and modify query value COMPASS-7405 (#5244)
* chore(query-bar): refactor query bar to the new plugin interface; provide hooks to access and modify query bar filelds state * chore(crud): refactor crud to work with new query bar plugin interface * chore(schema): update schema plugin to use new query bar interfaces * chore: depcheck * chore(query-bar): add ticket to todo; update usememo deps
1 parent a024f5f commit 4842170

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+728
-1052
lines changed

package-lock.json

Lines changed: 20 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/compass-collection/src/components/collection-tab-provider.tsx

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,40 @@ export interface CollectionTabPlugin {
77
component: HadronPluginComponent<CollectionTabPluginMetadata, any>;
88
}
99

10-
const CollectionTabsContext = React.createContext<CollectionTabPlugin[]>([]);
11-
12-
export const CollectionTabsProvider: React.FunctionComponent<{
10+
type CollectionTabComponentsProviderValue = {
1311
tabs: CollectionTabPlugin[];
14-
}> = ({ tabs, children }) => {
15-
const tabsRef = useRef(tabs);
12+
modals: CollectionTabPlugin['component'][];
13+
queryBar: CollectionTabPlugin['component'];
14+
};
15+
16+
const defaultComponents: CollectionTabComponentsProviderValue = {
17+
tabs: [],
18+
modals: [],
19+
queryBar: (() => null) as any,
20+
};
21+
22+
const CollectionTabComponentsContext =
23+
React.createContext<CollectionTabComponentsProviderValue>(defaultComponents);
24+
25+
export const CollectionTabsProvider: React.FunctionComponent<
26+
Partial<CollectionTabComponentsProviderValue>
27+
> = ({ children, ...props }) => {
28+
const valueRef = useRef({ ...defaultComponents, ...props });
1629
return (
17-
<CollectionTabsContext.Provider value={tabsRef.current}>
30+
<CollectionTabComponentsContext.Provider value={valueRef.current}>
1831
{children}
19-
</CollectionTabsContext.Provider>
32+
</CollectionTabComponentsContext.Provider>
2033
);
2134
};
2235

23-
export function useCollectionTabPlugins(): CollectionTabPlugin[] {
24-
return useContext(CollectionTabsContext);
36+
export function useCollectionSubTabs() {
37+
return useContext(CollectionTabComponentsContext).tabs;
38+
}
39+
40+
export function useCollectionScopedModals() {
41+
return useContext(CollectionTabComponentsContext).modals;
42+
}
43+
44+
export function useCollectionQueryBar() {
45+
return useContext(CollectionTabComponentsContext).queryBar;
2546
}

packages/compass-collection/src/components/collection-tab.tsx

Lines changed: 57 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import {
44
type CollectionState,
55
selectTab,
66
renderScopedModals,
7-
renderTabs,
87
} from '../modules/collection-tab';
98
import { css, ErrorBoundary, TabNavBar } from '@mongodb-js/compass-components';
109
import CollectionHeader from './collection-header';
1110
import { createLoggerAndTelemetry } from '@mongodb-js/compass-logging';
12-
import { useCollectionTabPlugins } from './collection-tab-provider';
11+
import {
12+
useCollectionQueryBar,
13+
useCollectionSubTabs,
14+
} from './collection-tab-provider';
1315
import type { CollectionTabOptions } from '../stores/collection-tab';
1416
import type { CollectionMetadata } from 'mongodb-collection-model';
1517

@@ -44,10 +46,6 @@ type CollectionTabProps = CollectionTabOptions & {
4446
currentTab: string;
4547
collectionMetadata: CollectionMetadata;
4648
renderScopedModals(props: CollectionTabOptions): React.ReactElement[];
47-
// TODO(COMPASS-7405): Remove usage of `renderTabs` for Query.QueryBar role
48-
renderTabs(
49-
props: CollectionTabOptions
50-
): { name: string; component: React.ReactElement }[];
5149
onTabClick(name: string): void;
5250
};
5351

@@ -63,7 +61,6 @@ const CollectionTabWithMetadata: React.FunctionComponent<
6361
editViewName,
6462
collectionMetadata,
6563
renderScopedModals,
66-
renderTabs,
6764
onTabClick,
6865
}) => {
6966
useEffect(() => {
@@ -78,7 +75,8 @@ const CollectionTabWithMetadata: React.FunctionComponent<
7875
}
7976
}, [currentTab]);
8077

81-
const pluginTabs = useCollectionTabPlugins();
78+
const QueryBarPlugin = useCollectionQueryBar();
79+
const pluginTabs = useCollectionSubTabs();
8280

8381
const tabsProps = {
8482
namespace,
@@ -88,18 +86,18 @@ const CollectionTabWithMetadata: React.FunctionComponent<
8886
initialQuery,
8987
editViewName,
9088
};
91-
renderTabs(tabsProps); // TODO(COMPASS-7405): Remove usage for Query.QueryBar role
92-
const tabs = pluginTabs.map(({ name, component: Component }) => {
93-
const pluginProps = {
94-
...collectionMetadata,
95-
namespace: namespace,
96-
aggregation: initialAggregation,
97-
pipeline: initialPipeline,
98-
pipelineText: initialPipelineText,
99-
query: initialQuery,
100-
editViewName: editViewName,
101-
};
10289

90+
const pluginProps = {
91+
...collectionMetadata,
92+
namespace: namespace,
93+
aggregation: initialAggregation,
94+
pipeline: initialPipeline,
95+
pipelineText: initialPipelineText,
96+
query: initialQuery,
97+
editViewName: editViewName,
98+
};
99+
100+
const tabs = pluginTabs.map(({ name, component: Component }) => {
103101
// `pluginTabs` never change in runtime so it's safe to call the hook here
104102
// eslint-disable-next-line react-hooks/rules-of-hooks
105103
Component.useActivate(pluginProps);
@@ -112,45 +110,47 @@ const CollectionTabWithMetadata: React.FunctionComponent<
112110
const activeTabIndex = tabs.findIndex((tab) => tab.name === currentTab);
113111

114112
return (
115-
<div className={collectionStyles} data-testid="collection">
116-
<div className={collectionContainerStyles}>
117-
<CollectionHeader
118-
editViewName={editViewName}
119-
{...collectionMetadata}
120-
></CollectionHeader>
121-
<TabNavBar
122-
data-testid="collection-tabs"
123-
aria-label="Collection Tabs"
124-
tabs={tabs.map((tab) => {
125-
return tab.name;
126-
})}
127-
views={tabs.map((tab) => {
128-
return (
129-
<ErrorBoundary
130-
key={tab.name}
131-
onError={(error: Error, errorInfo: unknown) => {
132-
log.error(
133-
mongoLogId(1001000107),
134-
'Collection Workspace',
135-
'Rendering collection tab failed',
136-
{ name: tab.name, error: error.stack, errorInfo }
137-
);
138-
}}
139-
>
140-
{tab.component}
141-
</ErrorBoundary>
142-
);
143-
})}
144-
activeTabIndex={activeTabIndex}
145-
onTabClicked={(id) => {
146-
onTabClick(tabs[id].name);
147-
}}
148-
/>
149-
</div>
150-
<div className={collectionModalContainerStyles}>
151-
{renderScopedModals(tabsProps)}
113+
<QueryBarPlugin {...pluginProps}>
114+
<div className={collectionStyles} data-testid="collection">
115+
<div className={collectionContainerStyles}>
116+
<CollectionHeader
117+
editViewName={editViewName}
118+
{...collectionMetadata}
119+
></CollectionHeader>
120+
<TabNavBar
121+
data-testid="collection-tabs"
122+
aria-label="Collection Tabs"
123+
tabs={tabs.map((tab) => {
124+
return tab.name;
125+
})}
126+
views={tabs.map((tab) => {
127+
return (
128+
<ErrorBoundary
129+
key={tab.name}
130+
onError={(error: Error, errorInfo: unknown) => {
131+
log.error(
132+
mongoLogId(1001000107),
133+
'Collection Workspace',
134+
'Rendering collection tab failed',
135+
{ name: tab.name, error: error.stack, errorInfo }
136+
);
137+
}}
138+
>
139+
{tab.component}
140+
</ErrorBoundary>
141+
);
142+
})}
143+
activeTabIndex={activeTabIndex}
144+
onTabClicked={(id) => {
145+
onTabClick(tabs[id].name);
146+
}}
147+
/>
148+
</div>
149+
<div className={collectionModalContainerStyles}>
150+
{renderScopedModals(tabsProps)}
151+
</div>
152152
</div>
153-
</div>
153+
</QueryBarPlugin>
154154
);
155155
};
156156

@@ -182,7 +182,6 @@ const ConnectedCollectionTab = connect(
182182
},
183183
{
184184
renderScopedModals: renderScopedModals,
185-
renderTabs: renderTabs,
186185
onTabClick: selectTab,
187186
}
188187
)(CollectionTab) as React.FunctionComponent<CollectionTabOptions>;

0 commit comments

Comments
 (0)