mirror of
https://gitee.com/ByteDance/flowgram.ai.git
synced 2025-07-07 17:43:29 +08:00
* feat(demo): comment node render component * feat(demo): comment node register to editor * feat(demo): comment node editor component * feat(demo): comment node editor placeholder * feat(demo): toolbar create comment node * fix(demo): scrolling issue when comment loses focus
51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import { useEffect, useMemo } from 'react';
|
||
|
||
import {
|
||
FlowNodeFormData,
|
||
FormModelV2,
|
||
useEntityFromContext,
|
||
useNodeRender,
|
||
WorkflowNodeEntity,
|
||
} from '@flowgram.ai/free-layout-editor';
|
||
|
||
import { CommentEditorModel } from '../model';
|
||
import { CommentEditorFormField } from '../constant';
|
||
|
||
export const useModel = () => {
|
||
const node = useEntityFromContext<WorkflowNodeEntity>();
|
||
const { selected: focused } = useNodeRender();
|
||
|
||
const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();
|
||
|
||
const model = useMemo(() => new CommentEditorModel(), []);
|
||
|
||
// 同步失焦状态
|
||
useEffect(() => {
|
||
if (focused) {
|
||
return;
|
||
}
|
||
model.setFocus(focused);
|
||
}, [focused, model]);
|
||
|
||
// 同步表单值初始化
|
||
useEffect(() => {
|
||
const value = formModel.getValueIn<string>(CommentEditorFormField.Note);
|
||
model.setValue(value); // 设置初始值
|
||
model.selectEnd(); // 设置初始化光标位置
|
||
}, [formModel, model]);
|
||
|
||
// 同步表单外部值变化:undo/redo/协同
|
||
useEffect(() => {
|
||
const disposer = formModel.onFormValuesChange(({ name }) => {
|
||
if (name !== CommentEditorFormField.Note) {
|
||
return;
|
||
}
|
||
const value = formModel.getValueIn<string>(CommentEditorFormField.Note);
|
||
model.setValue(value);
|
||
});
|
||
return () => disposer.dispose();
|
||
}, [formModel, model]);
|
||
|
||
return model;
|
||
};
|