diff --git a/src/renderer/src/components/GitHubItemDialog.tsx b/src/renderer/src/components/GitHubItemDialog.tsx index 0df1667fd69..6fa96c2b881 100644 --- a/src/renderer/src/components/GitHubItemDialog.tsx +++ b/src/renderer/src/components/GitHubItemDialog.tsx @@ -493,7 +493,7 @@ function PRReviewersPanel({ const [reviewerInput, setReviewerInput] = useState('') const [reviewerPickerSide, setReviewerPickerSide] = useState<'top' | 'bottom'>('bottom') const [reviewerPickerMaxHeight, setReviewerPickerMaxHeight] = useState(null) - const [activeReviewerIndex, setActiveReviewerIndex] = useState(0) + const [activeReviewerCursor, setActiveReviewerCursor] = useState({ resetKey: '', index: 0 }) const [submitting, setSubmitting] = useState(false) const [localReviewRequests, setLocalReviewRequests] = useState( () => item.reviewRequests ?? [] @@ -614,9 +614,24 @@ function PRReviewersPanel({ [everyoneElseReviewerRows, suggestedReviewerRows] ) - useEffect(() => { - setActiveReviewerIndex(0) - }, [reviewerQuery, actionableReviewerRows.length]) + const reviewerCursorResetKey = `${reviewerQuery}\u0000${actionableReviewerRows.length}` + if (activeReviewerCursor.resetKey !== reviewerCursorResetKey) { + setActiveReviewerCursor({ resetKey: reviewerCursorResetKey, index: 0 }) + } + const activeReviewerIndex = + activeReviewerCursor.resetKey === reviewerCursorResetKey ? activeReviewerCursor.index : 0 + const setActiveReviewerIndex = useCallback( + (nextIndex: number | ((current: number) => number)): void => { + setActiveReviewerCursor((current) => { + const currentIndex = current.resetKey === reviewerCursorResetKey ? current.index : 0 + return { + resetKey: reviewerCursorResetKey, + index: typeof nextIndex === 'function' ? nextIndex(currentIndex) : nextIndex + } + }) + }, + [reviewerCursorResetKey] + ) const hasReviewerMetadata = item.reviewDecision !== undefined || diff --git a/src/renderer/src/components/PullRequestPage.tsx b/src/renderer/src/components/PullRequestPage.tsx index 06bcb570013..b5e4919e04b 100644 --- a/src/renderer/src/components/PullRequestPage.tsx +++ b/src/renderer/src/components/PullRequestPage.tsx @@ -493,7 +493,7 @@ function PRReviewersPanel({ const [reviewerInput, setReviewerInput] = useState('') const [reviewerPickerSide, setReviewerPickerSide] = useState<'top' | 'bottom'>('bottom') const [reviewerPickerMaxHeight, setReviewerPickerMaxHeight] = useState(null) - const [activeReviewerIndex, setActiveReviewerIndex] = useState(0) + const [activeReviewerCursor, setActiveReviewerCursor] = useState({ resetKey: '', index: 0 }) const [submitting, setSubmitting] = useState(false) const [localReviewRequests, setLocalReviewRequests] = useState( () => item.reviewRequests ?? [] @@ -614,9 +614,24 @@ function PRReviewersPanel({ [everyoneElseReviewerRows, suggestedReviewerRows] ) - useEffect(() => { - setActiveReviewerIndex(0) - }, [reviewerQuery, actionableReviewerRows.length]) + const reviewerCursorResetKey = `${reviewerQuery}\u0000${actionableReviewerRows.length}` + if (activeReviewerCursor.resetKey !== reviewerCursorResetKey) { + setActiveReviewerCursor({ resetKey: reviewerCursorResetKey, index: 0 }) + } + const activeReviewerIndex = + activeReviewerCursor.resetKey === reviewerCursorResetKey ? activeReviewerCursor.index : 0 + const setActiveReviewerIndex = useCallback( + (nextIndex: number | ((current: number) => number)): void => { + setActiveReviewerCursor((current) => { + const currentIndex = current.resetKey === reviewerCursorResetKey ? current.index : 0 + return { + resetKey: reviewerCursorResetKey, + index: typeof nextIndex === 'function' ? nextIndex(currentIndex) : nextIndex + } + }) + }, + [reviewerCursorResetKey] + ) const hasReviewerMetadata = item.reviewDecision !== undefined || diff --git a/src/renderer/src/components/TaskPage.tsx b/src/renderer/src/components/TaskPage.tsx index 3660e23ebfe..b07f353b54c 100644 --- a/src/renderer/src/components/TaskPage.tsx +++ b/src/renderer/src/components/TaskPage.tsx @@ -1286,7 +1286,7 @@ function PRReviewCell({ () => item.reviewRequests ?? [] ) const patchWorkItem = useAppStore((s) => s.patchWorkItem) - const [activeReviewerIndex, setActiveReviewerIndex] = useState(0) + const [activeReviewerCursor, setActiveReviewerCursor] = useState({ resetKey: '', index: 0 }) const [submitting, setSubmitting] = useState(false) const settings = useAppStore((s) => s.settings) const reviewerInputRef = useRef(null) @@ -1397,9 +1397,24 @@ function PRReviewCell({ [everyoneElseReviewerRows, suggestedReviewerRows] ) - useEffect(() => { - setActiveReviewerIndex(0) - }, [reviewerQuery, actionableReviewerRows.length]) + const reviewerCursorResetKey = `${reviewerQuery}\u0000${actionableReviewerRows.length}` + if (activeReviewerCursor.resetKey !== reviewerCursorResetKey) { + setActiveReviewerCursor({ resetKey: reviewerCursorResetKey, index: 0 }) + } + const activeReviewerIndex = + activeReviewerCursor.resetKey === reviewerCursorResetKey ? activeReviewerCursor.index : 0 + const setActiveReviewerIndex = useCallback( + (nextIndex: number | ((current: number) => number)): void => { + setActiveReviewerCursor((current) => { + const currentIndex = current.resetKey === reviewerCursorResetKey ? current.index : 0 + return { + resetKey: reviewerCursorResetKey, + index: typeof nextIndex === 'function' ? nextIndex(currentIndex) : nextIndex + } + }) + }, + [reviewerCursorResetKey] + ) if (item.type !== 'pr') { return Issue