feat(user-config): Upload user configuration from json/bin file (#545)

* feat(user-config): Upload user configuration from json/bin file

* fix error message

* remove file extension filter

* apply user config after loaded from file

* add file filter

* remove file filter
This commit is contained in:
Róbert Kiss
2018-01-08 05:29:31 +01:00
committed by László Monda
parent b3f2e3451e
commit f0139c55ee
8 changed files with 117 additions and 9 deletions
@@ -162,7 +162,7 @@ export class DeviceEffects {
});
@Effect() saveResetUserConfigurationToDevice$ = this.actions$
.ofType(UserConfigActions.LOAD_RESET_USER_CONFIGURATION)
.ofType(UserConfigActions.LOAD_RESET_USER_CONFIGURATION, UserConfigActions.APPLY_USER_CONFIGURATION_FROM_FILE)
.switchMap(() => Observable.of(new SaveConfigurationAction()));
@Effect({dispatch: false}) updateFirmware$ = this.actions$
@@ -15,12 +15,21 @@ import 'rxjs/add/observable/of';
import 'rxjs/add/observable/empty';
import {
ConfigurationReply, HardwareConfiguration, LogService, NotificationType, UhkBuffer,
ConfigurationReply,
HardwareConfiguration,
LogService,
NotificationType,
UhkBuffer,
UserConfiguration
} from 'uhk-common';
import {
ActionTypes, LoadConfigFromDeviceReplyAction, LoadUserConfigSuccessAction, RenameUserConfigurationAction,
ActionTypes,
ApplyUserConfigurationFromFileAction,
LoadConfigFromDeviceReplyAction,
LoadUserConfigSuccessAction,
LoadUserConfigurationFromFileAction,
RenameUserConfigurationAction,
SaveUserConfigSuccessAction
} from '../actions/user-config';
@@ -29,12 +38,15 @@ import { DefaultUserConfigurationService } from '../../services/default-user-con
import { AppState, autoWriteUserConfiguration, getPrevUserConfiguration, getUserConfiguration } from '../index';
import { KeymapAction, KeymapActions, MacroAction, MacroActions } from '../actions';
import {
DismissUndoNotificationAction, LoadHardwareConfigurationSuccessAction, ShowNotificationAction,
DismissUndoNotificationAction,
LoadHardwareConfigurationSuccessAction,
ShowNotificationAction,
UndoLastAction
} from '../actions/app';
import { SaveConfigurationAction, ShowSaveToKeyboardButtonAction } from '../actions/device';
import { DeviceRendererService } from '../../services/device-renderer.service';
import { UndoUserConfigData } from '../../models/undo-user-config-data';
import { UploadFileData } from '../../models/upload-file-data';
@Injectable()
export class UserConfigEffects {
@@ -198,6 +210,38 @@ export class UserConfigEffects {
}
});
@Effect() loadUserConfigurationFromFile$ = this.actions$
.ofType<LoadUserConfigurationFromFileAction>(ActionTypes.LOAD_USER_CONFIGURATION_FROM_FILE)
.map(action => action.payload)
.map((info: UploadFileData) => {
try {
const userConfig = new UserConfiguration();
if (info.filename.endsWith('.bin')) {
userConfig.fromBinary(UhkBuffer.fromArray(info.data));
}
else {
const buffer = new Buffer(info.data);
const json = buffer.toString();
userConfig.fromJsonObject(JSON.parse(json));
}
if (userConfig.userConfigMajorVersion) {
return new ApplyUserConfigurationFromFileAction(userConfig);
}
return new ShowNotificationAction({
type: NotificationType.Error,
message: 'Invalid configuration specified.'
});
} catch (err) {
return new ShowNotificationAction({
type: NotificationType.Error,
message: 'Invalid configuration specified.'
});
}
});
constructor(private actions$: Actions,
private dataStorageRepository: DataStorageRepositoryService,
private store: Store<AppState>,