mirror of
https://github.com/JOYCEQL/magic-resume.git
synced 2026-07-03 14:07:11 +02:00
83 lines
2.6 KiB
TypeScript
83 lines
2.6 KiB
TypeScript
import { DEFAULT_TEMPLATES } from "@/config";
|
|
import {
|
|
initialResumeState,
|
|
initialResumeStateEn,
|
|
} from "@/config/initialResumeData";
|
|
import type { ResumeData } from "@/types/resume";
|
|
import type { ResumeTemplate } from "@/types/template";
|
|
|
|
export const TEMPLATE_PREVIEW_WIDTH_PX = 794;
|
|
export const TEMPLATE_PREVIEW_HEIGHT_PX = 1123;
|
|
export const TEMPLATE_SNAPSHOT_VERSION = 1;
|
|
export const TEMPLATE_SNAPSHOT_ROOT_ATTRIBUTE = "data-template-snapshot-root";
|
|
export const TEMPLATE_SNAPSHOT_ROOT_SELECTOR = `[${TEMPLATE_SNAPSHOT_ROOT_ATTRIBUTE}]`;
|
|
export const TEMPLATE_SNAPSHOT_PUBLIC_DIR = "template-snapshots";
|
|
export const TEMPLATE_PREVIEW_LOCALES = ["zh", "en"] as const;
|
|
|
|
export type TemplatePreviewLocale = (typeof TEMPLATE_PREVIEW_LOCALES)[number];
|
|
|
|
export interface TemplateSnapshotManifest {
|
|
version: number;
|
|
generatedAt: string | null;
|
|
locales: Record<TemplatePreviewLocale, Record<string, string>>;
|
|
}
|
|
|
|
export const createEmptyTemplateSnapshotManifest =
|
|
(): TemplateSnapshotManifest => ({
|
|
version: TEMPLATE_SNAPSHOT_VERSION,
|
|
generatedAt: null,
|
|
locales: {
|
|
zh: {},
|
|
en: {},
|
|
},
|
|
});
|
|
|
|
export const isTemplatePreviewLocale = (
|
|
value: string | null | undefined
|
|
): value is TemplatePreviewLocale =>
|
|
value === "zh" || value === "en";
|
|
|
|
export const getTemplateById = (templateId: string | undefined): ResumeTemplate =>
|
|
DEFAULT_TEMPLATES.find((template) => template.id === templateId) ??
|
|
DEFAULT_TEMPLATES[0];
|
|
|
|
export const getTemplatePreviewBaseData = (locale: TemplatePreviewLocale) =>
|
|
locale === "en" ? initialResumeStateEn : initialResumeState;
|
|
|
|
export const createTemplatePreviewData = (
|
|
template: ResumeTemplate,
|
|
locale: TemplatePreviewLocale
|
|
): ResumeData => {
|
|
const baseData = getTemplatePreviewBaseData(locale);
|
|
|
|
return {
|
|
...baseData,
|
|
id: `preview-mock-${locale}-${template.id}`,
|
|
templateId: template.id,
|
|
createdAt: new Date(0).toISOString(),
|
|
updatedAt: new Date(0).toISOString(),
|
|
globalSettings: {
|
|
...baseData.globalSettings,
|
|
themeColor: template.colorScheme.primary,
|
|
sectionSpacing: template.spacing.sectionGap,
|
|
paragraphSpacing: template.spacing.itemGap,
|
|
pagePadding: template.spacing.contentPadding,
|
|
},
|
|
basic: {
|
|
...baseData.basic,
|
|
layout: template.basic.layout,
|
|
},
|
|
} as ResumeData;
|
|
};
|
|
|
|
export const getTemplateSnapshotPath = (
|
|
locale: TemplatePreviewLocale,
|
|
templateId: string
|
|
) => `/${TEMPLATE_SNAPSHOT_PUBLIC_DIR}/${locale}/${templateId}.png`;
|
|
|
|
export const getTemplateSnapshotSrc = (
|
|
manifest: TemplateSnapshotManifest,
|
|
locale: TemplatePreviewLocale,
|
|
templateId: string
|
|
) => manifest.locales[locale][templateId] ?? null;
|