import { FileHeader } from "@/app/components/fireHeader";
import { TopBar } from "@/app/components/topBar";
import { Separator } from '@/components/ui/separator';
import { getFileSource, listRepositories } from '@/lib/server/searchService';
import { base64Decode, isServiceError } from "@/lib/utils";
import { CodePreview } from "./codePreview";
import { PageNotFound } from "@/app/components/pageNotFound";
import { ErrorCode } from "@/lib/errorCodes";
import { LuFileX2, LuBookX } from "react-icons/lu";
interface BrowsePageProps {
params: {
path: string[];
};
}
export default async function BrowsePage({
params,
}: BrowsePageProps) {
const rawPath = decodeURIComponent(params.path.join('/'));
const sentinalIndex = rawPath.search(/\/-\/(tree|blob)\//);
if (sentinalIndex === -1) {
return ;
}
const repoAndRevisionName = rawPath.substring(0, sentinalIndex).split('@');
const repoName = repoAndRevisionName[0];
const revisionName = repoAndRevisionName.length > 1 ? repoAndRevisionName[1] : undefined;
const { path, pathType } = ((): { path: string, pathType: 'tree' | 'blob' } => {
const path = rawPath.substring(sentinalIndex + '/-/'.length);
const pathType = path.startsWith('tree/') ? 'tree' : 'blob';
switch (pathType) {
case 'tree':
return {
path: path.substring('tree/'.length),
pathType,
};
case 'blob':
return {
path: path.substring('blob/'.length),
pathType,
};
}
})();
// @todo (bkellam) : We should probably have a endpoint to fetch repository metadata
// given it's name or id.
const reposResponse = await listRepositories();
if (isServiceError(reposResponse)) {
// @todo : proper error handling
return (
<>
Error: {reposResponse.message}
>
)
}
const repo = reposResponse.List.Repos.find(r => r.Repository.Name === repoName);
if (pathType === 'tree') {
// @todo : proper tree handling
return (
<>
Tree view not supported
>
)
}
return (
{repo === undefined ? (
) : (
)}
)
}
interface CodePreviewWrapper {
path: string,
repoName: string,
revisionName: string,
}
const CodePreviewWrapper = async ({
path,
repoName,
revisionName,
}: CodePreviewWrapper) => {
// @todo: this will depend on `pathType`.
const fileSourceResponse = await getFileSource({
fileName: path,
repository: repoName,
branch: revisionName,
});
if (isServiceError(fileSourceResponse)) {
if (fileSourceResponse.errorCode === ErrorCode.FILE_NOT_FOUND) {
return (
)
}
// @todo : proper error handling
return (
<>
Error: {fileSourceResponse.message}
>
)
}
return (
)
}