blob: 9eaf8ae5fe04b64c6af799e7ac94fb74e9c4548a [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import React from 'react';
import { makeStyles, withStyles } from '@material-ui/styles';
import { blue, yellow, red, grey } from '@material-ui/core/colors';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import Checkbox, { CheckboxProps } from '@material-ui/core/Checkbox';
import SelectMenu from './SelectMenu.tsx';
import { RadioDescription } from './RadioDescription/RadioDescription.tsx';
import {GetCategoriesByPersona} from './IssueWizardUtils.tsx';
import {ISSUE_WIZARD_QUESTIONS} from './IssueWizardConfig.ts';
import DotMobileStepper from './DotMobileStepper.tsx';
import {IssueWizardPersona} from './IssueWizardTypes.tsx';
const CustomCheckbox = withStyles({
root: {
color: blue[400],
'&$checked': {
color: blue[600],
},
},
checked: {},
})((props: CheckboxProps) => <Checkbox color="default" {...props} />);
const useStyles = makeStyles({
pad: {
margin: '10px, 20px',
display: 'inline-block',
},
flex: {
display: 'flex',
},
warningBox: {
minHeight: '10vh',
borderStyle: 'solid',
borderWidth: '2px',
borderColor: yellow[800],
borderRadius: '8px',
background: yellow[50],
padding: '0px 20px 1em',
margin: '1rem 0'
},
warningHeader: {
color: yellow[800],
fontSize: '16px',
fontWeight: '500',
},
star: {
color: red[700],
marginRight: '8px',
fontSize: '16px',
display: 'inline-block',
},
header: {
color: grey[900],
fontSize: '1.5rem',
margin: '1rem 0',
},
subheader: {
color: grey[700],
fontSize: '1.125rem',
margin: '1rem 0',
},
alertDetail: {
fontSize: '16px',
},
link: {
fontSize: '20px',
fontWeight: 'bolder',
textDecoration: 'underline',
},
red: {
color: red[600],
},
line: {
color: grey[200],
marginTop: '1.5rem',
minWidth: '360px',
}
});
type Props = {
userPersona: IssueWizardPersona,
setUserPersona: Function,
category: string,
setCategory: Function,
setActiveStep: Function,
};
export default function LandingStep(props: Props) {
const {userPersona, setUserPersona, category, setCategory, setActiveStep} = props;
const classes = useStyles();
const categoriesByPersonaMap = GetCategoriesByPersona(ISSUE_WIZARD_QUESTIONS);
const [categoryList, setCategoryList] = React.useState(categoriesByPersonaMap.get(userPersona));
const [checkExisting, setCheckExisting] = React.useState(false);
const handleCheckChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setCheckExisting(event.target.checked);
};
const onSelectUserPersona = (userPersona: string) => {
setUserPersona(userPersona);
setCategoryList(categoriesByPersonaMap.get(userPersona));
setCategory('');
}
const contributorAlert = () => {
return (
<div>
<div className={classes.subheader}>
Prefer to file an issue manually?
</div>
<div className={classes.alertDetail}>
It's usually best to work through this short wizard so that your issue is given the labels needed for the right team to see it.
Otherwise it might take longer for your issue to be triaged and resolved.
</div>
<div className={classes.alertDetail}>
However, if you are a Chromium contributor and none of the other options apply, you may use the
<a className={classes.link} href="entry"> regular issue entry form</a>.
</div>
</div>
);
}
const nextEnabled = (userPersona != IssueWizardPersona.Contributor) && checkExisting && (category != '');
return (
<>
<p className={classes.header}>Report an issue with Chromium</p>
<p className={classes.subheader}>
We want you to enter the best possible issue report so that the project team members
can act on it effectively. The following steps will help route your issue to the correct
people.
</p>
<p className={classes.subheader}>
Please select your following role: <span className={classes.red}>*</span>
</p>
<RadioDescription selectedRadio={userPersona} onClickRadio={onSelectUserPersona} />
{ userPersona === IssueWizardPersona.Contributor ? contributorAlert() :
<div>
<div className={classes.subheader}>
Which of the following best describes the issue that you are reporting? <span className={classes.red}>*</span>
</div>
<SelectMenu optionsList={categoryList} selectedOption={category} setOption={setCategory} />
<div className={classes.warningBox}>
<p className={classes.warningHeader}> <span className={classes.star}>*</span>Avoid duplicate issue reports:</p>
<div>
<FormControlLabel className={classes.pad}
control={
<CustomCheckbox
checked={checkExisting}
onChange={handleCheckChange}
name="warningCheck"
/>
}
label={
<span>By checking this box, I'm acknowledging that I have searched for <a href="/p/chromium/issues/list" target="_blank">existing issues</a> that already report this problem.</span>
}
/>
</div>
</div>
</div>
}
{ userPersona === IssueWizardPersona.Contributor ? null :
<DotMobileStepper nextEnabled={nextEnabled} activeStep={0} setActiveStep={setActiveStep}/>
}
</>
);
}