import type { MaybeRef } from 'vue' import { computed, unref, watch } from 'vue' import { toSelectOptions } from '@/utils/dict' import { useDictStore } from '@/store' import type { DictDataOption } from '@/service/api/system/dict' interface UseDictOptions { /** 是否在创建时立即加载,默认为 true */ immediate?: boolean /** 监听类型变化时是否强制刷新 */ force?: boolean } export function useDict(dictTypes: MaybeRef, options: UseDictOptions = {}) { const dictStore = useDictStore() const normalizedTypes = computed(() => { const value = unref(dictTypes) ?? [] return value.filter((item): item is string => Boolean(item)) }) const load = async (force = false) => { const types = normalizedTypes.value if (!types.length) return await dictStore.fetchDicts(types, force) } watch( normalizedTypes, (types) => { if (!types.length) return void dictStore.fetchDicts(types, options.force ?? false) }, { immediate: options.immediate ?? true }, ) const dictOptions = computed>(() => { const result: Record = {} normalizedTypes.value.forEach((type) => { result[type] = dictStore.getDictOptions(type) }) return result }) const isLoading = computed(() => normalizedTypes.value.some(type => dictStore.isLoading(type))) const getDictLabel = (dictType: string, value: unknown, fallback?: string) => dictStore.getDictLabel(dictType, value, fallback) const getDictOption = (dictType: string, value: unknown) => dictStore.getDictOption(dictType, value) const getSelectOptions = (dictType: string) => toSelectOptions(dictStore.getDictOptions(dictType)) const reload = async (targetTypes?: string[]) => { const types = targetTypes && targetTypes.length ? targetTypes : normalizedTypes.value if (!types.length) return await dictStore.fetchDicts(types, true) } return { dictOptions, isLoading, load, reload, getDictLabel, getDictOption, getSelectOptions, } }