import type { InjectionKey, UnwrapRef } from 'vue';
|
|
import {
|
readonly as defineReadonly,
|
inject,
|
provide,
|
reactive,
|
// defineComponent,
|
} from 'vue';
|
|
export interface CreateContextOptions {
|
createProvider?: boolean;
|
native?: boolean;
|
readonly?: boolean;
|
}
|
|
type ShallowUnwrap<T> = {
|
[P in keyof T]: UnwrapRef<T[P]>;
|
};
|
|
export function createContext<T>(
|
context: any,
|
key: InjectionKey<T> = Symbol('key'),
|
options: CreateContextOptions = {},
|
) {
|
const { createProvider = false, native = false, readonly = true } = options;
|
|
const state = reactive(context);
|
const provideData = readonly ? defineReadonly(state) : state;
|
!createProvider && provide(key, native ? context : provideData);
|
|
return {
|
state,
|
};
|
}
|
|
export function useContext<T>(key: InjectionKey<T>, native?: boolean): T;
|
|
export function useContext<T>(
|
key: InjectionKey<T> = Symbol('key'),
|
defaultValue?: any,
|
): ShallowUnwrap<T> {
|
return inject(key, defaultValue || {});
|
}
|