From 6ee1d31a0e8ce2d635cab6c4f11cd802712ca6ad Mon Sep 17 00:00:00 2001 From: Vigneshan Date: Fri, 4 Dec 2020 10:06:54 +0530 Subject: [PATCH] Improve store ui to support sso --- .../react-app/public/conf/config.json | 6 ++- .../react-app/src/App.js | 38 ++++++++++++----- .../scenes/Home/components/Logout/index.js | 41 +++++++++++++------ .../src/services/utils/uiConfigHandler.js | 40 ++++++++++++++++++ 4 files changed, 101 insertions(+), 24 deletions(-) create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/services/utils/uiConfigHandler.js diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/public/conf/config.json b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/public/conf/config.json index 4850da1d914..7e36b866c55 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/public/conf/config.json +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/public/conf/config.json @@ -1,4 +1,5 @@ { + "appName": "store", "theme": { "type": "default", "value": "lightBaseTheme", @@ -17,7 +18,10 @@ }, "loginUri": "/store-ui-request-handler/login", "logoutUri": "/store-ui-request-handler/logout", - "platform": "store" + "ssoLoginUri": "/store-ui-request-handler/ssoLogin", + "ssoLogoutUri": "/store-ui-request-handler/ssoLogout", + "platform": "store", + "appUiConfigUri": "/api/device-mgt-config/v1.0/configurations/ui-config" }, "defaultPlatformIcons": { "default": { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/App.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/App.js index 6ade8a306d5..e78a5983d8b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/App.js +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/App.js @@ -21,8 +21,9 @@ import 'antd/dist/antd.less'; import RouteWithSubRoutes from './components/RouteWithSubRoutes'; import { BrowserRouter as Router, Redirect, Switch } from 'react-router-dom'; import axios from 'axios'; -import { Layout, Spin, Result } from 'antd'; +import { Layout, Result, Spin } from 'antd'; import ConfigContext from './components/context/ConfigContext'; +import { getUiConfig } from './services/utils/uiConfigHandler'; const { Content } = Layout; const loadingView = ( @@ -138,15 +139,32 @@ class App extends React.Component { const redirectUrl = encodeURI(window.location.href); const pageURL = window.location.pathname; const lastURLSegment = pageURL.substr(pageURL.lastIndexOf('/') + 1); - if (lastURLSegment !== 'login') { - window.location.href = - window.location.origin + `/store/login?redirect=${redirectUrl}`; - } else { - this.setState({ - loading: false, - config: config, - }); - } + getUiConfig(config).then(uiConfig => { + if (uiConfig !== undefined) { + if (uiConfig.isSsoEnable) { + window.location = + window.location.origin + + config.serverConfig.ssoLoginUri + + '?redirect=' + + window.location.origin + + pageURL; + } else if (lastURLSegment !== 'login') { + window.location.href = + window.location.origin + + `/${config.appName}/login?redirect=${redirectUrl}`; + } else { + this.setState({ + loading: false, + config: config, + }); + } + } else { + this.setState({ + loading: false, + error: true, + }); + } + }); } else { this.setState({ loading: false, diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/scenes/Home/components/Logout/index.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/scenes/Home/components/Logout/index.js index d2c5e106eba..84bc6c0c943 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/scenes/Home/components/Logout/index.js +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/scenes/Home/components/Logout/index.js @@ -22,6 +22,7 @@ import { Menu } from 'antd'; import axios from 'axios'; import { withConfigContext } from '../../../../components/context/ConfigContext'; import { handleApiError } from '../../../../services/utils/errorHandler'; +import { getUiConfig } from '../../../../services/utils/uiConfigHandler'; /* This class for call the logout api by sending request @@ -45,20 +46,34 @@ class Logout extends React.Component { inValid: false, }); - axios - .post(window.location.origin + config.serverConfig.logoutUri) - .then(res => { - // if the api call status is correct then user will logout and then it goes to login page - if (res.status === 200) { - window.location = window.location.origin + '/store/login'; + let logoutUri; + getUiConfig(config).then(uiConfig => { + if (uiConfig !== undefined) { + if (uiConfig.isSsoEnable) { + logoutUri = window.location.origin + config.serverConfig.ssoLogoutUri; + } else { + logoutUri = window.location.origin + config.serverConfig.logoutUri; } - }) - .catch(function(error) { - handleApiError( - error, - 'Error occurred while trying to get your review.', - ); - }); + axios + .post(logoutUri) + .then(res => { + // if the api call status is correct then user + // will logout and then it goes to login page + if (res.status === 200) { + window.location = + window.location.origin + `/${config.appName}/login`; + } + }) + .catch(function(error) { + handleApiError(error, 'Error occurred while trying to logout.'); + }); + } else { + this.setState({ + loading: false, + error: true, + }); + } + }); }; render() { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/services/utils/uiConfigHandler.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/services/utils/uiConfigHandler.js new file mode 100644 index 00000000000..77fd691c379 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/services/utils/uiConfigHandler.js @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2020. Entgra (Pvt) Ltd, https://entgra.io + * All Rights Reserved. + * + * Unauthorized copying/redistribution of this file, via any medium + * is strictly prohibited. + * Proprietary and confidential. + * + * Licensed under the Entgra Commercial License, + * Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + * You may obtain a copy of the License at + * https://entgra.io/licenses/entgra-commercial/1.0 + */ + +import axios from 'axios'; +import { notification } from 'antd'; + +export const getUiConfig = config => { + return axios + .get(window.location.origin + config.serverConfig.appUiConfigUri) + .then(res => { + return res.data; + }) + .catch(error => { + notification.error({ + message: 'There was a problem', + duration: 0, + description: 'Error occurred while trying to load UI configurations.', + }); + }); +};