// * 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 | 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 = 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 | 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; Object.entries(modules).forEach(([path, module]) => { const name = path .replace("./CustomInputs/", "") .replace(".tsx", "") .toLowerCase(); DynamicInputRegistry.add(name, module.default); });