mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-11 15:16:28 +08:00
feature: 1.add primary ability in scroll scrollIntoViewByBlockId API;
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user