diff --git a/src/components/PRGradingScreen/PRGradingScreen.jsx b/src/components/PRGradingScreen/PRGradingScreen.jsx index afd6d22b50..cab67fae21 100644 --- a/src/components/PRGradingScreen/PRGradingScreen.jsx +++ b/src/components/PRGradingScreen/PRGradingScreen.jsx @@ -4,6 +4,8 @@ import { useSelector } from 'react-redux'; import { v4 as uuidv4 } from 'uuid'; import styles from './PRGradingScreen.module.css'; +const normalizePrNumbers = prNumbers => (prNumbers || '').replace(/\s+/g, ''); + const PRGradingScreen = ({ teamData, reviewers }) => { const darkMode = useSelector(state => state.theme.darkMode); @@ -55,6 +57,17 @@ const PRGradingScreen = ({ teamData, reviewers }) => { return; } + const reviewer = reviewerData.find(r => r.id === reviewerId); + const existingPRs = reviewer?.gradedPrs ?? []; + const normalizedNew = normalizePrNumbers(inputValue.trim()); + const isDuplicate = existingPRs.some( + pr => pr?.prNumbers && normalizePrNumbers(pr.prNumbers) === normalizedNew, + ); + if (isDuplicate) { + setInputError(`PR number "${inputValue.trim()}" already exists for this reviewer`); + return; + } + const newPREntry = { id: uuidv4(), prNumbers: inputValue.trim(), @@ -232,11 +245,26 @@ const PRGradingScreen = ({ teamData, reviewers }) => { setInputValue(e.target.value)} - className={styles['pr-grading-screen-pr-number-input']} + onChange={e => { + setInputValue(e.target.value); + if (inputError) setInputError(''); + }} + className={`${styles['pr-grading-screen-pr-number-input']} ${ + inputError ? styles['pr-grading-screen-input-error'] : '' + } ${darkMode ? styles['dark-mode'] : ''}`} placeholder="1070 or 1070 + 1256" /> + {inputError && ( +
+ {inputError} +
+ )} +