@@ -3,6 +3,7 @@ import classNames from 'classnames';
33import React , { useState , useRef } from 'react' ;
44import { connect } from 'react-redux' ;
55import { useTranslation } from 'react-i18next' ;
6+ import { useSelector } from 'react-redux' ;
67
78import * as IDEActions from '../actions/ide' ;
89import * as FileActions from '../actions/files' ;
@@ -88,6 +89,24 @@ const FileNode = ({
8889 const [ isDeleting , setIsDeleting ] = useState ( false ) ;
8990 const [ updatedName , setUpdatedName ] = useState ( name ) ;
9091
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+
91110 const { t } = useTranslation ( ) ;
92111 const fileNameInput = useRef ( null ) ;
93112 const fileOptionsRef = useRef ( null ) ;
@@ -157,7 +176,7 @@ const FileNode = ({
157176 } ;
158177
159178 const saveUpdatedFileName = ( ) => {
160- if ( updatedName !== name ) {
179+ if ( ! checkDuplicate ( updatedName ) && updatedName !== name ) {
161180 updateFileName ( id , updatedName ) ;
162181 }
163182 } ;
@@ -198,8 +217,13 @@ const FileNode = ({
198217 } ;
199218
200219 const handleFileNameBlur = ( ) => {
201- validateFileName ( ) ;
202- hideEditFileName ( ) ;
220+ if ( ! checkDuplicate ( updatedName ) ) {
221+ validateFileName ( ) ;
222+ hideEditFileName ( ) ;
223+ } else {
224+ setUpdatedName ( name ) ;
225+ hideEditFileName ( ) ;
226+ }
203227 } ;
204228
205229 const toggleFileOptions = ( event ) => {
@@ -271,6 +295,7 @@ const FileNode = ({
271295 aria-label = { updatedName }
272296 className = "sidebar__file-item-name"
273297 onClick = { handleFileClick }
298+ onDoubleClick = { handleClickRename }
274299 data-testid = "file-name"
275300 >
276301 < FileName name = { updatedName } />
0 commit comments