/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import * as yaml from 'js-yaml' import { debounce } from 'utils-decorators/dist/esm/debounce/debounce' import { Component, Inject, Input, HostBinding, NgZone } from '@angular/core' import { ConfigService, BaseTabComponent, HostAppService, Platform, HomeBaseService, UpdaterService, PlatformService, HostWindowService, AppService, LocaleService, TranslateService, } from 'tabby-core' import { SettingsTabProvider } from '../api' import { ReleaseNotesComponent } from './releaseNotesTab.component' /** @hidden */ @Component({ selector: 'settings-tab', template: require('./settingsTab.component.pug'), styles: [ require('./settingsTab.component.scss'), ], }) export class SettingsTabComponent extends BaseTabComponent { @Input() activeTab: string Platform = Platform configDefaults: any configFile: string isShellIntegrationInstalled = false checkingForUpdate = false updateAvailable = false showConfigDefaults = false @HostBinding('class.pad-window-controls') padWindowControls = false constructor ( public config: ConfigService, public hostApp: HostAppService, public hostWindow: HostWindowService, public homeBase: HomeBaseService, public platform: PlatformService, public zone: NgZone, public locale: LocaleService, private updater: UpdaterService, private app: AppService, @Inject(SettingsTabProvider) public settingsProviders: SettingsTabProvider[], translate: TranslateService, ) { super() this.setTitle(translate.instant('Settings')) this.settingsProviders = config.enabledServices(this.settingsProviders) this.settingsProviders = this.settingsProviders.filter(x => !!x.getComponentType()) this.settingsProviders.sort((a, b) => a.weight - b.weight + a.title.localeCompare(b.title)) this.configDefaults = yaml.dump(config.getDefaults()) const onConfigChange = () => { this.configFile = config.readRaw() this.padWindowControls = hostApp.platform === Platform.macOS && config.store.appearance.tabsLocation !== 'top' } this.subscribeUntilDestroyed(config.changed$, onConfigChange) onConfigChange() } async ngOnInit () { this.isShellIntegrationInstalled = await this.platform.isShellIntegrationInstalled() } async toggleShellIntegration () { if (!this.isShellIntegrationInstalled) { await this.platform.installShellIntegration() } else { await this.platform.uninstallShellIntegration() } this.isShellIntegrationInstalled = await this.platform.isShellIntegrationInstalled() } ngOnDestroy () { this.config.save() } restartApp () { this.hostApp.relaunch() } @debounce(500) saveConfiguration (requireRestart?: boolean) { this.config.save() if (requireRestart) { this.config.requestRestart() } } saveConfigFile () { if (this.isConfigFileValid()) { this.config.writeRaw(this.configFile) } } showConfigFile () { this.platform.showItemInFolder(this.platform.getConfigPath()!) } isConfigFileValid () { try { yaml.load(this.configFile) return true } catch (_) { return false } } async checkForUpdates () { this.checkingForUpdate = true this.updateAvailable = await this.updater.check() this.checkingForUpdate = false } showReleaseNotes () { this.app.openNewTabRaw({ type: ReleaseNotesComponent, }) } }