import { NgModule, ReflectiveInjector } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { StoreModule } from '@ngrx/store'; import { DragulaModule } from 'ng2-dragula/ng2-dragula'; import { Select2Component } from 'ng2-select2/ng2-select2'; import { AddOnComponent } from './components/add-on'; import { KeymapAddComponent, KeymapComponent, KeymapHeaderComponent } from './components/keymap'; import { LayersComponent } from './components/layers'; import { MacroActionEditorComponent, MacroAddComponent, MacroComponent, MacroDelayTabComponent, MacroHeaderComponent, MacroItemComponent, MacroKeyTabComponent, MacroMouseTabComponent, MacroTextTabComponent } from './components/macro'; import { NotificationComponent } from './components/notification'; import { PopoverComponent } from './components/popover'; import { KeymapTabComponent, KeypressTabComponent, LayerTabComponent, MacroTabComponent, MouseTabComponent, NoneTabComponent } from './components/popover/tab'; import { CaptureKeystrokeButtonComponent } from './components/popover/widgets/capture-keystroke'; import { IconComponent } from './components/popover/widgets/icon'; import { SettingsComponent } from './components/settings'; import { SideMenuComponent } from './components/side-menu'; import { SvgKeyboardComponent } from './components/svg/keyboard'; import { SvgIconTextKeyComponent, SvgKeyboardKeyComponent, SvgKeystrokeKeyComponent, SvgOneLineTextKeyComponent, SvgSingleIconKeyComponent, SvgSwitchKeymapKeyComponent, SvgTextIconKeyComponent, SvgTwoLineTextKeyComponent } from './components/svg/keys'; import { SvgModuleComponent } from './components/svg/module'; import { SvgKeyboardWrapComponent } from './components/svg/wrap'; import { MainAppComponent, appRoutingProviders, routing } from './main-app'; import { DataProviderService } from './services/data-provider.service'; import { MapperService } from './services/mapper.service'; import { UhkConfigurationService } from './services/uhk-configuration.service'; import { DataStorage } from './store/storage'; import { StoreDevtoolsModule } from '@ngrx/store-devtools'; import { StoreLogMonitorModule, useLogMonitor } from '@ngrx/store-log-monitor'; import { keymapReducer, macroReducer, presetReducer } from './store/reducers'; // Create DataStorage dependency injection const storageProvider = ReflectiveInjector.resolve([DataStorage]); const storageInjector = ReflectiveInjector.fromResolvedProviders(storageProvider); const storageService: DataStorage = storageInjector.get(DataStorage); // All reducers that are used in application const storeConfig = { keymaps: storageService.saveSate(keymapReducer), macros: storageService.saveSate(macroReducer), presetKeymaps: presetReducer }; @NgModule({ declarations: [ Select2Component, MainAppComponent, KeymapComponent, KeymapHeaderComponent, NotificationComponent, SvgIconTextKeyComponent, SvgKeyboardKeyComponent, SvgKeystrokeKeyComponent, SvgOneLineTextKeyComponent, SvgSingleIconKeyComponent, SvgSwitchKeymapKeyComponent, SvgTextIconKeyComponent, SvgTwoLineTextKeyComponent, SvgKeyboardKeyComponent, SvgKeyboardWrapComponent, SvgKeyboardComponent, SvgModuleComponent, LayersComponent, PopoverComponent, KeymapAddComponent, SideMenuComponent, KeypressTabComponent, KeymapTabComponent, LayerTabComponent, MacroTabComponent, MouseTabComponent, NoneTabComponent, CaptureKeystrokeButtonComponent, IconComponent, MacroComponent, MacroHeaderComponent, MacroAddComponent, MacroItemComponent, MacroActionEditorComponent, MacroDelayTabComponent, MacroKeyTabComponent, MacroMouseTabComponent, MacroTextTabComponent, AddOnComponent, SettingsComponent ], imports: [ BrowserModule, FormsModule, DragulaModule, routing, StoreModule.provideStore(storeConfig, storageService.initialState()), StoreDevtoolsModule.instrumentStore({ monitor: useLogMonitor({ visible: false, position: 'right' }) }), StoreLogMonitorModule ], providers: [ DataProviderService, UhkConfigurationService, MapperService, appRoutingProviders ], bootstrap: [MainAppComponent] }) export class AppModule { }