From a312aa4bd81e5ab99acb56bcae985f21e7b45fb8 Mon Sep 17 00:00:00 2001
From: Keith Daulton
Date: Thu, 20 Oct 2022 21:45:22 -0400
Subject: [PATCH] Updates the home view to be omnipresent
---
package.json | 1 -
src/webviews/apps/home/home.html | 12 ++++++++++++
src/webviews/apps/home/home.scss | 12 ++++++++++++
src/webviews/apps/home/home.ts | 19 +++++++++++++++++++
src/webviews/home/homeWebviewView.ts | 25 +++++++++++++++++++++++--
src/webviews/home/protocol.ts | 8 ++++++++
6 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/package.json b/package.json
index 1af1d76..0ae2e63 100644
--- a/package.json
+++ b/package.json
@@ -12198,7 +12198,6 @@
"type": "webview",
"id": "gitlens.views.home",
"name": "Home",
- "when": "!gitlens:disabled && gitlens:plus:enabled",
"contextualTitle": "GitLens",
"icon": "$(gitlens-gitlens)",
"visibility": "visible"
diff --git a/src/webviews/apps/home/home.html b/src/webviews/apps/home/home.html
index afaaecf..5595414 100644
--- a/src/webviews/apps/home/home.html
+++ b/src/webviews/apps/home/home.html
@@ -123,6 +123,18 @@
GitLens is deeply integrated into many areas and aspects of VS Code, especially editors and
views.
+
+
+
+ To use GitLens, open a folder containing a git repository or clone from a URL from the
+ Explorer.
+
+
+
Open a Folder or Repository
+
+
-
diff --git a/src/webviews/apps/home/home.scss b/src/webviews/apps/home/home.scss
index 3a69236..eecf21c 100644
--- a/src/webviews/apps/home/home.scss
+++ b/src/webviews/apps/home/home.scss
@@ -246,6 +246,18 @@ ul {
max-width: 10rem;
height: auto;
}
+
+ #no-repo[aria-hidden='false'] ~ & {
+ display: none;
+ }
+}
+
+#no-repo {
+ margin-bottom: 0;
+
+ &[aria-hidden='true'] {
+ display: none;
+ }
}
.video-banner {
diff --git a/src/webviews/apps/home/home.ts b/src/webviews/apps/home/home.ts
index 37ed75d..7004cec 100644
--- a/src/webviews/apps/home/home.ts
+++ b/src/webviews/apps/home/home.ts
@@ -6,6 +6,7 @@ import { getSubscriptionTimeRemaining, SubscriptionState } from '../../../subscr
import type { State } from '../../home/protocol';
import {
CompleteStepCommandType,
+ DidChangeExtensionEnabledType,
DidChangeSubscriptionNotificationType,
DismissSectionCommandType,
} from '../../home/protocol';
@@ -78,6 +79,14 @@ export class HomeApp extends App {
this.updateState();
});
break;
+ case DidChangeExtensionEnabledType.method:
+ this.log(`${this.appName}.onMessageReceived(${msg.id}): name=${msg.method}`);
+
+ onIpc(DidChangeExtensionEnabledType, msg, params => {
+ this.state.extensionEnabled = params.extensionEnabled;
+ this.updateNoRepo();
+ });
+ break;
default:
super.onMessageReceived?.(e);
@@ -157,6 +166,15 @@ export class HomeApp extends App {
}
}
+ private updateNoRepo() {
+ const { extensionEnabled } = this.state;
+
+ const $el = document.getElementById('no-repo');
+ if ($el) {
+ $el.setAttribute('aria-hidden', extensionEnabled ? 'true' : 'false');
+ }
+ }
+
private updatePlusContent(days = this.getDaysRemaining()) {
const { subscription, visibility } = this.state;
@@ -211,6 +229,7 @@ export class HomeApp extends App {
private updateState() {
const { completedSteps, dismissedSections, plusEnabled } = this.state;
+ this.updateNoRepo();
document.getElementById('restore-plus')?.classList.toggle('hide', plusEnabled);
const showRestoreWelcome = completedSteps?.length || dismissedSections?.length;
diff --git a/src/webviews/home/homeWebviewView.ts b/src/webviews/home/homeWebviewView.ts
index bafa9b5..a8eb16b 100644
--- a/src/webviews/home/homeWebviewView.ts
+++ b/src/webviews/home/homeWebviewView.ts
@@ -2,8 +2,9 @@ import type { Disposable } from 'vscode';
import { window } from 'vscode';
import { getAvatarUriFromGravatarEmail } from '../../avatars';
import { configuration } from '../../configuration';
-import { CoreCommands } from '../../constants';
+import { ContextKeys, CoreCommands } from '../../constants';
import type { Container } from '../../container';
+import { getContext, onDidChangeContext } from '../../context';
import type { RepositoriesVisibility } from '../../git/gitProviderService';
import type { SubscriptionChangeEvent } from '../../plus/subscription/subscriptionService';
import { ensurePlusFeaturesEnabled } from '../../plus/subscription/utils';
@@ -16,6 +17,7 @@ import type { CompleteStepParams, DismissSectionParams, State } from './protocol
import {
CompletedActions,
CompleteStepCommandType,
+ DidChangeExtensionEnabledType,
DidChangeSubscriptionNotificationType,
DismissSectionCommandType,
} from './protocol';
@@ -24,7 +26,13 @@ export class HomeWebviewView extends WebviewViewBase {
constructor(container: Container) {
super(container, 'gitlens.views.home', 'home.html', 'Home', 'homeView');
- this.disposables.push(this.container.subscription.onDidChange(this.onSubscriptionChanged, this));
+ this.disposables.push(
+ this.container.subscription.onDidChange(this.onSubscriptionChanged, this),
+ onDidChangeContext(key => {
+ if (key !== ContextKeys.Disabled) return;
+ this.notifyExtensionEnabled();
+ }),
+ );
}
override async show(options?: { preserveFocus?: boolean | undefined }): Promise {
@@ -158,6 +166,7 @@ export class HomeWebviewView extends WebviewViewBase {
const sections = this.container.storage.get('home:sections:dismissed', []);
return {
+ extensionEnabled: this.getExtensionEnabled(),
webroot: this.getWebRoot(),
subscription: subscriptionState.subscription,
completedActions: subscriptionState.completedActions,
@@ -177,6 +186,18 @@ export class HomeWebviewView extends WebviewViewBase {
);
}
+ private getExtensionEnabled() {
+ return !getContext(ContextKeys.Disabled, false);
+ }
+
+ private notifyExtensionEnabled() {
+ if (!this.isReady) return;
+
+ void this.notify(DidChangeExtensionEnabledType, {
+ extensionEnabled: this.getExtensionEnabled(),
+ });
+ }
+
private _validating: Promise | undefined;
private async validateSubscription(): Promise {
if (this._validating == null) {
diff --git a/src/webviews/home/protocol.ts b/src/webviews/home/protocol.ts
index f43a3ec..b94cd4a 100644
--- a/src/webviews/home/protocol.ts
+++ b/src/webviews/home/protocol.ts
@@ -8,6 +8,7 @@ export const enum CompletedActions {
}
export interface State {
+ extensionEnabled: boolean;
webroot?: string;
subscription: Subscription;
completedActions: CompletedActions[];
@@ -37,3 +38,10 @@ export interface DidChangeSubscriptionParams {
export const DidChangeSubscriptionNotificationType = new IpcNotificationType(
'subscription/didChange',
);
+
+export interface DidChangeExtensionEnabledParams {
+ extensionEnabled: boolean;
+}
+export const DidChangeExtensionEnabledType = new IpcNotificationType(
+ 'extensionEnabled/didChange',
+);