@paperbits/core
Version:
Paperbits core components.
109 lines (93 loc) • 4.06 kB
text/typescript
import * as ko from "knockout";
import template from "./settings.html";
import { Component, OnMounted } from "@paperbits/common/ko/decorators";
import { ISiteService, SiteSettingsContract } from "@paperbits/common/sites";
import { IMediaService, MediaContract } from "@paperbits/common/media";
import { MetaDataSetter } from "@paperbits/common/meta/metaDataSetter";
import { BackgroundModel } from "@paperbits/common/widgets/background";
export class SettingsWorkshop {
public readonly working: ko.Observable<boolean>;
public readonly title: ko.Observable<string>;
public readonly description: ko.Observable<string>;
public readonly keywords: ko.Observable<string>;
public readonly hostname: ko.Observable<string>;
public readonly author: ko.Observable<string>;
public readonly faviconSourceKey: ko.Observable<string>;
public readonly faviconFileName: ko.Observable<string>;
public readonly favicon: ko.Observable<BackgroundModel>;
constructor(
private readonly mediaService: IMediaService,
private readonly siteService: ISiteService
) {
this.working = ko.observable<boolean>();
this.title = ko.observable<string>();
this.description = ko.observable<string>();
this.keywords = ko.observable<string>();
this.hostname = ko.observable<string>();
this.author = ko.observable<string>();
this.faviconSourceKey = ko.observable<string>();
this.faviconFileName = ko.observable<string>();
this.favicon = ko.observable<BackgroundModel>();
}
public async initialize(): Promise<void> {
this.working(true);
const siteSettings = await this.siteService.getSetting<SiteSettingsContract>("site");
if (siteSettings) {
this.title(siteSettings.title);
this.description(siteSettings.description);
this.keywords(siteSettings.keywords);
this.hostname(siteSettings.hostname);
this.author(siteSettings.author);
this.faviconSourceKey(siteSettings.faviconSourceKey);
this.setFaviconUri(siteSettings.faviconSourceKey);
}
this.working(false);
this.title.subscribe(this.onSettingChange);
this.description.subscribe(this.onSettingChange);
this.keywords.subscribe(this.onSettingChange);
this.hostname.subscribe(this.onSettingChange);
this.author.subscribe(this.onSettingChange);
this.faviconSourceKey.subscribe(this.onSettingChange);
}
private async onSettingChange(): Promise<void> {
const siteSettings: SiteSettingsContract = {
title: this.title(),
description: this.description(),
keywords: this.keywords(),
hostname: this.hostname(),
faviconSourceKey: this.faviconSourceKey(),
author: this.author()
};
await this.siteService.setSetting("site", siteSettings);
}
public onMediaSelected(media: MediaContract): void {
if (media) {
this.faviconSourceKey(media.key);
this.setFaviconUri(media.key);
}
else {
this.faviconFileName(null);
this.faviconSourceKey(null);
}
}
private async setFaviconUri(sourceKey: string): Promise<void> {
if (!sourceKey) {
return;
}
const mediaContract = await this.mediaService.getMediaByKey(sourceKey);
if (!mediaContract) {
console.warn(`Unable to fetch favicon by key ${sourceKey}.`);
return;
}
this.faviconFileName(mediaContract.downloadUrl);
MetaDataSetter.setFavIcon(mediaContract.downloadUrl);
const faviconModel = new BackgroundModel();
faviconModel.sourceUrl = mediaContract.downloadUrl;
this.favicon(faviconModel);
}
}