mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-27 10:24:48 +10:00
chore: integrate improve-integration
This commit is contained in:
@@ -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];
|
||||
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user