enhance(scroll):尝试调整和修复滚动。
This commit is contained in:
		| @@ -3,12 +3,14 @@ import { useVirtualizer } from '@tanstack/react-virtual'; | ||||
| import EventEmitter from 'events'; | ||||
| import { filter, indexOf, isEmpty, length, map, pluck } from 'ramda'; | ||||
| import { FC, useContext, useEffect, useLayoutEffect, useMemo, useRef } from 'react'; | ||||
| import { useUpdate } from 'react-use'; | ||||
| import { EventBusContext } from '../EventBus'; | ||||
| import { useFileListStore } from '../states/files'; | ||||
| import { useZoomState } from '../states/zoom'; | ||||
| import { withinRange } from '../utils/offset_func'; | ||||
|  | ||||
| export const ContinuationView: FC = () => { | ||||
|   const forceRerender = useUpdate(); | ||||
|   const files = useFileListStore.use.files(); | ||||
|   const zoom = useZoomState.use.currentZoom(); | ||||
|   const viewHeight = useZoomState.use.viewHeight(); | ||||
| @@ -19,7 +21,7 @@ export const ContinuationView: FC = () => { | ||||
|   const virtualizer = useVirtualizer({ | ||||
|     count: fileCount, | ||||
|     getScrollElement: () => parentRef.current, | ||||
|     estimateSize: () => zoom * 10 | ||||
|     estimateSize: () => 100 | ||||
|   }); | ||||
|   const items = virtualizer.getVirtualItems(); | ||||
|  | ||||
| @@ -28,12 +30,20 @@ export const ContinuationView: FC = () => { | ||||
|       let index = indexOf(filename, pluck('filename', files)); | ||||
|       virtualizer.scrollToIndex(index); | ||||
|     }); | ||||
|     ebus?.addListener('reset_views', () => { | ||||
|       virtualizer.scrollToOffset(0); | ||||
|     }); | ||||
|  | ||||
|     return () => { | ||||
|       ebus?.removeAllListeners('navigate_offset'); | ||||
|       ebus?.removeAllListeners('reset_views'); | ||||
|     }; | ||||
|   }, [ebus, files, virtualizer]); | ||||
|  | ||||
|   useEffect(() => { | ||||
|     forceRerender(); | ||||
|   }, [files]); | ||||
|  | ||||
|   useLayoutEffect(() => { | ||||
|     let rangeStart = virtualizer.scrollOffset; | ||||
|     let rangeEnd = virtualizer.scrollOffset + viewHeight; | ||||
|   | ||||
| @@ -3,11 +3,15 @@ import { notifications } from '@mantine/notifications'; | ||||
| import { IconFolder } from '@tabler/icons-react'; | ||||
| import { invoke } from '@tauri-apps/api'; | ||||
| import { open } from '@tauri-apps/api/dialog'; | ||||
| import { FC, useCallback } from 'react'; | ||||
| import EventEmitter from 'events'; | ||||
| import { length } from 'ramda'; | ||||
| import { FC, useCallback, useContext } from 'react'; | ||||
| import { EventBusContext } from '../EventBus'; | ||||
| import { useFileListStore } from '../states/files'; | ||||
|  | ||||
| export const FileToolbar: FC = () => { | ||||
|   const storeFiles = useFileListStore.use.updateFiles(); | ||||
|   const ebus = useContext<EventEmitter>(EventBusContext); | ||||
|   const handleOpenAction = useCallback(async () => { | ||||
|     try { | ||||
|       const directory = await open({ | ||||
| @@ -15,9 +19,10 @@ export const FileToolbar: FC = () => { | ||||
|         directory: true, | ||||
|         multiple: false | ||||
|       }); | ||||
|       storeFiles([]); | ||||
|       const files = await invoke('scan_directory', { target: directory }); | ||||
|       console.log('[debug]获取到文件个数:', length(files)); | ||||
|       storeFiles(files); | ||||
|       ebus.emit('reset_views'); | ||||
|     } catch (e) { | ||||
|       console.error('[error]打开文件夹', e); | ||||
|       notifications.show({ title: '未能成功打开指定文件夹,请重试。', color: 'red' }); | ||||
|   | ||||
| @@ -27,6 +27,7 @@ export const useFileListStore = createStoreHook<FileListState & FileListActions> | ||||
|         (item, index) => mergeLeft({ sort: index * 10, path: convertFileSrc(item.path) }, item), | ||||
|         files | ||||
|       ); | ||||
|       df.actives = []; | ||||
|     }); | ||||
|   }, | ||||
|   updateActiveFiles(filenames) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user