@@ -7,24 +7,9 @@ import Modal from 'react-modal';
77import { addProjectComponent , setNameError } from '../EditorSlice' ;
88import Button from '../../Button/Button'
99import NameErrorMessage from '../ErrorMessage/NameErrorMessage' ;
10- import { NewFileIcon } from '../../../Icons' ;
11-
12- const allowedExtensions = {
13- "python" : [
14- "py" ,
15- "csv" ,
16- "txt"
17- ]
18- }
19-
20- const allowedExtensionsString = ( projectType ) => {
21- const extensionsList = allowedExtensions [ projectType ] ;
22- if ( extensionsList . length === 1 ) {
23- return `'.${ extensionsList [ 0 ] } '`
24- } else {
25- return `'.` + extensionsList . slice ( 0 , - 1 ) . join ( `', '.` ) + `' or '.` + extensionsList [ extensionsList . length - 1 ] + `'` ;
26- }
27- }
10+ import { CloseIcon , NewFileIcon } from '../../../Icons' ;
11+ import { validateFileName } from '../../../utils/componentNameValidation' ;
12+ import { useCookies } from 'react-cookie' ;
2813
2914const NewComponentButton = ( ) => {
3015 const [ modalIsOpen , setIsOpen ] = useState ( false ) ;
@@ -33,6 +18,10 @@ const NewComponentButton = () => {
3318 const projectComponents = useSelector ( ( state ) => state . editor . project . components ) ;
3419 const componentNames = projectComponents . map ( component => `${ component . name } .${ component . extension } ` )
3520
21+ const [ cookies ] = useCookies ( [ 'fontSize' , 'theme' ] )
22+ const isDarkMode = cookies . theme === "dark" || ( ! cookies . theme && window . matchMedia ( "(prefers-color-scheme:dark)" ) . matches )
23+ const theme = isDarkMode ? "dark" : "light"
24+
3625 const closeModal = ( ) => setIsOpen ( false ) ;
3726 const showModal = ( ) => {
3827 dispatch ( setNameError ( "" ) ) ;
@@ -42,62 +31,42 @@ const NewComponentButton = () => {
4231 const fileName = document . getElementById ( 'name' ) . value
4332 const name = fileName . split ( '.' ) [ 0 ] ;
4433 const extension = fileName . split ( '.' ) . slice ( 1 ) . join ( '.' ) ;
45- if ( isValidFileName ( fileName ) ) {
34+ validateFileName ( fileName , projectType , componentNames , dispatch , ( ) => {
4635 dispatch ( addProjectComponent ( { extension : extension , name : name } ) ) ;
4736 closeModal ( ) ;
48- } else if ( componentNames . includes ( fileName ) ) {
49- dispatch ( setNameError ( "File names must be unique." ) ) ;
50- } else if ( ! allowedExtensions [ projectType ] . includes ( extension ) ) {
51- dispatch ( setNameError ( `File names must end in ${ allowedExtensionsString ( projectType ) } .` ) ) ;
52- } else {
53- dispatch ( setNameError ( "Error" ) ) ;
54- }
37+ } )
5538 }
5639
57- const isValidFileName = ( fileName ) => {
58- const extension = fileName . split ( '.' ) . slice ( 1 ) . join ( '.' )
59- if ( allowedExtensions [ projectType ] . includes ( extension ) && ! componentNames . includes ( fileName ) ) {
60- return true ;
61- } else {
62- return false ;
63- }
64- }
65-
66- const customStyles = {
67- content : {
68- top : '50%' ,
69- left : '50%' ,
70- right : 'auto' ,
71- bottom : 'auto' ,
72- marginRight : '-50%' ,
73- transform : 'translate(-50%, -50%)' ,
74- } ,
75- overlay : {
76- zIndex : 1000
77- }
78- } ;
79-
8040 return (
81- < >
41+ < div className = { `-- ${ theme } ` } >
8242 < Button buttonText = { < > < NewFileIcon /> Add file</ > } onClickHandler = { showModal } className = "proj-new-component-button" />
8343
8444 < Modal
8545 isOpen = { modalIsOpen }
8646 onRequestClose = { closeModal }
87- style = { customStyles }
8847 contentLabel = "New File"
89- appElement = { document . getElementById ( 'root' ) || undefined }
48+ className = 'modal__content'
49+ overlayClassName = 'modal__overlay'
50+ parentSelector = { ( ) => document . querySelector ( '#app' ) }
51+ appElement = { document . getElementById ( 'app' ) || undefined }
9052 >
91- < h2 > Add a new file to your project</ h2 >
53+ < div className = 'modal__header' >
54+ < h2 > Add a new file to your project</ h2 >
55+ < button onClick = { closeModal } >
56+ < CloseIcon />
57+ </ button >
58+ </ div >
9259
60+ < label htmlFor = 'name' > Name your file</ label >
9361 < NameErrorMessage />
94- < label htmlFor = 'name' > Name: </ label >
9562 < input type = 'text' name = 'name' id = 'name' > </ input >
96- < Button buttonText = 'Cancel' onClickHandler = { closeModal } />
97- < Button buttonText = 'Save' onClickHandler = { createComponent } />
63+ < div className = 'modal__buttons' >
64+ < Button className = 'btn--secondary' buttonText = 'Cancel' onClickHandler = { closeModal } />
65+ < Button buttonText = 'Save' onClickHandler = { createComponent } />
66+ </ div >
9867
9968 </ Modal >
100- </ >
69+ </ div >
10170 ) ;
10271 }
10372
0 commit comments