chore: stop scrolling when wheeling in chat page

This commit is contained in:
jialin
2025-04-22 16:07:44 +08:00
parent ac1bf7c9bf
commit 1e68b75c68
4 changed files with 48 additions and 6 deletions
+2 -3
View File
@@ -74,7 +74,6 @@ const CanvasImageEditor: React.FC<CanvasImageEditorProps> = forwardRef(
onScaleImageSize, onScaleImageSize,
handleUpdateImageList, handleUpdateImageList,
handleUpdateMaskList, handleUpdateMaskList,
uploadButton,
maskUpload maskUpload
}, },
ref ref
@@ -203,6 +202,7 @@ const CanvasImageEditor: React.FC<CanvasImageEditorProps> = forwardRef(
loadMaksWorkerRef.current!.onmessage = (event: any) => { loadMaksWorkerRef.current!.onmessage = (event: any) => {
if (event.data.type === 'done' && event.data.imageData) { if (event.data.type === 'done' && event.data.imageData) {
console.log('load mask done');
// draw the data to the overlay canvas // draw the data to the overlay canvas
const ctx = overlayCanvasRef.current!.getContext('2d')!; const ctx = overlayCanvasRef.current!.getContext('2d')!;
ctx.putImageData(event.data.imageData, 0, 0); ctx.putImageData(event.data.imageData, 0, 0);
@@ -406,8 +406,6 @@ const CanvasImageEditor: React.FC<CanvasImageEditorProps> = forwardRef(
height: canvasRef.current!.height height: canvasRef.current!.height
}); });
console.log('Image status:', imageStatus, negativeMaskRef.current);
if (imageStatus.isResetNeeded) { if (imageStatus.isResetNeeded) {
onReset(); onReset();
resetCanvas(); resetCanvas();
@@ -424,6 +422,7 @@ const CanvasImageEditor: React.FC<CanvasImageEditorProps> = forwardRef(
) { ) {
invertPainting(true); invertPainting(true);
} }
console.log('Image status:', imageStatus, negativeMaskRef.current);
updateCursorSize(); updateCursorSize();
}, [drawImage, imageStatus.isOriginal, imageStatus.isResetNeeded]); }, [drawImage, imageStatus.isOriginal, imageStatus.isResetNeeded]);
@@ -32,7 +32,6 @@ const ToolsBar: React.FC<ToolsBarProps> = (props) => {
disabled, disabled,
loading, loading,
lineWidth, lineWidth,
uploadButton,
invertMask, invertMask,
handleBrushSizeChange, handleBrushSizeChange,
undo, undo,
@@ -94,7 +93,6 @@ const ToolsBar: React.FC<ToolsBarProps> = (props) => {
<ClearOutlined className="font-size-14" /> <ClearOutlined className="font-size-14" />
</Button> </Button>
</Tooltip> </Tooltip>
{uploadButton}
<UploadImg <UploadImg
disabled={loading || invertMask} disabled={loading || invertMask}
handleUpdateImgList={handleUpdateImageList} handleUpdateImgList={handleUpdateImageList}
+46
View File
@@ -32,6 +32,9 @@ export default function useOverlayScroller(data?: {
const scrollEventElement = React.useRef<any>(null); const scrollEventElement = React.useRef<any>(null);
const instanceRef = React.useRef<any>(null); const instanceRef = React.useRef<any>(null);
const initialized = React.useRef(false); const initialized = React.useRef(false);
const scrollElementRef = React.useRef<any>(null);
const stopUpdatePosition = React.useRef(false);
const timerRef = React.useRef<any>(null);
const [initialize, instance] = useOverlayScrollbars({ const [initialize, instance] = useOverlayScrollbars({
options: { options: {
update: { update: {
@@ -57,6 +60,20 @@ export default function useOverlayScroller(data?: {
scrollEventElement.current = scrollEventElement.current =
instanceRef.current?.elements()?.scrollEventElement; instanceRef.current?.elements()?.scrollEventElement;
const handleOnScroll = () => {
const scrollTop = scrollEventElement.current?.scrollTop;
const scrollHeight = scrollEventElement.current?.scrollHeight;
const clientHeight = scrollEventElement.current?.clientHeight;
const isBottom = scrollTop + clientHeight + 20 >= scrollHeight;
if (isBottom) {
stopUpdatePosition.current = false;
} else {
stopUpdatePosition.current = true;
}
};
const throttledScroll = React.useCallback( const throttledScroll = React.useCallback(
throttle(() => { throttle(() => {
scrollEventElement.current?.scrollTo?.({ scrollEventElement.current?.scrollTo?.({
@@ -79,6 +96,9 @@ export default function useOverlayScroller(data?: {
// scroll to bottom // scroll to bottom
const throttledUpdateScrollerPosition = React.useCallback( const throttledUpdateScrollerPosition = React.useCallback(
(delay?: number) => { (delay?: number) => {
if (stopUpdatePosition.current) {
return;
}
if (delay === 0) { if (delay === 0) {
scrollauto(); scrollauto();
} else { } else {
@@ -103,6 +123,29 @@ export default function useOverlayScroller(data?: {
instanceRef.current?.elements()?.scrollEventElement; instanceRef.current?.elements()?.scrollEventElement;
}; };
const handleWheelCallback = React.useCallback((e: any) => {
handleOnScroll();
if (timerRef.current) {
clearTimeout(timerRef.current);
}
timerRef.current = setTimeout(() => {
stopUpdatePosition.current = false;
}, 1500);
}, []);
// add wheel event
const handleWheelEvent = () => {
scrollElementRef.current?.addEventListener?.('wheel', handleWheelCallback);
};
// remove wheel event
const removeWheelEvent = () => {
scrollElementRef.current?.removeEventListener?.(
'wheel',
handleWheelCallback
);
};
const createInstance = React.useCallback( const createInstance = React.useCallback(
(el: any) => { (el: any) => {
if (instanceRef.current) { if (instanceRef.current) {
@@ -110,10 +153,12 @@ export default function useOverlayScroller(data?: {
} }
if (el) { if (el) {
initialize(el); initialize(el);
scrollElementRef.current = el;
initialized.current = true; initialized.current = true;
instanceRef.current = instance?.(); instanceRef.current = instance?.();
scrollEventElement.current = scrollEventElement.current =
instanceRef.current?.elements()?.scrollEventElement; instanceRef.current?.elements()?.scrollEventElement;
handleWheelEvent();
} }
return instanceRef.current; return instanceRef.current;
}, },
@@ -123,6 +168,7 @@ export default function useOverlayScroller(data?: {
useEffect(() => { useEffect(() => {
return () => { return () => {
instanceRef.current?.destroy?.(); instanceRef.current?.destroy?.();
removeWheelEvent();
}; };
}, [instance]); }, [instance]);
@@ -176,7 +176,6 @@ export default function useChatCompletion(
setLoading(false); setLoading(false);
} }
}; };
const throttleUpdatePosition = _.throttle(updateScrollerPosition, 100);
useEffect(() => { useEffect(() => {
if (scroller.current) { if (scroller.current) {