@@ -34,7 +34,15 @@ import GoogleDriveSaverHOC from '../../containers/google-drive-saver-hoc.jsx';
3434import GoogleDriveSaveDialog from '../google-drive-save-dialog/google-drive-save-dialog.jsx' ;
3535import SettingsMenu from './settings-menu.jsx' ;
3636
37- import { openDebugModal , openKoshienTestModal , openConnectionModal } from '../../reducers/modals' ;
37+ import {
38+ openDebugModal ,
39+ openKoshienTestModal ,
40+ openMeshDomainModal ,
41+ openConnectionModal
42+ } from '../../reducers/modals' ;
43+ import {
44+ setDomain as setMeshV2Domain
45+ } from '../../reducers/mesh-v2' ;
3846import { setConnectionModalExtensionId } from '../../reducers/connection-modal' ;
3947import { openBlockDisplayModal } from '../../reducers/block-display' ;
4048import { setPlayer } from '../../reducers/mode' ;
@@ -226,29 +234,26 @@ class MenuBar extends React.Component {
226234 'handleExtensionAdded' ,
227235 'handleClickKoshienEntryForm' ,
228236 'handleMeshV2MenuClick' ,
237+ 'handleMeshDomainClick' ,
229238 'handleClickLearn'
230239 ] ) ;
231240 }
232241 componentDidMount ( ) {
233242 document . addEventListener ( 'keydown' , this . handleKeyPress ) ;
234-
235- // Listen for extension load events
236- if ( this . props . vm . runtime ) {
237- this . props . vm . runtime . on ( 'EXTENSION_ADDED' , this . handleExtensionAdded ) ;
238- this . props . vm . runtime . on ( 'PERIPHERAL_CONNECTED' , this . handleExtensionAdded ) ;
239- this . props . vm . runtime . on ( 'PERIPHERAL_DISCONNECTED' , this . handleExtensionAdded ) ;
240- this . props . vm . runtime . on ( 'PERIPHERAL_REQUEST_ERROR' , this . handleExtensionAdded ) ;
243+ this . syncMeshV2Domain ( ) ;
244+ }
245+ componentDidUpdate ( prevProps ) {
246+ if ( this . props . extensionLoadCounter !== prevProps . extensionLoadCounter ) {
247+ this . syncMeshV2Domain ( ) ;
241248 }
242249 }
243250 componentWillUnmount ( ) {
244251 document . removeEventListener ( 'keydown' , this . handleKeyPress ) ;
245-
246- // Remove extension listener
247- if ( this . props . vm . runtime ) {
248- this . props . vm . runtime . off ( 'EXTENSION_ADDED' , this . handleExtensionAdded ) ;
249- this . props . vm . runtime . off ( 'PERIPHERAL_CONNECTED' , this . handleExtensionAdded ) ;
250- this . props . vm . runtime . off ( 'PERIPHERAL_DISCONNECTED' , this . handleExtensionAdded ) ;
251- this . props . vm . runtime . off ( 'PERIPHERAL_REQUEST_ERROR' , this . handleExtensionAdded ) ;
252+ }
253+ syncMeshV2Domain ( ) {
254+ const extension = this . props . vm . runtime . peripheralExtensions . meshV2 ;
255+ if ( extension && extension . domain !== this . props . meshV2Domain ) {
256+ this . props . onSetMeshV2Domain ( extension . domain ) ;
252257 }
253258 }
254259 handleExtensionAdded ( ) {
@@ -303,6 +308,20 @@ class MenuBar extends React.Component {
303308 // Open connection modal
304309 this . props . onOpenConnectionModal ( 'meshV2' ) ;
305310 }
311+ handleMeshDomainClick ( ) {
312+ // Close the Mesh V2 menu
313+ this . props . onRequestCloseMeshV2 ( ) ;
314+
315+ const extension = this . props . vm . runtime . peripheralExtensions . meshV2 ;
316+ if ( extension && ( extension . connectionState === 'connected' || extension . connectionState === 'connecting' ) ) {
317+ alert ( this . props . intl . formatMessage ( { // eslint-disable-line no-alert
318+ id : 'mesh.domainConnectedAlert' ,
319+ default : 'Mesh V2 is connected. To change the domain, please disconnect first.'
320+ } ) ) ;
321+ return ;
322+ }
323+ this . props . onOpenMeshDomainModal ( ) ;
324+ }
306325 handleClickNew ( ) {
307326 // if the project is dirty, and user owns the project, we will autosave.
308327 // but if they are not logged in and can't save, user should consider
@@ -962,6 +981,24 @@ class MenuBar extends React.Component {
962981 < MenuItem onClick = { this . handleMeshV2MenuClick } >
963982 { meshV2Status . message }
964983 </ MenuItem >
984+ < MenuSection >
985+ < MenuItem onClick = { this . handleMeshDomainClick } >
986+ < FormattedMessage
987+ defaultMessage = "Domain: {domain}"
988+ description = "Label for Mesh V2 domain"
989+ id = "mesh.domain"
990+ values = { {
991+ domain : this . props . meshV2Domain || (
992+ < FormattedMessage
993+ defaultMessage = "Not set"
994+ description = "Label for Mesh V2 domain not set"
995+ id = "mesh.domainNotSet"
996+ />
997+ )
998+ } }
999+ />
1000+ </ MenuItem >
1001+ </ MenuSection >
9651002 </ MenuBarMenu >
9661003 </ div >
9671004 ) ;
@@ -1342,6 +1379,7 @@ MenuBar.propTypes = {
13421379 locale : PropTypes . string . isRequired ,
13431380 loginMenuOpen : PropTypes . bool ,
13441381 logo : PropTypes . string ,
1382+ meshV2Domain : PropTypes . string ,
13451383 meshV2MenuOpen : PropTypes . bool ,
13461384 mode1920 : PropTypes . bool ,
13471385 mode1990 : PropTypes . bool ,
@@ -1376,6 +1414,7 @@ MenuBar.propTypes = {
13761414 onOpenRegistration : PropTypes . func ,
13771415 onOpenBlockDisplayModal : PropTypes . func ,
13781416 onOpenConnectionModal : PropTypes . func ,
1417+ onOpenMeshDomainModal : PropTypes . func ,
13791418 onOpenDebugModal : PropTypes . func ,
13801419 onOpenKoshienTestModal : PropTypes . func ,
13811420 onProjectTelemetryEvent : PropTypes . func ,
@@ -1399,6 +1438,7 @@ MenuBar.propTypes = {
13991438 onStartSavingToGoogleDrive : PropTypes . func ,
14001439 onSaveDirectlyToGoogleDrive : PropTypes . func ,
14011440 onSetAiSaveStatus : PropTypes . func ,
1441+ onSetMeshV2Domain : PropTypes . func ,
14021442 onClearAiSaveStatus : PropTypes . func ,
14031443 onStartSelectingUrlLoad : PropTypes . func ,
14041444 projectFilename : PropTypes . string ,
@@ -1431,6 +1471,7 @@ const mapStateToProps = (state, ownProps) => {
14311471 fileMenuOpen : fileMenuOpen ( state ) ,
14321472 editMenuOpen : editMenuOpen ( state ) ,
14331473 koshienMenuOpen : koshienMenuOpen ( state ) ,
1474+ meshV2Domain : state . scratchGui . meshV2 . domain ,
14341475 meshV2MenuOpen : meshV2MenuOpen ( state ) ,
14351476 extensionLoadCounter : state . scratchGui . koshienFile . extensionLoadCounter ,
14361477 aiSaveStatus : state . scratchGui . koshienFile . aiSaveStatus ,
@@ -1465,6 +1506,7 @@ const mapDispatchToProps = dispatch => ({
14651506 dispatch ( setConnectionModalExtensionId ( id ) ) ;
14661507 dispatch ( openConnectionModal ( ) ) ;
14671508 } ,
1509+ onOpenMeshDomainModal : ( ) => dispatch ( openMeshDomainModal ( ) ) ,
14681510 onOpenBlockDisplayModal : ( ) => dispatch ( openBlockDisplayModal ( ) ) ,
14691511 onOpenKoshienTestModal : ( ) => dispatch ( openKoshienTestModal ( ) ) ,
14701512 onClickAccount : ( ) => dispatch ( openAccountMenu ( ) ) ,
@@ -1493,6 +1535,7 @@ const mapDispatchToProps = dispatch => ({
14931535 onClickSave : ( ) => dispatch ( manualUpdateProject ( ) ) ,
14941536 onClickSaveAsCopy : ( ) => dispatch ( saveProjectAsCopy ( ) ) ,
14951537 onExtensionLoaded : ( ) => dispatch ( incrementExtensionLoad ( ) ) ,
1538+ onSetMeshV2Domain : domain => dispatch ( setMeshV2Domain ( domain ) ) ,
14961539 onSetAiSaveStatus : status => dispatch ( setAiSaveStatus ( status ) ) ,
14971540 onClearAiSaveStatus : ( ) => dispatch ( clearAiSaveStatus ( ) ) ,
14981541 onSeeCommunity : ( ) => dispatch ( setPlayer ( true ) ) ,
0 commit comments