项目文件夹

文件
wehub-resource-sync b3a7f98e5a
CI / E2E Cloudflare (4/8) (push) Failing after 0s
CI / E2E Cloudflare (8/8) (push) Failing after 1s
CI / Lint (push) Failing after 1s
Auto Extract / Extract (push) Failing after 4s
CI / Version Check (push) Failing after 9s
CI / Integration Tests (push) Failing after 1s
CI / E2E tests (1/8) (push) Failing after 1s
CI / E2E tests (2/8) (push) Failing after 2s
CI / E2E tests (3/8) (push) Failing after 2s
CI / Browser Tests (push) Failing after 1s
CI / E2E tests (5/8) (push) Failing after 1s
CI / E2E Cloudflare (2/8) (push) Failing after 2s
CI / Typecheck (push) Failing after 1s
CI / Changeset Validation (push) Failing after 2s
CI / E2E Cloudflare (5/8) (push) Failing after 1s
CI / E2E Cloudflare (6/8) (push) Failing after 1s
CI / E2E Cloudflare (7/8) (push) Failing after 1s
CodeQL / Analyze (javascript-typescript) (push) Failing after 1s
Format / Format (push) Failing after 0s
CodeQL / Analyze (actions) (push) Failing after 4s
CI / E2E tests (4/8) (push) Failing after 1s
CI / E2E tests (6/8) (push) Failing after 1s
CI / E2E tests (7/8) (push) Failing after 2s
CI / E2E tests (8/8) (push) Failing after 1s
CI / E2E Cloudflare (1/8) (push) Failing after 1s
CI / E2E Cloudflare (3/8) (push) Failing after 2s
Preview Releases / Publish Preview (push) Failing after 0s
zizmor / Run zizmor (push) Failing after 1s
Release / Release (push) Failing after 2s
CI / Smoke Tests (push) Failing after 5m36s
CI / Tests (push) Failing after 6m36s
Release / Sync Templates (push) Has been skipped
CI / E2E Tests (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:23:53 +08:00

83 行
3.0 KiB
TypeScript

import { AccordionBlockComponent } from "./blocks/accordion.js";
import { ActionsBlockComponent } from "./blocks/actions.js";
import { BannerBlockComponent } from "./blocks/banner.js";
import { ChartBlockComponent } from "./blocks/chart.js";
import { CodeBlockComponent } from "./blocks/code.js";
import { ColumnsBlockComponent } from "./blocks/columns.js";
import { ContextBlockComponent } from "./blocks/context.js";
import { DividerBlockComponent } from "./blocks/divider.js";
import { EmptyBlockComponent } from "./blocks/empty.js";
import { FieldsBlockComponent } from "./blocks/fields.js";
import { FormBlockComponent } from "./blocks/form.js";
import { HeaderBlockComponent } from "./blocks/header.js";
import { ImageBlockComponent } from "./blocks/image.js";
import { MeterBlockComponent } from "./blocks/meter.js";
import { SectionBlockComponent } from "./blocks/section.js";
import { StatsBlockComponent } from "./blocks/stats.js";
import { TabBlockComponent } from "./blocks/tab.js";
import { TableBlockComponent } from "./blocks/table.js";
import type { Block, BlockInteraction } from "./types.js";
function renderBlock(
block: Block,
onAction: (interaction: BlockInteraction) => void,
): React.ReactNode {
switch (block.type) {
case "header":
return <HeaderBlockComponent block={block} />;
case "section":
return <SectionBlockComponent block={block} onAction={onAction} />;
case "divider":
return <DividerBlockComponent />;
case "fields":
return <FieldsBlockComponent block={block} />;
case "table":
return <TableBlockComponent block={block} onAction={onAction} />;
case "actions":
return <ActionsBlockComponent block={block} onAction={onAction} />;
case "stats":
return <StatsBlockComponent block={block} />;
case "form":
return <FormBlockComponent block={block} onAction={onAction} />;
case "image":
return <ImageBlockComponent block={block} />;
case "context":
return <ContextBlockComponent block={block} />;
case "columns":
return <ColumnsBlockComponent block={block} onAction={onAction} />;
case "chart":
return <ChartBlockComponent block={block} />;
case "meter":
return <MeterBlockComponent block={block} />;
case "banner":
return <BannerBlockComponent block={block} />;
case "code":
return <CodeBlockComponent block={block} />;
case "tab":
return <TabBlockComponent block={block} onAction={onAction} />;
case "empty":
return <EmptyBlockComponent block={block} onAction={onAction} />;
case "accordion":
return <AccordionBlockComponent block={block} onAction={onAction} />;
default: {
const _exhaustive: never = block;
return null;
}
}
}
export interface BlockRendererProps {
blocks: Block[];
onAction: (interaction: BlockInteraction) => void;
}
export function BlockRenderer({ blocks, onAction }: BlockRendererProps) {
return (
<div className="flex flex-col gap-4">
{blocks.map((block, i) => (
<div key={block.block_id ?? i}>{renderBlock(block, onAction)}</div>
))}
</div>
);
}