joyent-portal/frontend/src/containers/service/index.js

121 lines
2.7 KiB
JavaScript
Raw Normal View History

import React from 'react';
import { connect } from 'react-redux';
import { Switch, Route } from 'react-router-dom';
import PropTypes from '@root/prop-types';
import Redirect from '@components/redirect';
import Section from '@components/section';
import SummarySection from './summary';
import InstancesSection from './instances';
import MetricsSection from './metrics';
import NetworksSection from './networks';
import TagsMetadataSection from './tags-metadata';
import ActivityFeedSection from './activity-feed';
import ServiceManifestSection from './service-manifest';
import FirewallSection from './firewall';
2017-01-03 00:32:29 +02:00
const SectionComponents = {
summary: SummarySection,
instances: InstancesSection,
metrics: MetricsSection,
networks: NetworksSection,
'tags-metadata': TagsMetadataSection,
'activity-feed': ActivityFeedSection,
'service-manifest': ServiceManifestSection,
firewall: FirewallSection
2017-01-03 00:32:29 +02:00
};
import {
2017-01-03 00:32:29 +02:00
orgByIdSelector,
serviceSectionsSelector,
projectByIdSelector,
serviceByIdSelector
} from '@state/selectors';
2017-01-03 00:32:29 +02:00
const Service = ({
org = {},
project = {},
sections = [],
service = {}
}) => {
const pathname = ({
org,
project,
service,
section
}) => (
`/${org}/projects/${project}/services/${service}/${section}`
);
2017-01-03 01:17:12 +02:00
const redirectHref = pathname({
org: org.id,
project: project.id,
service: service.id,
section: 'summary'
});
const navLinks = sections.map((name) => ({
2017-01-03 00:32:29 +02:00
pathname: pathname({
org: org.id,
project: project.id,
service: service.id,
section: name
}),
name
}));
2017-01-03 01:17:12 +02:00
const nameLinks = [{
pathname: `/${org.id}`,
name: org.name
}, {
pathname: `/${org.id}/projects/${project.id}`,
name: project.name
}, {
pathname: redirectHref,
name: service.name
}];
2017-01-03 00:32:29 +02:00
const navMatches = sections.map((name) => (
2017-02-06 20:27:10 +02:00
<Route
2017-01-03 00:32:29 +02:00
component={SectionComponents[name]}
key={name}
2017-02-06 20:27:10 +02:00
path={`/:org/projects/:projectId/services/:serviceId/${name}`}
2017-01-03 00:32:29 +02:00
/>
));
const missMatch = !sections.length ? null : (
2017-02-06 20:27:10 +02:00
<Route component={Redirect(redirectHref)} />
2017-01-03 00:32:29 +02:00
);
return (
2017-01-03 01:17:12 +02:00
<Section links={navLinks} name={nameLinks}>
2017-02-06 20:27:10 +02:00
<Switch>
{navMatches}
{missMatch}
</Switch>
2017-01-03 00:32:29 +02:00
</Section>
);
};
Service.propTypes = {
org: PropTypes.org,
project: PropTypes.project,
sections: PropTypes.sections,
service: PropTypes.service
};
const mapStateToProps = (state, {
2017-02-07 11:55:18 +02:00
match = {
params: {}
}
2017-01-03 00:32:29 +02:00
}) => ({
2017-02-06 20:27:10 +02:00
org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.projectId)(state),
2017-01-03 00:32:29 +02:00
sections: serviceSectionsSelector(state),
2017-02-06 20:27:10 +02:00
service: serviceByIdSelector(match.params.serviceId)(state)
2017-01-03 00:32:29 +02:00
});
export default connect(
2017-01-03 00:32:29 +02:00
mapStateToProps
)(Service);