import { provide, inject, readonly } from '@vue/composition-api'; import { createState } from '@/lib/store/state'; import { createMutation } from '@/lib/store/mutation'; import { StoreState } from '@/lib/store/types'; import { createOperators, Operator } from '@/lib/operator'; const STORE_KEY = 'GLOBAL_STORE'; const STORE_KEY_OPERATOR = 'GLOBAL_STORE_OPERATOR'; export const useStoreProvide = () => { const state = createState(); const mutation = createMutation(state); const store = readonly({ state, mutation, }) as Store; const operators = createOperators(store); provide(STORE_KEY_OPERATOR, operators); provide(STORE_KEY, store); return { store, operators }; }; export type Mutation = ReturnType; export interface Store { state: Readonly; mutation: Mutation; } export const useStoreInject = (): Store => { return inject(STORE_KEY); }; // TODO export const useOperators = () => { return inject(STORE_KEY_OPERATOR) as Record; }; export const useOperator = (operator: Operator) => { const allOperator = inject(STORE_KEY_OPERATOR); return allOperator[operator] as T; };