chore: integrate improve-integration

This commit is contained in:
Amruth Pillai
2026-07-08 19:07:05 +02:00
parent 73daf22b2f
commit 90105cb148
139 changed files with 6054 additions and 7793 deletions
+9 -1
View File
@@ -1,5 +1,6 @@
import type { ResumeData } from "@reactive-resume/schema/resume/data";
import type { Template } from "@reactive-resume/schema/templates";
import type { ResumeRenderOptions } from "./context";
import type { SectionTitleResolver } from "./section-title";
import { createElement } from "react";
import { pdf } from "#react-pdf-renderer";
@@ -8,13 +9,20 @@ import { ResumeDocument } from "./document";
type CreateResumePdfBlobOptions = {
data: ResumeData;
template?: Template | undefined;
renderOptions?: ResumeRenderOptions | undefined;
resolveSectionTitle?: SectionTitleResolver | undefined;
};
export const createResumePdfBlob = async ({ data, template, resolveSectionTitle }: CreateResumePdfBlobOptions) => {
export const createResumePdfBlob = async ({
data,
template,
renderOptions,
resolveSectionTitle,
}: CreateResumePdfBlobOptions) => {
const document = createElement(ResumeDocument, {
data,
template: template ?? data.metadata.template,
...(renderOptions ? { renderOptions } : {}),
resolveSectionTitle,
}) as Parameters<typeof pdf>[0];
+15 -3
View File
@@ -4,24 +4,36 @@ import type { SectionTitleResolver } from "./section-title";
import { createContext, use, useMemo } from "react";
import { isRTL } from "@reactive-resume/utils/locale";
export type ResumeRenderOptions = {
includeCoverLetterHeader?: boolean;
};
type RenderContextValue = ResumeData & {
resolveSectionTitle?: SectionTitleResolver | undefined;
renderOptions: ResumeRenderOptions;
rtl: boolean;
};
const RenderContext = createContext<RenderContextValue | null>(null);
const defaultRenderOptions: ResumeRenderOptions = {};
type RenderProviderProps = {
data: ResumeData;
resolveSectionTitle?: SectionTitleResolver | undefined;
renderOptions?: ResumeRenderOptions | undefined;
children: ReactNode;
};
export const RenderProvider = ({ data, resolveSectionTitle, children }: RenderProviderProps) => {
export const RenderProvider = ({
data,
resolveSectionTitle,
renderOptions = defaultRenderOptions,
children,
}: RenderProviderProps) => {
const rtl = isRTL(data.metadata.page.locale);
const contextValue = useMemo<RenderContextValue>(
() => ({ ...data, resolveSectionTitle, rtl }),
[data, resolveSectionTitle, rtl],
() => ({ ...data, resolveSectionTitle, renderOptions, rtl }),
[data, resolveSectionTitle, renderOptions, rtl],
);
return <RenderContext.Provider value={contextValue}>{children}</RenderContext.Provider>;
+4 -2
View File
@@ -2,6 +2,7 @@ import type { LayoutPage, ResumeData, Typography } from "@reactive-resume/schema
import type { Template } from "@reactive-resume/schema/templates";
import type { Locale } from "@reactive-resume/utils/locale";
import type { ComponentType } from "react";
import type { ResumeRenderOptions } from "./context";
import type { SectionTitleResolver } from "./section-title";
import { useMemo } from "react";
import { Document } from "#react-pdf-renderer";
@@ -19,13 +20,14 @@ export type TemplatePage = ComponentType<TemplatePageProps>;
type ResumeDocumentProps = {
data: ResumeData;
template: Template;
renderOptions?: ResumeRenderOptions | undefined;
resolveSectionTitle?: SectionTitleResolver | undefined;
};
const getLayoutPageKey = (page: LayoutPage, pageIndex: number) =>
`${page.fullWidth ? "full" : "split"}:${page.main.join(",")}:${page.sidebar.join(",")}:${pageIndex}`;
export const ResumeDocument = ({ data, template, resolveSectionTitle }: ResumeDocumentProps) => {
export const ResumeDocument = ({ data, template, renderOptions, resolveSectionTitle }: ResumeDocumentProps) => {
const TemplatePageComponent = getTemplatePage(template);
const creationDate = useMemo(() => new Date(), []);
const hasCjkContent = useMemo(() => resumeContentContainsCJK(data), [data]);
@@ -43,7 +45,7 @@ export const ResumeDocument = ({ data, template, resolveSectionTitle }: ResumeDo
const resumeData = useMemo(() => ({ ...data, metadata: { ...data.metadata, typography } }), [data, typography]);
return (
<RenderProvider data={resumeData} resolveSectionTitle={resolveSectionTitle}>
<RenderProvider data={resumeData} resolveSectionTitle={resolveSectionTitle} renderOptions={renderOptions}>
<Document
pageMode="useNone"
creationDate={creationDate}
@@ -26,6 +26,13 @@ describe("shouldShowResumeHeader", () => {
expect(shouldShowResumeHeader(createCoverLetterOnlyData(), 0)).toBe(false);
});
it("can keep the first-page header for cover letter documents", () => {
const data = { ...createCoverLetterOnlyData(), renderOptions: { includeCoverLetterHeader: true } };
expect(shouldShowResumeHeader(data, 0)).toBe(true);
expect(shouldShowResumeHeader(data, 1)).toBe(false);
});
it("keeps the first-page header for normal resume documents", () => {
expect(shouldShowResumeHeader(sampleResumeData, 0)).toBe(true);
expect(shouldShowResumeHeader(sampleResumeData, 1)).toBe(false);
@@ -1,6 +1,11 @@
import type { ResumeData } from "@reactive-resume/schema/resume/data";
import type { ResumeRenderOptions } from "../../context";
import { filterSections } from "./filtering";
type HeaderResumeData = ResumeData & {
renderOptions?: ResumeRenderOptions;
};
const isCoverLetterSection = (data: ResumeData, sectionId: string) =>
data.customSections.some((section) => section.id === sectionId && section.type === "cover-letter");
@@ -12,5 +17,5 @@ const isCoverLetterOnlyDocument = (data: ResumeData) => {
return visibleSections.length > 0 && visibleSections.every((sectionId) => isCoverLetterSection(data, sectionId));
};
export const shouldShowResumeHeader = (data: ResumeData, pageIndex: number) =>
pageIndex === 0 && !isCoverLetterOnlyDocument(data);
export const shouldShowResumeHeader = (data: HeaderResumeData, pageIndex: number) =>
pageIndex === 0 && (data.renderOptions?.includeCoverLetterHeader || !isCoverLetterOnlyDocument(data));