2020-06-30 09:22:25 +02:00
|
|
|
import React from 'react';
|
2020-06-29 23:43:49 +02:00
|
|
|
import Container from '@material-ui/core/Container';
|
|
|
|
import Typography from '@material-ui/core/Typography';
|
2020-06-30 14:19:29 +02:00
|
|
|
import Paper from '@material-ui/core/Paper';
|
|
|
|
import Tabs from '@material-ui/core/Tabs';
|
|
|
|
import Tab from '@material-ui/core/Tab';
|
2020-06-29 23:43:49 +02:00
|
|
|
import { useFetch } from './utils/useFetch';
|
2020-06-30 14:19:29 +02:00
|
|
|
import { useHistory } from "react-router-dom";
|
2020-06-29 23:43:49 +02:00
|
|
|
|
|
|
|
import { makeStyles } from '@material-ui/core/styles';
|
|
|
|
|
|
|
|
const useStyles = makeStyles((theme) => ({
|
|
|
|
description: {
|
|
|
|
textAlign: 'justify'
|
2020-06-30 14:19:29 +02:00
|
|
|
},
|
|
|
|
languageBar: {
|
|
|
|
ruleid: {
|
|
|
|
textAlign: 'left',
|
|
|
|
},
|
|
|
|
flexGrow: 1,
|
|
|
|
},
|
2020-06-29 23:43:49 +02:00
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
export function RulePage(props) {
|
|
|
|
const ruleid = props.match.params.ruleid;
|
|
|
|
const language = props.match.params.language;
|
|
|
|
|
2020-06-30 14:19:29 +02:00
|
|
|
const history = useHistory();
|
|
|
|
function handleLanguageChange(event, lang) {
|
|
|
|
history.push(`/${ruleid}/${lang}`);
|
|
|
|
}
|
|
|
|
|
2020-06-29 23:43:49 +02:00
|
|
|
const classes = useStyles();
|
|
|
|
|
2020-06-30 14:19:29 +02:00
|
|
|
let descUrl = process.env.PUBLIC_URL + '/rules/' + ruleid + "/" + language + "-description.html";
|
|
|
|
let metadataUrl = process.env.PUBLIC_URL + '/rules/' + ruleid + "/" + language + "-metadata.json";
|
2020-07-06 11:03:32 +02:00
|
|
|
let editOnGithubUrl = 'https://github.com/SonarSource/rspec/tree/master/rules/' + ruleid + '/' + language;
|
2020-06-29 23:43:49 +02:00
|
|
|
|
2020-06-30 14:19:29 +02:00
|
|
|
let [descHTML, descError, descIsLoading] = useFetch(descUrl, null, false);
|
|
|
|
let [metadataJSON, metadataError, metadataIsLoading] = useFetch(metadataUrl, null, true);
|
2020-06-29 23:43:49 +02:00
|
|
|
|
2020-06-30 14:19:29 +02:00
|
|
|
let title = "Loading..."
|
2020-07-06 11:03:32 +02:00
|
|
|
let metadataJSONString;
|
2020-06-30 14:19:29 +02:00
|
|
|
let languagesTabs = null;
|
2020-06-29 23:43:49 +02:00
|
|
|
if (!metadataIsLoading && !metadataError) {
|
2020-06-30 14:19:29 +02:00
|
|
|
title = metadataJSON.title
|
|
|
|
metadataJSON.all_languages.sort()
|
|
|
|
languagesTabs = metadataJSON.all_languages.map(lang => <Tab label={lang} value={lang}/>)
|
2020-07-06 11:03:32 +02:00
|
|
|
metadataJSONString = JSON.stringify(metadataJSON, null, 2);
|
2020-06-29 23:43:49 +02:00
|
|
|
}
|
|
|
|
|
2020-06-30 09:22:25 +02:00
|
|
|
let description = <div>Loading...</div>;
|
|
|
|
if (!descIsLoading && !descError) {
|
2020-07-06 11:03:32 +02:00
|
|
|
description = <div>
|
|
|
|
<div dangerouslySetInnerHTML={{__html: descHTML}}/>
|
|
|
|
<hr />
|
|
|
|
<a href={editOnGithubUrl}>Edit on Github</a><br/>
|
|
|
|
<hr />
|
|
|
|
<pre>{metadataJSONString}</pre>
|
|
|
|
</div>;
|
2020-06-30 09:22:25 +02:00
|
|
|
}
|
|
|
|
|
2020-06-29 23:43:49 +02:00
|
|
|
return (
|
2020-06-30 14:19:29 +02:00
|
|
|
<div>
|
|
|
|
<Paper className={classes.languagesBar}>
|
|
|
|
<Typography variant="h4" className={classes.languagesBar_ruleid}>{ruleid}</Typography>
|
|
|
|
<Tabs
|
|
|
|
value={language}
|
|
|
|
onChange={handleLanguageChange}
|
|
|
|
indicatorColor="primary"
|
|
|
|
textColor="primary"
|
|
|
|
centered
|
|
|
|
>
|
|
|
|
{languagesTabs}
|
|
|
|
</Tabs>
|
|
|
|
</Paper>
|
|
|
|
|
2020-06-29 23:43:49 +02:00
|
|
|
<Container maxWidth="md">
|
2020-06-30 14:19:29 +02:00
|
|
|
<Typography variant="h3">{title}</Typography>
|
2020-06-29 23:43:49 +02:00
|
|
|
<Typography className={classes.description}>
|
2020-06-30 09:22:25 +02:00
|
|
|
{description}
|
2020-06-29 23:43:49 +02:00
|
|
|
</Typography>
|
|
|
|
</Container>
|
2020-06-30 14:19:29 +02:00
|
|
|
</div>
|
2020-06-29 23:43:49 +02:00
|
|
|
);
|
2020-07-06 11:03:32 +02:00
|
|
|
}
|