import { computed, ComputedRef, inject, watch } from 'vue';
import type { SetupContext, Ref } from 'vue';
import { FORM_ITEM_TOKEN } from '../../../form';
import { AutoCompleteProps, UseAutoCompleteRender, AutoCompleteSize } from '../auto-complete-types';
import { useNamespace } from '../../../shared/hooks/use-namespace';
export function useAutoCompleteRender(
props: AutoCompleteProps,
ctx: SetupContext,
visible: Ref<boolean>,
isFocus: Ref<boolean>,
isDisabled: ComputedRef<boolean>,
autoCompleteSize: ComputedRef<AutoCompleteSize>
): UseAutoCompleteRender {
const formItemContext = inject(FORM_ITEM_TOKEN, undefined);
const ns = useNamespace('auto-complete');
const inputNs = useNamespace('auto-complete-input');
const slotNs = useNamespace('auto-complete-slot');
const formNs = useNamespace('form-group');
const feedbackNs = useNamespace('has-feedback');
const selectNs = useNamespace('select-open');
const formControlNs = useNamespace('form-control');
const dropdownNs = useNamespace('dropdown-origin');
const dropdownOpenNs = useNamespace('dropdown-origin-open');
const slots = ctx.slots;
const isValidatorError = computed(() => formItemContext?.validateState === 'error');
const autoCompleteTopClasses = computed(() => ({
[ns.b()]: true,
[ns.m(autoCompleteSize.value)]: true,
[formNs.b()]: true,
[feedbackNs.b()]: true,
[selectNs.b()]: visible.value,
}));
const inputClasses = computed(() => ({
[inputNs.b()]: true,
[ns.m('focus')]: isFocus.value,
[slotNs.b()]: slots.prepend || slots.append || props.prefix || props.suffix,
[ns.m('append')]: slots.append,
[ns.m('prepend')]: slots.prepend,
}));
const inputWrapperClasses = computed(() => ({
[inputNs.e('wrapper')]: true,
[inputNs.em('wrapper', 'error')]: isValidatorError.value,
[ns.m('glow-style')]: props.showGlowStyle,
[inputNs.em('wrapper', 'feedback')]: Boolean(formItemContext?.validateState) && formItemContext?.showFeedback,
[ns.m('disabled')]: isDisabled.value,
}));
const inputInnerClasses = computed(() => [
{
[formControlNs.b()]: true,
[dropdownNs.b()]: true,
[dropdownOpenNs.b()]: isFocus.value,
['disabled']: isDisabled.value,
},
]);
watch(
() => props.modelValue,
() => {
formItemContext?.validate('change').catch((err) => console.log(err));
}
);
return { autoCompleteTopClasses, inputClasses, inputWrapperClasses, inputInnerClasses };
}