1+ /*---------------------------------------------------------------------------------------------
2+ * Copyright (c) Microsoft Corporation. All rights reserved.
3+ * Licensed under the MIT License. See License.txt in the project root for license information.
4+ *--------------------------------------------------------------------------------------------*/
5+
6+ import * as vscode from 'vscode' ;
7+ import { Disposable } from '../common/lifecycle' ;
8+ import Logger from '../common/logger' ;
9+ import { ITelemetry } from '../common/telemetry' ;
10+ import { CredentialStore } from './credentials' ;
11+ import { FolderRepositoryManager } from './folderRepositoryManager' ;
12+ import { GitHubRepository } from './githubRepository' ;
13+ import { IssueOverviewPanel } from './issueOverview' ;
14+ import { PullRequestOverviewPanel } from './pullRequestOverview' ;
15+ import { RepositoriesManager } from './repositoriesManager' ;
16+ import { PullRequest } from './views' ;
17+
18+ export class OverviewRestorer extends Disposable implements vscode . WebviewPanelSerializer {
19+ private static ID = 'OverviewRestorer' ;
20+
21+ constructor ( private readonly _repositoriesManager : RepositoriesManager ,
22+ private readonly _telemetry : ITelemetry ,
23+ private readonly _extensionUri : vscode . Uri ,
24+ private readonly _credentialStore : CredentialStore
25+ ) {
26+ super ( ) ;
27+ this . _register ( vscode . window . registerWebviewPanelSerializer ( IssueOverviewPanel . viewType , this ) ) ;
28+ this . _register ( vscode . window . registerWebviewPanelSerializer ( PullRequestOverviewPanel . viewType , this ) ) ;
29+ }
30+
31+ async deserializeWebviewPanel ( webviewPanel : vscode . WebviewPanel , state : PullRequest ) : Promise < void > {
32+ await this . waitForAuth ( ) ;
33+ await this . waitForAnyGitHubRepos ( this . _repositoriesManager ) ;
34+
35+ if ( ! state || ! state . number || this . _repositoriesManager . folderManagers . length === 0 ) {
36+ webviewPanel . dispose ( ) ;
37+ return ;
38+ }
39+
40+ let repo : GitHubRepository | undefined ;
41+ let folderManager : FolderRepositoryManager | undefined ;
42+ for ( const manager of this . _repositoriesManager . folderManagers ) {
43+ const githubRepository = manager . findExistingGitHubRepository ( { owner : state . owner , repositoryName : state . repo } ) ;
44+ if ( githubRepository ) {
45+ repo = githubRepository ;
46+ folderManager = manager ;
47+ break ;
48+ }
49+ }
50+
51+ if ( ! repo || ! folderManager ) {
52+ folderManager = this . _repositoriesManager . folderManagers [ 0 ] ;
53+ repo = await folderManager . createGitHubRepositoryFromOwnerName ( state . owner , state . repo ) ;
54+ }
55+
56+ if ( state . isIssue ) {
57+ const issueModel = await repo . getIssue ( state . number , true ) ;
58+ if ( ! issueModel ) {
59+ webviewPanel . dispose ( ) ;
60+ return ;
61+ }
62+ return IssueOverviewPanel . createOrShow ( this . _telemetry , this . _extensionUri , folderManager , issueModel , undefined , true , webviewPanel ) ;
63+ } else {
64+ const pullRequestModel = await repo . getPullRequest ( state . number , true ) ;
65+ if ( ! pullRequestModel ) {
66+ webviewPanel . dispose ( ) ;
67+ return ;
68+ }
69+ return PullRequestOverviewPanel . createOrShow ( this . _telemetry , this . _extensionUri , folderManager , pullRequestModel , undefined , true , webviewPanel ) ;
70+ }
71+ }
72+
73+ protected async waitForAuth ( ) : Promise < void > {
74+ if ( this . _credentialStore . isAnyAuthenticated ( ) ) {
75+ return ;
76+ }
77+ return new Promise ( resolve => this . _credentialStore . onDidGetSession ( ( ) => resolve ( ) ) ) ;
78+ }
79+
80+ protected async waitForAnyGitHubRepos ( reposManager : RepositoriesManager ) : Promise < void > {
81+ // Check if any folder manager already has GitHub repositories
82+ if ( reposManager . folderManagers . some ( manager => manager . gitHubRepositories . length > 0 ) ) {
83+ return ;
84+ }
85+
86+ Logger . appendLine ( 'Waiting for GitHub repositories.' , OverviewRestorer . ID ) ;
87+ return new Promise ( resolve => {
88+ const disposable = reposManager . onDidChangeAnyGitHubRepository ( ( ) => {
89+ Logger . appendLine ( 'Found GitHub repositories.' , OverviewRestorer . ID ) ;
90+ disposable . dispose ( ) ;
91+ resolve ( ) ;
92+ } ) ;
93+ } ) ;
94+ }
95+ }
0 commit comments