From 461e343c24601cfdff1828b38401417d38bc7776 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Mon, 25 Apr 2016 13:31:59 -0700 Subject: [PATCH] Removed workspace update action --- app/containers/App.js | 16 +++++++--- app/containers/WorkspaceDropdown.js | 48 +++++++++++++++++++++-------- app/database/index.js | 17 ---------- app/redux/modules/entities.js | 37 ++++------------------ app/redux/modules/workspaces.js | 20 +++++------- 5 files changed, 60 insertions(+), 78 deletions(-) diff --git a/app/containers/App.js b/app/containers/App.js index ce4177c205..2c4e104084 100644 --- a/app/containers/App.js +++ b/app/containers/App.js @@ -39,8 +39,14 @@ class App extends Component { render () { const {actions, modals, workspaces, requests, entities} = this.props; + + // TODO: Factor this out into a selector + let workspace = entities.workspaces[workspaces.activeId]; + if (!workspace) { + workspace = entities.workspaces[Object.keys(entities.workspaces)[0]]; + } - const activeRequestId = workspaces.active.activeRequestId; + const activeRequestId = workspace.activeRequestId; const activeRequest = activeRequestId ? entities.requests[activeRequestId] : null; const responses = Object.keys(entities.responses).map(id => entities.responses[id]); @@ -50,15 +56,15 @@ class App extends Component { const activeResponse = responses.find(r => r.parentId === activeRequestId); const children = this._generateSidebarTree( - workspaces.active._id, + workspace._id, allRequests.concat(allRequestGroups) ); return (
db.update(workspaces.active, {activeRequestId: r._id})} + workspaceId={workspace._id} + activateRequest={r => db.update(workspace, {activeRequestId: r._id})} changeFilter={actions.requests.changeFilter} addRequestToRequestGroup={requestGroup => db.requestCreate({parentId: requestGroup._id})} toggleRequestGroup={requestGroup => db.update(requestGroup, {collapsed: !requestGroup.collapsed})} @@ -122,7 +128,7 @@ App.propTypes = { responses: PropTypes.object.isRequired }).isRequired, workspaces: PropTypes.shape({ - active: PropTypes.object + activeId: PropTypes.string }).isRequired, requests: PropTypes.shape({ filter: PropTypes.string.isRequired diff --git a/app/containers/WorkspaceDropdown.js b/app/containers/WorkspaceDropdown.js index ca2267c6be..917b2a3b29 100644 --- a/app/containers/WorkspaceDropdown.js +++ b/app/containers/WorkspaceDropdown.js @@ -8,6 +8,7 @@ import {connect} from 'react-redux' import Dropdown from '../components/base/Dropdown' import DropdownDivider from '../components/base/DropdownDivider' import * as RequestGroupActions from '../redux/modules/requestGroups' +import * as WorkspaceActions from '../redux/modules/workspaces' import * as db from '../database' import importData from '../lib/import' @@ -19,27 +20,46 @@ class WorkspaceDropdown extends Component { name: 'Insomnia Imports', extensions: ['json'] }] }; - + + // TODO: Factor this out into a selector + const {entities, workspaces} = this.props; + let workspace = entities.workspaces[workspaces.activeId]; + if (!workspace) { + workspace = entities.workspaces[Object.keys(entities.workspaces)[0]]; + } + electron.remote.dialog.showOpenDialog(options, paths => { paths.map(path => { fs.readFile(path, 'utf8', (err, data) => { - err || importData(this.props.workspaces.active, data); + err || importData(workspace, data); }) }) }); } + + _workspaceCreate () { + db.workspaceCreate({name: 'New Workspace'}).then(workspace => { + this.props.actions.workspaces.activate(workspace); + }); + } render () { const {actions, loading, workspaces, entities, ...other} = this.props; const allWorkspaces = Object.keys(entities.workspaces).map(id => entities.workspaces[id]); + + // TODO: Factor this out into a selector + let workspace = entities.workspaces[workspaces.activeId]; + if (!workspace) { + workspace = entities.workspaces[Object.keys(entities.workspaces)[0]]; + } return (
  • -
  • @@ -72,24 +92,24 @@ class WorkspaceDropdown extends Component {
  • -
  • {allWorkspaces.map(w => { - return w._id === workspaces.active._id ? null : ( + return w._id === workspace._id ? null : (
  • -
  • ) })}
  • -
  • @@ -107,7 +127,7 @@ class WorkspaceDropdown extends Component { WorkspaceDropdown.propTypes = { loading: PropTypes.bool.isRequired, workspaces: PropTypes.shape({ - active: PropTypes.object.isRequired + activeId: PropTypes.object }), entities: PropTypes.shape({ workspaces: PropTypes.object.isRequired @@ -115,6 +135,9 @@ WorkspaceDropdown.propTypes = { actions: PropTypes.shape({ requestGroups: PropTypes.shape({ showEnvironmentEditModal: PropTypes.func.isRequired + }), + workspaces: PropTypes.shape({ + activate: PropTypes.func.isRequired }) }) }; @@ -131,7 +154,8 @@ function mapStateToProps (state) { function mapDispatchToProps (dispatch) { return { actions: { - requestGroups: bindActionCreators(RequestGroupActions, dispatch) + requestGroups: bindActionCreators(RequestGroupActions, dispatch), + workspaces: bindActionCreators(WorkspaceActions, dispatch) } } } diff --git a/app/database/index.js b/app/database/index.js index e1a64eb952..fc2e4b8e16 100644 --- a/app/database/index.js +++ b/app/database/index.js @@ -185,15 +185,10 @@ export function workspaceCreate (patch = {}) { return modelCreate(TYPE_WORKSPACE, 'wrk', { name: 'New Workspace', activeRequestId: null, - activated: Date.now(), // TODO: Delete this property (replace with something better) environments: [] }, patch); } -export function workspaceActivate (workspace) { - return update(workspace, {activated: Date.now()}); -} - export function workspaceAll () { return db.find({ selector: {type: 'Workspace'} @@ -211,18 +206,6 @@ export function workspaceAll () { }) } -export function workspaceGetActive () { - return db.find({ - selector: { - activated: {$gte: 0}, // HACK: because can't use $exists here? - type: {$eq: 'Workspace'} - }, - sort: [{activated: 'desc'}], - limit: 1 - }) -} - - // ~~~~~~~~ // // SETTINGS // // ~~~~~~~~ // diff --git a/app/redux/modules/entities.js b/app/redux/modules/entities.js index d95ed1ac53..de5b5e8303 100644 --- a/app/redux/modules/entities.js +++ b/app/redux/modules/entities.js @@ -10,33 +10,14 @@ const ENTITY_REMOVE = 'entities/remove'; // REDUCERS // // ~~~~~~~~ // -function generateEntityReducer (referenceName, updateAction, deleteAction) { - return function (state = {}, action) { - switch (action.type) { - - case updateAction: - const doc = action[referenceName]; - return {...state, [doc._id]: doc}; - - case deleteAction: - const newState = Object.assign({}, state); - delete newState[action[referenceName]._id]; - return newState; - - default: - return state; - } - } -} - function genericEntityReducer (referenceName) { return function (state = {}, action) { const doc = action[referenceName]; - + if (!doc) { return state; } - + switch (action.type) { case ENTITY_UPDATE: @@ -53,14 +34,8 @@ function genericEntityReducer (referenceName) { } } -const workspaces = generateEntityReducer( - 'workspace', - workspaceFns.WORKSPACE_UPDATE, - 'dne' -); - export default combineReducers({ - workspaces, + workspaces: genericEntityReducer('workspace'), requestGroups: genericEntityReducer('requestGroup'), requests: genericEntityReducer('request'), responses: genericEntityReducer('response') @@ -72,15 +47,15 @@ export default combineReducers({ // ~~~~~~~ // const updateFns = { - [TYPE_WORKSPACE]: workspaceFns.update, + [TYPE_WORKSPACE]: workspace => ({type: ENTITY_UPDATE, workspace}), [TYPE_REQUEST_GROUP]: requestGroup => ({type: ENTITY_UPDATE, requestGroup}), [TYPE_RESPONSE]: response => ({type: ENTITY_UPDATE, response}), [TYPE_REQUEST]: request => ({type: ENTITY_UPDATE, request}) }; const removeFns = { - [TYPE_WORKSPACE]: workspace => ({type: ENTITY_UPDATE, workspace}), - [TYPE_REQUEST_GROUP]: requestGroup => ({type: ENTITY_UPDATE, requestGroup}), + [TYPE_WORKSPACE]: workspace => ({type: ENTITY_REMOVE, workspace}), + [TYPE_REQUEST_GROUP]: requestGroup => ({type: ENTITY_REMOVE, requestGroup}), [TYPE_RESPONSE]: response => ({type: ENTITY_UPDATE, response}), [TYPE_REQUEST]: request => ({type: ENTITY_REMOVE, request}) }; diff --git a/app/redux/modules/workspaces.js b/app/redux/modules/workspaces.js index fa149a5800..fe7104ad50 100644 --- a/app/redux/modules/workspaces.js +++ b/app/redux/modules/workspaces.js @@ -1,6 +1,6 @@ import {combineReducers} from 'redux' -export const WORKSPACE_UPDATE = 'workspaces/update'; +export const WORKSPACE_ACTIVATE = 'workspaces/activate'; // ~~~~~~~~ // // REDUCERS // @@ -8,15 +8,9 @@ export const WORKSPACE_UPDATE = 'workspaces/update'; function activeReducer (state = null, action) { switch (action.type) { - - case WORKSPACE_UPDATE: - if (state && state._id === action.workspace._id) { - return action.workspace; - } else if (state) { - return action.workspace.activated > state.activated ? action.workspace : state; - } else { - return action.workspace; - } + + case WORKSPACE_ACTIVATE: + return action.workspace._id; default: return state; @@ -24,7 +18,7 @@ function activeReducer (state = null, action) { } export default combineReducers({ - active: activeReducer + activeId: activeReducer }); @@ -32,6 +26,6 @@ export default combineReducers({ // ACTIONS // // ~~~~~~~ // -export function update (workspace) { - return {type: WORKSPACE_UPDATE, workspace}; +export function activate (workspace) { + return {type: WORKSPACE_ACTIVATE, workspace}; }