From dea04b0ad9fcdeb2b5ca32250f7e093d80538a79 Mon Sep 17 00:00:00 2001 From: Matthew Runyon Date: Thu, 4 Nov 2021 15:52:57 -0500 Subject: [PATCH 1/2] Convert core redux to TS --- .../src/linker/Linker.tsx | 22 +--- .../src/panels/FileExplorerPanel.tsx | 4 +- packages/redux/package.json | 3 + .../src/{actionTypes.js => actionTypes.ts} | 0 packages/redux/src/actions.js | 74 ------------ packages/redux/src/actions.ts | 112 ++++++++++++++++++ packages/redux/src/{index.js => index.ts} | 1 + .../{crashReporter.js => crashReporter.ts} | 3 +- .../src/middleware/{index.js => index.ts} | 0 .../src/middleware/{logger.js => logger.ts} | 3 +- .../reducers/{activeTool.js => activeTool.ts} | 0 .../reducers/common/{index.js => index.ts} | 0 .../redux/src/reducers/common/mergeReducer.js | 27 ----- .../redux/src/reducers/common/mergeReducer.ts | 34 ++++++ .../src/reducers/common/replaceByIdReducer.js | 26 ---- .../src/reducers/common/replaceByIdReducer.ts | 30 +++++ .../src/reducers/common/replaceReducer.js | 15 --- .../src/reducers/common/replaceReducer.ts | 22 ++++ .../redux/src/reducers/{index.js => index.ts} | 0 ...oryStorage.js => commandHistoryStorage.ts} | 0 .../{fileStorage.js => fileStorage.ts} | 0 .../reducers/storage/{index.js => index.ts} | 0 ...orkspaceStorage.js => workspaceStorage.ts} | 0 .../redux/src/reducers/{user.js => user.ts} | 0 .../reducers/{workspace.js => workspace.ts} | 0 ...orkspaceStorage.js => workspaceStorage.ts} | 0 packages/redux/src/selectors.js | 40 ------- packages/redux/src/selectors.ts | 67 +++++++++++ packages/redux/src/store.js | 23 ---- packages/redux/src/store.ts | 83 +++++++++++++ 30 files changed, 361 insertions(+), 228 deletions(-) rename packages/redux/src/{actionTypes.js => actionTypes.ts} (100%) delete mode 100644 packages/redux/src/actions.js create mode 100644 packages/redux/src/actions.ts rename packages/redux/src/{index.js => index.ts} (90%) rename packages/redux/src/middleware/{crashReporter.js => crashReporter.ts} (75%) rename packages/redux/src/middleware/{index.js => index.ts} (100%) rename packages/redux/src/middleware/{logger.js => logger.ts} (70%) rename packages/redux/src/reducers/{activeTool.js => activeTool.ts} (100%) rename packages/redux/src/reducers/common/{index.js => index.ts} (100%) delete mode 100644 packages/redux/src/reducers/common/mergeReducer.js create mode 100644 packages/redux/src/reducers/common/mergeReducer.ts delete mode 100644 packages/redux/src/reducers/common/replaceByIdReducer.js create mode 100644 packages/redux/src/reducers/common/replaceByIdReducer.ts delete mode 100644 packages/redux/src/reducers/common/replaceReducer.js create mode 100644 packages/redux/src/reducers/common/replaceReducer.ts rename packages/redux/src/reducers/{index.js => index.ts} (100%) rename packages/redux/src/reducers/storage/{commandHistoryStorage.js => commandHistoryStorage.ts} (100%) rename packages/redux/src/reducers/storage/{fileStorage.js => fileStorage.ts} (100%) rename packages/redux/src/reducers/storage/{index.js => index.ts} (100%) rename packages/redux/src/reducers/storage/{workspaceStorage.js => workspaceStorage.ts} (100%) rename packages/redux/src/reducers/{user.js => user.ts} (100%) rename packages/redux/src/reducers/{workspace.js => workspace.ts} (100%) rename packages/redux/src/reducers/{workspaceStorage.js => workspaceStorage.ts} (100%) delete mode 100644 packages/redux/src/selectors.js create mode 100644 packages/redux/src/selectors.ts delete mode 100644 packages/redux/src/store.js create mode 100644 packages/redux/src/store.ts diff --git a/packages/dashboard-core-plugins/src/linker/Linker.tsx b/packages/dashboard-core-plugins/src/linker/Linker.tsx index 885796bcaf..29aa376480 100644 --- a/packages/dashboard-core-plugins/src/linker/Linker.tsx +++ b/packages/dashboard-core-plugins/src/linker/Linker.tsx @@ -18,6 +18,7 @@ import { getActiveTool, getTimeZone, setActiveTool as setActiveToolAction, + RootState, } from '@deephaven/redux'; import { getIsolatedLinkerPanelIdForDashboard, @@ -55,7 +56,7 @@ interface OwnProps { localDashboardId: string; } -const mapState = (state: LinkerState, ownProps: OwnProps): StateProps => ({ +const mapState = (state: RootState, ownProps: OwnProps): StateProps => ({ activeTool: getActiveTool(state), isolatedLinkerPanelId: getIsolatedLinkerPanelIdForDashboard( state, @@ -65,24 +66,7 @@ const mapState = (state: LinkerState, ownProps: OwnProps): StateProps => ({ timeZone: getTimeZone(state), }); -type DispatchProps = { - setActiveTool: (activeTool: string) => void; - setDashboardLinks: (dashboardId: string, links: Link[]) => void; - addDashboardLinks: (dashboardId: string, links: Link[]) => void; - deleteDashboardLinks: (dashboardId: string, linkIds: string[]) => void; - setDashboardIsolatedLinkerPanelId: ( - dashboardId: string, - panelId: string | undefined - ) => void; - setDashboardColumnSelectionValidator: ( - dashboardId: string, - columnValidator: - | ((panel: PanelComponent, column?: LinkColumn) => boolean) - | undefined - ) => void; -}; - -const connector = connect(mapState, { +const connector = connect(mapState, { setActiveTool: setActiveToolAction, setDashboardLinks: setDashboardLinksAction, addDashboardLinks: addDashboardLinksAction, diff --git a/packages/dashboard-core-plugins/src/panels/FileExplorerPanel.tsx b/packages/dashboard-core-plugins/src/panels/FileExplorerPanel.tsx index f4d9a1a35c..9722c9dcec 100644 --- a/packages/dashboard-core-plugins/src/panels/FileExplorerPanel.tsx +++ b/packages/dashboard-core-plugins/src/panels/FileExplorerPanel.tsx @@ -1,5 +1,5 @@ import Log from '@deephaven/log'; -import { getFileStorage } from '@deephaven/redux'; +import { getFileStorage, RootState } from '@deephaven/redux'; import FileExplorer, { FileExplorerToolbar, FileStorage, @@ -244,7 +244,7 @@ export class FileExplorerPanel extends React.Component< } const mapStateToProps = ( - state: unknown, + state: RootState, ownProps: { localDashboardId: string } ) => { const fileStorage = getFileStorage(state); diff --git a/packages/redux/package.json b/packages/redux/package.json index b97eb42a34..0e7bbb118f 100644 --- a/packages/redux/package.json +++ b/packages/redux/package.json @@ -36,8 +36,11 @@ }, "devDependencies": { "@babel/cli": "^7.14.8", + "@deephaven/console": "^0.6.0", + "@deephaven/file-explorer": "^0.6.0", "@deephaven/log": "^0.6.0", "@deephaven/tsconfig": "^0.6.0", + "@types/deep-equal": "^1.0.1", "cross-env": "^7.0.2", "npm-run-all": "^4.1.5", "redux": "^4.0.5", diff --git a/packages/redux/src/actionTypes.js b/packages/redux/src/actionTypes.ts similarity index 100% rename from packages/redux/src/actionTypes.js rename to packages/redux/src/actionTypes.ts diff --git a/packages/redux/src/actions.js b/packages/redux/src/actions.js deleted file mode 100644 index f9db5fd61a..0000000000 --- a/packages/redux/src/actions.js +++ /dev/null @@ -1,74 +0,0 @@ -import { - SET_USER, - SET_WORKSPACE, - SET_COMMAND_HISTORY_STORAGE, - SET_WORKSPACE_STORAGE, - SET_ACTIVE_TOOL, - SET_FILE_STORAGE, -} from './actionTypes'; - -export const setUser = user => ({ - type: SET_USER, - payload: user, -}); - -export const setWorkspace = workspace => ({ - type: SET_WORKSPACE, - payload: workspace, -}); - -export const setWorkspaceStorage = workspaceStorage => ({ - type: SET_WORKSPACE_STORAGE, - payload: workspaceStorage, -}); - -export const setCommandHistoryStorage = commandHistoryStorage => ({ - type: SET_COMMAND_HISTORY_STORAGE, - payload: commandHistoryStorage, -}); - -export const setFileStorage = fileStorage => ({ - type: SET_FILE_STORAGE, - payload: fileStorage, -}); - -/** - * Sets the specified workspace locally and saves it remotely - * @param {Workspace} workspace The workspace to save - */ -export const saveWorkspace = workspace => (dispatch, getState) => { - dispatch(setWorkspace(workspace)); - - const { storage } = getState(); - const { workspaceStorage } = storage; - return workspaceStorage.save(workspace); -}; - -/** - * Update part of the workspace data and save it - * @param {Object} workspaceData The property to update in workspace data - */ -export const updateWorkspaceData = workspaceData => (dispatch, getState) => { - const { workspace } = getState(); - const { data } = workspace; - const newWorkspace = { - ...workspace, - data: { - ...data, - ...workspaceData, - }, - }; - return dispatch(saveWorkspace(newWorkspace)); -}; - -/** - * Sets the specified settings locally and saves them remotely - * @param {Object} settings The settings to save - */ -export const saveSettings = settings => dispatch => - dispatch(updateWorkspaceData({ settings })); - -export const setActiveTool = payload => ({ - type: SET_ACTIVE_TOOL, - payload, -}); diff --git a/packages/redux/src/actions.ts b/packages/redux/src/actions.ts new file mode 100644 index 0000000000..8037f4a9c5 --- /dev/null +++ b/packages/redux/src/actions.ts @@ -0,0 +1,112 @@ +import type { Action } from 'redux'; +import type { ThunkAction } from 'redux-thunk'; +import type { CommandHistoryStorage } from '@deephaven/console'; +import type { FileStorage } from '@deephaven/file-explorer'; +import { + SET_USER, + SET_WORKSPACE, + SET_COMMAND_HISTORY_STORAGE, + SET_WORKSPACE_STORAGE, + SET_ACTIVE_TOOL, + SET_FILE_STORAGE, +} from './actionTypes'; +import type { + RootState, + User, + Workspace, + WorkspaceData, + WorkspaceSettings, + WorkspaceStorage, +} from './store'; + +export interface PayloadAction

extends Action { + payload: P; +} + +export type PayloadActionCreator

= (payload: P) => PayloadAction

; + +export const setUser: PayloadActionCreator = user => ({ + type: SET_USER, + payload: user, +}); + +export const setWorkspace: PayloadActionCreator = workspace => ({ + type: SET_WORKSPACE, + payload: workspace, +}); + +export const setWorkspaceStorage: PayloadActionCreator = workspaceStorage => ({ + type: SET_WORKSPACE_STORAGE, + payload: workspaceStorage, +}); + +export const setCommandHistoryStorage: PayloadActionCreator = commandHistoryStorage => ({ + type: SET_COMMAND_HISTORY_STORAGE, + payload: commandHistoryStorage, +}); + +export const setFileStorage: PayloadActionCreator = fileStorage => ({ + type: SET_FILE_STORAGE, + payload: fileStorage, +}); + +/** + * Sets the specified workspace locally and saves it remotely + * @param workspace The workspace to save + */ +export const saveWorkspace = ( + workspace: Workspace +): ThunkAction< + Promise, + RootState, + never, + PayloadAction +> => (dispatch, getState) => { + dispatch(setWorkspace(workspace)); + + const { storage } = getState(); + const { workspaceStorage } = storage; + return workspaceStorage.save(workspace); +}; + +/** + * Update part of the workspace data and save it + * @param workspaceData The properties to update in workspace data + */ +export const updateWorkspaceData = ( + workspaceData: Partial +): ThunkAction< + Promise, + RootState, + never, + PayloadAction +> => (dispatch, getState) => { + const { workspace } = getState(); + const { data } = workspace; + const newWorkspace = { + ...workspace, + data: { + ...data, + ...workspaceData, + }, + }; + return dispatch(saveWorkspace(newWorkspace)); +}; + +/** + * Sets the specified settings locally and saves them remotely + * @param {Object} settings The settings to save + */ +export const saveSettings = ( + settings: WorkspaceSettings +): ThunkAction< + Promise, + RootState, + never, + PayloadAction +> => dispatch => dispatch(updateWorkspaceData({ settings })); + +export const setActiveTool: PayloadActionCreator = payload => ({ + type: SET_ACTIVE_TOOL, + payload, +}); diff --git a/packages/redux/src/index.js b/packages/redux/src/index.ts similarity index 90% rename from packages/redux/src/index.js rename to packages/redux/src/index.ts index 645cc88960..57cd15a979 100644 --- a/packages/redux/src/index.js +++ b/packages/redux/src/index.ts @@ -3,4 +3,5 @@ export * from './actions'; export * from './reducers/common'; export { default as reducers } from './reducers'; export { default as reducerRegistry } from './reducerRegistry'; +export * from './store'; export { default as store } from './store'; diff --git a/packages/redux/src/middleware/crashReporter.js b/packages/redux/src/middleware/crashReporter.ts similarity index 75% rename from packages/redux/src/middleware/crashReporter.js rename to packages/redux/src/middleware/crashReporter.ts index f4e570d550..2070070f25 100644 --- a/packages/redux/src/middleware/crashReporter.js +++ b/packages/redux/src/middleware/crashReporter.ts @@ -1,8 +1,9 @@ +import type { Middleware } from 'redux'; import Log from '@deephaven/log'; const log = Log.module('redux-crashReporter'); -const crashReporter = store => next => action => { +const crashReporter: Middleware = store => next => action => { try { return next(action); } catch (err) { diff --git a/packages/redux/src/middleware/index.js b/packages/redux/src/middleware/index.ts similarity index 100% rename from packages/redux/src/middleware/index.js rename to packages/redux/src/middleware/index.ts diff --git a/packages/redux/src/middleware/logger.js b/packages/redux/src/middleware/logger.ts similarity index 70% rename from packages/redux/src/middleware/logger.js rename to packages/redux/src/middleware/logger.ts index cf692a3c03..5873ef29c1 100644 --- a/packages/redux/src/middleware/logger.js +++ b/packages/redux/src/middleware/logger.ts @@ -1,8 +1,9 @@ +import type { Middleware } from 'redux'; import Log from '@deephaven/log'; const log = Log.module('redux-logger'); -const logger = store => next => action => { +const logger: Middleware = store => next => action => { log.debug('dispatching', action); const result = next(action); log.debug('next state', store.getState()); diff --git a/packages/redux/src/reducers/activeTool.js b/packages/redux/src/reducers/activeTool.ts similarity index 100% rename from packages/redux/src/reducers/activeTool.js rename to packages/redux/src/reducers/activeTool.ts diff --git a/packages/redux/src/reducers/common/index.js b/packages/redux/src/reducers/common/index.ts similarity index 100% rename from packages/redux/src/reducers/common/index.js rename to packages/redux/src/reducers/common/index.ts diff --git a/packages/redux/src/reducers/common/mergeReducer.js b/packages/redux/src/reducers/common/mergeReducer.js deleted file mode 100644 index c9ee4974e3..0000000000 --- a/packages/redux/src/reducers/common/mergeReducer.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Setup a merge reducer for a specific action type. - * Will take the payload passed in and merge it with the previous state to update. - * @param {string} type The action type - * @param {any} initialState The initial state - */ -export default (type, initialState) => (state = initialState, action) => { - switch (action.type) { - case type: { - const newState = action.payload; - if (newState == null) { - return null; - } - - if (state != null) { - return { - ...state, - ...newState, - }; - } - - return { ...newState }; - } - default: - return state; - } -}; diff --git a/packages/redux/src/reducers/common/mergeReducer.ts b/packages/redux/src/reducers/common/mergeReducer.ts new file mode 100644 index 0000000000..881cb46cc6 --- /dev/null +++ b/packages/redux/src/reducers/common/mergeReducer.ts @@ -0,0 +1,34 @@ +import type { Reducer } from 'redux'; + +/** + * Setup a merge reducer for a specific action type. + * Will take the payload passed in and merge it with the previous state to update. + * @param type The action type + * @param initialState The initial state + */ +export default function mergeReducer( + type: string, + initialState: S +): Reducer { + return (state = initialState, action) => { + switch (action.type) { + case type: { + const newState = action.payload; + if (newState == null) { + return null; + } + + if (state != null) { + return { + ...state, + ...newState, + }; + } + + return { ...newState }; + } + default: + return state; + } + }; +} diff --git a/packages/redux/src/reducers/common/replaceByIdReducer.js b/packages/redux/src/reducers/common/replaceByIdReducer.js deleted file mode 100644 index 0836a35ff4..0000000000 --- a/packages/redux/src/reducers/common/replaceByIdReducer.js +++ /dev/null @@ -1,26 +0,0 @@ -import deepEqual from 'deep-equal'; - -/** - * Setup a replace reducer for a specific action type. - * Will take the payload passed in and replace the entity at the id with the payload - * @param {string} type The action type - */ -export default (type, initialState = {}, checkIfChanged = true) => ( - state = initialState, - action -) => { - switch (action.type) { - case type: { - const { id, payload } = action; - if (checkIfChanged && deepEqual({ payload }, { payload: state[id] })) { - return state; - } - return { - ...state, - [id]: payload, - }; - } - default: - return state; - } -}; diff --git a/packages/redux/src/reducers/common/replaceByIdReducer.ts b/packages/redux/src/reducers/common/replaceByIdReducer.ts new file mode 100644 index 0000000000..84d468a7c8 --- /dev/null +++ b/packages/redux/src/reducers/common/replaceByIdReducer.ts @@ -0,0 +1,30 @@ +import deepEqual from 'deep-equal'; +import type { Reducer } from 'redux'; + +/** + * Setup a replace reducer for a specific action type. + * Will take the payload passed in and replace the entity at the id with the payload + * @param type The action type + */ +export default function replaceByIdReducer>( + type: string, + initialState: S = {} as never, + checkIfChanged = true +): Reducer { + return (state = initialState, action) => { + switch (action.type) { + case type: { + const { id, payload } = action; + if (checkIfChanged && deepEqual({ payload }, { payload: state[id] })) { + return state; + } + return { + ...state, + [id]: payload, + }; + } + default: + return state; + } + }; +} diff --git a/packages/redux/src/reducers/common/replaceReducer.js b/packages/redux/src/reducers/common/replaceReducer.js deleted file mode 100644 index d0f0a2eb9f..0000000000 --- a/packages/redux/src/reducers/common/replaceReducer.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Setup a replace reducer for a specific action type. - * Will take the payload passed in and replace the previous state - * @param {string} type The action type - * @param {any} initialState The initial state - */ -export default (type, initialState) => (state = initialState, action) => { - switch (action.type) { - case type: { - return action.payload; - } - default: - return state; - } -}; diff --git a/packages/redux/src/reducers/common/replaceReducer.ts b/packages/redux/src/reducers/common/replaceReducer.ts new file mode 100644 index 0000000000..93854a4332 --- /dev/null +++ b/packages/redux/src/reducers/common/replaceReducer.ts @@ -0,0 +1,22 @@ +import type { Reducer } from 'redux'; + +/** + * Setup a replace reducer for a specific action type. + * Will take the payload passed in and replace the previous state + * @param type The action type + * @param initialState The initial state + */ +export default function replaceReducer( + type: string, + initialState: S +): Reducer { + return (state = initialState, action) => { + switch (action.type) { + case type: { + return action.payload; + } + default: + return state; + } + }; +} diff --git a/packages/redux/src/reducers/index.js b/packages/redux/src/reducers/index.ts similarity index 100% rename from packages/redux/src/reducers/index.js rename to packages/redux/src/reducers/index.ts diff --git a/packages/redux/src/reducers/storage/commandHistoryStorage.js b/packages/redux/src/reducers/storage/commandHistoryStorage.ts similarity index 100% rename from packages/redux/src/reducers/storage/commandHistoryStorage.js rename to packages/redux/src/reducers/storage/commandHistoryStorage.ts diff --git a/packages/redux/src/reducers/storage/fileStorage.js b/packages/redux/src/reducers/storage/fileStorage.ts similarity index 100% rename from packages/redux/src/reducers/storage/fileStorage.js rename to packages/redux/src/reducers/storage/fileStorage.ts diff --git a/packages/redux/src/reducers/storage/index.js b/packages/redux/src/reducers/storage/index.ts similarity index 100% rename from packages/redux/src/reducers/storage/index.js rename to packages/redux/src/reducers/storage/index.ts diff --git a/packages/redux/src/reducers/storage/workspaceStorage.js b/packages/redux/src/reducers/storage/workspaceStorage.ts similarity index 100% rename from packages/redux/src/reducers/storage/workspaceStorage.js rename to packages/redux/src/reducers/storage/workspaceStorage.ts diff --git a/packages/redux/src/reducers/user.js b/packages/redux/src/reducers/user.ts similarity index 100% rename from packages/redux/src/reducers/user.js rename to packages/redux/src/reducers/user.ts diff --git a/packages/redux/src/reducers/workspace.js b/packages/redux/src/reducers/workspace.ts similarity index 100% rename from packages/redux/src/reducers/workspace.js rename to packages/redux/src/reducers/workspace.ts diff --git a/packages/redux/src/reducers/workspaceStorage.js b/packages/redux/src/reducers/workspaceStorage.ts similarity index 100% rename from packages/redux/src/reducers/workspaceStorage.js rename to packages/redux/src/reducers/workspaceStorage.ts diff --git a/packages/redux/src/selectors.js b/packages/redux/src/selectors.js deleted file mode 100644 index 73ec6de83f..0000000000 --- a/packages/redux/src/selectors.js +++ /dev/null @@ -1,40 +0,0 @@ -// User -export const getUser = store => store.user; - -export const getUserName = store => getUser(store).name; - -export const getUserGroups = store => getUserGroups(store).groups; - -// Storage -export const getStorage = store => store.storage; - -export const getCommandHistoryStorage = store => - getStorage(store).commandHistoryStorage; - -export const getFileStorage = store => getStorage(store).fileStorage; - -export const getWorkspaceStorage = store => getStorage(store).workspaceStorage; - -// Workspace -export const getWorkspace = store => store.workspace; - -// Settings -export const getSettings = store => getWorkspace(store).data.settings; - -export const getDefaultDateTimeFormat = store => - getSettings(store).defaultDateTimeFormat; - -export const getFormatter = store => getSettings(store).formatter; - -export const getTimeZone = store => getSettings(store).timeZone; - -export const getShowTimeZone = store => getSettings(store).showTimeZone; - -export const getShowTSeparator = store => getSettings(store).showTSeparator; - -export const getDisableMoveConfirmation = store => - getSettings(store).disableMoveConfirmation || false; - -export const getShowSystemBadge = store => getSettings(store).showSystemBadge; - -export const getActiveTool = store => store.activeTool; diff --git a/packages/redux/src/selectors.ts b/packages/redux/src/selectors.ts new file mode 100644 index 0000000000..de53b76694 --- /dev/null +++ b/packages/redux/src/selectors.ts @@ -0,0 +1,67 @@ +import type { + RootState, + User, + Storage, + Workspace, + WorkspaceSettings, +} from './store'; + +type Selector = (state: RootState) => R; + +// User +export const getUser: Selector = store => store.user; + +export const getUserName: Selector = store => getUser(store).name; + +export const getUserGroups: Selector = store => + getUser(store).groups; + +// Storage +export const getStorage: Selector = store => store.storage; + +export const getCommandHistoryStorage: Selector< + Storage['commandHistoryStorage'] +> = store => getStorage(store).commandHistoryStorage; + +export const getFileStorage: Selector = store => + getStorage(store).fileStorage; + +export const getWorkspaceStorage: Selector< + Storage['workspaceStorage'] +> = store => getStorage(store).workspaceStorage; + +// Workspace +export const getWorkspace: Selector = store => store.workspace; + +// Settings +export const getSettings: Selector = store => + getWorkspace(store).data.settings; + +export const getDefaultDateTimeFormat: Selector< + WorkspaceSettings['defaultDateTimeFormat'] +> = store => getSettings(store).defaultDateTimeFormat; + +export const getFormatter: Selector = store => + getSettings(store).formatter; + +export const getTimeZone: Selector = store => + getSettings(store).timeZone; + +export const getShowTimeZone: Selector< + WorkspaceSettings['showTimeZone'] +> = store => getSettings(store).showTimeZone; + +export const getShowTSeparator: Selector< + WorkspaceSettings['showTSeparator'] +> = store => getSettings(store).showTSeparator; + +export const getDisableMoveConfirmation: Selector< + WorkspaceSettings['disableMoveConfirmation'] +> = store => getSettings(store).disableMoveConfirmation || false; + +export const getShowSystemBadge: Selector< + WorkspaceSettings['showSystemBadge'] +> = store => getSettings(store).showSystemBadge; + +export const getActiveTool: Selector = store => + store.activeTool; diff --git a/packages/redux/src/store.js b/packages/redux/src/store.js deleted file mode 100644 index db8106fcf4..0000000000 --- a/packages/redux/src/store.js +++ /dev/null @@ -1,23 +0,0 @@ -import { applyMiddleware, createStore, compose, combineReducers } from 'redux'; -import rootMiddleware from './middleware'; -import reducers from './reducers'; -import reducerRegistry from './reducerRegistry'; - -// TODO #70: Separate all reducers into their respective modules, register from there -Object.entries(reducers).map(([name, reducer]) => - reducerRegistry.register(name, reducer) -); - -/* eslint-disable-next-line no-underscore-dangle */ -const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; - -const store = createStore( - combineReducers(reducerRegistry.reducers), - composeEnhancers(applyMiddleware(...rootMiddleware)) -); - -reducerRegistry.setListener(newReducers => { - store.replaceReducer(combineReducers(newReducers)); -}); - -export default store; diff --git a/packages/redux/src/store.ts b/packages/redux/src/store.ts new file mode 100644 index 0000000000..98964f3bdc --- /dev/null +++ b/packages/redux/src/store.ts @@ -0,0 +1,83 @@ +import { applyMiddleware, createStore, compose, combineReducers } from 'redux'; +import type { FileStorage } from '@deephaven/file-explorer'; +import type { PayloadAction } from './actions'; +import rootMiddleware from './middleware'; +import reducers from './reducers'; +import reducerRegistry from './reducerRegistry'; + +export interface User { + name: string; + operateAs: string; + groups: string[]; +} + +export interface Storage { + commandHistoryStorage: unknown; + fileStorage: FileStorage; + workspaceStorage: WorkspaceStorage; +} + +interface WorkspaceFormattingRule { + columnType: string; + columnName: string; + format: { + label: string; + formatString: string; + type: string; + }; +} + +export interface WorkspaceSettings { + defaultDateTimeFormat: string; + formatter: WorkspaceFormattingRule[]; + timeZone: string; + showTimeZone: boolean; + showTSeparator: boolean; + disableMoveConfirmation: boolean; + showSystemBadge: boolean; +} + +export interface WorkspaceData { + settings: WorkspaceSettings; + data: Record; + layoutConfig: Record[]; + closed: Record[]; +} + +export interface Workspace { + data: WorkspaceData; +} + +export interface WorkspaceStorage { + load(): Promise; + save(workspace: Workspace): Promise; +} + +export interface RootState { + user: User; + storage: Storage; + workspace: Workspace; + activeTool: string; +} + +// TODO #70: Separate all reducers into their respective modules, register from there +Object.entries(reducers).map(([name, reducer]) => + reducerRegistry.register(name, reducer) +); + +const composeEnhancers: typeof compose = + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; + +const store = createStore( + combineReducers(reducerRegistry.reducers), + composeEnhancers(applyMiddleware(...rootMiddleware)) +); + +reducerRegistry.setListener(newReducers => { + store.replaceReducer(combineReducers(newReducers)); +}); + +export default store; + +export type RootDispatch = typeof store.dispatch; From 08596741e2ce52ab55dba702711136fbd0f5b8a2 Mon Sep 17 00:00:00 2001 From: Matthew Runyon Date: Tue, 9 Nov 2021 10:46:21 -0600 Subject: [PATCH 2/2] Address review comment --- packages/redux/src/store.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/redux/src/store.ts b/packages/redux/src/store.ts index 98964f3bdc..63e52e1f0c 100644 --- a/packages/redux/src/store.ts +++ b/packages/redux/src/store.ts @@ -60,7 +60,6 @@ export interface RootState { activeTool: string; } -// TODO #70: Separate all reducers into their respective modules, register from there Object.entries(reducers).map(([name, reducer]) => reducerRegistry.register(name, reducer) );