From cf724bb17f156ab064dffa427451fe614735a577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Fri, 10 Mar 2023 10:24:32 +0800 Subject: [PATCH] =?UTF-8?q?enhance(list):=E6=96=87=E4=BB=B6=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=8A=A0=E8=B7=9F=E9=9A=8F=E6=BB=9A=E5=8A=A8?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/FileList.tsx | 68 ++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/components/FileList.tsx b/src/components/FileList.tsx index 976fb95..326bd2f 100644 --- a/src/components/FileList.tsx +++ b/src/components/FileList.tsx @@ -1,15 +1,20 @@ //@ts-nocheck import { Box, Center, Text } from '@mantine/core'; import EventEmitter from 'events'; -import { includes, isEmpty, map, not, pipe, sort } from 'ramda'; -import { FC, useCallback, useContext } from 'react'; +import { head, includes, indexOf, isEmpty, length, mergeLeft, not, pluck } from 'ramda'; +import { FC, useCallback, useContext, useLayoutEffect, useMemo, useRef } from 'react'; +import { useMeasure } from 'react-use'; +import { FixedSizeList } from 'react-window'; import { EventBusContext } from '../EventBus'; -import { useFileListStore } from '../states/files'; +import { sortedFilesSelector, useFileListStore } from '../states/files'; export const FileList: FC = () => { - const files = useFileListStore.use.files(); + const files = useFileListStore(sortedFilesSelector()); const activeFiles = useFileListStore.use.actives(); const ebus = useContext(EventBusContext); + const filesCount = useMemo(() => length(files), [files]); + const [parentRef, { height: parentHeight }] = useMeasure(); + const listRef = useRef(); const handleFileSelectAction = useCallback( (filename: string) => { ebus.emit('navigate_offset', { filename }); @@ -17,26 +22,43 @@ export const FileList: FC = () => { [ebus] ); + useLayoutEffect(() => { + let firstActived = head(activeFiles); + let firstActivedIndex = indexOf(firstActived, pluck('filename', files)); + listRef.current?.scrollToItem(firstActivedIndex, 'smart'); + }, [activeFiles]); + return ( - - {pipe( - sort((fa, fb) => fa.sort - fb.sort), - map(item => ( - handleFileSelectAction(item.filename)} - sx={theme => ({ - cursor: 'pointer', - '&:hover': { color: not(includes(item.filename, activeFiles)) && theme.colors.red } - })} - > - {item.filename} - - )) - )(files)} + + {!isEmpty(files) && ( + + {({ index, style }) => ( + handleFileSelectAction(files[index].filename)} + sx={theme => + mergeLeft(style, { + cursor: 'pointer', + '&:hover': { + color: not(includes(files[index].filename, activeFiles)) && theme.colors.red + } + }) + } + > + {files[index].filename} + + )} + + )} {isEmpty(files) && (
请先打开一个文件夹。