import { Ref, ref, useAttrs, watchEffect } from 'vue' import { AttrsValue, ClassValue, StyleValue } from '@/types/attributes' import { isListener } from '@/utilities/attributes' export type UseAttrsAndStyles = { classes: Ref, styles: Ref, attrs: Ref, } export type UseAttrsStylesAndListeners = UseAttrsAndStyles & { listeners: Ref, } export function useAttrsStylesAndClasses(): UseAttrsAndStyles { const classes: Ref = ref({}) const styles: Ref = ref([]) const attrs: Ref = ref({}) const attributes = useAttrs() watchEffect(() => { const { class: newClasses, style: newStyles, ...newAttrs } = attributes classes.value = newClasses as ClassValue styles.value = newStyles as StyleValue attrs.value = newAttrs }) return { classes, styles, attrs, } } export function useAttrsStylesClassesAndListeners(): UseAttrsStylesAndListeners { const { attrs, styles, classes } = useAttrsStylesAndClasses() const nonListenerAttrs: Ref = ref({}) const listeners: Ref = ref({}) watchEffect(() => { for (const attr in attrs.value) { if (isListener(attr)) { listeners.value[attr] = attrs.value[attr] } else { nonListenerAttrs.value[attr] = attrs.value[attr] } } }) return { attrs: nonListenerAttrs, listeners, styles, classes } }