Skip to content

Commit

Permalink
Replaced ToastError with more generic UserError.
Browse files Browse the repository at this point in the history
Same as ToastError, the UserError is supposed to deliver messages to end-users. However, the UserError is being abstracted from UI, so it can be used in components like publishers, where it can be collected and delivered to users through other channels.
  • Loading branch information
azaslonov committed Sep 21, 2024
1 parent eb3b706 commit 5199b60
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 49 deletions.
2 changes: 1 addition & 1 deletion src/ko/ui/defaultViewManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,7 @@ export class DefaultViewManager implements ViewManager {

this.openViewAsPopup(view);

this.eventManager.dispatchEvent("displayHint", {
this.eventManager.dispatchEvent(Events.HintRequest, {
key: "fe7c",
content: `You can resize and move almost every editor, and it will remember its size and position.`
});
Expand Down
4 changes: 2 additions & 2 deletions src/workshops/layout/ko/layoutDetails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { ViewManager } from "@paperbits/common/ui";
import { ILayoutService } from "@paperbits/common/layouts/";
import { LayoutItem } from "./layoutItem";
import { Component, Param, Event, OnMounted } from "@paperbits/common/ko/decorators";
import { EventManager } from "@paperbits/common/events";
import { EventManager, Events } from "@paperbits/common/events";

@Component({
selector: "layout-details-workshop",
Expand Down Expand Up @@ -58,7 +58,7 @@ export class LayoutDetails {

this.viewManager.setHost({ name: "layout-host", params: { layoutKey: this.layoutItem.key } });

this.eventManager.dispatchEvent("displayHint", {
this.eventManager.dispatchEvent(Events.HintRequest, {
key: "48f5",
content: `<p>You may have different page layouts for different parts of your website. Which layout gets applied at a given moment is determined by matching its URL template to URL of the current page.</p><p>Press Escape button to get back to the page editing.</p>`
});
Expand Down
42 changes: 22 additions & 20 deletions src/workshops/media/ko/media.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
import * as Utils from "@paperbits/common/utils";
import template from "./media.html";
import { IMediaService } from "@paperbits/common/media";
import { ViewManager, View, ToastError } from "@paperbits/common/ui";
import { ViewManager, View } from "@paperbits/common/ui";
import { MediaItem, defaultFileName, defaultURL } from "./mediaItem";
import { MediaContract } from "@paperbits/common/media/mediaContract";
import { EventManager } from "@paperbits/common/events";
import { EventManager, Events } from "@paperbits/common/events";
import { Component, OnMounted } from "@paperbits/common/ko/decorators";
import { ChangeRateLimit } from "@paperbits/common/ko/consts";
import { Query, Operator, Page } from "@paperbits/common/persistence";
import { MimeTypes } from "@paperbits/common";
import { UserError } from "@paperbits/common/errors";

@Component({
selector: "media",
Expand Down Expand Up @@ -79,7 +80,7 @@ export class MediaWorkshop {
}

public async uploadMedia(): Promise<void> {
this.eventManager.dispatchEvent("displayHint", {
this.eventManager.dispatchEvent(Events.HintRequest, {
key: "88d9",
content: `You may upload pictures, videos and other files just by dropping them anywhere in editor window and even make respective widget out of them.`
});
Expand All @@ -90,28 +91,29 @@ export class MediaWorkshop {

const uploadPromises = [];

for (const file of files) {
const content = await Utils.readFileAsByteArray(file);
const uploadPromise = this.mediaService.createMedia(file.name, content, file.type);
try {
for (const file of files) {
const content = await Utils.readFileAsByteArray(file);
const uploadPromise = this.mediaService.createMedia(file.name, content, file.type);

this.viewManager.notifyProgress(uploadPromise, "Media library", `Uploading ${file.name}...`);
uploadPromises.push(uploadPromise);
}
this.viewManager.notifyProgress(uploadPromise, "Media library", `Uploading ${file.name}...`);
uploadPromises.push(uploadPromise);
}

try {
await Promise.all<MediaContract>(uploadPromises);
} catch (error) {
if (error instanceof ToastError) {
const info: ToastError = error;
info.showError(this.viewManager);
} else {
this.viewManager.notifyError("Media library", `Unable to upload media: ${error.message}`);
await this.searchMedia();
}
catch (error) {
if (error instanceof UserError) {
this.viewManager.notifyError("Media library", error.message);
}
else {
throw error;
}
}

await this.searchMedia();

this.working(false);
finally {
this.working(false);
}
}

public async linkMedia(): Promise<void> {
Expand Down
47 changes: 26 additions & 21 deletions src/workshops/media/ko/mediaSelector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ import * as Utils from "@paperbits/common/utils";
import template from "./mediaSelector.html";
import { MediaItem } from "./mediaItem";
import { IMediaService, MediaContract } from "@paperbits/common/media";
import { ViewManager, ToastError } from "@paperbits/common/ui";
import { ViewManager } from "@paperbits/common/ui";
import { Component, Param, Event, OnMounted } from "@paperbits/common/ko/decorators";
import { HyperlinkModel } from "@paperbits/common/permalinks/hyperlinkModel";
import { ChangeRateLimit } from "@paperbits/common/ko/consts";
import { Query, Operator, Page } from "@paperbits/common/persistence";
import { UserError } from "@paperbits/common/errors";

@Component({
selector: "media-selector",
Expand Down Expand Up @@ -120,31 +121,35 @@ export class MediaSelector {

const uploadPromises = [];

for (const file of files) {
const content = await Utils.readFileAsByteArray(file);
const uploadPromise = this.mediaService.createMedia(file.name, content, file.type);
try {
for (const file of files) {
const content = await Utils.readFileAsByteArray(file);
const uploadPromise = this.mediaService.createMedia(file.name, content, file.type);

this.viewManager.notifyProgress(uploadPromise, "Media library", `Uploading ${file.name}...`);
uploadPromises.push(uploadPromise);
}

let results: MediaContract[] = [];

this.viewManager.notifyProgress(uploadPromise, "Media library", `Uploading ${file.name}...`);
uploadPromises.push(uploadPromise);
}

let results: MediaContract[] = [];
try {
results = await Promise.all<MediaContract>(uploadPromises);
} catch (error) {
if (error instanceof ToastError) {
const info: ToastError = error;
info.showError(this.viewManager);
} else {
this.viewManager.notifyError("Media library", `Unable to upload media: ${error.message}`);
await this.searchMedia();

const mediaItem = new MediaItem(results[0]);
this.selectMedia(mediaItem);
}
catch (error) {
if (error instanceof UserError) {
this.viewManager.notifyError("Media library", error.message);
}
else {
throw error;
}
}
await this.searchMedia();

const mediaItem = new MediaItem(results[0]);
this.selectMedia(mediaItem);

this.working(false);
finally {
this.working(false);
}
}

public isSelected(media: MediaItem): boolean {
Expand Down
2 changes: 1 addition & 1 deletion src/workshops/navigation/ko/navigation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ export class NavigationWorkshop {

rootViewModel.onUpdate.subscribe(this.onNavigationUpdate);

this.eventManager.dispatchEvent("displayHint", {
this.eventManager.dispatchEvent(Events.HintRequest, {
key: "b300",
content: `You can manage the navigation structure of the entire website in one place. Specific nodes of this structure can be assigned to navigation widgets like a Menu.`
});
Expand Down
4 changes: 2 additions & 2 deletions src/workshops/page/ko/pageDetails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { ISettingsProvider } from "@paperbits/common/configuration";
import { BackgroundModel } from "@paperbits/common/widgets/background";
import { MediaContract, IMediaService } from "@paperbits/common/media";
import { ILocaleService } from "@paperbits/common/localization";
import { EventManager } from "@paperbits/common/events";
import { EventManager, Events } from "@paperbits/common/events";

@Component({
selector: "page-details-workshop",
Expand Down Expand Up @@ -97,7 +97,7 @@ export class PageDetailsWorkshop {
await this.router.navigateTo(validPermalink());
this.viewManager.setHost({ name: "page-host" });

this.eventManager.dispatchEvent("displayHint", {
this.eventManager.dispatchEvent(Events.HintRequest, {
key: "41d9",
content: `If you change the permalink of a page, all hyperlinks pointing to it will be automatically updated everywhere on your website.`
});
Expand Down
2 changes: 1 addition & 1 deletion src/workshops/popups/ko/popupDetails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export class PopupDetailsWorkshop {
this.viewManager.clearJourney();
this.viewManager.closeView();

this.eventManager.dispatchEvent("displayHint", {
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.`
});
Expand Down
2 changes: 1 addition & 1 deletion src/workshops/popups/ko/popupHyperlinkDetails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export class PopupHyperlinkDetails {
this.viewManager.clearJourney();
this.viewManager.closeView();

this.eventManager.dispatchEvent("displayHint", {
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.`
});
Expand Down

0 comments on commit 5199b60

Please sign in to comment.