import type { MemShellResult } from "@/types/memshell";
import { DownloadIcon } from "lucide-react";
import { useTranslation } from "react-i18next";
import { toast } from "sonner";
import DecompiledCodeViewer from "@/components/decompiled-code-viewer";
import { QuickUsage } from "@/components/memshell/quick-usage";
import { Button } from "@/components/ui/button";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { useDecompiledSources } from "@/lib/decompile/use-decompiled-sources";
import { downloadBytes } from "@/lib/utils";
import { BasicInfo } from "./results/basic-info";
import { ResultComponent } from "./results/result-component";
export default function ShellResult({
packResult,
packMethod,
generateResult,
}: Readonly<{
packResult: string | undefined;
packMethod: string;
generateResult?: MemShellResult;
}>) {
const { t } = useTranslation(["common", "memshell"]);
const { sources, isDecompiling, error } = useDecompiledSources(generateResult);
if (!generateResult) {
return ;
}
const shellClassName = generateResult.shellClassName;
const shellBytesBase64 = generateResult.shellBytesBase64Str;
const injectorClassName = generateResult.injectorClassName;
const injectorBytesBase64 = generateResult.injectorBytesBase64Str;
const height = 800;
const sourcePlaceholder = isDecompiling
? `// ${t("common:decompiling")}`
: error
? `// ${t("common:decompileFailed", { error })}`
: "";
return (
{t("common:generateResult")}
{t("memshell:shellClass")}
{t("memshell:injectorClass")}
{shellClassName}}
button={
}
height={height}
lines={sources.shell?.lines ?? null}
placeholder={sourcePlaceholder}
/>
{injectorClassName}}
button={
}
height={height}
lines={sources.injector?.lines ?? null}
placeholder={sourcePlaceholder}
/>
);
}