Files
geo/apps/admin-web/src/lib/cover-requirements.ts
T

85 lines
2.5 KiB
TypeScript
Raw Normal View History

import { normalizePublishPlatformIds } from "./publish-platforms";
export type CoverSupportMode = "native" | "unsupported";
export interface PlatformCoverRequirement {
platformId: string;
required: boolean;
supportMode: CoverSupportMode;
aspectRatio: number | null;
aspectLabel: string | null;
outputWidth: number | null;
outputHeight: number | null;
priority: number;
}
const defaultRequirement = {
required: false,
supportMode: "unsupported" as CoverSupportMode,
aspectRatio: null,
aspectLabel: null,
outputWidth: null,
outputHeight: null,
priority: 0,
};
const requirementCatalog: Record<string, Partial<PlatformCoverRequirement>> = {
baijiahao: {
required: true,
supportMode: "native",
aspectRatio: 3 / 2,
aspectLabel: "3:2",
outputWidth: 1200,
outputHeight: 800,
priority: 100,
},
};
export function getPlatformCoverRequirements(platformIds?: Array<string | null | undefined>): PlatformCoverRequirement[] {
return normalizePublishPlatformIds(platformIds).map((platformId) => {
const config = requirementCatalog[platformId] ?? {};
return {
platformId,
required: config.required ?? defaultRequirement.required,
supportMode: config.supportMode ?? defaultRequirement.supportMode,
aspectRatio: config.aspectRatio ?? defaultRequirement.aspectRatio,
aspectLabel: config.aspectLabel ?? defaultRequirement.aspectLabel,
outputWidth: config.outputWidth ?? defaultRequirement.outputWidth,
outputHeight: config.outputHeight ?? defaultRequirement.outputHeight,
priority: config.priority ?? defaultRequirement.priority,
};
});
}
export function coverUploadRequired(platformIds?: Array<string | null | undefined>): boolean {
return getPlatformCoverRequirements(platformIds).some((item) => item.required);
}
export function getPrimaryCoverRequirement(platformIds?: Array<string | null | undefined>): PlatformCoverRequirement {
const requirements = getPlatformCoverRequirements(platformIds);
if (!requirements.length) {
return {
platformId: "default",
...defaultRequirement,
};
}
return [...requirements].sort((left, right) => right.priority - left.priority)[0];
}
export function deriveCoverFileName(value?: string | null): string {
const trimmed = String(value ?? "").trim();
if (!trimmed) {
return "";
}
try {
const pathname = new URL(trimmed, "https://cover.local").pathname;
const lastSegment = pathname.split("/").filter(Boolean).at(-1) ?? "";
return decodeURIComponent(lastSegment);
} catch {
return "";
}
}