Skip to content

Commit 743fa2a

Browse files
committed
fixup: update types, move provider in workspace-tab-context-provider
1 parent 5019960 commit 743fa2a

File tree

14 files changed

+151
-237
lines changed

14 files changed

+151
-237
lines changed

packages/compass-collection/src/plugin-tab-title.tsx

Lines changed: 31 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,42 @@ import React from 'react';
22
import { connect } from 'react-redux';
33
import toNS from 'mongodb-ns';
44
import {
5+
useConnectionInfo,
56
useConnectionsListRef,
67
useTabConnectionTheme,
78
} from '@mongodb-js/compass-connections/provider';
89
import {
910
WorkspaceTab,
1011
type WorkspaceTabCoreProps,
1112
} from '@mongodb-js/compass-components';
12-
import type { CollectionSubtab } from '@mongodb-js/compass-workspaces';
13+
import type { WorkspacePluginProps } from '@mongodb-js/compass-workspaces';
1314

1415
import { type CollectionState } from './modules/collection-tab';
1516

16-
type WorkspaceProps = {
17-
id: string;
18-
connectionId: string;
19-
namespace: string;
20-
subTab: CollectionSubtab;
21-
initialQuery?: unknown;
22-
initialPipeline?: unknown[];
23-
initialPipelineText?: string;
24-
initialAggregation?: unknown;
25-
editViewName?: string;
26-
isNonExistent: boolean;
27-
};
17+
export const CollectionWorkspaceTitle = 'Collection' as const;
2818

29-
function _PluginTitle({
30-
isTimeSeries,
31-
isReadonly,
32-
sourceName,
33-
tabProps,
34-
workspaceProps,
35-
}: {
19+
type PluginTitleProps = {
3620
isTimeSeries?: boolean;
3721
isReadonly?: boolean;
3822
sourceName?: string | null;
39-
tabProps: WorkspaceTabCoreProps;
40-
workspaceProps: WorkspaceProps;
41-
}) {
23+
} & WorkspaceTabCoreProps &
24+
WorkspacePluginProps<typeof CollectionWorkspaceTitle>;
25+
26+
function _PluginTitle({
27+
editViewName,
28+
isNonExistent,
29+
isReadonly,
30+
isTimeSeries,
31+
sourceName,
32+
namespace,
33+
...tabProps
34+
}: PluginTitleProps) {
4235
const { getThemeOf } = useTabConnectionTheme();
4336
const { getConnectionById } = useConnectionsListRef();
37+
const { id: connectionId } = useConnectionInfo();
4438

45-
const { database, collection, ns } = toNS(workspaceProps.namespace);
46-
const connectionName =
47-
getConnectionById(workspaceProps.connectionId)?.title || '';
39+
const { database, collection, ns } = toNS(namespace);
40+
const connectionName = getConnectionById(connectionId)?.title || '';
4841
const collectionType = isTimeSeries
4942
? 'timeseries'
5043
: isReadonly
@@ -58,8 +51,8 @@ function _PluginTitle({
5851
if (sourceName) {
5952
tooltip.push(['View', collection]);
6053
tooltip.push(['Derived from', toNS(sourceName).collection]);
61-
} else if (workspaceProps.editViewName) {
62-
tooltip.push(['View', toNS(workspaceProps.editViewName).collection]);
54+
} else if (editViewName) {
55+
tooltip.push(['View', toNS(editViewName).collection]);
6356
tooltip.push(['Derived from', collection]);
6457
} else {
6558
tooltip.push(['Collection', collection]);
@@ -68,7 +61,6 @@ function _PluginTitle({
6861
return (
6962
<WorkspaceTab
7063
{...tabProps}
71-
id={workspaceProps.id}
7264
connectionName={connectionName}
7365
type={CollectionWorkspaceTitle}
7466
title={collection}
@@ -78,32 +70,21 @@ function _PluginTitle({
7870
? 'Visibility'
7971
: collectionType === 'timeseries'
8072
? 'TimeSeries'
81-
: workspaceProps.isNonExistent
73+
: isNonExistent
8274
? 'EmptyFolder'
8375
: 'Folder'
8476
}
8577
data-namespace={ns}
86-
tabTheme={getThemeOf(workspaceProps.connectionId)}
87-
isNonExistent={workspaceProps.isNonExistent}
78+
tabTheme={getThemeOf(connectionId)}
79+
isNonExistent={isNonExistent}
8880
/>
8981
);
9082
}
9183

92-
const ConnectedPluginTitle = connect((state: CollectionState) => ({
93-
isTimeSeries: state.metadata?.isTimeSeries,
94-
isReadonly: state.metadata?.isReadonly,
95-
sourceName: state.metadata?.sourceName,
96-
}))(_PluginTitle);
97-
98-
export const CollectionWorkspaceTitle = 'Collection' as const;
99-
export function CollectionPluginTitleComponent({
100-
tabProps,
101-
workspaceProps,
102-
}: {
103-
tabProps: WorkspaceTabCoreProps;
104-
workspaceProps: WorkspaceProps;
105-
}) {
106-
return (
107-
<ConnectedPluginTitle tabProps={tabProps} workspaceProps={workspaceProps} />
108-
);
109-
}
84+
export const CollectionPluginTitleComponent = connect(
85+
(state: CollectionState) => ({
86+
isTimeSeries: state.metadata?.isTimeSeries,
87+
isReadonly: state.metadata?.isReadonly,
88+
sourceName: state.metadata?.sourceName,
89+
})
90+
)(_PluginTitle);

packages/compass-data-modeling/src/plugin-tab-title.tsx

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,32 @@ import {
66
type WorkspaceTabCoreProps,
77
} from '@mongodb-js/compass-components';
88
import type { DataModelingState } from './store/reducer';
9+
import type { WorkspacePluginProps } from '@mongodb-js/compass-workspaces';
910

1011
export const WorkspaceName = 'Data Modeling' as const;
1112

12-
type WorkspaceProps = {
13-
id: string;
14-
};
15-
16-
function _TabTitle({
17-
tabProps,
18-
tabTitle,
19-
workspaceProps,
20-
}: {
21-
tabProps: WorkspaceTabCoreProps;
13+
type WorkspaceProps = WorkspacePluginProps<typeof WorkspaceName>;
14+
type PluginTabTitleProps = {
2215
tabTitle: string;
23-
workspaceProps: WorkspaceProps;
24-
}) {
16+
} & WorkspaceTabCoreProps &
17+
WorkspaceProps;
18+
19+
function _TabTitle({ tabTitle, ...props }: PluginTabTitleProps) {
2520
return (
2621
<WorkspaceTab
27-
{...tabProps}
28-
id={workspaceProps.id}
22+
{...props}
2923
type={WorkspaceName}
3024
title={tabTitle}
3125
iconGlyph="Diagram"
3226
/>
3327
);
3428
}
3529

36-
const ConnectedTabTitle = connect((state: DataModelingState) => {
30+
export const PluginTabTitleComponent = connect((state: DataModelingState) => {
3731
return {
3832
tabTitle:
3933
state.step === 'NO_DIAGRAM_SELECTED'
4034
? WorkspaceName
4135
: state.diagram?.name ?? WorkspaceName,
4236
};
4337
})(_TabTitle);
44-
45-
export function PluginTabTitleComponent({
46-
tabProps,
47-
workspaceProps,
48-
}: {
49-
tabProps: WorkspaceTabCoreProps;
50-
workspaceProps: WorkspaceProps;
51-
}) {
52-
return (
53-
<ConnectedTabTitle tabProps={tabProps} workspaceProps={workspaceProps} />
54-
);
55-
}

packages/compass-saved-aggregations-queries/src/plugin-tab-title.tsx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,17 @@ import {
33
WorkspaceTab,
44
type WorkspaceTabCoreProps,
55
} from '@mongodb-js/compass-components';
6+
import type { WorkspacePluginProps } from '@mongodb-js/compass-workspaces';
67

78
export const WorkspaceName = 'My Queries' as const;
89

9-
export function PluginTabTitleComponent({
10-
tabProps,
11-
workspaceProps,
12-
}: {
13-
tabProps: WorkspaceTabCoreProps;
14-
workspaceProps: { id: string };
15-
}) {
10+
type PluginTabTitleProps = WorkspaceTabCoreProps &
11+
WorkspacePluginProps<typeof WorkspaceName>;
12+
13+
export function PluginTabTitleComponent(props: PluginTabTitleProps) {
1614
return (
1715
<WorkspaceTab
18-
{...tabProps}
19-
id={workspaceProps.id}
16+
{...props}
2017
type={WorkspaceName}
2118
title={WorkspaceName}
2219
iconGlyph="CurlyBraces"
Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,38 @@
11
import React from 'react';
22
import {
3-
useTabConnectionTheme,
3+
useConnectionInfo,
44
useConnectionsListRef,
5+
useTabConnectionTheme,
56
} from '@mongodb-js/compass-connections/provider';
67
import {
78
WorkspaceTab,
89
type WorkspaceTabCoreProps,
910
} from '@mongodb-js/compass-components';
11+
import type { WorkspacePluginProps } from '@mongodb-js/compass-workspaces';
1012

1113
export const WorkspaceName = 'Performance' as const;
1214

13-
export function ServerStatsPluginTitleComponent({
14-
tabProps,
15-
workspaceProps,
16-
}: {
17-
tabProps: WorkspaceTabCoreProps;
18-
workspaceProps: {
19-
id: string;
20-
connectionId: string;
21-
};
22-
}) {
15+
type PluginTitleComponentProps = WorkspaceTabCoreProps &
16+
WorkspacePluginProps<typeof WorkspaceName>;
17+
18+
export function ServerStatsPluginTitleComponent(
19+
props: PluginTitleComponentProps
20+
) {
2321
const { getConnectionById } = useConnectionsListRef();
24-
const connectionName =
25-
getConnectionById(workspaceProps.connectionId)?.title || '';
22+
const { id: connectionId } = useConnectionInfo();
23+
const connectionName = getConnectionById(connectionId)?.title || '';
2624

2725
const { getThemeOf } = useTabConnectionTheme();
2826

2927
return (
3028
<WorkspaceTab
31-
{...tabProps}
32-
id={workspaceProps.id}
29+
{...props}
3330
type={WorkspaceName}
3431
connectionName={connectionName}
3532
title={`Performance: ${connectionName}`}
3633
tooltip={[['Performance', connectionName || '']]}
3734
iconGlyph="Gauge"
38-
tabTheme={getThemeOf(workspaceProps.connectionId)}
35+
tabTheme={getThemeOf(connectionId)}
3936
/>
4037
);
4138
}
Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,35 @@
11
import React from 'react';
22
import {
3+
useConnectionInfo,
34
useConnectionsListRef,
45
useTabConnectionTheme,
56
} from '@mongodb-js/compass-connections/provider';
67
import {
78
WorkspaceTab,
89
type WorkspaceTabCoreProps,
910
} from '@mongodb-js/compass-components';
11+
import type { WorkspacePluginProps } from '@mongodb-js/compass-workspaces';
1012

1113
export const WorkspaceName = 'Shell' as const;
1214

13-
export function ShellPluginTitleComponent({
14-
tabProps,
15-
workspaceProps,
16-
}: {
17-
tabProps: WorkspaceTabCoreProps;
18-
workspaceProps: {
19-
id: string;
20-
connectionId: string;
21-
};
22-
}) {
15+
type PluginTitleProps = WorkspaceTabCoreProps &
16+
WorkspacePluginProps<typeof WorkspaceName>;
17+
18+
export function ShellPluginTitleComponent(tabProps: PluginTitleProps) {
2319
const { getThemeOf } = useTabConnectionTheme();
2420
const { getConnectionById } = useConnectionsListRef();
21+
const { id: connectionId } = useConnectionInfo();
2522

26-
const connectionName =
27-
getConnectionById(workspaceProps.connectionId)?.title || '';
23+
const connectionName = getConnectionById(connectionId)?.title || '';
2824
return (
2925
<WorkspaceTab
3026
{...tabProps}
31-
id={workspaceProps.id}
3227
connectionName={connectionName}
3328
type={WorkspaceName}
3429
title={connectionName ? `mongosh: ${connectionName}` : 'MongoDB Shell'}
3530
tooltip={connectionName ? [['mongosh', connectionName]] : []}
3631
iconGlyph="Shell"
37-
tabTheme={getThemeOf(workspaceProps.connectionId)}
32+
tabTheme={getThemeOf(connectionId)}
3833
/>
3934
);
4035
}

packages/compass-welcome/src/plugin-tab-title.tsx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,17 @@ import {
33
WorkspaceTab,
44
type WorkspaceTabCoreProps,
55
} from '@mongodb-js/compass-components';
6+
import type { WorkspacePluginProps } from '@mongodb-js/compass-workspaces';
67

78
export const WorkspaceName = 'Welcome' as const;
89

9-
export function PluginTabTitleComponent({
10-
tabProps,
11-
workspaceProps,
12-
}: {
13-
tabProps: WorkspaceTabCoreProps;
14-
workspaceProps: { id: string };
15-
}) {
10+
type PluginTitleComponentProps = WorkspaceTabCoreProps &
11+
WorkspacePluginProps<typeof WorkspaceName>;
12+
13+
export function PluginTabTitleComponent(props: PluginTitleComponentProps) {
1614
return (
1715
<WorkspaceTab
18-
{...tabProps}
19-
id={workspaceProps.id}
16+
{...props}
2017
type={WorkspaceName}
2118
title={WorkspaceName}
2219
iconGlyph="Logo"

packages/compass-workspaces/src/components/workspace-tab-context-provider.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
WorkspaceTabStateProvider,
1111
} from './workspace-tab-state-provider';
1212
import { AppRegistryProvider } from 'hadron-app-registry';
13+
import { useWorkspacePlugins } from './workspaces-provider';
1314

1415
function getInitialPropsForWorkspace(tab: WorkspaceTab) {
1516
switch (tab.type) {
@@ -100,6 +101,9 @@ const WorkspaceTabContextProvider: React.FunctionComponent<
100101
WorkspaceTabContextProviderProps
101102
> = ({ tab, onNamespaceNotFound, sectionType: type, children }) => {
102103
const initialProps = getInitialPropsForWorkspace(tab);
104+
const { getWorkspacePluginByName } = useWorkspacePlugins();
105+
106+
const { provider: WorkspaceProvider } = getWorkspacePluginByName(tab.type);
103107

104108
if (initialProps) {
105109
children = React.cloneElement(children, initialProps);
@@ -138,7 +142,7 @@ const WorkspaceTabContextProvider: React.FunctionComponent<
138142
localAppRegistry={getLocalAppRegistryForTab(tab.id)}
139143
deactivateOnUnmount={false}
140144
>
141-
{children}
145+
<WorkspaceProvider>{children}</WorkspaceProvider>
142146
</AppRegistryProvider>
143147
</WorkspaceTabStateProvider>
144148
);

packages/compass-workspaces/src/components/workspaces-provider.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ export const useWorkspacePlugins = () => {
3434
getWorkspacePlugins: (): AnyWorkspacePlugin[] => {
3535
return workspaces;
3636
},
37+
getWorkspacePluginByName: <T extends AnyWorkspace['type']>(name: T) => {
38+
const plugin = workspaces.find((ws) => ws.name === name);
39+
if (!plugin) {
40+
throw new Error(
41+
`Component for workspace "${name}" is missing in context. Did you forget to set up WorkspacesProvider?`
42+
);
43+
}
44+
return plugin as unknown as WorkspacePlugin<T>;
45+
},
3746
});
3847
return workspacePlugins.current;
3948
};

0 commit comments

Comments
 (0)