feat : dreamgineer ask me try to use this and now im ran out of token sad [no ci]
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
import {
|
||||
createElement,
|
||||
isValidElement,
|
||||
type ReactNode,
|
||||
type ReactElement,
|
||||
} from "react";
|
||||
import type { ExportRequest } from "../types";
|
||||
import { ConstellationImage } from "./constellation";
|
||||
import { WeaponComparisonImage } from "./weapon";
|
||||
import { TeamExportImage } from "./team";
|
||||
import { MaterialPoster } from "./materials";
|
||||
import { OverviewPoster } from "./overview";
|
||||
import { ArtifactSectionContent } from "./artifact";
|
||||
|
||||
type Props = {
|
||||
children?: ReactNode;
|
||||
className?: string;
|
||||
[key: string]: unknown;
|
||||
};
|
||||
// Resolve only our pure functions. Filter sections and notes before layout, without DOM mutation.
|
||||
export function resolveTemplate(
|
||||
node: ReactNode,
|
||||
request: ExportRequest,
|
||||
): ReactNode {
|
||||
if (Array.isArray(node))
|
||||
return node.map((child) => resolveTemplate(child, request));
|
||||
if (!isValidElement<Props>(node)) return node;
|
||||
if (typeof node.type === "function") {
|
||||
return resolveTemplate(
|
||||
(node.type as (props: Props) => ReactNode)(node.props),
|
||||
request,
|
||||
);
|
||||
}
|
||||
const props = { ...node.props };
|
||||
if (request.withoutNotes && "data-export-note" in props) return null;
|
||||
if (request.kind === "artifact") {
|
||||
const { sections, recommendedCondition, targetCondition, includeNote } =
|
||||
request.data;
|
||||
const section = props["data-artifact-export-section"];
|
||||
if (
|
||||
section &&
|
||||
(section === "note"
|
||||
? !includeNote
|
||||
: !sections.includes(section as (typeof sections)[number]))
|
||||
)
|
||||
return null;
|
||||
if (
|
||||
props["data-recommended-condition"] !== undefined &&
|
||||
Number(props["data-recommended-condition"]) !== recommendedCondition
|
||||
)
|
||||
return null;
|
||||
if (
|
||||
props["data-target-condition"] !== undefined &&
|
||||
Number(props["data-target-condition"]) !== targetCondition
|
||||
)
|
||||
return null;
|
||||
const profile = request.data.guide.artifactProfile;
|
||||
const hasNote =
|
||||
includeNote && !request.withoutNotes && Boolean(profile?.note);
|
||||
const hasTargets =
|
||||
sections.includes("target-stats") &&
|
||||
Boolean(
|
||||
profile?.targetConditions.filter((condition) => condition.rows.length)[
|
||||
targetCondition
|
||||
],
|
||||
);
|
||||
const hasTalents =
|
||||
sections.includes("talents") && Boolean(profile?.talents.length);
|
||||
if (
|
||||
props.className?.includes("artifact-export-right") &&
|
||||
!hasNote &&
|
||||
!hasTargets &&
|
||||
!hasTalents
|
||||
)
|
||||
return null;
|
||||
}
|
||||
props.children = resolveTemplate(props.children, request);
|
||||
return createElement(node.type, { ...props, key: node.key });
|
||||
}
|
||||
export function exportTemplate(request: ExportRequest): ReactElement {
|
||||
let content: ReactNode;
|
||||
switch (request.kind) {
|
||||
case "constellation":
|
||||
content = <ConstellationImage {...request.data} />;
|
||||
break;
|
||||
case "weapon":
|
||||
content = <WeaponComparisonImage {...request.data} />;
|
||||
break;
|
||||
case "team":
|
||||
content = <TeamExportImage {...request.data} />;
|
||||
break;
|
||||
case "materials":
|
||||
content = <MaterialPoster {...request.data} />;
|
||||
break;
|
||||
case "overview":
|
||||
content = <OverviewPoster {...request.data} />;
|
||||
break;
|
||||
case "artifact":
|
||||
content = <ArtifactSectionContent guide={request.data.guide} />;
|
||||
break;
|
||||
}
|
||||
return (
|
||||
<div
|
||||
className="export-root"
|
||||
style={{ display: "block", width: request.width, height: request.height }}
|
||||
>
|
||||
{resolveTemplate(content, request)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user