diff --git a/web/src/actions/tenants.js b/web/src/actions/tenants.js new file mode 100644 index 0000000000..33b0dcbf37 --- /dev/null +++ b/web/src/actions/tenants.js @@ -0,0 +1,58 @@ +// Copyright 2018 Red Hat, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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. + +import * as API from '../api' + +export const TENANTS_FETCH_REQUEST = 'TENANTS_FETCH_REQUEST' +export const TENANTS_FETCH_SUCCESS = 'TENANTS_FETCH_SUCCESS' +export const TENANTS_FETCH_FAIL = 'TENANTS_FETCH_FAIL' + +export const requestTenants = () => ({ + type: TENANTS_FETCH_REQUEST +}) + +export const receiveTenants = json => ({ + type: TENANTS_FETCH_SUCCESS, + tenants: json, + receivedAt: Date.now() +}) + +const failedTenants = error => ({ + type: TENANTS_FETCH_FAIL, + error +}) + +const fetchTenants = () => dispatch => { + dispatch(requestTenants()) + return API.fetchTenants() + .then(response => dispatch(receiveTenants(response.data))) + .catch(error => dispatch(failedTenants(error))) +} + +const shouldFetchTenants = state => { + const tenants = state.tenants + if (tenants.tenants.length > 0) { + return false + } + if (tenants.isFetching) { + return false + } + return true +} + +export const fetchTenantsIfNeeded = (force) => (dispatch, getState) => { + if (force || shouldFetchTenants(getState())) { + return dispatch(fetchTenants()) + } +} diff --git a/web/src/pages/Tenants.jsx b/web/src/pages/Tenants.jsx index 4b6a03efea..f3646cf5db 100644 --- a/web/src/pages/Tenants.jsx +++ b/web/src/pages/Tenants.jsx @@ -13,32 +13,36 @@ // under the License. import * as React from 'react' +import { connect } from 'react-redux' +import PropTypes from 'prop-types' import { Link } from 'react-router-dom' import { Table } from 'patternfly-react' -import { fetchTenants } from '../api' +import Refreshable from '../containers/Refreshable' +import { fetchTenantsIfNeeded } from '../actions/tenants' -class TenantsPage extends React.Component { - constructor () { - super() - this.state = { - tenants: [] - } +class TenantsPage extends Refreshable { + static propTypes = { + remoteData: PropTypes.object, + dispatch: PropTypes.func + } + + updateData = (force) => { + this.props.dispatch(fetchTenantsIfNeeded(force)) } componentDidMount () { document.title = 'Zuul Tenants' - fetchTenants().then(response => { - this.setState({tenants: response.data}) - }) + this.updateData() } + // TODO: fix Refreshable class to work with tenant less page. + componentDidUpdate () { } + render () { - const { tenants } = this.state - if (tenants.length === 0) { - return (
Loading...
) - } + const { remoteData } = this.props + const tenants = remoteData.tenants const headerFormat = value =>