Skip to content

Commit 104dc38

Browse files
committed
wip
1 parent 35f125b commit 104dc38

File tree

5 files changed

+95
-73
lines changed

5 files changed

+95
-73
lines changed
Lines changed: 83 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1-
import { connect } from 'react-redux';
1+
import { connect as reduxConnect } from 'react-redux';
22
import ConnectionFormModal from '@mongodb-js/connection-form';
33
import type { ConnectionInfo } from '@mongodb-js/connection-storage/provider';
4+
import {
5+
connect,
6+
disconnect,
7+
cancelEditConnection,
8+
saveEditedConnectionInfo,
9+
saveAndConnect,
10+
} from '../stores/connections-store-redux';
11+
412
import type {
513
ConnectionId,
614
ConnectionState,
@@ -11,11 +19,13 @@ function shouldDisableConnectionEditing(connection: ConnectionState): boolean {
1119
}
1220

1321
function mapState({
22+
isEditingNewConnection,
1423
isEditingConnectionInfoModalOpen,
1524
editingConnectionInfo,
1625
connectionErrors,
1726
connections,
1827
}: {
28+
isEditingNewConnection: boolean;
1929
isEditingConnectionInfoModalOpen: boolean;
2030
editingConnectionInfo: ConnectionInfo;
2131
connectionErrors: Record<string, Error | null>;
@@ -32,53 +42,86 @@ function mapState({
3242
initialConnectionInfo: editingConnectionInfo,
3343
connectionErrorMessage: connectionErrors[editingConnectionInfo.id]?.message,
3444
disableEditingConnectedConnection,
45+
editingConnectionInfo,
46+
isEditingNewConnection,
47+
connections,
3548
};
3649
}
3750

38-
function mapDispatch(
39-
{
40-
disconnect,
41-
cancelEditConnection,
42-
}: {
43-
//connect: (connectionInfo: ConnectionInfo) => Promise<void>;
44-
//saveAndConnect: (connectionInfo: ConnectionInfo) => Promise<void>;
45-
disconnect: (connectionId: string) => void;
46-
47-
//createNewConnection: () => void;
48-
//editConnection: (connectionId: string) => void;
49-
//saveEditedConnection: (connectionInfo: ConnectionInfo) => Promise<void>;
50-
cancelEditConnection: (connectionId: string) => void;
51-
/*
52-
duplicateConnection: (
53-
connectionId: string,
54-
options?: { autoDuplicate: boolean }
55-
) => void;
56-
*/
57-
//toggleConnectionFavoritedStatus: (connectionId: string) => void;
58-
//removeConnection: (connectionId: string) => void;
51+
const mapDispatch = {
52+
connect,
53+
disconnect,
54+
cancelEditConnection,
55+
saveEditedConnectionInfo,
56+
saveAndConnect,
57+
};
5958

60-
//removeAllRecentConnections: () => void;
61-
//showNonGenuineMongoDBWarningModal: (connectionId: string) => void;
62-
},
63-
{
64-
isEditingNewConnection,
65-
editingConnectionInfo,
66-
connections,
67-
}: {
68-
isEditingNewConnection: boolean;
69-
editingConnectionInfo: ConnectionInfo;
70-
connections: {
71-
byId: Record<ConnectionId, ConnectionState>;
72-
};
59+
function mergeProps(
60+
stateProps: ReturnType<typeof mapState>,
61+
dispatchProps: {
62+
// TODO: surely there's a way of inferring these types?
63+
connect: (connectionInfo: ConnectionInfo) => any;
64+
disconnect: (id: string) => void;
65+
cancelEditConnection: (id: string) => void;
66+
saveEditedConnectionInfo: (connectionInfo: ConnectionInfo) => any;
67+
saveAndConnect: (connectionInfo: ConnectionInfo) => any;
7368
}
7469
) {
75-
const disableEditingConnectedConnection = shouldDisableConnectionEditing(
76-
connections.byId[editingConnectionInfo.id]
77-
);
70+
const {
71+
isOpen,
72+
initialConnectionInfo,
73+
connectionErrorMessage,
74+
disableEditingConnectedConnection,
75+
editingConnectionInfo,
76+
isEditingNewConnection,
77+
} = stateProps;
7878

79-
return {
79+
const {
80+
connect,
8081
disconnect,
82+
saveAndConnect,
83+
saveEditedConnectionInfo,
84+
cancelEditConnection,
85+
} = dispatchProps;
86+
87+
return {
88+
isOpen,
89+
initialConnectionInfo,
90+
connectionErrorMessage,
91+
disableEditingConnectedConnection,
92+
93+
onDisconnectClicked: () => disconnect(editingConnectionInfo.id),
94+
setOpen: (newOpen: boolean) => {
95+
// This is how leafygreen propagates `X` button click
96+
if (newOpen === false) {
97+
cancelEditConnection(editingConnectionInfo.id);
98+
}
99+
},
100+
openSettingsModal: () => {
101+
// TODO: this has to emit on the global app registry somehow
102+
},
103+
onCancel: () => {
104+
cancelEditConnection(editingConnectionInfo.id);
105+
},
106+
onSaveClicked: (connectionInfo: ConnectionInfo) => {
107+
return saveEditedConnectionInfo(connectionInfo);
108+
},
109+
onConnectClicked:
110+
isEditingNewConnection || disableEditingConnectedConnection
111+
? undefined
112+
: (connectionInfo: ConnectionInfo) => {
113+
void connect(connectionInfo);
114+
},
115+
onSaveAndConnectClicked: disableEditingConnectedConnection
116+
? undefined
117+
: (connectionInfo: ConnectionInfo) => {
118+
void saveAndConnect(connectionInfo);
119+
},
81120
};
82121
}
83122

84-
export default connect(mapState, mapDispatch)(ConnectionFormModal);
123+
export default reduxConnect(
124+
mapState,
125+
mapDispatch,
126+
mergeProps
127+
)(ConnectionFormModal);

packages/compass-connections/src/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export { useConnectionFormPreferences } from './hooks/use-connection-form-prefer
2323
import ConnectionModal from './components/connection-modal';
2424
import type { connect as devtoolsConnect } from 'mongodb-data-service';
2525
import type { ExtraConnectionData as ExtraConnectionDataForTelemetry } from '@mongodb-js/compass-telemetry';
26+
import { useConnectionFormPreferences } from './hooks/use-connection-form-preferences';
2627
export type { ConnectionFeature } from './utils/connection-supports';
2728
export { connectionSupports } from './utils/connection-supports';
2829

@@ -37,10 +38,11 @@ const ConnectionsComponent: React.FunctionComponent<{
3738
connectFn?: typeof devtoolsConnect | undefined;
3839
preloadStorageConnectionInfos?: ConnectionInfo[];
3940
}> = ({ children }) => {
41+
const formPreferences = useConnectionFormPreferences();
4042
return (
4143
<ConnectionActionsProvider>
4244
{children}
43-
<ConnectionModal />
45+
<ConnectionModal {...formPreferences} />
4446
</ConnectionActionsProvider>
4547
);
4648
};

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Reducer, AnyAction, Action } from 'redux';
1+
import type { Store, Reducer, AnyAction, Action } from 'redux';
22
import { createStore, applyMiddleware } from 'redux';
33
import type { ThunkAction } from 'redux-thunk';
44
import thunk from 'redux-thunk';
@@ -2178,3 +2178,10 @@ export function configureStore(
21782178
applyMiddleware(thunk.withExtraArgument(thunkArg))
21792179
);
21802180
}
2181+
2182+
export type ConnectionsStore = ReturnType<typeof configureStore> extends Store<
2183+
infer S,
2184+
infer A
2185+
> & { dispatch: infer D }
2186+
? { state: S; actions: A; dispatch: D }
2187+
: never;

packages/compass-connections/src/stores/store-context.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {
1414
configureStore,
1515
ConnectionId,
1616
ConnectionState,
17+
ConnectionsStore,
1718
} from './connections-store-redux';
1819
import {
1920
cancelEditConnection,
@@ -33,21 +34,13 @@ import {
3334
importConnections,
3435
refreshConnections,
3536
} from './connections-store-redux';
36-
import type { Store } from 'redux';
3737
import {
3838
getConnectionTitle,
3939
type ConnectionInfo,
4040
} from '@mongodb-js/connection-info';
4141
import { createServiceLocator } from 'hadron-app-registry';
4242
import { isEqual } from 'lodash';
4343

44-
type ConnectionsStore = ReturnType<typeof configureStore> extends Store<
45-
infer S,
46-
infer A
47-
> & { dispatch: infer D }
48-
? { state: S; actions: A; dispatch: D }
49-
: never;
50-
5144
export const ConnectionsStoreContext = React.createContext<
5245
ReactReduxContextValue<ConnectionsStore['state']>
5346
// @ts-expect-error not possible to correctly pass default value here

packages/compass-sidebar/src/components/multiple-connections/sidebar.tsx

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
useConnections,
66
useConnectionsWithStatus,
77
} from '@mongodb-js/compass-connections/provider';
8-
import { useConnectionFormPreferences } from '@mongodb-js/compass-connections';
98
import { type ConnectionInfo } from '@mongodb-js/connection-info';
109
import {
1110
ResizableSidebar,
@@ -15,7 +14,6 @@ import {
1514
HorizontalRule,
1615
} from '@mongodb-js/compass-components';
1716
import { SidebarHeader } from './header/sidebar-header';
18-
import { ConnectionFormModal } from '@mongodb-js/connection-form';
1917
import { type RootState, type SidebarThunkAction } from '../../modules';
2018
import { Navigation } from './navigation/navigation';
2119
import ConnectionInfoModal from '../connection-info-modal';
@@ -27,7 +25,6 @@ import CSFLEConnectionModal, {
2725
} from '../csfle-connection-modal';
2826
import type { ConnectionsFilter } from '../use-filtered-connections';
2927
import { setConnectionIsCSFLEEnabled } from '../../modules/data-service';
30-
import { useGlobalAppRegistry } from 'hadron-app-registry';
3128

3229
const TOAST_TIMEOUT_MS = 5000; // 5 seconds.
3330

@@ -107,27 +104,17 @@ export function MultipleConnectionSidebar({
107104
const [connectionInfoModalConnectionId, setConnectionInfoModalConnectionId] =
108105
useState<string | undefined>();
109106

110-
const formPreferences = useConnectionFormPreferences();
111107
const maybeProtectConnectionString = useMaybeProtectConnectionString();
112108
const connectionsWithStatus = useConnectionsWithStatus();
113109
const {
114110
connect,
115-
saveAndConnect,
116111
disconnect,
117112
createNewConnection,
118113
editConnection,
119-
cancelEditConnection,
120114
removeConnection,
121115
duplicateConnection,
122-
saveEditedConnection,
123116
toggleConnectionFavoritedStatus,
124117
showNonGenuineMongoDBWarningModal,
125-
state: {
126-
editingConnectionInfo,
127-
isEditingNewConnection,
128-
isEditingConnectionInfoModalOpen,
129-
connectionErrors,
130-
},
131118
} = useConnections();
132119

133120
const findActiveConnection = (id: string) => {
@@ -177,16 +164,6 @@ export function MultipleConnectionSidebar({
177164
[csfleModalConnectionId, onConnectionCsfleModeChanged]
178165
);
179166

180-
const globalAppRegistry = useGlobalAppRegistry();
181-
const openSettingsModal = useCallback(
182-
(tab?: string) => globalAppRegistry.emit('open-compass-settings', tab),
183-
[globalAppRegistry]
184-
);
185-
186-
const disableEditingConnectedConnection = !!findActiveConnection(
187-
editingConnectionInfo.id
188-
);
189-
190167
return (
191168
<ResizableSidebar data-testid="navigation-sidebar" useNewTheme={true}>
192169
<aside className={sidebarStyles}>

0 commit comments

Comments
 (0)