ldc-laravel-base-project/resources/ts/back/Components/DynamicPages/DynamicInputRegistry.tsx
2026-06-04 12:36:36 +02:00

61 lines
1.9 KiB
TypeScript

// * Packages
import { ReactNode } from "react";
// * Other
import { ConfigField } from "@/back/types/dynamic-pages";
/* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */
export type DynamicInputProps = {
fieldName: string;
fieldValue: string | number | boolean | File | Date;
field: ConfigField;
setData: (
name: string,
value: string | number | boolean | File | object | null,
) => void;
errors: Record<string, string> | null | undefined;
};
/* eslint-enable no-unused-vars, @typescript-eslint/no-unused-vars */
// eslint-disable-next-line no-unused-vars
export type InputResolver = (props: DynamicInputProps) => ReactNode;
export default class DynamicInputRegistry {
private static resolvers: Map<string, InputResolver> = new Map();
static add(name: string, resolver: InputResolver) {
this.resolvers.set(name, resolver);
}
static get(
targetName: string,
fieldName: string,
fieldValue: string | number | boolean | File | Date,
field: ConfigField,
/* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */
setData: (
name: string,
value: string | number | boolean | File | object | null,
) => void,
/* eslint-enable no-unused-vars, @typescript-eslint/no-unused-vars */
errors?: Record<string, string> | null | undefined,
): ReactNode | null {
const resolver = this.resolvers.get(targetName.toLowerCase());
return resolver
? resolver({ fieldName, fieldValue, field, setData, errors })
: null;
}
}
// Add all custom inputs presents in files to the registry.
// @ts-expect-error Glob error.
const modules = import.meta.glob("./CustomInputs/*.tsx", {
eager: true,
}) as Record<string, { default: InputResolver }>;
Object.entries(modules).forEach(([path, module]) => {
const name = path
.replace("./CustomInputs/", "")
.replace(".tsx", "")
.toLowerCase();
DynamicInputRegistry.add(name, module.default);
});