feature: 1.add primary ability in scroll scrollIntoViewByBlockId API;

This commit is contained in:
mitsuha
2022-08-25 15:58:29 +08:00
parent 9633ebd486
commit b2d1968492
2 changed files with 20 additions and 10 deletions
@@ -6,7 +6,6 @@ import {
useCallback,
useContext,
useEffect,
useMemo,
useRef,
useState,
} from 'react';
@@ -168,12 +167,12 @@ export const TOC = () => {
}, [updateTocDataSource]);
const onClick = async (blockId?: string) => {
if (blockId === activeBlockId) {
return;
}
setActiveBlockId(blockId);
await editor.scrollManager.scrollIntoViewByBlockId(blockId);
await editor.scrollManager.scrollIntoViewByBlockId(
blockId,
'smooth',
'primary'
);
};
return (
@@ -1,5 +1,5 @@
import { CSSProperties, type UIEvent } from 'react';
import EventEmitter from 'eventemitter3';
import { type UIEvent } from 'react';
import { domToRect, Rect } from '@toeverything/utils';
import type { Editor as BlockEditor } from '../editor';
@@ -14,6 +14,8 @@ type ScrollController = {
unLockScroll: () => void;
};
type ScrollPrimary = undefined | 'primary';
export class ScrollManager {
private _editor: BlockEditor;
private _scrollContainer: HTMLElement;
@@ -150,20 +152,29 @@ export class ScrollManager {
public async scrollIntoViewByBlockId(
blockId: string,
behavior: ScrollBehavior = 'smooth'
behavior: ScrollBehavior = 'smooth',
ability?: ScrollPrimary
) {
const block = await this._editor.getBlockById(blockId);
await this.scrollIntoViewByBlock(block, behavior);
await this.scrollIntoViewByBlock(block, behavior, ability);
}
public async scrollIntoViewByBlock(
block: AsyncBlock,
behavior: ScrollBehavior = 'smooth'
behavior: ScrollBehavior = 'smooth',
ability?: ScrollPrimary
) {
if (!block.dom) {
return console.warn(`Block is not exist.`);
}
/* use dom primary ability */
if (ability === 'primary') {
block.dom.scrollIntoView({ block: 'start', behavior });
return;
}
const containerRect = domToRect(this._scrollContainer);
const blockRect = domToRect(block.dom);