Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
export class UmbPreviewExitElement extends UmbLitElement {
async #onClick() {
const previewContext = await this.getContext(UMB_PREVIEW_CONTEXT);
await previewContext?.exitPreview(0);
await previewContext?.exitPreview();
}

override render() {
Expand Down
62 changes: 6 additions & 56 deletions src/Umbraco.Web.UI.Client/src/apps/preview/preview.context.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
import { tryExecute } from '@umbraco-cms/backoffice/resources';

Check warning on line 1 in src/Umbraco.Web.UI.Client/src/apps/preview/preview.context.ts

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (v17/dev)

❌ New issue: Overall Code Complexity

This module has a mean cyclomatic complexity of 5.20 across 10 functions. The mean complexity threshold is 4. This file has many conditional statements (e.g. if, for, while) across its implementation, leading to lower code health. Avoid adding more conditionals.
import { umbConfirmModal } from '@umbraco-cms/backoffice/modal';
import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api';
import { HubConnectionBuilder } from '@umbraco-cms/backoffice/external/signalr';
import { UmbBooleanState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
import { UmbDocumentPreviewRepository } from '@umbraco-cms/backoffice/document';
import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api';
import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification';
import { UMB_SERVER_CONTEXT } from '@umbraco-cms/backoffice/server';
import type { HubConnection } from '@umbraco-cms/backoffice/external/signalr';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { HubConnectionBuilder, type HubConnection } from '@umbraco-cms/backoffice/external/signalr';
import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification';
import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api';

const UMB_LOCALSTORAGE_SESSION_KEY = 'umb:previewSessions';

interface UmbPreviewIframeArgs {
className?: string;
Expand Down Expand Up @@ -133,10 +131,6 @@
return urlInfo.url.startsWith('/') ? `${this.#serverUrl}${urlInfo.url}` : urlInfo.url;
}

#getSessionCount(): number {
return Math.max(Number(localStorage.getItem(UMB_LOCALSTORAGE_SESSION_KEY)), 0) || 0;
}

#setPreviewUrl(args?: UmbPreviewUrlArgs) {
const host = args?.serverUrl || this.#serverUrl;
const unique = args?.unique || this.#unique;
Expand Down Expand Up @@ -179,35 +173,8 @@
this.#previewUrl.setValue(previewUrlString);
}

#setSessionCount(sessions: number) {
localStorage.setItem(UMB_LOCALSTORAGE_SESSION_KEY, sessions.toString());
}

checkSession() {
const sessions = this.#getSessionCount();
if (sessions > 0) return;

umbConfirmModal(this._host, {
headline: `Preview website?`,
content: `You have ended preview mode, do you want to enable it again to view the latest saved version of your website?`,
cancelLabel: 'View published version',
confirmLabel: 'Preview latest version',
})
.then(() => {
this.restartSession();
})
.catch(() => {
this.exitSession();
});
}

async exitPreview(sessions: number = 0) {
this.#setSessionCount(sessions);

// We are good to end preview mode.
if (sessions <= 0) {
await this.#documentPreviewRepository.exit();
}
async exitPreview() {
await this.#documentPreviewRepository.exit();

if (this.#connection) {
await this.#connection.stop();
Expand All @@ -223,12 +190,6 @@
window.location.replace(url);
}

async exitSession() {
let sessions = this.#getSessionCount();
sessions--;
this.exitPreview(sessions);
}

iframeLoaded(iframe: HTMLIFrameElement) {
if (!iframe) return;
this.#iframeReady.setValue(true);
Expand All @@ -255,17 +216,6 @@
document.location.reload();
}

async restartSession() {
await this.#documentPreviewRepository.enter();
this.startSession();
}

startSession() {
let sessions = this.#getSessionCount();
sessions++;
this.#setSessionCount(sessions);
}

#currentArgs: UmbPreviewIframeArgs = {};
async updateIFrame(args?: UmbPreviewIframeArgs) {
const mergedArgs = { ...this.#currentArgs, ...args };
Expand Down
21 changes: 0 additions & 21 deletions src/Umbraco.Web.UI.Client/src/apps/preview/preview.element.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,6 @@ export class UmbPreviewElement extends UmbLitElement {
this.observe(this.#context.previewUrl, (previewUrl) => (this._previewUrl = previewUrl));
}

override connectedCallback() {
super.connectedCallback();
this.addEventListener('visibilitychange', this.#onVisibilityChange);
window.addEventListener('beforeunload', () => this.#context.exitSession());
this.#context.startSession();
}

override disconnectedCallback() {
super.disconnectedCallback();
this.removeEventListener('visibilitychange', this.#onVisibilityChange);
// NOTE: Unsure how we remove an anonymous function from 'beforeunload' event listener.
// The reason for the anonymous function is that if we used a named function,
// `this` would be the `window` and would not have context to the class instance. [LK]
//window.removeEventListener('beforeunload', () => this.#context.exitSession());
this.#context.exitSession();
}

@state()
private _iframeReady?: boolean;

Expand All @@ -49,10 +32,6 @@ export class UmbPreviewElement extends UmbLitElement {
this.#context.iframeLoaded(event.target);
}

#onVisibilityChange() {
this.#context.checkSession();
}

override render() {
if (!this._previewUrl) return nothing;
return html`
Expand Down
Loading