Skip to content

Commit d5a2f05

Browse files
authored
Preview: Redirect to published URL on exit (#20556)
* Preview Exit: Gets the page's published URL on exit for redirect * Preview Open Website: Uses the page's published URL * Tweaked the published URL logic * Code amends based on @copilot's suggestions
1 parent 5a65eb1 commit d5a2f05

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

src/Umbraco.Web.UI.Client/src/apps/preview/apps/preview-exit.element.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
66
export class UmbPreviewExitElement extends UmbLitElement {
77
async #onClick() {
88
const previewContext = await this.getContext(UMB_PREVIEW_CONTEXT);
9-
previewContext?.exitPreview(0);
9+
await previewContext?.exitPreview(0);
1010
}
1111

1212
override render() {

src/Umbraco.Web.UI.Client/src/apps/preview/apps/preview-open-website.element.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
66
export class UmbPreviewOpenWebsiteElement extends UmbLitElement {
77
async #onClick() {
88
const previewContext = await this.getContext(UMB_PREVIEW_CONTEXT);
9-
previewContext?.openWebsite();
9+
await previewContext?.openWebsite();
1010
}
1111

1212
override render() {

src/Umbraco.Web.UI.Client/src/apps/preview/preview.context.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { UmbBooleanState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';
1+
import { tryExecute } from '@umbraco-cms/backoffice/resources';
22
import { umbConfirmModal } from '@umbraco-cms/backoffice/modal';
3+
import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api';
4+
import { UmbBooleanState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';
35
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
46
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
57
import { UmbDocumentPreviewRepository } from '@umbraco-cms/backoffice/document';
6-
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
78
import { UMB_SERVER_CONTEXT } from '@umbraco-cms/backoffice/server';
9+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
810

911
const UMB_LOCALSTORAGE_SESSION_KEY = 'umb:previewSessions';
1012

@@ -89,6 +91,19 @@ export class UmbPreviewContext extends UmbContextBase {
8991
});
9092
}
9193

94+
async #getPublishedUrl(): Promise<string | null> {
95+
if (!this.#unique) return null;
96+
97+
// NOTE: We should be reusing `UmbDocumentUrlRepository` here, but the preview app doesn't register the `itemStore` extensions, so can't resolve/consume `UMB_DOCUMENT_URL_STORE_CONTEXT`. [LK]
98+
const { data } = await tryExecute(this, DocumentService.getDocumentUrls({ query: { id: [this.#unique] } }));
99+
100+
if (!data?.length) return null;
101+
const urlInfo = this.#culture ? data[0].urlInfos.find((x) => x.culture === this.#culture) : data[0].urlInfos[0];
102+
103+
if (!urlInfo?.url) return null;
104+
return urlInfo.url.startsWith('/') ? `${this.#serverUrl}${urlInfo.url}` : urlInfo.url;
105+
}
106+
92107
#getSessionCount(): number {
93108
return Math.max(Number(localStorage.getItem(UMB_LOCALSTORAGE_SESSION_KEY)), 0) || 0;
94109
}
@@ -170,7 +185,12 @@ export class UmbPreviewContext extends UmbContextBase {
170185
this.#webSocket = undefined;
171186
}
172187

173-
const url = this.#previewUrl.getValue() as string;
188+
let url = await this.#getPublishedUrl();
189+
190+
if (!url) {
191+
url = this.#previewUrl.getValue() as string;
192+
}
193+
174194
window.location.replace(url);
175195
}
176196

@@ -190,8 +210,13 @@ export class UmbPreviewContext extends UmbContextBase {
190210
return this.getHostElement().shadowRoot?.querySelector('#wrapper') as HTMLElement;
191211
}
192212

193-
openWebsite() {
194-
const url = this.#previewUrl.getValue() as string;
213+
async openWebsite() {
214+
let url = await this.#getPublishedUrl();
215+
216+
if (!url) {
217+
url = this.#previewUrl.getValue() as string;
218+
}
219+
195220
window.open(url, '_blank');
196221
}
197222

0 commit comments

Comments
 (0)