tabby/tabby-settings/src/components/settingsTab.component.ts
2022-01-08 16:03:01 +01:00

132 lines
3.8 KiB
TypeScript

/* 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,
})
}
}