From 9b257711a281a106efaa7aea96aa5004b9e33c63 Mon Sep 17 00:00:00 2001 From: imsarang Date: Mon, 2 Feb 2026 02:48:47 +0530 Subject: [PATCH 1/2] bug fix for 404 page --- .../[...path]/components/404NotFound.tsx | 117 ++++++++++++++++++ .../[...path]/components/codePreviewPanel.tsx | 13 +- 2 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 packages/web/src/app/[domain]/browse/[...path]/components/404NotFound.tsx diff --git a/packages/web/src/app/[domain]/browse/[...path]/components/404NotFound.tsx b/packages/web/src/app/[domain]/browse/[...path]/components/404NotFound.tsx new file mode 100644 index 000000000..d2e70f2e2 --- /dev/null +++ b/packages/web/src/app/[domain]/browse/[...path]/components/404NotFound.tsx @@ -0,0 +1,117 @@ +'use client'; + +import { $Enums } from "@sourcebot/db"; +import { ServiceError } from "@/lib/serviceError"; +import { TriangleAlert } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import Link from "next/link"; +import { getBrowsePath } from "@/app/[domain]/browse/hooks/utils"; +import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"; +import { useEffect } from "react"; +import { FileSourceResponse } from "@/features/git/getFileSourceApi"; +import { PathHeader } from "@/app/[domain]/components/pathHeader"; + +type RepoInfoResponse = ServiceError | { + id: number; + name: string; + displayName: string | undefined; + codeHostType: $Enums.CodeHostType; + externalWebUrl: string | undefined; + imageUrl: string | undefined; + indexedAt: Date | undefined; +} + +type FileSourceResponseType = FileSourceResponse | ServiceError; + +export const FileNotFound = ({ + repoInfoResponse, + fileSourceResponse, + revisionName, + path, + repoName +}: { + repoInfoResponse: RepoInfoResponse; + fileSourceResponse: FileSourceResponseType; + revisionName?: string; + path: string; + repoName: string; +}) => { + // Get display name from repoInfoResponse if available, otherwise use repoName + const displayRepoName = !('statusCode' in repoInfoResponse) + ? (repoInfoResponse.displayName || repoInfoResponse.name.split('/').pop() || repoName) + : repoName; + + // Use revisionName if provided, otherwise default to HEAD + const branchName = revisionName || 'HEAD'; + const filePath = path; + + // Check if repoInfoResponse is a ServiceError + const isRepoInfoError = 'statusCode' in repoInfoResponse; + const repoInfo = isRepoInfoError ? null : repoInfoResponse; + + return <> +
+ {/* display path header */} + {repoInfo && ( +
+ +
+ )} +
+ {/* icon */} +
+ +
+ + {/* error message with status code */} +
+

+ 404 - page not found +

+
+ + {/* detailed error with path */} +
+

+ The {branchName} branch of {displayRepoName} does not contain the path {filePath}. +

+
+ + {/* return to overview button */} +
+ +
+
+
+ +} + diff --git a/packages/web/src/app/[domain]/browse/[...path]/components/codePreviewPanel.tsx b/packages/web/src/app/[domain]/browse/[...path]/components/codePreviewPanel.tsx index cc5be9090..203110356 100644 --- a/packages/web/src/app/[domain]/browse/[...path]/components/codePreviewPanel.tsx +++ b/packages/web/src/app/[domain]/browse/[...path]/components/codePreviewPanel.tsx @@ -5,6 +5,8 @@ import { cn, getCodeHostInfoForRepo, isServiceError } from "@/lib/utils"; import Image from "next/image"; import { PureCodePreviewPanel } from "./pureCodePreviewPanel"; import { getFileSource } from '@/features/git'; +import { FileNotFound } from "./404NotFound"; +import { StatusCodes } from "http-status-codes"; interface CodePreviewPanelProps { path: string; @@ -23,7 +25,16 @@ export const CodePreviewPanel = async ({ path, repoName, revisionName }: CodePre ]); if (isServiceError(fileSourceResponse)) { - return
Error loading file source: {fileSourceResponse.message}
+ if (fileSourceResponse.statusCode === StatusCodes.NOT_FOUND) + return + else + return
Error loading file source: {fileSourceResponse.message}
} if (isServiceError(repoInfoResponse)) { From 1bd3220952352676f9d9f0d9cb91c2856dd37f88 Mon Sep 17 00:00:00 2001 From: imsarang Date: Mon, 2 Feb 2026 18:40:02 +0530 Subject: [PATCH 2/2] fixed pr-comments from bot --- .../app/[domain]/browse/[...path]/components/404NotFound.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/web/src/app/[domain]/browse/[...path]/components/404NotFound.tsx b/packages/web/src/app/[domain]/browse/[...path]/components/404NotFound.tsx index d2e70f2e2..dce1d7cba 100644 --- a/packages/web/src/app/[domain]/browse/[...path]/components/404NotFound.tsx +++ b/packages/web/src/app/[domain]/browse/[...path]/components/404NotFound.tsx @@ -1,5 +1,3 @@ -'use client'; - import { $Enums } from "@sourcebot/db"; import { ServiceError } from "@/lib/serviceError"; import { TriangleAlert } from "lucide-react"; @@ -7,7 +5,6 @@ import { Button } from "@/components/ui/button"; import Link from "next/link"; import { getBrowsePath } from "@/app/[domain]/browse/hooks/utils"; import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"; -import { useEffect } from "react"; import { FileSourceResponse } from "@/features/git/getFileSourceApi"; import { PathHeader } from "@/app/[domain]/components/pathHeader"; @@ -104,6 +101,7 @@ export const FileNotFound = ({ path: '/', pathType: 'tree', domain: SINGLE_TENANT_ORG_DOMAIN, + revisionName })} > Return to the repository overview