From e4882e6804394ab448dbdbb3673adadb80faafe2 Mon Sep 17 00:00:00 2001 From: Benjamin Canac Date: Wed, 20 Mar 2024 12:43:07 +0100 Subject: [PATCH] feat(useComponentIcons): extract repetitive logic --- src/runtime/composables/useComponentIcons.ts | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/runtime/composables/useComponentIcons.ts diff --git a/src/runtime/composables/useComponentIcons.ts b/src/runtime/composables/useComponentIcons.ts new file mode 100644 index 00000000..1a7eecc2 --- /dev/null +++ b/src/runtime/composables/useComponentIcons.ts @@ -0,0 +1,41 @@ +import { computed } from 'vue' +import { useAppConfig } from '#app' + +export interface UseComponentIconsProps { + icon?: string + leading?: boolean + leadingIcon?: string + trailing?: boolean + trailingIcon?: string + loading?: boolean + loadingIcon?: string +} + +export function useComponentIcons (props: UseComponentIconsProps) { + const appConfig = useAppConfig() + + const isLeading = computed(() => (props.icon && props.leading) || (props.icon && !props.trailing) || (props.loading && !props.trailing && !props.trailingIcon) || !!props.leadingIcon) + const isTrailing = computed(() => (props.icon && props.trailing) || (props.loading && props.trailing) || !!props.trailingIcon) + + const leadingIconName = computed(() => { + if (props.loading) { + return props.loadingIcon || appConfig.ui.icons.loading + } + + return props.leadingIcon || props.icon + }) + const trailingIconName = computed(() => { + if (props.loading && !isLeading.value) { + return props.loadingIcon || appConfig.ui.icons.loading + } + + return props.trailingIcon || props.icon + }) + + return { + isLeading, + isTrailing, + leadingIconName, + trailingIconName + } +}