diff --git a/web/src/components/Changes/Changes.tsx b/web/src/components/Changes/Changes.tsx index 60a939014..460edf1b5 100644 --- a/web/src/components/Changes/Changes.tsx +++ b/web/src/components/Changes/Changes.tsx @@ -32,7 +32,7 @@ import { useHistory } from 'react-router-dom' import { useGet } from 'restful-react' import { isEqual, noop } from 'lodash-es' import { useStrings } from 'framework/strings' -import { normalizeGitRef, type GitInfoProps } from 'utils/GitUtils' +import { normalizeGitRef, type GitInfoProps, FILE_VIEWED_OBSOLETE_SHA } from 'utils/GitUtils' import { PullRequestSection, formatNumber, getErrorMessage, voidFn } from 'utils/Utils' import { DiffViewer } from 'components/DiffViewer/DiffViewer' import { useEventListener } from 'hooks/useEventListener' @@ -176,7 +176,7 @@ export const Changes: React.FC = ({ rawFileViews ?.filter(({ path, sha }) => path && sha) // every entry is expected to have a path and sha - otherwise skip ... .forEach(({ path, sha, obsolete }) => { - out.set(path || '', obsolete ? 'ffffffffffffffffffffffffffffffffffffffff' : sha || '') + out.set(path || '', obsolete ? FILE_VIEWED_OBSOLETE_SHA : sha || '') }) return out }, [rawFileViews]) diff --git a/web/src/components/DiffViewer/DiffViewer.tsx b/web/src/components/DiffViewer/DiffViewer.tsx index b63330910..b3bb7268d 100644 --- a/web/src/components/DiffViewer/DiffViewer.tsx +++ b/web/src/components/DiffViewer/DiffViewer.tsx @@ -61,7 +61,9 @@ import { getCommentLineInfo, createCommentOppositePlaceHolder, ViewStyle, - contentDOMHasData + contentDOMHasData, + getFileViewedState, + FileViewedState } from './DiffViewerUtils' import { CommentAction, @@ -114,13 +116,14 @@ export const DiffViewer: React.FC = ({ // file viewed feature is only enabled if no commit range is provided (otherwise component is hidden, too) const [viewed, setViewed] = useState( - commitRange?.length === 0 && diff.fileViews?.get(diff.filePath) === diff.checksumAfter + commitRange?.length === 0 && + getFileViewedState(diff.filePath, diff.checksumAfter, diff.fileViews) === FileViewedState.VIEWED ) useEffect(() => { if (commitRange?.length === 0) { - setViewed(diff.fileViews?.get(diff.filePath) === diff.checksumAfter) + setViewed(getFileViewedState(diff.filePath, diff.checksumAfter, diff.fileViews) === FileViewedState.VIEWED) } - }, [diff.fileViews, diff.filePath, diff.checksumAfter, commitRange]) + }, [setViewed, diff.fileViews, diff.filePath, diff.checksumAfter, commitRange]) const [collapsed, setCollapsed] = useState(viewed) useEffect(() => { @@ -711,8 +714,7 @@ export const DiffViewer: React.FC = ({ when={ !readOnly && commitRange?.length === 0 && - diff.fileViews?.get(diff.filePath) !== undefined && - diff.fileViews?.get(diff.filePath) !== diff.checksumAfter + getFileViewedState(diff.filePath, diff.checksumAfter, diff.fileViews) === FileViewedState.CHANGED }> {getString('changedSinceLastView')} diff --git a/web/src/components/DiffViewer/DiffViewerUtils.tsx b/web/src/components/DiffViewer/DiffViewerUtils.tsx index 36a3ea001..faffcd443 100644 --- a/web/src/components/DiffViewer/DiffViewerUtils.tsx +++ b/web/src/components/DiffViewer/DiffViewerUtils.tsx @@ -19,6 +19,7 @@ import HoganJsUtils from 'diff2html/lib/hoganjs-utils' import { get } from 'lodash-es' import type { CommentItem, SingleConsumerEventStream } from 'components/CommentBox/CommentBox' import type { TypesPullReqActivity } from 'services/code' +import { FILE_VIEWED_OBSOLETE_SHA } from 'utils/GitUtils' export enum ViewStyle { SIDE_BY_SIDE = 'side-by-side', @@ -257,3 +258,28 @@ export function activitiesToDiffCommentItems( }) || [] ) } + +export enum FileViewedState { + NOT_VIEWED, + VIEWED, + CHANGED +} + +export function getFileViewedState( + filePath: string, + fileSha: string | undefined, + views: Map | undefined +): FileViewedState { + if (!views || !views.has(filePath)) { + return FileViewedState.NOT_VIEWED + } + + const viewedSHA = views.get(filePath) + + // this case is only expected in case of pure rename - but we'll also use it as fallback. + if (fileSha === undefined || fileSha === '') { + return viewedSHA === FILE_VIEWED_OBSOLETE_SHA ? FileViewedState.CHANGED : FileViewedState.VIEWED + } + + return viewedSHA === fileSha ? FileViewedState.VIEWED : FileViewedState.CHANGED +} diff --git a/web/src/utils/GitUtils.ts b/web/src/utils/GitUtils.ts index e754cce37..df962333d 100644 --- a/web/src/utils/GitUtils.ts +++ b/web/src/utils/GitUtils.ts @@ -234,6 +234,8 @@ export const normalizeGitRef = (gitRef: string | undefined) => { export const REFS_TAGS_PREFIX = 'refs/tags/' export const REFS_BRANCH_PREFIX = 'refs/heads/' +export const FILE_VIEWED_OBSOLETE_SHA = 'ffffffffffffffffffffffffffffffffffffffff' + export function formatTriggers(triggers: EnumWebhookTrigger[]) { return triggers.map(trigger => { return trigger