fix: scrollManager can not get scrollcontainer after create new page

This commit is contained in:
QiShaoXuan
2022-08-05 23:52:16 +08:00
parent 1920921ee7
commit 15d908626e
2 changed files with 37 additions and 16 deletions

View File

@@ -93,38 +93,29 @@ const EditorContainer = ({
workspace: string; workspace: string;
}) => { }) => {
const [lockScroll, setLockScroll] = useState(false); const [lockScroll, setLockScroll] = useState(false);
const scrollContainerRef = useRef<HTMLDivElement>(); const [scrollContainer, setScrollContainer] = useState<HTMLElement>();
const editorRef = useRef<BlockEditor>(); const editorRef = useRef<BlockEditor>();
const onScroll = (event: UIEvent) => { const onScroll = (event: UIEvent) => {
editorRef.current.getHooks().onRootNodeScroll(event); editorRef.current.getHooks().onRootNodeScroll(event);
editorRef.current.scrollManager.emitScrollEvent(event); editorRef.current.scrollManager.emitScrollEvent(event);
}; };
useEffect(() => {
editorRef.current.scrollManager.scrollContainer =
scrollContainerRef.current;
editorRef.current.scrollManager.scrollController = {
lockScroll: () => setLockScroll(true),
unLockScroll: () => setLockScroll(false),
};
}, []);
const { setPageClientWidth } = usePageClientWidth(); const { setPageClientWidth } = usePageClientWidth();
useEffect(() => { useEffect(() => {
if (scrollContainerRef.current) { if (scrollContainer) {
const obv = new ResizeObserver(e => { const obv = new ResizeObserver(e => {
setPageClientWidth(e[0].contentRect.width); setPageClientWidth(e[0].contentRect.width);
}); });
obv.observe(scrollContainerRef.current); obv.observe(scrollContainer);
return () => obv.disconnect(); return () => obv.disconnect();
} }
}, [setPageClientWidth]); }, [setPageClientWidth, scrollContainer]);
return ( return (
<StyledEditorContainer <StyledEditorContainer
lockScroll={lockScroll} lockScroll={lockScroll}
ref={scrollContainerRef} ref={ref => setScrollContainer(ref)}
onScroll={onScroll} onScroll={onScroll}
> >
{pageId ? ( {pageId ? (
@@ -132,6 +123,11 @@ const EditorContainer = ({
workspace={workspace} workspace={workspace}
rootBlockId={pageId} rootBlockId={pageId}
ref={editorRef} ref={editorRef}
scrollContainer={scrollContainer}
scrollController={{
lockScroll: () => setLockScroll(true),
unLockScroll: () => setLockScroll(false),
}}
/> />
) : ( ) : (
<Box <Box

View File

@@ -18,6 +18,12 @@ interface AffineEditorProps {
scrollBlank?: boolean; scrollBlank?: boolean;
isWhiteboard?: boolean; isWhiteboard?: boolean;
scrollContainer?: HTMLElement;
scrollController?: {
lockScroll: () => void;
unLockScroll: () => void;
};
} }
function _useConstantWithDispose( function _useConstantWithDispose(
@@ -53,13 +59,32 @@ function _useConstantWithDispose(
} }
export const AffineEditor = forwardRef<BlockEditor, AffineEditorProps>( export const AffineEditor = forwardRef<BlockEditor, AffineEditorProps>(
({ workspace, rootBlockId, scrollBlank = true, isWhiteboard }, ref) => { (
{
workspace,
rootBlockId,
scrollBlank = true,
isWhiteboard,
scrollController,
scrollContainer,
},
ref
) => {
const editor = _useConstantWithDispose( const editor = _useConstantWithDispose(
workspace, workspace,
rootBlockId, rootBlockId,
isWhiteboard isWhiteboard
); );
useEffect(() => {
if (scrollContainer) {
editor.scrollManager.scrollContainer = scrollContainer;
}
if (scrollController) {
editor.scrollManager.scrollController = scrollController;
}
}, [editor, scrollContainer, scrollController]);
useImperativeHandle(ref, () => editor); useImperativeHandle(ref, () => editor);
return ( return (