Files
dooring/packages/dooringx-lib/src/hooks/index.ts

100 lines
2.8 KiB
TypeScript
Raw Normal View History

2021-07-09 01:41:03 +08:00
/*
* @Author: yehuozhili
* @Date: 2021-03-14 05:35:15
* @LastEditors: yehuozhili
2021-07-12 15:32:21 +08:00
* @LastEditTime: 2021-07-12 14:48:38
2021-07-10 19:35:06 +08:00
* @FilePath: \dooringx\packages\dooringx-lib\src\hooks\index.ts
2021-07-09 01:41:03 +08:00
*/
import { useEffect, useMemo, useState } from 'react';
import UserConfig from '../config';
import { ComponentRenderConfigProps } from '../core/components/componentItem';
import { registCommandFn, unRegistCommandFn } from '../core/command/runtime';
export function useStoreState(
config: UserConfig,
extraFn: Function = () => {},
everyFn: Function = () => {}
) {
2021-07-10 19:35:06 +08:00
const store = config.getStore();
2021-07-09 01:41:03 +08:00
const [state, setState] = useState(store.getData());
const forceUpdate = useState(0)[1];
useEffect(() => {
const unRegister = store.subscribe(() => {
2021-07-10 19:35:06 +08:00
const data = store.getData();
setState(data);
2021-07-09 01:41:03 +08:00
config.getEventCenter().syncEventMap(store.getData(), config.getStoreChanger());
extraFn();
});
store.setForceUpdate(() => forceUpdate((v) => v + 1));
const commandModules = config.getConfig().initCommandModule;
const commander = config.getCommanderRegister();
registCommandFn(commandModules, commander);
return () => {
unRegister();
unRegistCommandFn(commandModules, commander);
};
2021-07-10 19:35:06 +08:00
}, [config, extraFn, forceUpdate, store]);
2021-07-09 01:41:03 +08:00
useEffect(() => {
everyFn();
}, [everyFn]);
// 去除默认滚动
useEffect(() => {
const fn1 = function (event: Event) {
if ((event as MouseEvent).ctrlKey === true || (event as MouseEvent).metaKey) {
event.preventDefault();
}
};
const fn2 = function (event: Event) {
if ((event as MouseEvent).ctrlKey === true || (event as MouseEvent).metaKey) {
event.preventDefault();
}
};
window.addEventListener('mousewheel', fn1, { passive: false });
//firefox
window.addEventListener('DOMMouseScroll', fn2, { passive: false });
return () => {
window.removeEventListener('mousewheel', fn1);
window.removeEventListener('mousewheel', fn2);
};
}, []);
return [state];
}
/**
*
* eventMap与eventCenter
* @export
* @param {ComponentRenderConfigProps} props render参数传来的
* @param {string} eventName
* @returns
*/
export function useDynamicAddEventCenter(
props: ComponentRenderConfigProps,
eventName: string,
displayName: string
) {
const eventCenter = useMemo(() => {
return props.config.getEventCenter();
}, [props.config]);
useEffect(() => {
const data = props.store.getData();
const map = props.data.eventMap;
const storeItem = data.block.find((v) => v.id === props.data.id);
if (storeItem) {
if (!map[eventName]) {
//动态store加属性需要通过hook
storeItem.eventMap[eventName] = {
arr: [],
displayName,
userSelect: [],
};
eventCenter.manualUpdateMap(eventName, displayName);
}
}
}, [eventCenter, props.data.eventMap, props.data.id, props.store]);
return;
}