refactor(web): finding 2 — replace dialog renderer indirection with plain typed arrays

defineDialogRenderer/defineDialogRendererRegistry were identity functions.
Each registry now exports a readonly AnyDialogRendererEntry[] directly;
renderer-registry.ts retains only the types. The unused 'domain' field and
its wrapping object are gone; renderers.tsx spreads the arrays directly.

Claude-Session: https://claude.ai/code/session_012Bnvt1MghwHj4qQRxuQUGa
This commit is contained in:
Amruth Pillai
2026-07-04 21:47:37 +02:00
parent 02538836a9
commit e47cb37ab9
5 changed files with 62 additions and 82 deletions
+4 -4
View File
@@ -1,6 +1,6 @@
import { defineDialogRenderer, defineDialogRendererRegistry } from "../renderer-registry";
import type { AnyDialogRendererEntry } from "../renderer-registry";
import { CreateApiKeyDialog } from "./create";
export const apiKeyDialogRendererRegistry = defineDialogRendererRegistry("api-key", [
defineDialogRenderer("api-key.create", () => <CreateApiKeyDialog />),
]);
export const apiKeyDialogRenderers: readonly AnyDialogRendererEntry[] = [
{ type: "api-key.create", render: () => <CreateApiKeyDialog /> },
];
+6 -6
View File
@@ -1,10 +1,10 @@
import { defineDialogRenderer, defineDialogRendererRegistry } from "../renderer-registry";
import type { AnyDialogRendererEntry } from "../renderer-registry";
import { ChangePasswordDialog } from "./change-password";
import { DisableTwoFactorDialog } from "./disable-two-factor";
import { EnableTwoFactorDialog } from "./enable-two-factor";
export const authDialogRendererRegistry = defineDialogRendererRegistry("auth", [
defineDialogRenderer("auth.change-password", () => <ChangePasswordDialog />),
defineDialogRenderer("auth.two-factor.enable", () => <EnableTwoFactorDialog />),
defineDialogRenderer("auth.two-factor.disable", () => <DisableTwoFactorDialog />),
]);
export const authDialogRenderers: readonly AnyDialogRendererEntry[] = [
{ type: "auth.change-password", render: () => <ChangePasswordDialog /> },
{ type: "auth.two-factor.enable", render: () => <EnableTwoFactorDialog /> },
{ type: "auth.two-factor.disable", render: () => <DisableTwoFactorDialog /> },
];
+3 -17
View File
@@ -1,26 +1,12 @@
import type { ReactNode } from "react";
import type { DialogSchema, DialogType } from "./schemas";
export interface DialogRendererEntry<T extends DialogType = DialogType> {
// ponytail: defineDialogRenderer/defineDialogRendererRegistry were identity fns; inlined
export type DialogRendererEntry<T extends DialogType = DialogType> = {
type: T;
render: (dialog: Extract<DialogSchema, { type: T }>) => ReactNode;
}
};
export type AnyDialogRendererEntry = {
[T in DialogType]: DialogRendererEntry<T>;
}[DialogType];
export interface DialogRendererRegistry {
domain: string;
renderers: readonly AnyDialogRendererEntry[];
}
export const defineDialogRenderer = <T extends DialogType>(
type: T,
render: (dialog: Extract<DialogSchema, { type: T }>) => ReactNode,
): DialogRendererEntry<T> => ({ type, render });
export const defineDialogRendererRegistry = (
domain: string,
renderers: readonly AnyDialogRendererEntry[],
): DialogRendererRegistry => ({ domain, renderers });
+5 -13
View File
@@ -1,25 +1,17 @@
import type { DialogSchema } from "./schemas";
import { apiKeyDialogRendererRegistry } from "./api-key/registry";
import { authDialogRendererRegistry } from "./auth/registry";
import { resumeDialogRendererRegistry } from "./resume/registry";
const dialogRendererRegistries = [
authDialogRendererRegistry,
apiKeyDialogRendererRegistry,
resumeDialogRendererRegistry,
] as const;
import { apiKeyDialogRenderers } from "./api-key/registry";
import { authDialogRenderers } from "./auth/registry";
import { resumeDialogRenderers } from "./resume/registry";
const dialogRendererByType = new Map(
dialogRendererRegistries.flatMap((registry) =>
registry.renderers.map((renderer) => [renderer.type, renderer] as const),
[...authDialogRenderers, ...apiKeyDialogRenderers, ...resumeDialogRenderers].map(
(renderer) => [renderer.type, renderer] as const,
),
);
export const renderDialog = (dialog: DialogSchema | null) => {
if (!dialog) return null;
const renderer = dialogRendererByType.get(dialog.type);
if (renderer) return renderer.render(dialog as never);
return null;
};
+44 -42
View File
@@ -1,4 +1,4 @@
import { defineDialogRenderer, defineDialogRendererRegistry } from "../renderer-registry";
import type { AnyDialogRendererEntry } from "../renderer-registry";
import { CreateResumeDialog, DuplicateResumeDialog, UpdateResumeDialog } from ".";
import { ImportResumeDialog } from "./import";
import { CreateAwardDialog, UpdateAwardDialog } from "./sections/award";
@@ -18,44 +18,46 @@ import { CreateSummaryItemDialog, UpdateSummaryItemDialog } from "./sections/sum
import { CreateVolunteerDialog, UpdateVolunteerDialog } from "./sections/volunteer";
import { TemplateGalleryDialog } from "./template/gallery";
export const resumeDialogRendererRegistry = defineDialogRendererRegistry("resume", [
defineDialogRenderer("resume.create", () => <CreateResumeDialog />),
defineDialogRenderer("resume.update", ({ data }) => <UpdateResumeDialog data={data} />),
defineDialogRenderer("resume.duplicate", ({ data }) => <DuplicateResumeDialog data={data} />),
defineDialogRenderer("resume.import", () => <ImportResumeDialog />),
defineDialogRenderer("resume.template.gallery", () => <TemplateGalleryDialog />),
defineDialogRenderer("resume.sections.profiles.create", ({ data }) => <CreateProfileDialog data={data} />),
defineDialogRenderer("resume.sections.profiles.update", ({ data }) => <UpdateProfileDialog data={data} />),
defineDialogRenderer("resume.sections.experience.create", ({ data }) => <CreateExperienceDialog data={data} />),
defineDialogRenderer("resume.sections.experience.update", ({ data }) => <UpdateExperienceDialog data={data} />),
defineDialogRenderer("resume.sections.education.create", ({ data }) => <CreateEducationDialog data={data} />),
defineDialogRenderer("resume.sections.education.update", ({ data }) => <UpdateEducationDialog data={data} />),
defineDialogRenderer("resume.sections.skills.create", ({ data }) => <CreateSkillDialog data={data} />),
defineDialogRenderer("resume.sections.skills.update", ({ data }) => <UpdateSkillDialog data={data} />),
defineDialogRenderer("resume.sections.projects.create", ({ data }) => <CreateProjectDialog data={data} />),
defineDialogRenderer("resume.sections.projects.update", ({ data }) => <UpdateProjectDialog data={data} />),
defineDialogRenderer("resume.sections.certifications.create", ({ data }) => (
<CreateCertificationDialog data={data} />
)),
defineDialogRenderer("resume.sections.certifications.update", ({ data }) => (
<UpdateCertificationDialog data={data} />
)),
defineDialogRenderer("resume.sections.languages.create", ({ data }) => <CreateLanguageDialog data={data} />),
defineDialogRenderer("resume.sections.languages.update", ({ data }) => <UpdateLanguageDialog data={data} />),
defineDialogRenderer("resume.sections.publications.create", ({ data }) => <CreatePublicationDialog data={data} />),
defineDialogRenderer("resume.sections.publications.update", ({ data }) => <UpdatePublicationDialog data={data} />),
defineDialogRenderer("resume.sections.awards.create", ({ data }) => <CreateAwardDialog data={data} />),
defineDialogRenderer("resume.sections.awards.update", ({ data }) => <UpdateAwardDialog data={data} />),
defineDialogRenderer("resume.sections.interests.create", ({ data }) => <CreateInterestDialog data={data} />),
defineDialogRenderer("resume.sections.interests.update", ({ data }) => <UpdateInterestDialog data={data} />),
defineDialogRenderer("resume.sections.volunteer.create", ({ data }) => <CreateVolunteerDialog data={data} />),
defineDialogRenderer("resume.sections.volunteer.update", ({ data }) => <UpdateVolunteerDialog data={data} />),
defineDialogRenderer("resume.sections.references.create", ({ data }) => <CreateReferenceDialog data={data} />),
defineDialogRenderer("resume.sections.references.update", ({ data }) => <UpdateReferenceDialog data={data} />),
defineDialogRenderer("resume.sections.summary.create", ({ data }) => <CreateSummaryItemDialog data={data} />),
defineDialogRenderer("resume.sections.summary.update", ({ data }) => <UpdateSummaryItemDialog data={data} />),
defineDialogRenderer("resume.sections.cover-letter.create", ({ data }) => <CreateCoverLetterDialog data={data} />),
defineDialogRenderer("resume.sections.cover-letter.update", ({ data }) => <UpdateCoverLetterDialog data={data} />),
defineDialogRenderer("resume.sections.custom.create", ({ data }) => <CreateCustomSectionDialog data={data} />),
defineDialogRenderer("resume.sections.custom.update", ({ data }) => <UpdateCustomSectionDialog data={data} />),
]);
export const resumeDialogRenderers: readonly AnyDialogRendererEntry[] = [
{ type: "resume.create", render: () => <CreateResumeDialog /> },
{ type: "resume.update", render: ({ data }) => <UpdateResumeDialog data={data} /> },
{ type: "resume.duplicate", render: ({ data }) => <DuplicateResumeDialog data={data} /> },
{ type: "resume.import", render: () => <ImportResumeDialog /> },
{ type: "resume.template.gallery", render: () => <TemplateGalleryDialog /> },
{ type: "resume.sections.profiles.create", render: ({ data }) => <CreateProfileDialog data={data} /> },
{ type: "resume.sections.profiles.update", render: ({ data }) => <UpdateProfileDialog data={data} /> },
{ type: "resume.sections.experience.create", render: ({ data }) => <CreateExperienceDialog data={data} /> },
{ type: "resume.sections.experience.update", render: ({ data }) => <UpdateExperienceDialog data={data} /> },
{ type: "resume.sections.education.create", render: ({ data }) => <CreateEducationDialog data={data} /> },
{ type: "resume.sections.education.update", render: ({ data }) => <UpdateEducationDialog data={data} /> },
{ type: "resume.sections.skills.create", render: ({ data }) => <CreateSkillDialog data={data} /> },
{ type: "resume.sections.skills.update", render: ({ data }) => <UpdateSkillDialog data={data} /> },
{ type: "resume.sections.projects.create", render: ({ data }) => <CreateProjectDialog data={data} /> },
{ type: "resume.sections.projects.update", render: ({ data }) => <UpdateProjectDialog data={data} /> },
{
type: "resume.sections.certifications.create",
render: ({ data }) => <CreateCertificationDialog data={data} />,
},
{
type: "resume.sections.certifications.update",
render: ({ data }) => <UpdateCertificationDialog data={data} />,
},
{ type: "resume.sections.languages.create", render: ({ data }) => <CreateLanguageDialog data={data} /> },
{ type: "resume.sections.languages.update", render: ({ data }) => <UpdateLanguageDialog data={data} /> },
{ type: "resume.sections.publications.create", render: ({ data }) => <CreatePublicationDialog data={data} /> },
{ type: "resume.sections.publications.update", render: ({ data }) => <UpdatePublicationDialog data={data} /> },
{ type: "resume.sections.awards.create", render: ({ data }) => <CreateAwardDialog data={data} /> },
{ type: "resume.sections.awards.update", render: ({ data }) => <UpdateAwardDialog data={data} /> },
{ type: "resume.sections.interests.create", render: ({ data }) => <CreateInterestDialog data={data} /> },
{ type: "resume.sections.interests.update", render: ({ data }) => <UpdateInterestDialog data={data} /> },
{ type: "resume.sections.volunteer.create", render: ({ data }) => <CreateVolunteerDialog data={data} /> },
{ type: "resume.sections.volunteer.update", render: ({ data }) => <UpdateVolunteerDialog data={data} /> },
{ type: "resume.sections.references.create", render: ({ data }) => <CreateReferenceDialog data={data} /> },
{ type: "resume.sections.references.update", render: ({ data }) => <UpdateReferenceDialog data={data} /> },
{ type: "resume.sections.summary.create", render: ({ data }) => <CreateSummaryItemDialog data={data} /> },
{ type: "resume.sections.summary.update", render: ({ data }) => <UpdateSummaryItemDialog data={data} /> },
{ type: "resume.sections.cover-letter.create", render: ({ data }) => <CreateCoverLetterDialog data={data} /> },
{ type: "resume.sections.cover-letter.update", render: ({ data }) => <UpdateCoverLetterDialog data={data} /> },
{ type: "resume.sections.custom.create", render: ({ data }) => <CreateCustomSectionDialog data={data} /> },
{ type: "resume.sections.custom.update", render: ({ data }) => <UpdateCustomSectionDialog data={data} /> },
];