@@ -14,10 +14,8 @@ import {
1414 setupFunctionFromEvents ,
1515 canCreateEventsFunction ,
1616 functionHasLotsOfParameters ,
17- validateExtensionNameUniqueness ,
18- validateExtensionName ,
19- validateEventsFunctionNameUniqueness ,
20- validateEventsFunctionName ,
17+ getSafeExtensionName ,
18+ getSafeEventsFunctionName ,
2119} from '.' ;
2220import AlertMessage from '../../UI/AlertMessage' ;
2321import DismissableAlertMessage from '../../UI/DismissableAlertMessage' ;
@@ -27,6 +25,7 @@ import HelpButton from '../../UI/HelpButton';
2725import { ColumnStackLayout , ResponsiveLineStackLayout } from '../../UI/Layout' ;
2826import { type EventsScope } from '../../InstructionOrExpression/EventsScope' ;
2927import { ProjectScopedContainersAccessor } from '../../InstructionOrExpression/EventsScope' ;
28+
3029const gd : libGDevelop = global . gd ;
3130
3231type Props = { |
@@ -90,47 +89,25 @@ export default class EventsFunctionExtractorDialog extends React.Component<
9089 } ) ;
9190
9291 // Prepopulate the form
93- const eventsFunctionsExtensions = enumerateEventsFunctionsExtensions (
94- project
92+ const extensionName = getSafeExtensionName ( project , 'MyExtension' ) ;
93+ this . setState ( {
94+ createNewExtension : true ,
95+ extensionName,
96+ } ) ;
97+ eventsFunction . setName (
98+ getSafeEventsFunctionName (
99+ project ,
100+ extensionName ,
101+ eventsFunction . getName ( )
102+ )
95103 ) ;
96- if ( eventsFunctionsExtensions . length === 0 ) {
97- this . setState ( {
98- createNewExtension : true ,
99- } ) ;
100- }
101104 }
102105
103106 componentWillUnmount ( ) {
104107 const { eventsFunction } = this . state ;
105108 if ( eventsFunction ) eventsFunction . delete ( ) ;
106109 }
107110
108- _getFunctionGroupNames = ( ) : Array < string > => {
109- const { createNewExtension, extensionName } = this . state ;
110- if ( createNewExtension || ! extensionName ) {
111- return [ ] ;
112- }
113- const groupNames = new Set < string > ( ) ;
114- const { project } = this . props ;
115- const eventsFunctionsExtension = project . getEventsFunctionsExtension (
116- extensionName
117- ) ;
118- const freeEventsFunctions = eventsFunctionsExtension . getEventsFunctions ( ) ;
119- for (
120- let index = 0 ;
121- index < freeEventsFunctions . getEventsFunctionsCount ( ) ;
122- index ++
123- ) {
124- const groupName = freeEventsFunctions
125- . getEventsFunctionAt ( index )
126- . getGroup ( ) ;
127- if ( groupName ) {
128- groupNames . add ( groupName ) ;
129- }
130- }
131- return [ ...groupNames ] . sort ( ( a , b ) => a . localeCompare ( b ) ) ;
132- } ;
133-
134111 render ( ) : any {
135112 const { project, onClose, onCreate } = this . props ;
136113 const { eventsFunction, extensionName, createNewExtension } = this . state ;
@@ -205,14 +182,24 @@ export default class EventsFunctionExtractorDialog extends React.Component<
205182 if ( extensionName === CREATE_NEW_EXTENSION_PLACEHOLDER ) {
206183 this . setState ( {
207184 createNewExtension : true ,
208- extensionName : '' ,
185+ extensionName : getSafeExtensionName (
186+ project ,
187+ 'MyExtension'
188+ ) ,
209189 } ) ;
210190 } else {
211191 this . setState ( {
212192 createNewExtension : false ,
213193 extensionName,
214194 } ) ;
215195 }
196+ eventsFunction . setName (
197+ getSafeEventsFunctionName (
198+ project ,
199+ extensionName ,
200+ eventsFunction . getName ( )
201+ )
202+ ) ;
216203 } }
217204 fullWidth
218205 >
@@ -237,23 +224,14 @@ export default class EventsFunctionExtractorDialog extends React.Component<
237224 value = { extensionName }
238225 floatingLabelText = { < Trans > New extension name</ Trans > }
239226 onChange = { ( extensionName : string ) =>
240- this . setState ( { extensionName } )
227+ this . setState ( {
228+ extensionName : getSafeExtensionName (
229+ project ,
230+ extensionName
231+ ) ,
232+ } )
241233 }
242234 fullWidth
243- errorText = {
244- ! validateExtensionNameUniqueness ( project , extensionName ) ? (
245- < Trans >
246- This name is already taken by another extension.
247- </ Trans >
248- ) : ! validateExtensionName ( extensionName ) ? (
249- < Trans >
250- This name is not valid. Only use alphanumeric characters
251- (0-9, a-z) and underscores.
252- </ Trans >
253- ) : (
254- undefined
255- )
256- }
257235 />
258236 ) : null }
259237 </ ResponsiveLineStackLayout >
@@ -263,29 +241,16 @@ export default class EventsFunctionExtractorDialog extends React.Component<
263241 value = { eventsFunction . getName ( ) }
264242 floatingLabelText = { < Trans > Function name</ Trans > }
265243 onChange = { ( functionName : string ) => {
266- eventsFunction . setName ( functionName ) ;
244+ eventsFunction . setName (
245+ getSafeEventsFunctionName (
246+ project ,
247+ extensionName ,
248+ functionName
249+ )
250+ ) ;
267251 this . forceUpdate ( ) ;
268252 } }
269253 fullWidth
270- errorText = {
271- ! validateEventsFunctionNameUniqueness (
272- project ,
273- extensionName ,
274- eventsFunction
275- ) ? (
276- < Trans >
277- This name is already taken by another function. Choose
278- another name.
279- </ Trans >
280- ) : ! validateEventsFunctionName ( eventsFunction . getName ( ) ) ? (
281- < Trans >
282- This name is not valid. Only use alphanumeric characters
283- (0-9, a-z) and underscores.
284- </ Trans >
285- ) : (
286- undefined
287- )
288- }
289254 />
290255 </ Line >
291256 { hasLotsOfParameters ? (
@@ -312,7 +277,6 @@ export default class EventsFunctionExtractorDialog extends React.Component<
312277 this . forceUpdate ( ) ;
313278 } }
314279 freezeEventsFunctionType
315- getFunctionGroupNames = { this . _getFunctionGroupNames }
316280 />
317281 { this . _projectScopedContainersAccessor && (
318282 < CompactEventsFunctionParametersEditor
0 commit comments