Files
better-auth/examples/nuxt-example/components/ui/auto-form/AutoFormField.vue
2024-09-27 13:36:20 +03:00

48 lines
1.3 KiB
Vue

<script setup lang="ts" generic="U extends ZodAny">
import type { ZodAny } from "zod";
import { computed } from "vue";
import type { Config, ConfigItem, Shape } from "./interface";
import { DEFAULT_ZOD_HANDLERS, INPUT_COMPONENTS } from "./constant";
import useDependencies from "./dependencies";
const props = defineProps<{
fieldName: string;
shape: Shape;
config?: ConfigItem | Config<U>;
}>();
function isValidConfig(config: any): config is ConfigItem {
return !!config?.component;
}
const delegatedProps = computed(() => {
if (["ZodObject", "ZodArray"].includes(props.shape?.type))
return { schema: props.shape?.schema };
return undefined;
});
const { isDisabled, isHidden, isRequired, overrideOptions } = useDependencies(
props.fieldName,
);
</script>
<template>
<component
:is="isValidConfig(config)
? typeof config.component === 'string'
? INPUT_COMPONENTS[config.component!]
: config.component
: INPUT_COMPONENTS[DEFAULT_ZOD_HANDLERS[shape.type]] "
v-if="!isHidden"
:field-name="fieldName"
:label="shape.schema?.description"
:required="isRequired || shape.required"
:options="overrideOptions || shape.options"
:disabled="isDisabled"
:config="config"
v-bind="delegatedProps"
>
<slot />
</component>
</template>