Partial import processing
This commit is contained in:
@@ -35,6 +35,7 @@ import YesNo from './components/YesNo/YesNo';
|
|||||||
import {createModalConditionally} from './utils';
|
import {createModalConditionally} from './utils';
|
||||||
import SkynetImport from './containers/SkynetImport/SkynetImport';
|
import SkynetImport from './containers/SkynetImport/SkynetImport';
|
||||||
import {displaySkynetImport} from './redux/actions/skynet_actions';
|
import {displaySkynetImport} from './redux/actions/skynet_actions';
|
||||||
|
import ApplicationBusy from './components/ApplicationBusy/ApplicationBusy';
|
||||||
|
|
||||||
const Constants = require('./constants');
|
const Constants = require('./constants');
|
||||||
const Scheduler = require('node-schedule');
|
const Scheduler = require('node-schedule');
|
||||||
@@ -175,6 +176,8 @@ class App extends IPCContainer {
|
|||||||
<SelectAppPlatform/>);
|
<SelectAppPlatform/>);
|
||||||
const upgradeDisplay = createModalConditionally(showUpgrade, <UpgradeUI/>);
|
const upgradeDisplay = createModalConditionally(showUpgrade, <UpgradeUI/>);
|
||||||
const importDisplay = createModalConditionally(showSkynetImport, <SkynetImport version={selectedVersion}/>);
|
const importDisplay = createModalConditionally(showSkynetImport, <SkynetImport version={selectedVersion}/>);
|
||||||
|
const appBusyDisplay = createModalConditionally(this.props.AppBusy,
|
||||||
|
<ApplicationBusy/>, false, true, this.props.AppBusyTransparent);
|
||||||
|
|
||||||
let mainContent = [];
|
let mainContent = [];
|
||||||
if (this.props.DisplaySelectAppPlatform || !this.props.AppReady) {
|
if (this.props.DisplaySelectAppPlatform || !this.props.AppReady) {
|
||||||
@@ -206,7 +209,7 @@ class App extends IPCContainer {
|
|||||||
));
|
));
|
||||||
} else if (selectedVersion !== 'unavailable') {
|
} else if (selectedVersion !== 'unavailable') {
|
||||||
mainContent.push((
|
mainContent.push((
|
||||||
<Box dxStyle={{padding: 'var(--default_spacing)', height: '173px'}}
|
<Box dxStyle={{padding: 'var(--default_spacing)', height: '170px'}}
|
||||||
key={'md_' + key++}>
|
key={'md_' + key++}>
|
||||||
<Loading/>
|
<Loading/>
|
||||||
</Box>
|
</Box>
|
||||||
@@ -252,6 +255,7 @@ class App extends IPCContainer {
|
|||||||
{confirmDisplay}
|
{confirmDisplay}
|
||||||
{downloadDisplay}
|
{downloadDisplay}
|
||||||
{rebootDisplay}
|
{rebootDisplay}
|
||||||
|
{appBusyDisplay}
|
||||||
{errorDisplay}
|
{errorDisplay}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -263,6 +267,8 @@ const mapStateToProps = state => {
|
|||||||
AllowDownload: state.download.AllowDownload,
|
AllowDownload: state.download.AllowDownload,
|
||||||
AllowMount: state.common.AllowMount,
|
AllowMount: state.common.AllowMount,
|
||||||
AppPlatform: state.common.AppPlatform,
|
AppPlatform: state.common.AppPlatform,
|
||||||
|
AppBusy: state.common.AppBusy,
|
||||||
|
AppBusyTransparent: state.common.AppBusyTransparent,
|
||||||
AppReady: state.common.AppReady,
|
AppReady: state.common.AppReady,
|
||||||
DismissDependencies: state.install.DismissDependencies,
|
DismissDependencies: state.install.DismissDependencies,
|
||||||
DisplayConfiguration: state.mounts.DisplayConfiguration,
|
DisplayConfiguration: state.mounts.DisplayConfiguration,
|
||||||
|
|||||||
21
src/components/ApplicationBusy/ApplicationBusy.js
Normal file
21
src/components/ApplicationBusy/ApplicationBusy.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Box from '../UI/Box/Box';
|
||||||
|
import Loader from 'react-loader-spinner';
|
||||||
|
import Text from '../UI/Text/Text';
|
||||||
|
|
||||||
|
export default ({title}) => {
|
||||||
|
return (
|
||||||
|
<Box dxStyle={{padding: 'var(--default_spacing)'}}>
|
||||||
|
<Text
|
||||||
|
text={title || 'Please Wait...'}
|
||||||
|
textAlign={'center'}
|
||||||
|
type={'Heading1'}/>
|
||||||
|
<div style={{paddingLeft: 'calc(50% - 16px)', paddingTop: 'var(--default_spacing)'}}>
|
||||||
|
<Loader color={'var(--heading_text_color)'}
|
||||||
|
height={32}
|
||||||
|
width={32}
|
||||||
|
type='TailSpin'/>
|
||||||
|
</div>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ import React from 'react';
|
|||||||
import './Loading.css'
|
import './Loading.css'
|
||||||
import Loader from 'react-loader-spinner';
|
import Loader from 'react-loader-spinner';
|
||||||
|
|
||||||
export default props => {
|
export default () => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={'Loading'}>
|
className={'Loading'}>
|
||||||
@@ -13,4 +13,4 @@ export default props => {
|
|||||||
type='ThreeDots'/>
|
type='ThreeDots'/>
|
||||||
</div>
|
</div>
|
||||||
</div>);
|
</div>);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,6 +8,10 @@
|
|||||||
z-index: 2000;
|
z-index: 2000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.Modal.Transparent {
|
||||||
|
background-color: rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
.ModalContent {
|
.ModalContent {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
width: auto;
|
width: auto;
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ export default props => {
|
|||||||
contentStyles.push('ModalCritical');
|
contentStyles.push('ModalCritical');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (props.transparent) {
|
||||||
|
modalStyles.push('Transparent');
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FocusTrap active={!props.disableFocusTrap}>
|
<FocusTrap active={!props.disableFocusTrap}>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -1,38 +1,55 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {Component} from 'react';
|
|
||||||
import {connect} from 'react-redux';
|
import {connect} from 'react-redux';
|
||||||
import './SkynetImport.css'
|
import './SkynetImport.css'
|
||||||
import Box from '../../components/UI/Box/Box';
|
import Box from '../../components/UI/Box/Box';
|
||||||
import Button from '../../components/UI/Button/Button';
|
import Button from '../../components/UI/Button/Button';
|
||||||
import {
|
import {displaySkynetImport} from '../../redux/actions/skynet_actions';
|
||||||
displaySkynetImport, importSkylinks
|
//import {ImportList} from './ImportList/ImportList'
|
||||||
} from '../../redux/actions/skynet_actions';
|
import IPCContainer from '../IPCContainer/IPCContainer';
|
||||||
|
import {notifyApplicationBusy} from '../../redux/actions/common_actions';
|
||||||
import {
|
import {
|
||||||
notifyError,
|
notifyError,
|
||||||
notifyInfo
|
notifyInfo
|
||||||
} from '../../redux/actions/error_actions';
|
} from '../../redux/actions/error_actions';
|
||||||
|
|
||||||
|
const Constants = require('../../constants');
|
||||||
|
|
||||||
|
const mapStateToProps = (state, ownProps) => {
|
||||||
|
return {
|
||||||
|
AppBusy: state.common.AppBusy,
|
||||||
|
};
|
||||||
|
};
|
||||||
const mapDispatchToProps = dispatch => {
|
const mapDispatchToProps = dispatch => {
|
||||||
return {
|
return {
|
||||||
displaySkynetImport: display => dispatch(displaySkynetImport(display)),
|
displaySkynetImport: display => dispatch(displaySkynetImport(display)),
|
||||||
notifyInfo: msg => dispatch(notifyInfo('Import Syntax', msg)),
|
notifyApplicationBusy: busy => dispatch(notifyApplicationBusy(busy, true)),
|
||||||
notifyError: msg => dispatch(notifyError(msg)),
|
notifyError: msg => dispatch(notifyError(msg)),
|
||||||
importSkylinks: (version, jsonArray) => dispatch(importSkylinks(version, jsonArray)),
|
notifyInfo: msg => dispatch(notifyInfo('Import Syntax', msg)),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default connect(null, mapDispatchToProps)(class extends Component {
|
export default connect(mapStateToProps, mapDispatchToProps)(class extends IPCContainer {
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
import_list: '',
|
import_text: '',
|
||||||
|
imports_array: [],
|
||||||
|
second_stage: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.setRequestHandler(Constants.IPC_Import_Skylinks_Reply, this.onImportSkylinksReply);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
super.componentWillUnmount();
|
||||||
|
}
|
||||||
|
|
||||||
displaySyntax = () => {
|
displaySyntax = () => {
|
||||||
const msg = '!alternate!To import Skylinks into the root directory, list each Skylink on a new line:\n' +
|
const msg = '!alternate!To import Skylinks into the root directory, list each Skylink on a new line:\n' +
|
||||||
' AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA\n' +
|
' AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA\n' +
|
||||||
' AACyjmDGoHqY7mTaxi-rkpnKUJGZK1B4UhrF74Nv6tY6Cg\n' +
|
' AACyjmDGoHqY7mTaxi-rkpnKUJGZK1B4UhrF74Nv6tY6Cg\n' +
|
||||||
'\n' +
|
'\n' +
|
||||||
'To import Skylinks to new or existing directories, use the following syntax:\n' +
|
'To import Skylinks into new or existing directories, use the following syntax:\n' +
|
||||||
' directory="/my/sub/dir",skylink="AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA"\n' +
|
' directory="/my/sub/dir",skylink="AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA"\n' +
|
||||||
' directory="/my/sub/dir2",skylink="AACyjmDGoHqY7mTaxi-rkpnKUJGZK1B4UhrF74Nv6tY6Cg"\n' +
|
' directory="/my/sub/dir2",skylink="AACyjmDGoHqY7mTaxi-rkpnKUJGZK1B4UhrF74Nv6tY6Cg"\n' +
|
||||||
'\n' +
|
'\n' +
|
||||||
@@ -40,7 +57,7 @@ export default connect(null, mapDispatchToProps)(class extends Component {
|
|||||||
' directory="/my/sub/dir",skylink="AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA",token="My Password"\n' +
|
' directory="/my/sub/dir",skylink="AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA",token="My Password"\n' +
|
||||||
' directory="/my/sub/dir",skylink="AACyjmDGoHqY7mTaxi-rkpnKUJGZK1B4UhrF74Nv6tY6Cg",token="My Password"\n' +
|
' directory="/my/sub/dir",skylink="AACyjmDGoHqY7mTaxi-rkpnKUJGZK1B4UhrF74Nv6tY6Cg",token="My Password"\n' +
|
||||||
'\n' +
|
'\n' +
|
||||||
'To import JSON Skylinks, use the following syntax:\n' +
|
'To import Skylinks using JSON syntax:\n' +
|
||||||
' [\n' +
|
' [\n' +
|
||||||
' {\n' +
|
' {\n' +
|
||||||
' "directory": "/",\n' +
|
' "directory": "/",\n' +
|
||||||
@@ -56,56 +73,87 @@ export default connect(null, mapDispatchToProps)(class extends Component {
|
|||||||
this.props.notifyInfo(msg)
|
this.props.notifyInfo(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onImportSkylinksReply = (_, arg) => {
|
||||||
|
this.props.notifyApplicationBusy(false);
|
||||||
|
if (arg.data.Success) {
|
||||||
|
console.log(arg.data.Result);
|
||||||
|
this.setState({
|
||||||
|
import_text: '',
|
||||||
|
imports_array: [],
|
||||||
|
second_stage: false,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.props.notifyError(arg.data.Error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
processNext = () => {
|
processNext = () => {
|
||||||
const items = this.state.import_list.split('\n');
|
if (this.state.second_stage) {
|
||||||
let importsArray = [];
|
try {
|
||||||
try {
|
this.props.notifyApplicationBusy(true);
|
||||||
for (let item of items) {
|
this.sendRequest(Constants.IPC_Import_Skylinks, {
|
||||||
item = item.trim();
|
Version: this.props.version,
|
||||||
if (item.startsWith('[')) {
|
JsonArray: this.state.imports_array,
|
||||||
importsArray = JSON.parse(this.state.import_list.trim());
|
});
|
||||||
break;
|
} catch (e) {
|
||||||
} else if (item.indexOf('=') >= 0) {
|
this.props.notifyApplicationBusy(false);
|
||||||
const parts = item.split(',')
|
this.props.notifyError(e);
|
||||||
let importItem = {
|
}
|
||||||
directory: '/',
|
} else {
|
||||||
skylink: '',
|
const items = this.state.import_text.split('\n');
|
||||||
token: '',
|
let importsArray = [];
|
||||||
};
|
try {
|
||||||
for (let part of parts) {
|
for (let item of items) {
|
||||||
part = part.trim();
|
item = item.trim();
|
||||||
const pair = part.split('=');
|
if (item.startsWith('[')) {
|
||||||
if (pair.length !== 2) {
|
importsArray = JSON.parse(this.state.import_text.trim());
|
||||||
|
break;
|
||||||
|
} else if (item.indexOf('=') >= 0) {
|
||||||
|
const parts = item.split(',')
|
||||||
|
let importItem = {
|
||||||
|
directory: '/',
|
||||||
|
skylink: '',
|
||||||
|
token: '',
|
||||||
|
};
|
||||||
|
for (let part of parts) {
|
||||||
|
part = part.trim();
|
||||||
|
const pair = part.split('=');
|
||||||
|
if (pair.length !== 2) {
|
||||||
|
throw new Error('Invalid syntax for import: directory="",skylink="",token=""');
|
||||||
|
}
|
||||||
|
importItem = {
|
||||||
|
...importItem,
|
||||||
|
[pair[0].trim()]: pair[1].trim().replace(/"/g, ''),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (!importItem.skylink) {
|
||||||
throw new Error('Invalid syntax for import: directory="",skylink="",token=""');
|
throw new Error('Invalid syntax for import: directory="",skylink="",token=""');
|
||||||
}
|
}
|
||||||
importItem = {
|
importsArray.push(importItem);
|
||||||
...importItem,
|
} else if (item.length > 0) {
|
||||||
[pair[0].trim()]: pair[1].trim().replace(/"/g, ''),
|
importsArray.push({
|
||||||
};
|
directory: '/',
|
||||||
|
skylink: item,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (!importItem.skylink) {
|
|
||||||
throw new Error('Invalid syntax for import: directory="",skylink="",token=""');
|
|
||||||
}
|
|
||||||
importsArray.push(importItem);
|
|
||||||
} else if (item.length > 0) {
|
|
||||||
importsArray.push({
|
|
||||||
directory: '/',
|
|
||||||
skylink: item,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (importsArray.length === 0) {
|
if (importsArray.length === 0) {
|
||||||
throw new Error('Nothing to import');
|
throw new Error('Nothing to import');
|
||||||
|
}
|
||||||
|
this.setState({
|
||||||
|
imports_array: importsArray,
|
||||||
|
second_stage: true,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
this.props.notifyError(e);
|
||||||
}
|
}
|
||||||
this.props.importSkylinks(this.props.version, importsArray);
|
|
||||||
} catch (e) {
|
|
||||||
this.props.notifyError(e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
//<ImportList data={this.state.imports_array}/>
|
||||||
|
return this.props.AppBusy ? (<div/>) : (
|
||||||
<Box dxDark dxStyle={{
|
<Box dxDark dxStyle={{
|
||||||
height: 'auto',
|
height: 'auto',
|
||||||
padding: 'var(--default_spacing)',
|
padding: 'var(--default_spacing)',
|
||||||
@@ -118,15 +166,19 @@ export default connect(null, mapDispatchToProps)(class extends Component {
|
|||||||
style={{cursor: 'pointer'}}>X</a>
|
style={{cursor: 'pointer'}}>X</a>
|
||||||
</div>
|
</div>
|
||||||
<h1 className={'SkynetImportHeading'}>Import List</h1>
|
<h1 className={'SkynetImportHeading'}>Import List</h1>
|
||||||
<textarea autoFocus={true}
|
{
|
||||||
className={'SkynetImportTextArea'}
|
this.state.second_stage ? (
|
||||||
onChange={e => this.setState({
|
<div/>
|
||||||
...this.state,
|
) : (
|
||||||
import_list: e.target.value,
|
<textarea autoFocus={true}
|
||||||
})}
|
className={'SkynetImportTextArea'}
|
||||||
value={this.state.import_list}
|
onChange={e => this.setState({
|
||||||
rows={10}/>
|
import_text: e.target.value,
|
||||||
|
})}
|
||||||
|
value={this.state.import_text}
|
||||||
|
rows={10}/>
|
||||||
|
)
|
||||||
|
}
|
||||||
<div className={'SkynetImportButtons'}>
|
<div className={'SkynetImportButtons'}>
|
||||||
<Button buttonStyles={{height: 'auto', marginTop: 'var(--default_spacing)', width: 'auto'}}
|
<Button buttonStyles={{height: 'auto', marginTop: 'var(--default_spacing)', width: 'auto'}}
|
||||||
clicked={this.displaySyntax}>Import Syntax...</Button>
|
clicked={this.displaySyntax}>Import Syntax...</Button>
|
||||||
@@ -135,7 +187,7 @@ export default connect(null, mapDispatchToProps)(class extends Component {
|
|||||||
marginLeft: 'var(--default_spacing)',
|
marginLeft: 'var(--default_spacing)',
|
||||||
marginTop: 'var(--default_spacing)',
|
marginTop: 'var(--default_spacing)',
|
||||||
width: 'auto'
|
width: 'auto'
|
||||||
}} clicked={this.processNext}>Next</Button>
|
}} clicked={this.processNext}>{this.state.second_stage ? 'Import' : 'Next'}</Button>
|
||||||
</div>
|
</div>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -53,6 +53,17 @@ const handleConfirmYesNo = (show, titleOrConfirmed, resolve) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const NOTIFY_APPLICATION_BUSY = 'common/notifyApplicationBusy';
|
||||||
|
export const notifyApplicationBusy = (busy, transparent) => {
|
||||||
|
return {
|
||||||
|
type: NOTIFY_APPLICATION_BUSY,
|
||||||
|
payload: {
|
||||||
|
busy,
|
||||||
|
transparent
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export const notifyRebootRequired = createAction('common/notifyRebootRequired');
|
export const notifyRebootRequired = createAction('common/notifyRebootRequired');
|
||||||
|
|
||||||
export const rebootSystem = () => {
|
export const rebootSystem = () => {
|
||||||
|
|||||||
@@ -1,27 +1,4 @@
|
|||||||
import {createAction} from '@reduxjs/toolkit';
|
import {createAction} from '@reduxjs/toolkit';
|
||||||
import {getIPCRenderer} from '../../utils';
|
|
||||||
import * as Constants from '../../constants';
|
|
||||||
import {notifyError} from './error_actions';
|
|
||||||
|
|
||||||
export const displaySkynetExport = createAction('skynet/displaySkynetExport');
|
export const displaySkynetExport = createAction('skynet/displaySkynetExport');
|
||||||
export const displaySkynetImport = createAction('skynet/displaySkynetImport');
|
export const displaySkynetImport = createAction('skynet/displaySkynetImport');
|
||||||
|
|
||||||
export const importSkylinks = (version, jsonArray) => {
|
|
||||||
return dispatch => {
|
|
||||||
const ipcRenderer = getIPCRenderer();
|
|
||||||
if (ipcRenderer) {
|
|
||||||
ipcRenderer.once(Constants.IPC_Import_Skylinks_Reply, (_, arg) => {
|
|
||||||
if (arg.data.Success) {
|
|
||||||
|
|
||||||
} else {
|
|
||||||
dispatch(notifyError(arg.data.Error));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
ipcRenderer.send(Constants.IPC_Import_Skylinks, {
|
|
||||||
Version: version,
|
|
||||||
JsonArray: jsonArray,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import {createReducer} from '@reduxjs/toolkit';
|
import {createReducer} from '@reduxjs/toolkit';
|
||||||
import {
|
import {
|
||||||
DISPLAY_CONFIRM_YES_NO,
|
DISPLAY_CONFIRM_YES_NO,
|
||||||
|
NOTIFY_APPLICATION_BUSY,
|
||||||
notifyRebootRequired,
|
notifyRebootRequired,
|
||||||
setAllowMount,
|
setAllowMount,
|
||||||
setApplicationReady,
|
setApplicationReady,
|
||||||
@@ -11,6 +12,8 @@ import {
|
|||||||
export const createCommonReducer = (platformInfo, version) => {
|
export const createCommonReducer = (platformInfo, version) => {
|
||||||
return createReducer({
|
return createReducer({
|
||||||
AllowMount: false,
|
AllowMount: false,
|
||||||
|
AppBusy: false,
|
||||||
|
AppBusyTransparent: false,
|
||||||
AppPlatform: platformInfo.AppPlatform,
|
AppPlatform: platformInfo.AppPlatform,
|
||||||
AppReady: false,
|
AppReady: false,
|
||||||
DisplayConfirmYesNo: false,
|
DisplayConfirmYesNo: false,
|
||||||
@@ -51,6 +54,13 @@ export const createCommonReducer = (platformInfo, version) => {
|
|||||||
AppPlatform: action.payload,
|
AppPlatform: action.payload,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
[NOTIFY_APPLICATION_BUSY]: (state, action) => {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
AppBusy: action.payload.busy,
|
||||||
|
AppBusyTransparent: action.payload.busy && action.payload.transparent,
|
||||||
|
};
|
||||||
|
},
|
||||||
[notifyRebootRequired]: (state, action) => {
|
[notifyRebootRequired]: (state, action) => {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ export const checkNewReleases = selectedVersion => {
|
|||||||
return [];
|
return [];
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createModalConditionally = (condition, jsx, critical, disableFocusTrap) => {
|
export const createModalConditionally = (condition, jsx, critical, disableFocusTrap, transparent) => {
|
||||||
const modalProps = {critical: critical, disableFocusTrap: disableFocusTrap};
|
const modalProps = {critical: critical, disableFocusTrap: disableFocusTrap, transparent: transparent};
|
||||||
return condition ? (<Modal {...modalProps}>{jsx}</Modal>) : null;
|
return condition ? (<Modal {...modalProps}>{jsx}</Modal>) : null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user