Skip to content

Commit 61e0a7e

Browse files
committed
feat: openFolder command
1 parent 13a9597 commit 61e0a7e

File tree

3 files changed

+68
-38
lines changed

3 files changed

+68
-38
lines changed

apps/linebyline/src/components/Explorer/index.tsx

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
import { open } from '@tauri-apps/api/dialog'
21
import classNames from 'classnames'
3-
import dayjs from 'dayjs'
42
import type { FC } from 'react'
53
import { memo, useCallback, useMemo, useState } from 'react'
64
import { useTranslation } from 'react-i18next'
75
import type { ListDataItem } from '../List'
86
import { Container } from './styles'
97
import { useEditorStore } from '@/stores'
10-
import { readDirectory } from '@/helper/filesys'
118
import type { IFile } from '@/helper/filesys'
12-
import { useGlobalCacheData } from '@/hooks'
9+
import { useGlobalCacheData, useOpen } from '@/hooks'
1310
import { CacheManager } from '@/helper'
1411
import { Empty, FileTree, List, Popper } from '@/components'
1512
import styled from 'styled-components'
@@ -21,15 +18,16 @@ const RecentListBottom = styled.div`
2118
text-align: center;
2219
2320
&:hover {
24-
background-color: ${props => props.theme.tipsBgColor};
21+
background-color: ${(props) => props.theme.tipsBgColor};
2522
}
2623
`
2724

2825
const Explorer: FC<ExplorerProps> = (props) => {
2926
const { t } = useTranslation()
30-
const { folderData, activeId, setFolderData, addOpenedFile, setActiveId } = useEditorStore()
27+
const { folderData, activeId, addOpenedFile, setActiveId } = useEditorStore()
3128
const [popperOpen, setPopperOpen] = useState(false)
3229
const [cache] = useGlobalCacheData()
30+
const { openFolderDialog, openFolder } = useOpen()
3331

3432
const handleSelect = (item: IFile) => {
3533
if (item.kind === 'dir') return
@@ -38,32 +36,18 @@ const Explorer: FC<ExplorerProps> = (props) => {
3836
setActiveId(item.id)
3937
}
4038

41-
const openRir = useCallback(async (dir: string) => {
42-
try {
43-
const res = await readDirectory(dir)
44-
CacheManager.writeCache('openFolderHistory', { path: dir, time: dayjs() })
45-
setFolderData(res)
46-
} catch (error) {
47-
console.error('error', error)
48-
}
49-
}, [setFolderData])
50-
5139
const handleClearRecent = () => {
5240
CacheManager.writeCache('openFolderHistory', [])
5341
setPopperOpen(false)
5442
}
5543

56-
const handleOpenDirClick = async () => {
57-
const dir = await open({ directory: true, recursive: true })
58-
59-
if (typeof dir !== 'string') return
60-
openRir(dir)
61-
}
62-
63-
const handleOpenHistoryListItemClick = useCallback((item: ListDataItem) => {
64-
openRir(item.title)
65-
setPopperOpen(false)
66-
}, [openRir])
44+
const handleOpenHistoryListItemClick = useCallback(
45+
(item: ListDataItem) => {
46+
openFolder(item.title)
47+
setPopperOpen(false)
48+
},
49+
[openFolder],
50+
)
6751

6852
const listData = useMemo(
6953
() =>
@@ -79,14 +63,14 @@ const Explorer: FC<ExplorerProps> = (props) => {
7963

8064
return (
8165
<Container className={containerCLs}>
82-
<div className="explorer-header">
66+
<div className='explorer-header'>
8367
<small>EXPLORER</small>
84-
<div className="flex" />
68+
<div className='flex' />
8569
</div>
86-
<div className="h-full w-full overflow-auto">
70+
<div className='h-full w-full overflow-auto'>
8771
{folderData && folderData.length > 1 ? (
8872
<FileTree
89-
className="flex-1"
73+
className='flex-1'
9074
data={folderData}
9175
activeId={activeId}
9276
onSelect={handleSelect}
@@ -95,12 +79,12 @@ const Explorer: FC<ExplorerProps> = (props) => {
9579
<Empty />
9680
)}
9781
</div>
98-
<div className="explorer-bottom">
99-
<small className="flex-1 cursor-pointer" onClick={handleOpenDirClick}>
82+
<div className='explorer-bottom'>
83+
<small className='flex-1 cursor-pointer' onClick={openFolderDialog}>
10084
{t('file.openDir')}
10185
</small>
10286
<Popper
103-
placement="top-end"
87+
placement='top-end'
10488
onClickAway={() => setPopperOpen(false)}
10589
open={popperOpen}
10690
content={
@@ -114,10 +98,12 @@ const Explorer: FC<ExplorerProps> = (props) => {
11498
</>
11599
}
116100
>
117-
{listData.length > 0 ? <i
118-
className="ri-more-2-fill icon-border cursor-pointer"
119-
onClick={() => setPopperOpen(true)}
120-
/> : null}
101+
{listData.length > 0 ? (
102+
<i
103+
className='ri-more-2-fill icon-border cursor-pointer'
104+
onClick={() => setPopperOpen(true)}
105+
/>
106+
) : null}
121107
</Popper>
122108
</div>
123109
</Container>

apps/linebyline/src/hooks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export { default as useGlobalSettingData } from './useSettingData'
33
export { default as useGlobalTheme } from './useTheme'
44
export { default as useGlobalKeyboard } from './useKeyboard'
55
export { default as useGlobalOSInfo } from './useOSInfo'
6+
export { default as useOpen } from './useOpen'

apps/linebyline/src/hooks/useOpen.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { useCallback, useEffect } from 'react'
2+
import { open } from '@tauri-apps/api/dialog'
3+
import { readDirectory } from '@/helper/filesys'
4+
import { CacheManager } from '@/helper'
5+
import { useCommandStore, useEditorStore } from '@/stores'
6+
import dayjs from 'dayjs'
7+
8+
const useOpen = () => {
9+
const { setFolderData } = useEditorStore()
10+
const { addCommand } = useCommandStore()
11+
12+
const openFolder = useCallback(
13+
async (dir: string) => {
14+
try {
15+
const res = await readDirectory(dir)
16+
CacheManager.writeCache('openFolderHistory', { path: dir, time: dayjs() })
17+
setFolderData(res)
18+
} catch (error) {
19+
console.error('error', error)
20+
}
21+
},
22+
[setFolderData],
23+
)
24+
25+
const openFolderDialog = useCallback(async () => {
26+
const dir = await open({ directory: true, recursive: true })
27+
28+
if (typeof dir !== 'string') return
29+
openFolder(dir)
30+
}, [openFolder])
31+
32+
33+
useEffect(() => {
34+
addCommand({ id: 'app:open_folder', handler: openFolderDialog})
35+
}, [addCommand, openFolderDialog])
36+
37+
return {
38+
openFolderDialog,
39+
openFolder
40+
}
41+
}
42+
43+
export default useOpen

0 commit comments

Comments
 (0)