@paperbits/core
Version:
Paperbits core components.
109 lines (88 loc) • 3.98 kB
text/typescript
import * as ko from "knockout";
import template from "./popupDetails.html";
import * as Utils from "@paperbits/common/utils";
import { IPopupService } from "@paperbits/common/popups";
import { Router } from "@paperbits/common/routing";
import { ViewManager } from "@paperbits/common/ui";
import { Component, Param, Event, OnMounted } from "@paperbits/common/ko/decorators";
import { PopupItem } from "./popupItem";
import { BackgroundModel } from "@paperbits/common/widgets/background";
import { ILocaleService } from "@paperbits/common/localization";
import { EventManager, Events } from "@paperbits/common/events";
export class PopupDetailsWorkshop {
public readonly isReserved: ko.Observable<boolean>;
public readonly isSeoEnabled: ko.Observable<boolean>;
public readonly socialShareImage: ko.Observable<BackgroundModel>;
constructor(
private readonly popupService: IPopupService,
private readonly router: Router,
private readonly viewManager: ViewManager,
private readonly reservedPermalinks: string[],
private readonly localeService: ILocaleService,
private readonly eventManager: EventManager
) {
this.isReserved = ko.observable(false);
this.isSeoEnabled = ko.observable(false);
this.socialShareImage = ko.observable();
}
public popupItem: PopupItem;
private readonly onDeleteCallback: () => void;
private readonly onCopyCallback: (popupItem: PopupItem) => void;
public async onMounted(): Promise<void> {
this.popupItem.title
.extend(<any>{ required: true, onlyValid: true })
.subscribe(this.applyChanges);
this.popupItem.description
.subscribe(this.applyChanges);
let validPermalink = this.popupItem.permalink;
if (this.reservedPermalinks.includes(this.popupItem.permalink())) {
this.isReserved(true);
}
else {
validPermalink = validPermalink.extend(<any>{ required: true, isValidPopup: true, onlyValid: true });
validPermalink.subscribe(this.applyChanges);
}
const locale = await this.localeService.getCurrentLocaleCode();
const defaultLocale = await this.localeService.getDefaultLocaleCode();
if (locale !== defaultLocale) {
this.isReserved(true);
}
}
public openPopup(): void {
const hostDocument = this.viewManager.getHostDocument();
hostDocument.dispatchEvent(new CustomEvent(Events.PopupRequest, { detail: this.popupItem.key }));
this.viewManager.clearContextualCommands();
this.viewManager.clearJourney();
this.viewManager.closeView();
this.eventManager.dispatchEvent(Events.HintRequest, {
key: "4de8",
content: `You can open a popup anytime by clicking on its trigger holding Ctrl (Windows) or ⌘ (Mac) key.`
});
}
private async applyChanges(): Promise<void> {
await this.popupService.updatePopup(this.popupItem.toContract());
}
public async deletePopup(): Promise<void> {
await this.popupService.deletePopup(this.popupItem.toContract());
this.viewManager.notifySuccess("Popups", `Popup "${Utils.truncate(this.popupItem.title(), 50)}" was deleted.`);
this.viewManager.closeWorkshop("popup-details-workshop");
if (this.onDeleteCallback) {
this.onDeleteCallback();
}
this.router.navigateTo("/");
}
public async copyPopup(): Promise<void> {
const copiedPopup = await this.popupService.copyPopup(this.popupItem.key);
if (this.onCopyCallback) {
this.onCopyCallback(new PopupItem(copiedPopup));
}
}
}