From 2ff1890571a6789ed83c17389e2120d0a18e2177 Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Wed, 17 May 2023 15:56:51 -0400 Subject: [PATCH] Adds timestamp to state models for webviews --- src/plus/webviews/focus/focusWebview.ts | 3 +++ src/plus/webviews/focus/protocol.ts | 2 ++ src/plus/webviews/graph/graphWebview.ts | 5 +++-- src/plus/webviews/graph/protocol.ts | 2 ++ src/plus/webviews/timeline/protocol.ts | 2 ++ src/plus/webviews/timeline/timelineWebview.ts | 4 ++++ src/webviews/apps/shared/appBase.ts | 16 +++++++++++++--- src/webviews/apps/shared/appWithConfigBase.ts | 2 ++ .../commitDetails/commitDetailsWebview.ts | 1 + src/webviews/commitDetails/protocol.ts | 2 ++ src/webviews/home/homeWebview.ts | 1 + src/webviews/home/protocol.ts | 8 +++----- src/webviews/rebase/protocol.ts | 2 ++ src/webviews/rebase/rebaseEditor.ts | 1 + src/webviews/settings/protocol.ts | 2 ++ src/webviews/settings/settingsWebview.ts | 1 + src/webviews/welcome/protocol.ts | 2 ++ src/webviews/welcome/welcomeWebview.ts | 1 + 18 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/plus/webviews/focus/focusWebview.ts b/src/plus/webviews/focus/focusWebview.ts index fd00355451262..e791f7a54d57b 100644 --- a/src/plus/webviews/focus/focusWebview.ts +++ b/src/plus/webviews/focus/focusWebview.ts @@ -261,6 +261,7 @@ export class FocusWebviewProvider implements WebviewProvider { const { subscription, isPlus } = await this.getSubscription(); if (!isPlus) { return { + timestamp: Date.now(), isPlus: isPlus, subscription: subscription, }; @@ -273,6 +274,7 @@ export class FocusWebviewProvider implements WebviewProvider { if (deferState || !hasConnectedRepos) { return { + timestamp: Date.now(), isPlus: isPlus, subscription: subscription, repos: (hasConnectedRepos ? connectedRepos : githubRepos).map(r => serializeRepoWithRichRemote(r)), @@ -296,6 +298,7 @@ export class FocusWebviewProvider implements WebviewProvider { })); return { + timestamp: Date.now(), isPlus: isPlus, subscription: subscription, pullRequests: serializedPrs, diff --git a/src/plus/webviews/focus/protocol.ts b/src/plus/webviews/focus/protocol.ts index 9a4459076d1c6..48c5e2a90d789 100644 --- a/src/plus/webviews/focus/protocol.ts +++ b/src/plus/webviews/focus/protocol.ts @@ -4,6 +4,8 @@ import type { Subscription } from '../../../subscription'; import { IpcCommandType, IpcNotificationType } from '../../../webviews/protocol'; export type State = { + timestamp: number; + isPlus: boolean; subscription: Subscription; pullRequests?: PullRequestResult[]; diff --git a/src/plus/webviews/graph/graphWebview.ts b/src/plus/webviews/graph/graphWebview.ts index 25a3080521a89..9ac39618a127b 100644 --- a/src/plus/webviews/graph/graphWebview.ts +++ b/src/plus/webviews/graph/graphWebview.ts @@ -1712,7 +1712,7 @@ export class GraphWebviewProvider implements WebviewProvider { private async getState(deferRows?: boolean): Promise { if (this.container.git.repositoryCount === 0) { - return { debugging: this.container.debugging, allowed: true, repositories: [] }; + return { timestamp: Date.now(), debugging: this.container.debugging, allowed: true, repositories: [] }; } if (this.trialBanner == null) { @@ -1725,7 +1725,7 @@ export class GraphWebviewProvider implements WebviewProvider { if (this.repository == null) { this.repository = this.container.git.getBestRepositoryOrFirst(); if (this.repository == null) { - return { debugging: this.container.debugging, allowed: true, repositories: [] }; + return { timestamp: Date.now(), debugging: this.container.debugging, allowed: true, repositories: [] }; } } @@ -1802,6 +1802,7 @@ export class GraphWebviewProvider implements WebviewProvider { } return { + timestamp: Date.now(), windowFocused: this.isWindowFocused, trialBanner: this.trialBanner, repositories: formatRepositories(this.container.git.openRepositories), diff --git a/src/plus/webviews/graph/protocol.ts b/src/plus/webviews/graph/protocol.ts index ee75e526dec9c..4890bd70d7c81 100644 --- a/src/plus/webviews/graph/protocol.ts +++ b/src/plus/webviews/graph/protocol.ts @@ -84,6 +84,8 @@ export const enum GraphMinimapMarkerTypes { export const supportedRefMetadataTypes: GraphRefMetadataType[] = Object.values(GraphRefMetadataTypes); export interface State { + timestamp: number; + windowFocused?: boolean; repositories?: GraphRepository[]; selectedRepository?: string; diff --git a/src/plus/webviews/timeline/protocol.ts b/src/plus/webviews/timeline/protocol.ts index a585a5c90bad2..c41a604fabc9d 100644 --- a/src/plus/webviews/timeline/protocol.ts +++ b/src/plus/webviews/timeline/protocol.ts @@ -2,6 +2,8 @@ import type { FeatureAccess } from '../../../features'; import { IpcCommandType, IpcNotificationType } from '../../../webviews/protocol'; export interface State { + timestamp: number; + dataset?: Commit[]; emptyMessage?: string; period: Period; diff --git a/src/plus/webviews/timeline/timelineWebview.ts b/src/plus/webviews/timeline/timelineWebview.ts index abd30ee1f1f31..3968c0c1b146a 100644 --- a/src/plus/webviews/timeline/timelineWebview.ts +++ b/src/plus/webviews/timeline/timelineWebview.ts @@ -252,6 +252,7 @@ export class TimelineWebviewProvider implements WebviewProvider { if (current.uri == null) { const access = await this.container.git.access(PlusFeatures.Timeline); return { + timestamp: Date.now(), emptyMessage: 'There are no editors open that can provide file history information', period: period, title: '', @@ -268,6 +269,7 @@ export class TimelineWebviewProvider implements WebviewProvider { if (access.allowed === false) { const dataset = generateRandomTimelineDataset(); return { + timestamp: Date.now(), dataset: dataset.sort((a, b) => b.sort - a.sort), period: period, title: 'src/app/index.ts', @@ -296,6 +298,7 @@ export class TimelineWebviewProvider implements WebviewProvider { if (log == null) { return { + timestamp: Date.now(), dataset: [], emptyMessage: 'No commits found for the specified time period', period: period, @@ -354,6 +357,7 @@ export class TimelineWebviewProvider implements WebviewProvider { dataset.sort((a, b) => b.sort - a.sort); return { + timestamp: Date.now(), dataset: dataset, period: period, title: title, diff --git a/src/webviews/apps/shared/appBase.ts b/src/webviews/apps/shared/appBase.ts index 2c8bfa7e49d4c..8f02933382da4 100644 --- a/src/webviews/apps/shared/appBase.ts +++ b/src/webviews/apps/shared/appBase.ts @@ -38,7 +38,7 @@ function nextIpcId() { return `webview:${ipcSequence}`; } -export abstract class App { +export abstract class App { private readonly _api: VsCodeApi; protected state: State; @@ -65,6 +65,16 @@ export abstract class App { // this.log(`ctor(${this.state ? JSON.stringify(this.state) : ''})`); this._api = acquireVsCodeApi(); + if (this.state != null) { + const state = this.getState(); + if (state != null) { + if (this.state.timestamp > (state.timestamp ?? 0)) { + this._api.setState(this.state); + } else { + this.state = state; + } + } + } const disposables: Disposable[] = []; @@ -151,8 +161,8 @@ export abstract class App { Logger.log(message, ...optionalParams); } - protected getState(): State { - return this._api.getState() as State; + protected getState(): State | undefined { + return this._api.getState() as State | undefined; } protected sendCommand>( diff --git a/src/webviews/apps/shared/appWithConfigBase.ts b/src/webviews/apps/shared/appWithConfigBase.ts index 4f21010acbb31..58da018d27519 100644 --- a/src/webviews/apps/shared/appWithConfigBase.ts +++ b/src/webviews/apps/shared/appWithConfigBase.ts @@ -19,6 +19,8 @@ const date = new Date( ); interface AppStateWithConfig { + timestamp: number; + config: Config; customSettings?: Record; } diff --git a/src/webviews/commitDetails/commitDetailsWebview.ts b/src/webviews/commitDetails/commitDetailsWebview.ts index 099ac12d4cd8c..b1058e824c8fc 100644 --- a/src/webviews/commitDetails/commitDetailsWebview.ts +++ b/src/webviews/commitDetails/commitDetailsWebview.ts @@ -447,6 +447,7 @@ export class CommitDetailsWebviewProvider implements WebviewProvider summaryModel(commit))); const state = serialize({ + timestamp: Date.now(), pinned: current.pinned, includeRichContent: current.richStateLoaded, // commits: commitChoices, diff --git a/src/webviews/commitDetails/protocol.ts b/src/webviews/commitDetails/protocol.ts index 17133bc30ca20..e7d91640288d2 100644 --- a/src/webviews/commitDetails/protocol.ts +++ b/src/webviews/commitDetails/protocol.ts @@ -37,6 +37,8 @@ export type Preferences = { }; export type State = { + timestamp: number; + pinned: boolean; preferences?: Preferences; // commits?: CommitSummary[]; diff --git a/src/webviews/home/homeWebview.ts b/src/webviews/home/homeWebview.ts index 68eda89cf2d2f..337184ecccb5b 100644 --- a/src/webviews/home/homeWebview.ts +++ b/src/webviews/home/homeWebview.ts @@ -227,6 +227,7 @@ export class HomeWebviewProvider implements WebviewProvider { const dismissedBanners = this.container.storage.get('home:banners:dismissed', []); return { + timestamp: Date.now(), repositories: this.getRepositoriesState(), webroot: this.host.getWebRoot(), subscription: sub.subscription, diff --git a/src/webviews/home/protocol.ts b/src/webviews/home/protocol.ts index d8c217924cb60..823eeb9cb9f5f 100644 --- a/src/webviews/home/protocol.ts +++ b/src/webviews/home/protocol.ts @@ -9,11 +9,9 @@ export const enum CompletedActions { } export interface State { - repositories: { - count: number; - openCount: number; - hasUnsafe: boolean; - }; + timestamp: number; + + repositories: DidChangeRepositoriesParams; webroot?: string; subscription: Subscription; completedActions: CompletedActions[]; diff --git a/src/webviews/rebase/protocol.ts b/src/webviews/rebase/protocol.ts index 1bcb23731d4d0..97002b750c62d 100644 --- a/src/webviews/rebase/protocol.ts +++ b/src/webviews/rebase/protocol.ts @@ -1,6 +1,8 @@ import { IpcCommandType, IpcNotificationType } from '../protocol'; export interface State { + timestamp: number; + branch: string; onto: { sha: string; commit?: Commit } | undefined; diff --git a/src/webviews/rebase/rebaseEditor.ts b/src/webviews/rebase/rebaseEditor.ts index 2a25a882dbc05..f157f8387ee0d 100644 --- a/src/webviews/rebase/rebaseEditor.ts +++ b/src/webviews/rebase/rebaseEditor.ts @@ -691,6 +691,7 @@ async function parseRebaseTodo( } return { + timestamp: Date.now(), branch: context.branchName ?? '', onto: onto ? { diff --git a/src/webviews/settings/protocol.ts b/src/webviews/settings/protocol.ts index 7edbb4cc4f474..fe0746ac7e7ea 100644 --- a/src/webviews/settings/protocol.ts +++ b/src/webviews/settings/protocol.ts @@ -1,6 +1,8 @@ import type { Config } from '../../config'; export interface State { + timestamp: number; + config: Config; customSettings?: Record; scope: 'user' | 'workspace'; diff --git a/src/webviews/settings/settingsWebview.ts b/src/webviews/settings/settingsWebview.ts index c329633b738e8..799cf70b99f06 100644 --- a/src/webviews/settings/settingsWebview.ts +++ b/src/webviews/settings/settingsWebview.ts @@ -40,6 +40,7 @@ export class SettingsWebviewProvider extends WebviewProviderWithConfigBase; } diff --git a/src/webviews/welcome/welcomeWebview.ts b/src/webviews/welcome/welcomeWebview.ts index be59424981ecb..2c742ab8985aa 100644 --- a/src/webviews/welcome/welcomeWebview.ts +++ b/src/webviews/welcome/welcomeWebview.ts @@ -6,6 +6,7 @@ import type { State } from './protocol'; export class WelcomeWebviewProvider extends WebviewProviderWithConfigBase implements WebviewProvider { includeBootstrap(): State { return { + timestamp: Date.now(), // Make sure to get the raw config, not from the container which has the modes mixed in config: configuration.getAll(true), };