Skip to content

Commit 2860e70

Browse files
committed
refactor
1 parent 6b232a9 commit 2860e70

File tree

8 files changed

+77
-49
lines changed

8 files changed

+77
-49
lines changed

packages/compass-connections-navigation/src/connections-navigation-tree.tsx

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useCallback, useMemo } from 'react';
22
import AutoSizer from 'react-virtualized-auto-sizer';
3-
import { clusterIsConnectable, getVirtualTreeItems } from './tree-data';
3+
import { getConnectionId, getVirtualTreeItems } from './tree-data';
44
import { ROW_HEIGHT } from './constants';
55
import type { Actions } from './constants';
66
import { VirtualTree } from './virtual-list/virtual-list';
@@ -18,10 +18,10 @@ import {
1818
spacing,
1919
useId,
2020
} from '@mongodb-js/compass-components';
21+
import { useConnectableRef } from '@mongodb-js/compass-connections/provider';
2122
import type { WorkspaceTab } from '@mongodb-js/compass-workspaces';
2223
import { usePreference } from 'compass-preferences-model/provider';
2324
import type { NavigationItemActions } from './item-actions';
24-
import { useConnectionsListRef } from '@mongodb-js/compass-connections/provider';
2525
import {
2626
collectionItemActions,
2727
connectedConnectionItemActions,
@@ -58,7 +58,7 @@ const ConnectionsNavigationTree: React.FunctionComponent<
5858
);
5959

6060
const id = useId();
61-
const { getConnectionById } = useConnectionsListRef();
61+
const { getConnectable } = useConnectableRef();
6262

6363
const treeData = useMemo(() => {
6464
return getVirtualTreeItems({
@@ -71,11 +71,8 @@ const ConnectionsNavigationTree: React.FunctionComponent<
7171

7272
const onDefaultAction: OnDefaultAction<SidebarActionableItem> = useCallback(
7373
(item, evt) => {
74-
const isConnectableCluster = clusterIsConnectable(
75-
item,
76-
getConnectionById
77-
);
78-
if (!isConnectableCluster) {
74+
const connectionId = getConnectionId(item);
75+
if (!getConnectable(connectionId)) {
7976
return;
8077
}
8178

@@ -93,7 +90,7 @@ const ConnectionsNavigationTree: React.FunctionComponent<
9390
}
9491
}
9592
},
96-
[onItemAction, getConnectionById]
93+
[onItemAction, getConnectable]
9794
);
9895

9996
const activeItemId = useMemo(() => {
@@ -154,11 +151,8 @@ const ConnectionsNavigationTree: React.FunctionComponent<
154151

155152
const getItemActionsAndConfig = useCallback(
156153
(item: SidebarTreeItem) => {
157-
const isConnectableCluster = clusterIsConnectable(
158-
item,
159-
getConnectionById
160-
);
161-
if (!isConnectableCluster) {
154+
const connectionId = getConnectionId(item);
155+
if (!getConnectable(connectionId)) {
162156
return {
163157
actions: [],
164158
};
@@ -214,7 +208,7 @@ const ConnectionsNavigationTree: React.FunctionComponent<
214208
[
215209
isRenameCollectionEnabled,
216210
getCollapseAfterForConnectedItem,
217-
getConnectionById,
211+
getConnectable,
218212
]
219213
);
220214

packages/compass-connections-navigation/src/styled-navigation-item.tsx

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import {
44
DefaultColorCode,
55
} from '@mongodb-js/connection-form';
66
import { palette, useDarkMode } from '@mongodb-js/compass-components';
7-
import { clusterIsConnectable, type SidebarTreeItem } from './tree-data';
8-
import { useConnectionsListRef } from '@mongodb-js/compass-connections/provider';
7+
import { getConnectionId, type SidebarTreeItem } from './tree-data';
8+
import { useConnectable } from '@mongodb-js/compass-connections/provider';
99

1010
type AcceptedStyles = {
1111
'--item-bg-color'?: string;
@@ -30,8 +30,9 @@ export default function StyledNavigationItem({
3030
() => (isDarkMode ? palette.gray.light1 : palette.gray.dark1),
3131
[isDarkMode]
3232
);
33-
const { getConnectionById } = useConnectionsListRef();
34-
const isConnectableCluster = clusterIsConnectable(item, getConnectionById);
33+
34+
const connectionId = getConnectionId(item);
35+
const isConnectable = useConnectable(connectionId);
3536

3637
const style: React.CSSProperties & AcceptedStyles = useMemo(() => {
3738
const style: AcceptedStyles = {};
@@ -47,22 +48,18 @@ export default function StyledNavigationItem({
4748
style['--item-bg-color-active'] = connectionColorToHexActive(colorCode);
4849
}
4950

50-
if (
51-
isDisconnectedConnection ||
52-
isNonExistentNamespace ||
53-
!isConnectableCluster
54-
) {
51+
if (isDisconnectedConnection || isNonExistentNamespace || !isConnectable) {
5552
style['--item-color'] = inactiveColor;
5653
}
5754

5855
// We always show these as inactive
59-
if (isNonExistentNamespace || !isConnectableCluster) {
56+
if (isNonExistentNamespace || !isConnectable) {
6057
style['--item-color-active'] = inactiveColor;
6158
}
6259
return style;
6360
}, [
6461
inactiveColor,
65-
isConnectableCluster,
62+
isConnectable,
6663
item,
6764
colorCode,
6865
connectionColorToHex,

packages/compass-connections-navigation/src/tree-data.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -124,22 +124,14 @@ export type SidebarActionableItem =
124124

125125
export type SidebarTreeItem = PlaceholderTreeItem | SidebarActionableItem;
126126

127-
export function clusterIsConnectable(
128-
item: SidebarTreeItem,
129-
getConnectionById: any
130-
): boolean {
131-
if (item.type === 'connection') {
132-
const clusterState = item.connectionInfo.atlasMetadata?.clusterState;
133-
return !['DELETING', 'DELETED', 'CREATING', 'PAUSED'].includes(
134-
clusterState
135-
);
136-
} else if (item.type === 'database' || item.type === 'collection') {
137-
const connection = getConnectionById(item.connectionId);
138-
return !['DELETING', 'DELETED', 'CREATING', 'PAUSED'].includes(
139-
connection.info.atlasMetadata?.clusterState
140-
);
127+
export function getConnectionId(item: SidebarTreeItem): string {
128+
if (item.type === 'placeholder') {
129+
return '';
130+
} else if (item.type === 'connection') {
131+
return item.connectionInfo.id;
132+
} else {
133+
return item.connectionId;
141134
}
142-
return true;
143135
}
144136

145137
const notConnectedConnectionToItems = ({
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { useSelector, useStore } from '../stores/store-context';
2+
import { useRef, useState } from 'react';
3+
import { connectable } from '../utils/connection-supports';
4+
5+
export function useConnectable(connectionId: string): boolean {
6+
return useSelector((state) => {
7+
const connection = state.connections.byId[connectionId];
8+
9+
if (!connection) {
10+
return false;
11+
}
12+
13+
return connectable(connection.info);
14+
});
15+
}
16+
17+
export function useConnectableRef(): {
18+
getConnectable(this: void, connectionId: string): boolean;
19+
} {
20+
const storeRef = useRef(useStore());
21+
const [ref] = useState(() => {
22+
return {
23+
getConnectable(connectionId: string) {
24+
const conn = storeRef.current.getState().connections.byId[connectionId];
25+
if (!conn) {
26+
return false;
27+
}
28+
29+
return connectable(conn.info);
30+
},
31+
};
32+
});
33+
return ref;
34+
}

packages/compass-connections/src/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
ConnectionActionsProvider,
2424
} from './stores/store-context';
2525
export type { ConnectionFeature } from './utils/connection-supports';
26-
export { connectionSupports } from './utils/connection-supports';
26+
export { connectionSupports, connectable } from './utils/connection-supports';
2727

2828
const ConnectionsComponent: React.FunctionComponent<{
2929
/**

packages/compass-connections/src/provider.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ export type { ConnectionsService } from './stores/store-context';
6969

7070
export { useConnectionSupports } from './hooks/use-connection-supports';
7171

72+
export { useConnectable, useConnectableRef } from './hooks/use-connectable';
73+
7274
const ConnectionStatus = {
7375
/**
7476
* @deprecated use a string literal directly

packages/compass-connections/src/stores/connections-store-redux.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import EventEmitter from 'events';
3232
import { showNonGenuineMongoDBWarningModal as _showNonGenuineMongoDBWarningModal } from '../components/non-genuine-connection-modal';
3333
import ConnectionString from 'mongodb-connection-string-url';
3434
import type { ExtraConnectionData as ExtraConnectionDataForTelemetry } from '@mongodb-js/compass-telemetry';
35+
import { connectable } from '../utils/connection-supports';
3536

3637
export type ConnectionsEventMap = {
3738
connected: (
@@ -563,6 +564,7 @@ function mergeConnections(
563564
}
564565
}
565566

567+
// If an Atlas connection was removed, it means that the cluster was deleted
566568
for (const connectionId of removedConnectionIds) {
567569
const removedConnection = newConnectionsById[connectionId];
568570
if (removedConnection.info.atlasMetadata) {
@@ -1511,13 +1513,7 @@ const connectWithOptions = (
15111513
return;
15121514
}
15131515

1514-
const atlasClusterState = connectionInfo.atlasMetadata?.clusterState;
1515-
if (
1516-
atlasClusterState === 'DELETED' ||
1517-
atlasClusterState === 'DELETING' ||
1518-
atlasClusterState === 'CREATING' ||
1519-
atlasClusterState === 'PAUSED'
1520-
) {
1516+
if (!connectable(connectionInfo)) {
15211517
return;
15221518
}
15231519

packages/compass-connections/src/utils/connection-supports.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ function supportsRollingIndexCreation(connectionInfo: ConnectionInfo) {
1111
return atlasMetadata.supports.rollingIndexes;
1212
}
1313

14+
export function connectable(connectionInfo: ConnectionInfo) {
15+
const atlasClusterState = connectionInfo.atlasMetadata?.clusterState;
16+
if (
17+
atlasClusterState === 'DELETED' ||
18+
atlasClusterState === 'DELETING' ||
19+
atlasClusterState === 'CREATING' ||
20+
atlasClusterState === 'PAUSED'
21+
) {
22+
return false;
23+
}
24+
return true;
25+
}
26+
1427
function supportsGlobalWrites(connectionInfo: ConnectionInfo) {
1528
const atlasMetadata = connectionInfo.atlasMetadata;
1629

0 commit comments

Comments
 (0)