diff --git a/packages/strapi-admin/admin/src/app.js b/packages/strapi-admin/admin/src/app.js
index a7f4cff8d0..83a6e8debd 100755
--- a/packages/strapi-admin/admin/src/app.js
+++ b/packages/strapi-admin/admin/src/app.js
@@ -129,7 +129,7 @@ if (window.location.port !== '4000') {
});
})
.catch(err => {
- console.log(err);
+ console.log(err); // eslint-disable-line no-console
});
} else if (findIndex(plugins, ['id', 'users-permissions']) === -1) {
store.dispatch(unsetHasUserPlugin());
diff --git a/packages/strapi-admin/admin/src/containers/InstallPluginPage/actions.js b/packages/strapi-admin/admin/src/containers/InstallPluginPage/actions.js
index 4de39e11f8..6f58869926 100644
--- a/packages/strapi-admin/admin/src/containers/InstallPluginPage/actions.js
+++ b/packages/strapi-admin/admin/src/containers/InstallPluginPage/actions.js
@@ -8,8 +8,10 @@ import {
DOWNLOAD_PLUGIN,
DOWNLOAD_PLUGIN_ERROR,
DOWNLOAD_PLUGIN_SUCCEEDED,
- GET_PLUGINS,
- GET_PLUGINS_SUCCEEDED,
+ GET_AVAILABLE_PLUGINS,
+ GET_AVAILABLE_PLUGINS_SUCCEEDED,
+ GET_INSTALLED_PLUGINS,
+ GET_INSTALLED_PLUGINS_SUCCEEDED,
ON_CHANGE,
} from './constants';
@@ -32,19 +34,32 @@ export function downloadPluginSucceeded() {
};
}
-export function getPlugins() {
+export function getAvailablePlugins() {
return {
- type: GET_PLUGINS,
+ type: GET_AVAILABLE_PLUGINS,
};
}
-export function getPluginsSucceeded(availablePlugins) {
+export function getAvailablePluginsSucceeded(availablePlugins) {
return {
- type: GET_PLUGINS_SUCCEEDED,
+ type: GET_AVAILABLE_PLUGINS_SUCCEEDED,
availablePlugins,
};
}
+export function getInstalledPlugins() {
+ return {
+ type: GET_INSTALLED_PLUGINS,
+ };
+}
+
+export function getInstalledPluginsSucceeded(installedPlugins) {
+ return {
+ type: GET_INSTALLED_PLUGINS_SUCCEEDED,
+ installedPlugins,
+ };
+}
+
export function onChange({ target }) {
return {
type: ON_CHANGE,
diff --git a/packages/strapi-admin/admin/src/containers/InstallPluginPage/constants.js b/packages/strapi-admin/admin/src/containers/InstallPluginPage/constants.js
index 2141383d83..06650ea0e6 100644
--- a/packages/strapi-admin/admin/src/containers/InstallPluginPage/constants.js
+++ b/packages/strapi-admin/admin/src/containers/InstallPluginPage/constants.js
@@ -7,6 +7,8 @@
export const DOWNLOAD_PLUGIN = 'StrapiAdmin/InstallPluginPage/DOWNLOAD_PLUGIN';
export const DOWNLOAD_PLUGIN_ERROR = 'StrapiAdmin/InstallPluginPage/DOWNLOAD_PLUGIN_ERROR';
export const DOWNLOAD_PLUGIN_SUCCEEDED = 'StrapiAdmin/InstallPluginPage/DOWNLOAD_PLUGIN_SUCCEEDED';
-export const GET_PLUGINS = 'StrapiAdmin/InstallPluginPage/GET_PLUGINS';
-export const GET_PLUGINS_SUCCEEDED = 'StrapiAdmin/InstallPluginPage/GET_PLUGINS_SUCCEEDED';
+export const GET_AVAILABLE_PLUGINS = 'StrapiAdmin/InstallPluginPage/GET_AVAILABLE_PLUGINS';
+export const GET_AVAILABLE_PLUGINS_SUCCEEDED = 'StrapiAdmin/InstallPluginPage/GET_AVAILABLE_PLUGINS_SUCCEEDED';
+export const GET_INSTALLED_PLUGINS = 'StrapiAdmin/InstallPluginPage/GET_INSTALLED_PLUGINS';
+export const GET_INSTALLED_PLUGINS_SUCCEEDED = 'StrapiAdmin/InstallPluginPage/GET_INSTALLED_PLUGINS_SUCCEEDED';
export const ON_CHANGE = 'StrapiAdmin/InstallPluginPage/ON_CHANGE';
diff --git a/packages/strapi-admin/admin/src/containers/InstallPluginPage/index.js b/packages/strapi-admin/admin/src/containers/InstallPluginPage/index.js
index 49634bb882..c1c4016891 100644
--- a/packages/strapi-admin/admin/src/containers/InstallPluginPage/index.js
+++ b/packages/strapi-admin/admin/src/containers/InstallPluginPage/index.js
@@ -11,7 +11,7 @@ import { Helmet } from 'react-helmet';
import { FormattedMessage } from 'react-intl';
import { bindActionCreators, compose } from 'redux';
import cn from 'classnames';
-import { get, isUndefined, map } from 'lodash';
+import { map } from 'lodash';
import {
disableGlobalOverlayBlocker,
@@ -32,7 +32,8 @@ import injectReducer from 'utils/injectReducer';
import {
downloadPlugin,
- getPlugins,
+ getAvailablePlugins,
+ getInstalledPlugins,
onChange,
} from './actions';
@@ -55,8 +56,11 @@ export class InstallPluginPage extends React.Component { // eslint-disable-line
// Don't fetch the available plugins if it has already been done
if (!this.props.didFetchPlugins) {
- this.props.getPlugins();
+ this.props.getAvailablePlugins();
}
+
+ // Get installed plugins
+ this.props.getInstalledPlugins();
}
componentWillUnmount() {
@@ -65,10 +69,10 @@ export class InstallPluginPage extends React.Component { // eslint-disable-line
}
render() {
- if (!this.props.didFetchPlugins) {
+ if (!this.props.didFetchPlugins || !this.props.didFetchInstalledPlugins) {
return ;
}
-
+
return (
@@ -112,7 +116,7 @@ export class InstallPluginPage extends React.Component { // eslint-disable-line
key={plugin.id}
plugin={plugin}
showSupportUsButton={plugin.id === 'support-us'}
- isAlreadyInstalled={!isUndefined(get(this.context.plugins.toJS(), plugin.id))}
+ isAlreadyInstalled={this.props.installedPlugins.includes(plugin.id)}
downloadPlugin={(e) => {
e.preventDefault();
e.stopPropagation();
@@ -134,19 +138,18 @@ InstallPluginPage.childContextTypes = {
downloadPlugin: PropTypes.func.isRequired,
};
-InstallPluginPage.contextTypes = {
- plugins: PropTypes.object.isRequired,
-};
-
InstallPluginPage.propTypes = {
availablePlugins: PropTypes.array.isRequired,
blockApp: PropTypes.bool.isRequired,
+ didFetchInstalledPlugins: PropTypes.bool.isRequired,
didFetchPlugins: PropTypes.bool.isRequired,
disableGlobalOverlayBlocker: PropTypes.func.isRequired,
downloadPlugin: PropTypes.func.isRequired,
enableGlobalOverlayBlocker: PropTypes.func.isRequired,
- getPlugins: PropTypes.func.isRequired,
+ getAvailablePlugins: PropTypes.func.isRequired,
+ getInstalledPlugins: PropTypes.func.isRequired,
history: PropTypes.object.isRequired,
+ installedPlugins: PropTypes.array.isRequired,
// onChange: PropTypes.func.isRequired,
// search: PropTypes.string.isRequired,
};
@@ -159,7 +162,8 @@ function mapDispatchToProps(dispatch) {
disableGlobalOverlayBlocker,
downloadPlugin,
enableGlobalOverlayBlocker,
- getPlugins,
+ getAvailablePlugins,
+ getInstalledPlugins,
onChange,
},
dispatch,
diff --git a/packages/strapi-admin/admin/src/containers/InstallPluginPage/reducer.js b/packages/strapi-admin/admin/src/containers/InstallPluginPage/reducer.js
index cc70f6f36c..2f7f007b46 100644
--- a/packages/strapi-admin/admin/src/containers/InstallPluginPage/reducer.js
+++ b/packages/strapi-admin/admin/src/containers/InstallPluginPage/reducer.js
@@ -9,14 +9,17 @@ import {
DOWNLOAD_PLUGIN,
DOWNLOAD_PLUGIN_ERROR,
DOWNLOAD_PLUGIN_SUCCEEDED,
- GET_PLUGINS_SUCCEEDED,
+ GET_AVAILABLE_PLUGINS_SUCCEEDED,
+ GET_INSTALLED_PLUGINS_SUCCEEDED,
ON_CHANGE,
} from './constants';
const initialState = fromJS({
availablePlugins: List([]),
+ installedPlugins: List([]),
blockApp: false,
didFetchPlugins: false,
+ didFetchInstalledPlugins: false,
pluginToDownload: '',
search: '',
});
@@ -35,10 +38,14 @@ function installPluginPageReducer(state = initialState, action) {
return state
.set('blockApp', false)
.set('pluginToDownload', '');
- case GET_PLUGINS_SUCCEEDED:
+ case GET_AVAILABLE_PLUGINS_SUCCEEDED:
return state
.set('didFetchPlugins', true)
.set('availablePlugins', List(action.availablePlugins));
+ case GET_INSTALLED_PLUGINS_SUCCEEDED:
+ return state
+ .set('didFetchInstalledPlugins', true)
+ .set('installedPlugins', List(action.installedPlugins));
case ON_CHANGE:
return state.updateIn(action.keys, () => action.value);
default:
diff --git a/packages/strapi-admin/admin/src/containers/InstallPluginPage/saga.js b/packages/strapi-admin/admin/src/containers/InstallPluginPage/saga.js
index ee8c18c416..0a2384a6b0 100644
--- a/packages/strapi-admin/admin/src/containers/InstallPluginPage/saga.js
+++ b/packages/strapi-admin/admin/src/containers/InstallPluginPage/saga.js
@@ -15,9 +15,10 @@ import { selectLocale } from '../LanguageProvider/selectors';
import {
downloadPluginError,
downloadPluginSucceeded,
- getPluginsSucceeded,
+ getAvailablePluginsSucceeded,
+ getInstalledPluginsSucceeded,
} from './actions';
-import { DOWNLOAD_PLUGIN, GET_PLUGINS } from './constants';
+import { DOWNLOAD_PLUGIN, GET_AVAILABLE_PLUGINS, GET_INSTALLED_PLUGINS } from './constants';
import { makeSelectPluginToDownload } from './selectors';
@@ -49,7 +50,7 @@ export function* pluginDownload() {
}
}
-export function* pluginsGet() {
+export function* getAvailablePlugins() {
try {
// Get current locale.
const locale = yield select(selectLocale());
@@ -73,20 +74,44 @@ export function* pluginsGet() {
availablePlugins = [];
}
- yield put(getPluginsSucceeded(availablePlugins));
+ yield put(getAvailablePluginsSucceeded(availablePlugins));
} catch(err) {
strapi.notification.error('notification.error');
}
}
+export function* getInstalledPlugins() {
+ try {
+ const opts = {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ };
+ let installedPlugins;
+
+ try {
+ // Retrieve plugins list.
+ installedPlugins = yield call(request, '/admin/plugins', opts);
+ } catch (e) {
+ installedPlugins = [];
+ }
+
+ yield put(getInstalledPluginsSucceeded(Object.keys(installedPlugins.plugins)));
+ } catch(err) {
+ strapi.notification.error('notification.error');
+ }
+}
// Individual exports for testing
export default function* defaultSaga() {
- const loadPluginsWatcher = yield fork(takeLatest, GET_PLUGINS, pluginsGet);
+ const loadAvailablePluginsWatcher = yield fork(takeLatest, GET_AVAILABLE_PLUGINS, getAvailablePlugins);
+ const loadInstalledPluginsWatcher = yield fork(takeLatest, GET_INSTALLED_PLUGINS, getInstalledPlugins);
yield fork(takeLatest, DOWNLOAD_PLUGIN, pluginDownload);
yield take(LOCATION_CHANGE);
- yield cancel(loadPluginsWatcher);
+ yield cancel(loadAvailablePluginsWatcher);
+ yield cancel(loadInstalledPluginsWatcher);
}