61 lines
1.9 KiB
TypeScript
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);
|
|
});
|