import { watchEffect, type WatchStopHandle } from 'vue'
import { generateFunction } from '../data-utils'
import { globalNotify } from '../canvas-function'
type IAccessorType = 'getter' | 'setter'
interface IAccessor {
getter: { value: string }
setter: { value: string }
}
export function useAccessorMap(context) {
const generateAccessor = (type: IAccessorType, accessor: IAccessor, property: string) => {
const accessorFn = generateFunction(accessor[type].value, context) as (...args: any) => any
return { property, accessorFn, type }
}
const stateAccessorMap = new Map<string, WatchStopHandle>()
const propsAccessorMap = new Map<string, WatchStopHandle>()
const generateStateAccessors = (type: IAccessorType, accessor: IAccessor, key: string) => {
const stateWatchEffectKey = `${key}${type}`
const { property, accessorFn } = generateAccessor(type, accessor, key)
stateAccessorMap.get(stateWatchEffectKey)?.()
stateAccessorMap.set(
stateWatchEffectKey,
watchEffect(() => {
try {
accessorFn()
} catch (error) {
globalNotify({
type: 'warning',
title: `状态变量${property}的访问器函数:${accessorFn.name}执行报错`,
message: error?.message || `状态变量${property}的访问器函数:${accessorFn.name}执行报错,请检查语法`
})
}
})
)
}
return {
generateAccessor,
stateAccessorMap,
propsAccessorMap,
generateStateAccessors
}
}