@@ -3,6 +3,7 @@ import classNames from 'classnames';
3
3
import React , { useState , useRef } from 'react' ;
4
4
import { connect } from 'react-redux' ;
5
5
import { useTranslation } from 'react-i18next' ;
6
+ import { useSelector } from 'react-redux' ;
6
7
7
8
import * as IDEActions from '../actions/ide' ;
8
9
import * as FileActions from '../actions/files' ;
@@ -88,6 +89,24 @@ const FileNode = ({
88
89
const [ isDeleting , setIsDeleting ] = useState ( false ) ;
89
90
const [ updatedName , setUpdatedName ] = useState ( name ) ;
90
91
92
+ const files = useSelector ( ( state ) => state . files ) ;
93
+
94
+ const checkDuplicate = ( newName ) => {
95
+ const parentFolder = files . find ( ( f ) => f . id === parentId ) ;
96
+ if ( ! parentFolder ) return false ;
97
+
98
+ const siblingFiles = parentFolder . children
99
+ . map ( ( childId ) => files . find ( ( f ) => f . id === childId ) )
100
+ . filter ( Boolean )
101
+ . filter ( ( file ) => file . id !== id ) ;
102
+
103
+ const isDuplicate = siblingFiles . some (
104
+ ( f ) => f . name . trim ( ) . toLowerCase ( ) === newName . trim ( ) . toLowerCase ( )
105
+ ) ;
106
+
107
+ return isDuplicate ;
108
+ } ;
109
+
91
110
const { t } = useTranslation ( ) ;
92
111
const fileNameInput = useRef ( null ) ;
93
112
const fileOptionsRef = useRef ( null ) ;
@@ -157,7 +176,7 @@ const FileNode = ({
157
176
} ;
158
177
159
178
const saveUpdatedFileName = ( ) => {
160
- if ( updatedName !== name ) {
179
+ if ( ! checkDuplicate ( updatedName ) && updatedName !== name ) {
161
180
updateFileName ( id , updatedName ) ;
162
181
}
163
182
} ;
@@ -198,8 +217,13 @@ const FileNode = ({
198
217
} ;
199
218
200
219
const handleFileNameBlur = ( ) => {
201
- validateFileName ( ) ;
202
- hideEditFileName ( ) ;
220
+ if ( ! checkDuplicate ( updatedName ) ) {
221
+ validateFileName ( ) ;
222
+ hideEditFileName ( ) ;
223
+ } else {
224
+ setUpdatedName ( name ) ;
225
+ hideEditFileName ( ) ;
226
+ }
203
227
} ;
204
228
205
229
const toggleFileOptions = ( event ) => {
0 commit comments