@@ -14,22 +14,42 @@ import { PPAPIService } from '../../common/services/PPAPIService';
1414import { VSCODE_EXTENSION_GET_WEBSITE_RECORD_ID_EMPTY } from '../../common/services/TelemetryConstants' ;
1515import { EDGE_TOOLS_EXTENSION_ID } from '../../common/constants' ;
1616import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper" ;
17- import { showProgressWithNotification } from '../../common/utilities/Utils' ;
17+ import { getWorkspaceFolders , showProgressWithNotification } from '../../common/utilities/Utils' ;
18+ import { PacTerminal } from '../lib/PacTerminal' ;
19+ import { initializeOrgDetails } from '../../common/utilities/OrgHandlerUtils' ;
20+ import { ArtemisService } from '../../common/services/ArtemisService' ;
1821
1922export const SITE_PREVIEW_COMMAND_ID = "microsoft.powerplatform.pages.preview-site" ;
2023
2124export class PreviewSite {
25+ private static _websiteUrl : string | undefined = undefined ;
26+
2227 static isSiteRuntimePreviewEnabled ( ) : boolean {
2328 const enableSiteRuntimePreview = ECSFeaturesClient . getConfig ( EnableSiteRuntimePreview ) . enableSiteRuntimePreview
2429
2530 if ( enableSiteRuntimePreview === undefined ) {
2631 return false ;
2732 }
2833
29- return enableSiteRuntimePreview ;
34+ return true ;
35+ }
36+
37+ static async loadSiteUrl (
38+ workspaceFolders : WorkspaceFolder [ ] ,
39+ stamp : ServiceEndpointCategory ,
40+ envId : string ,
41+ telemetry : ITelemetry )
42+ : Promise < void > {
43+ const websiteUrl = await PreviewSite . getWebSiteUrl ( workspaceFolders , stamp , envId , telemetry ) ;
44+
45+ this . _websiteUrl = websiteUrl ;
3046 }
3147
32- static async getWebSiteURL ( workspaceFolders : WorkspaceFolder [ ] , stamp : ServiceEndpointCategory , envId : string , telemetry : ITelemetry ) : Promise < string > {
48+ static getSiteUrl ( ) : string | undefined {
49+ return this . _websiteUrl ;
50+ }
51+
52+ private static async getWebSiteUrl ( workspaceFolders : WorkspaceFolder [ ] , stamp : ServiceEndpointCategory , envId : string , telemetry : ITelemetry ) : Promise < string > {
3353 const websiteRecordId = getWebsiteRecordId ( workspaceFolders , telemetry ) ;
3454 if ( ! websiteRecordId ) {
3555 telemetry . sendTelemetryEvent ( VSCODE_EXTENSION_GET_WEBSITE_RECORD_ID_EMPTY , {
@@ -74,9 +94,15 @@ export class PreviewSite {
7494 await settings . update ( 'defaultUrl' , currentDefaultUrl ) ;
7595 }
7696 ) ;
97+
98+ await vscode . window . showInformationMessage ( vscode . l10n . t ( 'The preview shown is for published changes.' ) ) ;
7799 }
78100
79- static async handlePreviewRequest ( isSiteRuntimePreviewEnabled : boolean , websiteURL : string | undefined , telemetry : ITelemetry ) {
101+ static async handlePreviewRequest (
102+ isSiteRuntimePreviewEnabled : boolean ,
103+ telemetry : ITelemetry ,
104+ pacTerminal : PacTerminal ) {
105+
80106 telemetry . sendTelemetryEvent ( "StartCommand" , {
81107 commandId : SITE_PREVIEW_COMMAND_ID ,
82108 } ) ;
@@ -94,25 +120,66 @@ export class PreviewSite {
94120 return ;
95121 }
96122
97- if ( websiteURL === undefined ) {
123+ if ( this . _websiteUrl === undefined ) {
98124 await vscode . window . showWarningMessage ( vscode . l10n . t ( "Initializing site preview. Please try again after few seconds." ) ) ;
99125 return ;
100126 }
101127
102- if ( websiteURL === "" ) {
103- const shouldInitiateLogin = await vscode . window . showErrorMessage (
104- vscode . l10n . t (
105- `Website not found in the environment. Please check the credentials and login with correct account.`
106- ) ,
107- vscode . l10n . t ( 'Login' )
108- ) ;
128+ if ( this . _websiteUrl === "" ) {
129+ let shouldRepeatLoginFlow = true ;
109130
110- if ( shouldInitiateLogin === vscode . l10n . t ( 'Login' ) ) {
111- await vscode . authentication . getSession ( PROVIDER_ID , [ ] , { } )
131+ while ( shouldRepeatLoginFlow ) {
132+ shouldRepeatLoginFlow = await PreviewSite . handleEmptyWebsiteUrl ( pacTerminal , telemetry ) ;
112133 }
113- return ;
114134 }
115135
116- await PreviewSite . launchBrowserAndDevToolsWithinVsCode ( websiteURL ) ;
136+ await PreviewSite . launchBrowserAndDevToolsWithinVsCode ( this . _websiteUrl ) ;
137+ }
138+
139+ private static async handleEmptyWebsiteUrl ( pacTerminal : PacTerminal , telemetry : ITelemetry ) : Promise < boolean > {
140+ const shouldInitiateLogin = await vscode . window . showErrorMessage (
141+ vscode . l10n . t (
142+ `Website not found in the environment. Please check the credentials and login with correct account.`
143+ ) ,
144+ vscode . l10n . t ( 'Login' ) ,
145+ vscode . l10n . t ( 'Cancel' )
146+ ) ;
147+
148+ let shouldRepeatLoginFlow = false ;
149+
150+ if ( shouldInitiateLogin === vscode . l10n . t ( 'Login' ) ) {
151+ await vscode . authentication . getSession ( PROVIDER_ID , [ ] , { forceNewSession : true , clearSessionPreference : true } ) ;
152+
153+ await showProgressWithNotification (
154+ vscode . l10n . t ( 'Initializing site preview' ) ,
155+ async ( progress ) => {
156+ progress . report ( { message : vscode . l10n . t ( 'Getting org details...' ) } ) ;
157+
158+ const orgDetails = await initializeOrgDetails ( false , pacTerminal . getWrapper ( ) ) ;
159+
160+ progress . report ( { message : vscode . l10n . t ( 'Getting region information...' ) } ) ;
161+
162+ const artemisResponse = await ArtemisService . getArtemisResponse ( orgDetails . orgID , telemetry , "" ) ;
163+
164+ if ( artemisResponse === null || artemisResponse . response === null ) {
165+ vscode . window . showErrorMessage ( vscode . l10n . t ( "Failed to get website endpoint. Please try again later" ) ) ;
166+ return ;
167+ }
168+
169+ progress . report ( { message : vscode . l10n . t ( 'Getting website endpoint...' ) } ) ;
170+
171+ const websiteUrl = await PreviewSite . getWebSiteUrl ( getWorkspaceFolders ( ) , artemisResponse ?. stamp , orgDetails . environmentID , telemetry ) ;
172+
173+ if ( websiteUrl === "" ) {
174+ shouldRepeatLoginFlow = true ;
175+ }
176+ else {
177+ this . _websiteUrl = websiteUrl ;
178+ }
179+ }
180+ ) ;
181+ }
182+
183+ return shouldRepeatLoginFlow ;
117184 }
118185}
0 commit comments