1
- import { useEffect , useRef , useState } from "react" ;
1
+ import { useRef } from "react" ;
2
2
import FileItem from "./FileItem" ;
3
- import { duplicateNameHandler } from "../../utils/duplicateNameHandler" ;
4
3
import { useFileNavigation } from "../../contexts/FileNavigationContext" ;
5
- import { useSelection } from "../../contexts/SelectionContext" ;
6
4
import { useLayout } from "../../contexts/LayoutContext" ;
7
5
import ContextMenu from "../../components/ContextMenu/ContextMenu" ;
8
6
import { useDetectOutsideClick } from "../../hooks/useDetectOutsideClick" ;
9
- import { BsCopy , BsFolderPlus , BsScissors } from "react-icons/bs" ;
10
- import { MdOutlineDelete , MdOutlineFileDownload , MdOutlineFileUpload } from "react-icons/md" ;
11
- import { FiRefreshCw } from "react-icons/fi" ;
7
+ import useFileList from "./useFileList" ;
8
+ import FilesHeader from "./FilesHeader" ;
12
9
import "./FileList.scss" ;
13
- import { PiFolderOpen } from "react-icons/pi" ;
14
- import { FaRegFile , FaRegPaste } from "react-icons/fa6" ;
15
- import { BiRename } from "react-icons/bi" ;
16
- import { useClipBoard } from "../../contexts/ClipboardContext" ;
17
10
18
- const FileList = ( { onCreateFolder , onRename , onFileOpen , enableFilePreview , triggerAction } ) => {
19
- const [ selectedFileIndexes , setSelectedFileIndexes ] = useState ( [ ] ) ;
20
- const [ visible , setVisible ] = useState ( false ) ;
21
- const [ isSelectionCtx , setIsSelectionCtx ] = useState ( false ) ;
22
- const [ clickPosition , setClickPosition ] = useState ( { clickX : 0 , clickY : 0 } ) ;
23
- const [ lastSelectedFile , setLastSelectedFile ] = useState ( null ) ;
24
-
25
- const { currentPath , setCurrentPath , currentPathFiles , setCurrentPathFiles } =
26
- useFileNavigation ( ) ;
11
+ const FileList = ( {
12
+ onCreateFolder ,
13
+ onRename ,
14
+ onFileOpen ,
15
+ onRefresh ,
16
+ enableFilePreview ,
17
+ triggerAction ,
18
+ } ) => {
19
+ const { currentPathFiles } = useFileNavigation ( ) ;
27
20
const filesViewRef = useRef ( null ) ;
28
- const { selectedFiles, setSelectedFiles, handleDownload } = useSelection ( ) ;
29
- const { clipBoard, handleCutCopy, handlePasting } = useClipBoard ( ) ;
30
21
const { activeLayout } = useLayout ( ) ;
31
- const contextMenuRef = useDetectOutsideClick ( ( ) => setVisible ( false ) ) ;
32
-
33
- const emptySelecCtxItems = [
34
- {
35
- title : "Refresh" ,
36
- icon : < FiRefreshCw size = { 18 } /> ,
37
- onClick : ( ) => { } ,
38
- } ,
39
- {
40
- title : "New Folder" ,
41
- icon : < BsFolderPlus size = { 18 } /> ,
42
- onClick : ( ) => { } ,
43
- } ,
44
- {
45
- title : "Upload" ,
46
- icon : < MdOutlineFileUpload size = { 18 } /> ,
47
- onClick : ( ) => { } ,
48
- } ,
49
- ] ;
50
-
51
- const selecCtxItems = [
52
- {
53
- title : "Open" ,
54
- icon : lastSelectedFile ?. isDirectory ? < PiFolderOpen size = { 20 } /> : < FaRegFile size = { 16 } /> ,
55
- onClick : handleFileOpen ,
56
- } ,
57
- {
58
- title : "Cut" ,
59
- icon : < BsScissors size = { 19 } /> ,
60
- onClick : ( ) => handleMoveOrCopyItems ( true ) ,
61
- } ,
62
- {
63
- title : "Copy" ,
64
- icon : < BsCopy strokeWidth = { 0.1 } size = { 17 } /> ,
65
- onClick : ( ) => handleMoveOrCopyItems ( false ) ,
66
- } ,
67
- {
68
- title : "Paste" ,
69
- icon : < FaRegPaste size = { 18 } /> ,
70
- onClick : handleFilePasting ,
71
- className : `${ clipBoard ? "" : "disable-paste" } ` ,
72
- hidden : ! lastSelectedFile ?. isDirectory ,
73
- } ,
74
- {
75
- title : "Rename" ,
76
- icon : < BiRename size = { 19 } /> ,
77
- onClick : handleRenaming ,
78
- hidden : selectedFiles . length > 1 ,
79
- } ,
80
- {
81
- title : "Download" ,
82
- icon : < MdOutlineFileDownload size = { 18 } /> ,
83
- onClick : handleDownloadItems ,
84
- hidden : lastSelectedFile ?. isDirectory ,
85
- } ,
86
- {
87
- title : "Delete" ,
88
- icon : < MdOutlineDelete size = { 19 } /> ,
89
- onClick : handleDelete ,
90
- } ,
91
- ] ;
92
-
93
- function handleFileOpen ( ) {
94
- if ( lastSelectedFile . isDirectory ) {
95
- setCurrentPath ( lastSelectedFile . path ) ;
96
- setSelectedFileIndexes ( [ ] ) ;
97
- setSelectedFiles ( [ ] ) ;
98
- } else {
99
- enableFilePreview && triggerAction . show ( "previewFile" ) ;
100
- }
101
- setVisible ( false ) ;
102
- }
103
-
104
- function handleMoveOrCopyItems ( isMoving ) {
105
- handleCutCopy ( isMoving ) ;
106
- setVisible ( false ) ;
107
- }
108
-
109
- function handleFilePasting ( ) {
110
- handlePasting ( lastSelectedFile ) ;
111
- setVisible ( false ) ;
112
- }
113
-
114
- function handleRenaming ( ) {
115
- setVisible ( false ) ;
116
- triggerAction . show ( "rename" ) ;
117
- }
118
-
119
- function handleDownloadItems ( ) {
120
- handleDownload ( ) ;
121
- setVisible ( false ) ;
122
- }
123
-
124
- function handleDelete ( ) {
125
- setVisible ( false ) ;
126
- triggerAction . show ( "delete" ) ;
127
- }
128
22
129
- const handleFolderCreating = ( ) => {
130
- setCurrentPathFiles ( ( prev ) => {
131
- return [
132
- ...prev ,
133
- {
134
- name : duplicateNameHandler ( "New Folder" , true , prev ) ,
135
- isDirectory : true ,
136
- path : currentPath ,
137
- isEditing : true ,
138
- key : new Date ( ) . valueOf ( ) ,
139
- } ,
140
- ] ;
141
- } ) ;
142
- } ;
23
+ const {
24
+ emptySelecCtxItems,
25
+ selecCtxItems,
26
+ handleContextMenu,
27
+ unselectFiles,
28
+ visible,
29
+ setVisible,
30
+ setLastSelectedFile,
31
+ selectedFileIndexes,
32
+ clickPosition,
33
+ isSelectionCtx,
34
+ } = useFileList ( onRefresh , enableFilePreview , triggerAction ) ;
143
35
144
- const handleItemRenaming = ( ) => {
145
- setCurrentPathFiles ( ( prev ) => {
146
- if ( prev [ selectedFileIndexes . at ( - 1 ) ] ) {
147
- prev [ selectedFileIndexes . at ( - 1 ) ] . isEditing = true ;
148
- }
149
- return prev ;
150
- } ) ;
151
-
152
- setSelectedFileIndexes ( [ ] ) ;
153
- setSelectedFiles ( [ ] ) ;
154
- } ;
155
-
156
- const handleContextMenu = ( e , isSelection ) => {
157
- e . preventDefault ( ) ;
158
- setClickPosition ( { clickX : e . clientX , clickY : e . clientY } ) ;
159
- setIsSelectionCtx ( isSelection ) ;
160
- setVisible ( true ) ;
161
- } ;
162
-
163
- useEffect ( ( ) => {
164
- if ( triggerAction . isActive ) {
165
- switch ( triggerAction . actionType ) {
166
- case "createFolder" :
167
- handleFolderCreating ( ) ;
168
- break ;
169
- case "rename" :
170
- handleItemRenaming ( ) ;
171
- break ;
172
- }
173
- }
174
- } , [ triggerAction . isActive ] ) ;
175
-
176
- useEffect ( ( ) => {
177
- setSelectedFileIndexes ( [ ] ) ;
178
- setSelectedFiles ( [ ] ) ;
179
- } , [ currentPath ] ) ;
180
-
181
- useEffect ( ( ) => {
182
- if ( selectedFiles . length > 0 ) {
183
- setSelectedFileIndexes ( ( ) => {
184
- return selectedFiles . map ( ( selectedFile ) => {
185
- return currentPathFiles . findIndex ( ( f ) => f . path === selectedFile . path ) ;
186
- } ) ;
187
- } ) ;
188
- } else {
189
- setSelectedFileIndexes ( [ ] ) ;
190
- }
191
- } , [ selectedFiles , currentPathFiles ] ) ;
36
+ const contextMenuRef = useDetectOutsideClick ( ( ) => setVisible ( false ) ) ;
192
37
193
38
return (
194
39
< div
195
40
ref = { filesViewRef }
196
41
className = { `files ${ activeLayout } ` }
197
- onContextMenu = { ( e ) => handleContextMenu ( e , false ) }
198
- onClick = { ( ) => {
199
- setSelectedFileIndexes ( [ ] ) ;
200
- setSelectedFiles ( ( prev ) => ( prev . length > 0 ? [ ] : prev ) ) ;
201
- } }
42
+ onContextMenu = { handleContextMenu }
43
+ onClick = { unselectFiles }
202
44
>
203
- { activeLayout === "list" && (
204
- < div className = "files-header" >
205
- < div className = "file-name" > Name</ div >
206
- < div className = "file-date" > Modified</ div >
207
- < div className = "file-size" > Size</ div >
208
- </ div >
209
- ) }
45
+ { activeLayout === "list" && < FilesHeader unselectFiles = { unselectFiles } /> }
46
+
210
47
{ currentPathFiles ?. length > 0 ? (
211
48
< >
212
49
{ currentPathFiles . map ( ( file , index ) => (
@@ -218,9 +55,9 @@ const FileList = ({ onCreateFolder, onRename, onFileOpen, enableFilePreview, tri
218
55
onRename = { onRename }
219
56
onFileOpen = { onFileOpen }
220
57
enableFilePreview = { enableFilePreview }
58
+ triggerAction = { triggerAction }
221
59
filesViewRef = { filesViewRef }
222
60
selectedFileIndexes = { selectedFileIndexes }
223
- triggerAction = { triggerAction }
224
61
handleContextMenu = { handleContextMenu }
225
62
setVisible = { setVisible }
226
63
setLastSelectedFile = { setLastSelectedFile }
0 commit comments