ldc-ovoteam/resources/ts/back/Components/DynamicPages/DynamicInputRegistry.tsx

59 lines
1.5 KiB
TypeScript
Raw Permalink Normal View History

import { type ReactNode } from "react";
2026-03-30 14:19:26 +02:00
import type { ConfigField } from "@/back/types/dynamic-pages";
export interface DynamicInputProps {
2026-03-30 14:19:26 +02:00
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;
}
2026-03-30 14:19:26 +02:00
export type InputResolver = (props: DynamicInputProps) => ReactNode;
const resolvers = new Map<string, InputResolver>();
2026-03-30 14:19:26 +02:00
export const DynamicInputRegistry = {
add(name: string, resolver: InputResolver) {
resolvers.set(name, resolver);
},
get(
2026-03-30 14:19:26 +02:00
targetName: string,
fieldName: string,
fieldValue: string | number | boolean | File | Date,
field: ConfigField,
2026-03-30 14:19:26 +02:00
setData: (
name: string,
value: string | number | boolean | File | object | null,
) => void,
errors?: Record<string, string> | null,
2026-03-30 14:19:26 +02:00
): ReactNode | null {
const resolver = resolvers.get(targetName.toLowerCase());
2026-03-30 14:19:26 +02:00
return resolver
? resolver({ fieldName, fieldValue, field, setData, errors })
: null;
},
};
2026-03-30 14:19:26 +02:00
// Add all custom inputs presents in files to the registry.
const modules = import.meta.glob<{ default: InputResolver }>(
"./CustomInputs/*.tsx",
{
eager: true,
},
);
2026-03-30 14:19:26 +02:00
Object.entries(modules).forEach(([path, module]) => {
const name = path
.replace("./CustomInputs/", "")
.replace(".tsx", "")
.toLowerCase();
DynamicInputRegistry.add(name, module.default);
});