{storeConnectionError && (
diff --git a/packages/connections/src/components/resizeable-sidebar.tsx b/packages/connections/src/components/resizeable-sidebar.tsx
index 7dafab5e3bd..6589e92c457 100644
--- a/packages/connections/src/components/resizeable-sidebar.tsx
+++ b/packages/connections/src/components/resizeable-sidebar.tsx
@@ -36,6 +36,8 @@ function ResizableSidebar({
setActiveConnectionId,
onConnectionDoubleClicked,
removeAllRecentsConnections,
+ duplicateConnection,
+ removeConnection,
}: {
activeConnectionId?: string;
connections: ConnectionInfo[];
@@ -43,6 +45,8 @@ function ResizableSidebar({
setActiveConnectionId: (newConnectionId?: string) => void;
onConnectionDoubleClicked: (connectionInfo: ConnectionInfo) => void;
removeAllRecentsConnections: () => void;
+ duplicateConnection: (connectionInfo: ConnectionInfo) => void;
+ removeConnection: (connectionInfo: ConnectionInfo) => void;
}): React.ReactElement {
const [width, setWidth] = useState(initialSidebarWidth);
@@ -61,6 +65,8 @@ function ResizableSidebar({
setActiveConnectionId={setActiveConnectionId}
onDoubleClick={onConnectionDoubleClicked}
removeAllRecentsConnections={removeAllRecentsConnections}
+ removeConnection={removeConnection}
+ duplicateConnection={duplicateConnection}
/>
setWidth(newWidth)}
diff --git a/packages/connections/src/stores/connections-store.ts b/packages/connections/src/stores/connections-store.ts
index 95634a3c4c8..0b2aacde24c 100644
--- a/packages/connections/src/stores/connections-store.ts
+++ b/packages/connections/src/stores/connections-store.ts
@@ -1,4 +1,3 @@
-import { v4 as uuidv4 } from 'uuid';
import {
ConnectionInfo,
ConnectionOptions,
@@ -17,7 +16,8 @@ import {
trackNewConnectionEvent,
trackConnectionFailedEvent,
} from '../modules/telemetry';
-
+import { v4 as uuidv4 } from 'uuid';
+import { cloneDeep } from 'lodash';
const debug = debugModule('mongodb-compass:connections:connections-store');
export function createNewConnectionInfo(): ConnectionInfo {
@@ -94,6 +94,11 @@ type Action =
| {
type: 'set-connections';
connections: ConnectionInfo[];
+ }
+ | {
+ type: 'set-connections-and-select';
+ connections: ConnectionInfo[];
+ activeConnectionInfo: ConnectionInfo;
};
export function connectionsReducer(state: State, action: Action): State {
@@ -151,6 +156,13 @@ export function connectionsReducer(state: State, action: Action): State {
...state,
connections: action.connections,
};
+ case 'set-connections-and-select':
+ return {
+ ...state,
+ connections: action.connections,
+ activeConnectionId: action.activeConnectionInfo.id,
+ activeConnectionInfo: action.activeConnectionInfo,
+ };
default:
return state;
}
@@ -191,13 +203,16 @@ export function useConnections(
hideStoreConnectionError(): void;
setActiveConnectionById(newConnectionId?: string | undefined): void;
removeAllRecentsConnections(): void;
+ duplicateConnection(connectioInfo: ConnectionInfo): void;
+ removeConnection(connectionInfo: ConnectionInfo): void;
}
] {
const [state, dispatch]: [State, React.Dispatch] = useReducer(
connectionsReducer,
defaultConnectionsState()
);
- const { isConnected, connectionAttempt, connections } = state;
+ const { isConnected, connectionAttempt, connections, activeConnectionId } =
+ state;
const connectingConnectionAttempt = useRef();
const connectedConnectionInfo = useRef();
@@ -206,7 +221,6 @@ export function useConnections(
async function saveConnectionInfo(connectionInfo: ConnectionInfo) {
try {
await connectionStorage.save(connectionInfo);
-
debug(`saved connection with id ${connectionInfo.id || ''}`);
} catch (err) {
debug(
@@ -379,6 +393,37 @@ export function useConnections(
}),
});
},
+ async removeConnection(connectionInfo: ConnectionInfo) {
+ await connectionStorage.delete(connectionInfo);
+ dispatch({
+ type: 'set-connections',
+ connections: connections.filter(
+ (conn) => conn.id !== connectionInfo.id
+ ),
+ });
+ if (activeConnectionId === connectionInfo.id) {
+ const nextActiveConnection = createNewConnectionInfo();
+ dispatch({
+ type: 'set-active-connection',
+ connectionId: nextActiveConnection.id,
+ connectionInfo: nextActiveConnection,
+ });
+ }
+ },
+ async duplicateConnection(connectionInfo: ConnectionInfo) {
+ const duplicate: ConnectionInfo = {
+ ...cloneDeep(connectionInfo),
+ id: uuidv4(),
+ };
+ duplicate.favorite!.name += ' (copy)';
+
+ await saveConnectionInfo(duplicate);
+ dispatch({
+ type: 'set-connections-and-select',
+ connections: [...connections, duplicate],
+ activeConnectionInfo: duplicate,
+ });
+ },
},
];
}