2022-01-01 13:43:08 +08:00
|
|
|
import { inject, ref, computed, unref, provide, getCurrentInstance } from 'vue'
|
2021-11-05 18:10:07 +08:00
|
|
|
import { configProviderContextKey } from '@element-plus/tokens'
|
2022-01-01 13:43:08 +08:00
|
|
|
import { hasOwn, isObject, merge } from '@element-plus/utils/util'
|
|
|
|
import { debugWarn } from '@element-plus/utils/error'
|
|
|
|
import type { MaybeRef } from '@vueuse/core'
|
|
|
|
import type { Ref, App } from 'vue'
|
2021-12-01 22:26:57 +08:00
|
|
|
import type { ConfigProviderContext } from '@element-plus/tokens'
|
2021-11-05 18:10:07 +08:00
|
|
|
|
2022-01-08 19:36:13 +08:00
|
|
|
// this is meant to fix global methods like `ElMessage(opts)`, this way we can inject current locale
|
|
|
|
// into the component as default injection value.
|
|
|
|
// refer to: https://github.com/element-plus/element-plus/issues/2610#issuecomment-887965266
|
|
|
|
const cache = ref<ConfigProviderContext>({})
|
2022-01-01 13:43:08 +08:00
|
|
|
|
2021-12-10 17:21:01 +08:00
|
|
|
export function useGlobalConfig<K extends keyof ConfigProviderContext>(
|
|
|
|
key: K
|
|
|
|
): Ref<ConfigProviderContext[K]>
|
2022-01-01 13:43:08 +08:00
|
|
|
export function useGlobalConfig(): Ref<ConfigProviderContext>
|
2021-12-10 17:21:01 +08:00
|
|
|
export function useGlobalConfig(key?: keyof ConfigProviderContext) {
|
2022-01-08 19:36:13 +08:00
|
|
|
const config = inject(configProviderContextKey, cache)
|
2021-12-10 17:21:01 +08:00
|
|
|
if (key) {
|
2022-01-01 13:43:08 +08:00
|
|
|
return isObject(config.value) && hasOwn(config.value, key)
|
|
|
|
? computed(() => config.value[key])
|
2021-12-30 19:31:35 +08:00
|
|
|
: ref(undefined)
|
2021-12-10 17:21:01 +08:00
|
|
|
} else {
|
|
|
|
return config
|
|
|
|
}
|
2021-11-05 18:10:07 +08:00
|
|
|
}
|
2022-01-01 13:43:08 +08:00
|
|
|
|
|
|
|
export const provideGlobalConfig = (
|
|
|
|
config: MaybeRef<ConfigProviderContext>,
|
|
|
|
app?: App
|
|
|
|
) => {
|
|
|
|
const inSetup = !!getCurrentInstance()
|
|
|
|
const oldConfig = inSetup ? useGlobalConfig() : undefined
|
|
|
|
|
|
|
|
const provideFn = app?.provide ?? (inSetup ? provide : undefined)
|
|
|
|
if (!provideFn) {
|
|
|
|
debugWarn(
|
|
|
|
'provideGlobalConfig',
|
|
|
|
'provideGlobalConfig() can only be used inside setup().'
|
|
|
|
)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
const context = computed(() => {
|
|
|
|
const cfg = unref(config)
|
|
|
|
if (!oldConfig) return cfg
|
|
|
|
return merge(oldConfig.value, cfg)
|
|
|
|
})
|
|
|
|
provideFn(configProviderContextKey, context)
|
2022-01-08 19:36:13 +08:00
|
|
|
cache.value = context.value
|
2022-01-01 13:43:08 +08:00
|
|
|
return context
|
|
|
|
}
|