diff options
author | Stas Vilchik <vilchiks@gmail.com> | 2016-12-09 15:44:24 +0100 |
---|---|---|
committer | Stas Vilchik <vilchiks@gmail.com> | 2016-12-09 17:16:20 +0100 |
commit | 4e096de629fda4bbdba94d8823da3f92881d7a4c (patch) | |
tree | c0bd7467e33edc8565fd664c2872858690335f2a /server/sonar-web/src/main/js/store/utils | |
parent | 5686fcc7cc310e5603c4620d74e8cf679a38eeb2 (diff) | |
download | sonarqube-4e096de629fda4bbdba94d8823da3f92881d7a4c.tar.gz sonarqube-4e096de629fda4bbdba94d8823da3f92881d7a4c.zip |
reorganize store directories
move store/ outside of app/
move components/store/* to store/
Diffstat (limited to 'server/sonar-web/src/main/js/store/utils')
3 files changed, 189 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/store/utils/configureStore.js b/server/sonar-web/src/main/js/store/utils/configureStore.js new file mode 100644 index 00000000000..97397d836cd --- /dev/null +++ b/server/sonar-web/src/main/js/store/utils/configureStore.js @@ -0,0 +1,40 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import { createStore, applyMiddleware, compose } from 'redux'; +import thunk from 'redux-thunk'; + +const middlewares = [thunk]; +const composed = []; + +if (process.env.NODE_ENV !== 'production') { + const createLogger = require('redux-logger'); + middlewares.push(createLogger()); + + composed.push(window.devToolsExtension ? window.devToolsExtension() : f => f); +} + +const finalCreateStore = compose( + applyMiddleware(...middlewares), + ...composed +)(createStore); + +export default function configureStore (rootReducer, initialState) { + return finalCreateStore(rootReducer, initialState); +} diff --git a/server/sonar-web/src/main/js/store/utils/generalReducers.js b/server/sonar-web/src/main/js/store/utils/generalReducers.js new file mode 100644 index 00000000000..8f88ff41b0b --- /dev/null +++ b/server/sonar-web/src/main/js/store/utils/generalReducers.js @@ -0,0 +1,95 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +// Author: Christoffer Niska <christofferniska@gmail.com> +// https://gist.github.com/crisu83/42ecffccad9d04c74605fbc75c9dc9d1 +import uniq from 'lodash/uniq'; + +/** + * Creates a reducer that manages a single value. + * + * @param {function(state, action)} shouldUpdate + * @param {function(state, action)} shouldReset + * @param {function(state, action)} getValue + * @param {*} defaultValue + * @returns {function(state, action)} + */ +export const createValue = ( + shouldUpdate = () => true, + shouldReset = () => false, + getValue = (state, action) => action.payload, + defaultValue = null +) => (state = defaultValue, action = {}) => { + if (shouldReset(state, action)) { + return defaultValue; + } + if (shouldUpdate(state, action)) { + return getValue(state, action); + } + return state; +}; + +/** + * Creates a reducer that manages a map. + * + * @param {function(state, action)} shouldUpdate + * @param {function(state, action)} shouldReset + * @param {function(state, action)} getValues + * @returns {function(state, action)} + */ +export const createMap = ( + shouldUpdate = () => true, + shouldReset = () => false, + getValues = (state, action) => action.payload +) => createValue(shouldUpdate, shouldReset, (state, action) => + ({ ...state, ...getValues(state, action) }), {}); + +/** + * Creates a reducer that manages a set. + * + * @param {function(state, action)} shouldUpdate + * @param {function(state, action)} shouldReset + * @param {function(state, action)} getValues + * @returns {function(state, action)} + */ +export const createSet = ( + shouldUpdate = () => true, + shouldReset = () => false, + getValues = (state, action) => action.payload +) => createValue(shouldUpdate, shouldReset, (state, action) => + uniq([...state, ...getValues(state, action)]), []); + +/** + * Creates a reducer that manages a flag. + * + * @param {function(state, action)} shouldTurnOn + * @param {function(state, action)} shouldTurnOff + * @param {bool} defaultValue + * @returns {function(state, action)} + */ +export const createFlag = (shouldTurnOn, shouldTurnOff, defaultValue = false) => + (state = defaultValue, action = {}) => { + if (shouldTurnOn(state, action)) { + return true; + } + if (shouldTurnOff(state, action)) { + return false; + } + return state; + }; diff --git a/server/sonar-web/src/main/js/store/utils/withStore.js b/server/sonar-web/src/main/js/store/utils/withStore.js new file mode 100644 index 00000000000..4518fc0547f --- /dev/null +++ b/server/sonar-web/src/main/js/store/utils/withStore.js @@ -0,0 +1,54 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import React from 'react'; + +const withStore = (ComposedComponent, initial = {}) => { + let store = initial; + + const updateStore = changes => { + store = { ...store, ...changes }; + }; + + const getStore = () => ({ ...store }); + + return class extends React.Component { + static displayName = `withStore(${ComposedComponent.displayName})}`; + + componentWillMount () { + this.handleUpdateStore = this.handleUpdateStore.bind(this); + } + + handleUpdateStore (changes) { + updateStore(changes); + this.forceUpdate(); + } + + render () { + return ( + <ComposedComponent + {...this.props} + getStore={getStore} + updateStore={this.handleUpdateStore}/> + ); + } + }; +}; + +export default withStore; |