diff --git a/src/core/index.js b/src/core/index.js index abc0ba36..76a0d705 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -58,13 +58,12 @@ module.exports = function SwaggerUI(opts) { plugins: [ ], + // Initial state + initialState: { }, + // Inline Plugin fn: { }, components: { }, - state: { }, - - // Override some core configs... at your own risk - store: { }, } let queryConfig = parseSearch() @@ -74,12 +73,12 @@ module.exports = function SwaggerUI(opts) { const constructorConfig = deepExtend({}, defaults, opts, queryConfig) - const storeConfigs = deepExtend({}, constructorConfig.store, { + const storeConfigs = { system: { configs: constructorConfig.configs }, plugins: constructorConfig.presets, - state: { + state: deepExtend({ layout: { layout: constructorConfig.layout, filter: constructorConfig.filter @@ -88,8 +87,8 @@ module.exports = function SwaggerUI(opts) { spec: "", url: constructorConfig.url } - } - }) + }, constructorConfig.initialState) + } let inlinePlugin = ()=> { return { diff --git a/src/core/presets/base.js b/src/core/presets/base.js index ec005b37..b6c11f9f 100644 --- a/src/core/presets/base.js +++ b/src/core/presets/base.js @@ -10,6 +10,7 @@ import auth from "core/plugins/auth" import util from "core/plugins/util" import SplitPaneModePlugin from "core/plugins/split-pane-mode" import downloadUrlPlugin from "core/plugins/download-url" +import configsPlugin from "plugins/configs" import deepLinkingPlugin from "core/plugins/deep-linking" import App from "core/components/app" @@ -122,6 +123,7 @@ export default function() { } return [ + configsPlugin, util, logs, view, diff --git a/src/plugins/configs/actions.js b/src/plugins/configs/actions.js new file mode 100644 index 00000000..70588372 --- /dev/null +++ b/src/plugins/configs/actions.js @@ -0,0 +1,20 @@ +export const UPDATE_CONFIGS = "configs_update" +export const TOGGLE_CONFIGS = "configs_toggle" + +// Update the configs, with a merge ( not deep ) +export function update(configName, configValue) { + return { + type: UPDATE_CONFIGS, + payload: { + [configName]: configValue + }, + } +} + +// Toggle's the config, by name +export function toggle(configName) { + return { + type: TOGGLE_CONFIGS, + payload: configName, + } +} diff --git a/src/plugins/configs/index.js b/src/plugins/configs/index.js index 2269d873..58edbfa1 100644 --- a/src/plugins/configs/index.js +++ b/src/plugins/configs/index.js @@ -1,56 +1,66 @@ import YAML from "js-yaml" import yamlConfig from "../../../swagger-config.yaml" +import * as actions from "./actions" +import * as selectors from "./selectors" +import reducers from "./reducers" const parseYamlConfig = (yaml, system) => { - try { - return YAML.safeLoad(yaml) - } catch(e) { - if (system) { - system.errActions.newThrownErr( new Error(e) ) - } - return {} + try { + return YAML.safeLoad(yaml) + } catch(e) { + if (system) { + system.errActions.newThrownErr( new Error(e) ) } + return {} + } } -export default function configPlugin (toolbox) { - let { fn } = toolbox - - const actions = { - downloadConfig: (url) => () => { - let {fetch} = fn - return fetch(url) - }, - - getConfigByUrl: (configUrl, cb)=> ({ specActions }) => { - if (configUrl) { - return specActions.downloadConfig(configUrl).then(next, next) - } - - function next(res) { - if (res instanceof Error || res.status >= 400) { - specActions.updateLoadingStatus("failedConfig") - specActions.updateLoadingStatus("failedConfig") - specActions.updateUrl("") - console.error(res.statusText + " " + configUrl) - cb(null) - } else { - cb(parseYamlConfig(res.text)) - } - } - } +const specActions = { + downloadConfig: (url) => ({fn}) => { + let {fetch} = fn + return fetch(url) + }, + getConfigByUrl: (configUrl, cb)=> ({ specActions }) => { + if (configUrl) { + return specActions.downloadConfig(configUrl).then(next, next) } - const selectors = { - getLocalConfig: () => { - return parseYamlConfig(yamlConfig) - } - } - - return { - statePlugins: { - spec: { actions, selectors } - } + function next(res) { + if (res instanceof Error || res.status >= 400) { + specActions.updateLoadingStatus("failedConfig") + specActions.updateLoadingStatus("failedConfig") + specActions.updateUrl("") + console.error(res.statusText + " " + configUrl) + cb(null) + } else { + cb(parseYamlConfig(res.text)) + } } + } +} + +const specSelectors = { + getLocalConfig: () => { + return parseYamlConfig(yamlConfig) + } +} + + +export default function configsPlugin() { + + return { + statePlugins: { + spec: { + actions: specActions, + selectors: specSelectors, + }, + configs: { + reducers, + actions, + selectors, + } + } + } } diff --git a/src/plugins/configs/reducers.js b/src/plugins/configs/reducers.js new file mode 100644 index 00000000..5b38931d --- /dev/null +++ b/src/plugins/configs/reducers.js @@ -0,0 +1,20 @@ +import { fromJS } from "immutable" + +import { + UPDATE_CONFIGS, + TOGGLE_CONFIGS, +} from "./actions" + +export default { + + [UPDATE_CONFIGS]: (state, action) => { + return state.merge(fromJS(action.payload)) + }, + + [TOGGLE_CONFIGS]: (state, action) => { + const configName = action.payload + const oriVal = state.get(configName) + return state.set(configName, !oriVal) + }, + +} diff --git a/src/plugins/configs/selectors.js b/src/plugins/configs/selectors.js new file mode 100644 index 00000000..dcb6f670 --- /dev/null +++ b/src/plugins/configs/selectors.js @@ -0,0 +1,4 @@ +// Just get the config value ( it can possibly be an immutable object) +export const get = (state, path) => { + return state.getIn(Array.isArray(path) ? path : [path]) +}