obsidian-micropub/src/MicroPlugin.ts

136 lines
4.2 KiB
TypeScript

import { ErrorView } from '@views/ErrorView'
import { Editor, Notice, Plugin } from 'obsidian'
import { MicroPluginContainerInterface, MicroPluginContainer } from '@base/MicroPluginContainer'
import { MicroPluginSettingsView } from '@views/MicroPluginSettingsView'
import { PublishView } from '@views/PublishView'
import { ServiceFactory, ServiceFactoryInterface } from '@factories/ServiceFactory'
import { StoredSettings, defaultSettings } from '@stores/StoredSettings'
import { TagSynchronizationServiceDelegate, TagSynchronizationServiceInterface } from '@services/TagSynchronizationService'
import { ViewModelFactoryInterface, ViewModelFactory } from '@factories/ViewModelFactory'
import { FrontmatterServiceDelegate, FrontmatterServiceInterface } from './services/FrontmatterService'
import { PublishResponse } from './networking/PublishResponse'
export default class MicroPlugin extends Plugin implements TagSynchronizationServiceDelegate {
// Properties
private settings: StoredSettings
private container: MicroPluginContainerInterface
private viewModelFactory: ViewModelFactoryInterface
private serviceFactory: ServiceFactoryInterface
private synchronizationService: TagSynchronizationServiceInterface
private frontmatterService: FrontmatterServiceInterface
// Public
public async onload() {
await this.loadSettings()
await this.loadDependencies()
await this.loadServiceFactory()
await this.registerSynchronizationService()
await this.registerFrontmatterService()
await this.loadViewModelFactory()
this.synchronizationService.fetchTags()
this.addCommand({
id: 'micropub-publish-command',
name: 'Post with Micropub',
editorCallback: (editor, markdownView) => {
if (editor.getValue().trim().length == 0) {
new ErrorView(
this.viewModelFactory.makeEmptyPostErrorViewModel()
).open()
} else {
new PublishView(
this.viewModelFactory.makePublishViewModel(
markdownView.file.basename,
editor.getValue(),
editor
)
).open()
}
}
})
this.addCommand({
id: 'micropub-categories-sync-command',
name: 'Synchronize Categories',
callback: () => {
this.synchronizationService.fetchTags()
}
})
this.addSettingTab(
new MicroPluginSettingsView(
this.viewModelFactory.makeMicroPluginSettingsViewModel()
)
)
}
public onunload() { }
public async saveSettings() {
await this.saveData(this.settings)
}
// Private
private async loadSettings() {
this.settings = Object.assign(
{},
defaultSettings,
await this.loadData()
)
}
private async loadDependencies() {
this.container = new MicroPluginContainer(
this.settings,
this
)
}
private async loadViewModelFactory() {
this.viewModelFactory = new ViewModelFactory(
this.container,
this.frontmatterService
)
}
private async loadServiceFactory() {
this.serviceFactory = new ServiceFactory(
this.container
)
}
private async registerSynchronizationService() {
this.synchronizationService = this.serviceFactory
.makeTagSynchronizationService(
this
)
}
private async registerFrontmatterService() {
this.frontmatterService = this.serviceFactory
.makeFrontmatterService()
}
// TagSynchronizationServiceDelegate
public tagSynchronizationDidSucceed(
count: number
) {
new Notice(
'Categories synchronized. Found ' + count + ' categories'
)
}
public tagSynchronizationDidFail(
error: Error
) {
new Notice(
'Error synchronizing categories'
)
}
}