From a75d68ca6ce2c36bb6fee95c040231e32adb0cd4 Mon Sep 17 00:00:00 2001 From: Ramin Tadayon Date: Tue, 13 Feb 2024 10:12:05 -0700 Subject: [PATCH 1/3] Adds trial reactivation UX and command --- package.json | 16 ++++- src/constants.ts | 1 + src/plus/gk/account/subscription.ts | 25 ++++++-- src/plus/gk/account/subscriptionService.ts | 62 +++++++++++++++++++ src/plus/gk/checkin.ts | 6 ++ src/system/date.ts | 10 +-- .../account/components/account-content.ts | 18 ++++++ .../apps/plus/focus/components/focus-app.ts | 7 +++ src/webviews/apps/plus/graph/GraphWrapper.tsx | 7 +++ .../components/feature-gate-plus-state.ts | 13 +++- src/webviews/apps/plus/timeline/timeline.html | 6 ++ .../shared/components/feature-gate-badge.ts | 1 + .../apps/shared/components/feature-gate.ts | 4 ++ 13 files changed, 166 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 945ec0c167fdd..47f141e3139ef 100644 --- a/package.json +++ b/package.json @@ -5123,6 +5123,11 @@ "title": "Preview Pro", "category": "GitLens" }, + { + "command": "gitlens.plus.reactivateProTrial", + "title": "Reactivate GitKraken Trial", + "category": "GitLens" + }, { "command": "gitlens.plus.manage", "title": "Manage Your Account...", @@ -8929,6 +8934,10 @@ "command": "gitlens.plus.startPreviewTrial", "when": "!gitlens:plus" }, + { + "command": "gitlens.plus.reactivateProTrial", + "when": "gitlens:plus:state == 5" + }, { "command": "gitlens.plus.manage", "when": "gitlens:plus" @@ -16123,7 +16132,7 @@ }, { "view": "gitlens.views.drafts", - "contents": "[Start Free Pro Trial](command:gitlens.plus.signUp)\n\nStart a free 7-day Pro trial to use Cloud Patches, or [sign in](command:gitlens.plus.login).\n☁️ Requires a GitKraken account and access is based on your plan, e.g. Free, Pro, etc", + "contents": "[Start Free GitKraken Trial](command:gitlens.plus.signUp)\n\nStart a free 7-day GitKraken trial to use Cloud Patches, or [sign in](command:gitlens.plus.login).\n☁️ Requires a GitKraken account and access is based on your plan, e.g. Free, Pro, etc", "when": "!gitlens:plus" }, { @@ -16169,6 +16178,11 @@ "view": "gitlens.views.worktrees", "contents": "Your GitKraken trial has ended, please upgrade to continue to use this on privately hosted repos.\n\n[Upgrade to Pro](command:gitlens.plus.purchase)\n✨ A paid plan is required to use this on privately hosted repos.", "when": "gitlens:plus:required && gitlens:plus:state == 4" + }, + { + "view": "gitlens.views.worktrees", + "contents": "You're eligible to reactivate your GitLens Pro trial and experience all the new Pro features — free for another 7 days!\n\n[Try Pro](command:gitlens.plus.reactivateProTrial)\nYour Pro trial provides access to [✨ Worktrees](https://help.gitkraken.com/gitlens/side-bar/#worktrees-view%e2%9c%a8) for seamlessly switching between branches without any hassle.", + "when": "gitlens:plus:required && gitlens:plus:state == 5" } ], "views": { diff --git a/src/constants.ts b/src/constants.ts index 68ef8aac7c652..53f50cccf3440 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -252,6 +252,7 @@ export const enum Commands { PlusLogout = 'gitlens.plus.logout', PlusManage = 'gitlens.plus.manage', PlusPurchase = 'gitlens.plus.purchase', + PlusReactivateProTrial = 'gitlens.plus.reactivateProTrial', PlusResendVerification = 'gitlens.plus.resendVerification', PlusRestore = 'gitlens.plus.restore', PlusShowPlans = 'gitlens.plus.showPlans', diff --git a/src/plus/gk/account/subscription.ts b/src/plus/gk/account/subscription.ts index c3ed2bfc17789..2bca55f5cf58c 100644 --- a/src/plus/gk/account/subscription.ts +++ b/src/plus/gk/account/subscription.ts @@ -34,6 +34,7 @@ export interface SubscriptionPlan { readonly name: string; readonly bundle: boolean; readonly trialReactivationCount: number; + readonly nextTrialOptInDate?: string | undefined; readonly cancelled: boolean; readonly startedOn: string; readonly expiresOn?: string | undefined; @@ -53,6 +54,7 @@ export interface SubscriptionPreviewTrial { readonly expiresOn: string; } +// Note: Pay attention to gitlens:plus:state in package.json when modifying this enum export const enum SubscriptionState { /** Indicates a user who hasn't verified their email address yet */ VerificationRequired = -1, @@ -64,8 +66,10 @@ export const enum SubscriptionState { FreePreviewTrialExpired, /** Indicates a Free+ user with a completed trial */ FreePlusInTrial, - /** Indicates a Free+ user who's trial has expired */ + /** Indicates a Free+ user who's trial has expired and is not yet eligible for reactivation */ FreePlusTrialExpired, + /** Indicated a Free+ user who's trial has expired and is eligible for reactivation */ + FreePlusTrialReactivationEligible, /** Indicates a Paid user */ Paid, } @@ -84,8 +88,13 @@ export function computeSubscriptionState(subscription: Optional): boolean { diff --git a/src/plus/gk/account/subscriptionService.ts b/src/plus/gk/account/subscriptionService.ts index 9062f8063d1be..994efb1c51e78 100644 --- a/src/plus/gk/account/subscriptionService.ts +++ b/src/plus/gk/account/subscriptionService.ts @@ -17,6 +17,7 @@ import { ProgressLocation, StatusBarAlignment, ThemeColor, + Uri, window, } from 'vscode'; import { getPlatform } from '@env/platform'; @@ -173,6 +174,7 @@ export class SubscriptionService implements Disposable { registerCommand(Commands.PlusLogout, () => this.logout()), registerCommand(Commands.PlusStartPreviewTrial, () => this.startPreviewTrial()), + registerCommand(Commands.PlusReactivateProTrial, () => this.reactivateProTrial()), registerCommand(Commands.PlusManage, () => this.manage()), registerCommand(Commands.PlusPurchase, () => this.purchase()), @@ -504,6 +506,66 @@ export class SubscriptionService implements Disposable { } } + @gate() + @log() + async reactivateProTrial(): Promise { + if (!(await ensurePlusFeaturesEnabled())) return; + const scope = getLogScope(); + + const session = await this.ensureSession(false); + if (session == null) return; + + const rsp = await this.connection.fetchApi('user/reactivate-trial', { + method: 'POST', + body: JSON.stringify({ client: 'gitlens' }), + }); + + if (!rsp.ok) { + if (rsp.status === 409) { + void window.showErrorMessage( + 'Unable to reactivate trial: User not eligible. Please try again. If this issue persists, please contact support.', + 'OK', + ); + return; + } + + void window.showErrorMessage( + `Unable to reactivate trial: (${rsp.status}) ${rsp.statusText}. Please try again. If this issue persists, please contact support.`, + 'OK', + ); + return; + } + + // Trial was reactivated. Do a check-in to update, and show a message if successful. + try { + await this.checkInAndValidate(session, { force: true }); + if (isSubscriptionTrial(this._subscription)) { + const remaining = getSubscriptionTimeRemaining(this._subscription, 'days'); + + const confirm: MessageItem = { title: 'OK', isCloseAffordance: true }; + const learn: MessageItem = { title: "See What's New" }; + const result = await window.showInformationMessage( + `Your new trial has been activated! Enjoy access to Pro features on privately hosted repos for another ${pluralize( + 'day', + remaining ?? 0, + )}.`, + { modal: true }, + confirm, + learn, + ); + + if (result === learn) { + void env.openExternal( + Uri.parse('https://help.gitkraken.com/gitlens/gitlens-release-notes-current/'), + ); + } + } + } catch (ex) { + Logger.error(ex, scope); + debugger; + } + } + @gate(o => `${o?.force ?? false}`) @log() async validate(options?: { force?: boolean }): Promise { diff --git a/src/plus/gk/checkin.ts b/src/plus/gk/checkin.ts index 1123e40eebb1a..4cebd5d75a73d 100644 --- a/src/plus/gk/checkin.ts +++ b/src/plus/gk/checkin.ts @@ -8,6 +8,7 @@ export interface GKCheckInResponse { readonly paidLicenses: Record; readonly effectiveLicenses: Record; }; + readonly nextOptInDate?: string; } export interface GKUser { @@ -25,6 +26,7 @@ export interface GKLicense { readonly latestEndDate: string; readonly organizationId: string | undefined; readonly reactivationCount?: number; + readonly nextOptInDate?: string; } export type GKLicenseType = @@ -144,6 +146,9 @@ export function getSubscriptionFromCheckIn( : data.user.createdDate != null ? new Date(data.user.createdDate) : undefined, + undefined, + undefined, + data.nextOptInDate, ); } @@ -162,6 +167,7 @@ export function getSubscriptionFromCheckIn( new Date(license.latestStartDate), new Date(license.latestEndDate), license.latestStatus === 'cancelled', + license.nextOptInDate ?? data.nextOptInDate, ); } diff --git a/src/system/date.ts b/src/system/date.ts index 4edae74fdfb48..f5bb490a4781b 100644 --- a/src/system/date.ts +++ b/src/system/date.ts @@ -236,19 +236,21 @@ export function getDateDifference( first: Date | number, second: Date | number, unit?: 'days' | 'hours' | 'minutes' | 'seconds', + roundFn?: (value: number) => number, ): number { const diff = (typeof second === 'number' ? second : second.getTime()) - (typeof first === 'number' ? first : first.getTime()); + const round = roundFn ?? Math.floor; switch (unit) { case 'days': - return Math.floor(diff / (1000 * 60 * 60 * 24)); + return round(diff / (1000 * 60 * 60 * 24)); case 'hours': - return Math.floor(diff / (1000 * 60 * 60)); + return round(diff / (1000 * 60 * 60)); case 'minutes': - return Math.floor(diff / (1000 * 60)); + return round(diff / (1000 * 60)); case 'seconds': - return Math.floor(diff / 1000); + return round(diff / 1000); default: return diff; } diff --git a/src/webviews/apps/plus/account/components/account-content.ts b/src/webviews/apps/plus/account/components/account-content.ts index 9ee737d5d8bef..4fe8861dcebdc 100644 --- a/src/webviews/apps/plus/account/components/account-content.ts +++ b/src/webviews/apps/plus/account/components/account-content.ts @@ -149,6 +149,7 @@ export class AccountContent extends LitElement { case SubscriptionState.Free: case SubscriptionState.FreePreviewTrialExpired: case SubscriptionState.FreePlusTrialExpired: + case SubscriptionState.FreePlusTrialReactivationEligible: return 'GitKraken Free'; case SubscriptionState.FreeInPreviewTrial: case SubscriptionState.FreePlusInTrial: @@ -301,6 +302,23 @@ export class AccountContent extends LitElement {

`; + case SubscriptionState.FreePlusTrialReactivationEligible: + return html` +

+ You're eligible to reactivate your GitLens Pro trial and experience all the new Pro features — + free for another 7 days! +

+ + Try Pro + +

+ Your Pro trial provides access to the entire + GitKraken suite, unleashing powerful Git + visualization & productivity capabilities everywhere you work: IDE, desktop, browser and + terminal. +

+ `; + case SubscriptionState.FreePlusInTrial: return html`

diff --git a/src/webviews/apps/plus/focus/components/focus-app.ts b/src/webviews/apps/plus/focus/components/focus-app.ts index 4bad25954943b..0c24956aa3317 100644 --- a/src/webviews/apps/plus/focus/components/focus-app.ts +++ b/src/webviews/apps/plus/focus/components/focus-app.ts @@ -324,6 +324,13 @@ export class GlFocusApp extends LitElement { Brings all of your GitHub pull requests and issues into a unified actionable view to help to you more easily juggle work in progress, pending work, reviews, and more. Quickly see if anything requires your attention while keeping you focused. +

+

+ Your Pro trial provides access to + ✨ Focus View, for effortlessly viewing all your GitHub pull requests and issues in a unified, + actionable view.

diff --git a/src/webviews/apps/plus/graph/GraphWrapper.tsx b/src/webviews/apps/plus/graph/GraphWrapper.tsx index d0d07f70edc09..9d7291a0c2e39 100644 --- a/src/webviews/apps/plus/graph/GraphWrapper.tsx +++ b/src/webviews/apps/plus/graph/GraphWrapper.tsx @@ -1369,6 +1369,13 @@ export function GraphWrapper({ to search by a specific commit, message, author, a changed file or files, or even a specific code change.

+

+ Your Pro trial provides access to{' '} + + ✨ The Commit Graph + + , to easily visualize your repository and keep track of work in progress all in one view. +

{graphConfig?.minimap && ( Upgrade to Pro -

✨ A paid plan is required to use this on privately hosted repos.

+

✨ A trial or paid plan is required to use this on privately hosted repos.

+ `; + + case SubscriptionState.FreePlusTrialReactivationEligible: + return html` +

+ You're eligible to reactivate your GitLens Pro trial and experience all the new Pro features — + free for another 7 days! +

+ Try Pro `; } diff --git a/src/webviews/apps/plus/timeline/timeline.html b/src/webviews/apps/plus/timeline/timeline.html index bcbdd2a23fe97..540765495e2ae 100644 --- a/src/webviews/apps/plus/timeline/timeline.html +++ b/src/webviews/apps/plus/timeline/timeline.html @@ -25,6 +25,12 @@ >

Visualize the evolution of a file, including when changes were made, how large they were, and who made them. +

+

+ Your Pro trial provides access to + ✨ Visual File History, for identifying when the most impactful changes were made to a file and by whom.

diff --git a/src/webviews/apps/shared/components/feature-gate-badge.ts b/src/webviews/apps/shared/components/feature-gate-badge.ts index d0e492df01227..2a37d5c3c166c 100644 --- a/src/webviews/apps/shared/components/feature-gate-badge.ts +++ b/src/webviews/apps/shared/components/feature-gate-badge.ts @@ -123,6 +123,7 @@ export class FeatureGateBadge extends LitElement { case SubscriptionState.FreePlusTrialExpired: case SubscriptionState.FreeInPreviewTrial: case SubscriptionState.FreePlusInTrial: + case SubscriptionState.FreePlusTrialReactivationEligible: return html`✨ Requires a paid plan for use on privately hosted repos.`; diff --git a/src/webviews/apps/shared/components/feature-gate.ts b/src/webviews/apps/shared/components/feature-gate.ts index a7b80b5d17958..4f714678a684d 100644 --- a/src/webviews/apps/shared/components/feature-gate.ts +++ b/src/webviews/apps/shared/components/feature-gate.ts @@ -107,6 +107,10 @@ export class FeatureGate extends LitElement { + `; } From 03a1acd59bf6c70468d7406f4c6fec1329eae620 Mon Sep 17 00:00:00 2001 From: Ramin Tadayon Date: Wed, 14 Feb 2024 12:45:18 -0700 Subject: [PATCH 2/3] Updates wording on all trial states and references --- README.md | 12 ++--- package.json | 20 ++++---- src/plus/gk/account/subscriptionService.ts | 6 +-- src/plus/integrations/providerIntegration.ts | 2 +- src/plus/utils.ts | 2 +- src/plus/workspaces/workspacesService.ts | 2 +- src/quickpicks/items/directive.ts | 2 +- .../account/components/account-content.ts | 48 ++++++++++--------- .../apps/plus/focus/components/focus-app.ts | 17 ++++--- src/webviews/apps/plus/graph/GraphWrapper.tsx | 12 +++-- .../components/feature-gate-plus-state.ts | 20 +++----- src/webviews/apps/plus/timeline/timeline.html | 15 +++--- .../apps/shared/components/feature-gate.ts | 8 +++- src/webviews/apps/welcome/welcome.html | 2 +- 14 files changed, 88 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index 5aa6bc3fd2f27..bbe86bb827d98 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ See the [FAQ](#is-gitlens-free-to-use 'Jump to FAQ') for more details. [Features](#discover-powerful-features 'Jump to Discover Powerful Features') | [Labs](#gitkraken-labs 'Jump to GitKraken Labs') -| [Pro](#ready-for-gitlens-pro 'Jump to Ready for GitKraken Pro?') +| [Pro](#ready-for-gitlens-pro 'Jump to Ready for GitLens Pro?') | [FAQ](#faq 'Jump to FAQ') | [Support and Community](#support-and-community 'Jump to Support and Community') | [Contributing](#contributing 'Jump to Contributing') @@ -257,11 +257,11 @@ Use the Explain panel on the **Commit Details** view to leverage AI to help you Use the `Generate Commit Message` command from the Source Control view's context menu to automatically generate a commit message for your staged changes by leveraging AI. -# Ready for GitKraken Pro? +# Ready for GitLens Pro? -When you're ready to unlock the full potential of GitLens and enjoy all the benefits on your privately hosted repos, consider upgrading to GitKraken Pro. With GitKraken Pro, you'll gain access to ✨ features on privately hosted repos and ☁️ features based on the Pro plan. +When you're ready to unlock the full potential of GitLens and enjoy all the benefits on your privately hosted repos, consider upgrading to GitLens Pro. With GitLens Pro, you'll gain access to ✨ features on privately hosted repos and ☁️ features based on the Pro plan. -To learn more about the pricing and the additional ✨ and ☁️ features offered with GitKraken Pro, visit the [GitLens Pricing page](https://www.gitkraken.com/gitlens/pricing). Upgrade to GitKraken Pro today and take your Git workflow to the next level! +To learn more about the pricing and the additional ✨ and ☁️ features offered with GitLens Pro, visit the [GitLens Pricing page](https://www.gitkraken.com/gitlens/pricing). Upgrade to GitLens Pro today and take your Git workflow to the next level! # FAQ @@ -274,7 +274,7 @@ Yes. All features are free to use on all repos, **except** for features, While GitLens offers a remarkable set of free features, a subset of features tailored for professional developers and teams, marked with a ✨, require a trial or paid plan for use on privately hosted repos — use on local or publicly hosted repos is free for everyone. Additionally some features marked with a ☁️, rely on GitKraken Dev Services which requires a GitKraken account and access is based on your plan, e.g. Free, Pro, etc. -Preview ✨ features instantly for free for 3 days without an account, or start a free GitKraken trial to get an additional 7 days and gain access to ☁️ features to experience the full power of GitLens. +Preview ✨ features instantly for free for 3 days without an account, or start a free GitLens Pro trial to get an additional 7 days and gain access to ☁️ features to experience the full power of GitLens. ## Are ✨ and ☁️ features free to use? @@ -300,7 +300,7 @@ Join the GitLens community on [GitHub Discussions](https://github.com/gitkraken/ For any issues or inquiries related to GitLens, you can reach out to the GitKraken support team via the [official support page](https://support.gitkraken.com/). They will be happy to assist you with any problems you may encounter. -With GitKraken Pro, you gain access to priority email support from our customer success team, ensuring higher priority and faster response times. Custom onboarding and training are also available to help you and your team quickly get up and running with a GitKraken Pro plan. +With GitLens Pro, you gain access to priority email support from our customer success team, ensuring higher priority and faster response times. Custom onboarding and training are also available to help you and your team quickly get up and running with a GitLens Pro plan. # Contributing diff --git a/package.json b/package.json index 47f141e3139ef..76a8933652a4c 100644 --- a/package.json +++ b/package.json @@ -5125,7 +5125,7 @@ }, { "command": "gitlens.plus.reactivateProTrial", - "title": "Reactivate GitKraken Trial", + "title": "Reactivate Pro Trial", "category": "GitLens" }, { @@ -16132,7 +16132,7 @@ }, { "view": "gitlens.views.drafts", - "contents": "[Start Free GitKraken Trial](command:gitlens.plus.signUp)\n\nStart a free 7-day GitKraken trial to use Cloud Patches, or [sign in](command:gitlens.plus.login).\n☁️ Requires a GitKraken account and access is based on your plan, e.g. Free, Pro, etc", + "contents": "[Start Pro Trial](command:gitlens.plus.signUp)\n\nStart a free 7-day GitLens Pro trial to use Cloud Patches, or [sign in](command:gitlens.plus.login).\n☁️ Requires a GitKraken account and access is based on your plan, e.g. Free, Pro, etc", "when": "!gitlens:plus" }, { @@ -16146,7 +16146,7 @@ }, { "view": "gitlens.views.workspaces", - "contents": "[Start Free GitKraken Trial](command:gitlens.plus.signUp)\n\nStart a free 7-day GitKraken trial to use GitKraken Workspaces, or [sign in](command:gitlens.plus.login).\n☁️ Requires a GitKraken account and access is based on your plan, e.g. Free, Pro, etc", + "contents": "[Start Pro Trial](command:gitlens.plus.signUp)\n\nStart a free 7-day GitLens Pro trial to use GitKraken Workspaces, or [sign in](command:gitlens.plus.login).\n☁️ Requires a GitKraken account and access is based on your plan, e.g. Free, Pro, etc", "when": "!gitlens:plus" }, { @@ -16166,22 +16166,22 @@ }, { "view": "gitlens.views.worktrees", - "contents": "[Preview Pro](command:gitlens.plus.startPreviewTrial)\n\nPreview Pro for 3 days, or [sign up](command:gitlens.plus.signUp) to start a full 7-day GitKraken trial.\n✨ A trial or paid plan is required to use this on privately hosted repos.", + "contents": "[Preview Pro](command:gitlens.plus.startPreviewTrial)\n\nPreview Pro for 3 days, or [sign up](command:gitlens.plus.signUp) to start a full 7-day GitLens Pro trial.\n[✨ Worktrees](https://help.gitkraken.com/gitlens/side-bar/#worktrees-view%e2%9c%a8) — seamlessly work on multiple branches simultaneously.", "when": "gitlens:plus:required && gitlens:plus:state == 0" }, { "view": "gitlens.views.worktrees", - "contents": "Your 3-day Pro preview has ended, start a free GitKraken trial to get an additional 7 days, or [sign in](command:gitlens.plus.login).\n\n[Start Free GitKraken Trial](command:gitlens.plus.signUp)\n✨ A trial or paid plan is required to use this on privately hosted repos.", + "contents": "Your 3-day preview has ended. Start a free GitLens Pro trial to get an additional 7 days, or [sign in](command:gitlens.plus.login).\n\n[Start Pro Trial](command:gitlens.plus.signUp)\n[✨ Worktrees](https://help.gitkraken.com/gitlens/side-bar/#worktrees-view%e2%9c%a8) — seamlessly work on multiple branches simultaneously.", "when": "gitlens:plus:required && gitlens:plus:state == 2" }, { "view": "gitlens.views.worktrees", - "contents": "Your GitKraken trial has ended, please upgrade to continue to use this on privately hosted repos.\n\n[Upgrade to Pro](command:gitlens.plus.purchase)\n✨ A paid plan is required to use this on privately hosted repos.", + "contents": "Your GitLens Pro trial has ended. Please upgrade to continue to use this on privately hosted repos.\n\n[Upgrade to Pro](command:gitlens.plus.purchase)\n[✨ Worktrees](https://help.gitkraken.com/gitlens/side-bar/#worktrees-view%e2%9c%a8) — seamlessly work on multiple branches simultaneously.", "when": "gitlens:plus:required && gitlens:plus:state == 4" }, { "view": "gitlens.views.worktrees", - "contents": "You're eligible to reactivate your GitLens Pro trial and experience all the new Pro features — free for another 7 days!\n\n[Try Pro](command:gitlens.plus.reactivateProTrial)\nYour Pro trial provides access to [✨ Worktrees](https://help.gitkraken.com/gitlens/side-bar/#worktrees-view%e2%9c%a8) for seamlessly switching between branches without any hassle.", + "contents": "You're eligible to reactivate your GitLens Pro trial and experience all the new Pro features — free for another 7 days!\n\n[Try Pro](command:gitlens.plus.reactivateProTrial)\n[✨ Worktrees](https://help.gitkraken.com/gitlens/side-bar/#worktrees-view%e2%9c%a8) — seamlessly work on multiple branches simultaneously.", "when": "gitlens:plus:required && gitlens:plus:state == 5" } ], @@ -16455,8 +16455,8 @@ }, { "id": "gitlens.welcome.preview", - "title": "Previewing GitKraken Pro", - "description": "During your preview, you have access to ✨ features on privately hosted repos. [Learn more](https://www.gitkraken.com/gitlens/pro-features)\n\n[Start Free GitKraken Trial](command:gitlens.plus.signUp)\n\nStart a free GitKraken trial to get an additional 7 days.", + "title": "Previewing GitLens Pro", + "description": "During your preview, you have access to ✨ features on privately hosted repos. [Learn more](https://www.gitkraken.com/gitlens/pro-features)\n\n[Start Free Pro Trial](command:gitlens.plus.signUp)\n\nStart a free Pro trial to get an additional 7 days.", "media": { "markdown": "walkthroughs/welcome/preview.md" }, @@ -16464,7 +16464,7 @@ }, { "id": "gitlens.welcome.trial", - "title": "Trialing GitKraken Pro", + "title": "Trialing GitLens Pro", "description": "During your trial, you have access to ✨ features on privately hosted repos and ☁️ features based on the Pro plan. [Learn more](https://www.gitkraken.com/gitlens/pro-features)\n\n[Upgrade to Pro](command:gitlens.plus.purchase)", "media": { "markdown": "walkthroughs/welcome/trial.md" diff --git a/src/plus/gk/account/subscriptionService.ts b/src/plus/gk/account/subscriptionService.ts index 994efb1c51e78..fd639d31c222d 100644 --- a/src/plus/gk/account/subscriptionService.ts +++ b/src/plus/gk/account/subscriptionService.ts @@ -438,10 +438,10 @@ export class SubscriptionService implements Disposable { void this.showAccountView(); if (!silent && plan.effective.id === SubscriptionPlanId.Free) { - const confirm: MessageItem = { title: 'Start Free GitKraken Trial', isCloseAffordance: true }; + const confirm: MessageItem = { title: 'Start Pro Trial', isCloseAffordance: true }; const cancel: MessageItem = { title: 'Cancel' }; const result = await window.showInformationMessage( - 'Your 3-day Pro preview has ended, start a free GitKraken trial to get an additional 7 days.\n\n✨ A trial or paid plan is required to use Pro features on privately hosted repos.', + 'Your 3-day preview has ended. Start a free GitLens Pro trial to get an additional 7 days.\n\n✨ A trial or paid plan is required to use Pro features on privately hosted repos.', { modal: true }, confirm, cancel, @@ -494,7 +494,7 @@ export class SubscriptionService implements Disposable { `You can now preview Pro features for ${pluralize( 'day', days, - )}. After which, you can start a free GitKraken trial for an additional 7 days.`, + )}. After which, you can start a free GitLens Pro trial for an additional 7 days.`, confirm, learn, ); diff --git a/src/plus/integrations/providerIntegration.ts b/src/plus/integrations/providerIntegration.ts index 14dc7b13b2436..578c40c2db0e0 100644 --- a/src/plus/integrations/providerIntegration.ts +++ b/src/plus/integrations/providerIntegration.ts @@ -934,7 +934,7 @@ export async function ensurePaidPlan(providerName: string, container: Container) void container.subscription.startPreviewTrial(); break; } else if (subscription.account == null) { - const signIn = { title: 'Start Free GitKraken Trial' }; + const signIn = { title: 'Start Pro Trial' }; const cancel = { title: 'Cancel', isCloseAffordance: true }; const result = await window.showWarningMessage( `${title}\n\nDo you want to continue to use ✨ features on privately hosted repos, free for an additional 7 days?`, diff --git a/src/plus/utils.ts b/src/plus/utils.ts index 0bc2957523b33..38f5fa60339bb 100644 --- a/src/plus/utils.ts +++ b/src/plus/utils.ts @@ -29,7 +29,7 @@ export async function ensurePaidPlan(title: string, container: Container): Promi if (isSubscriptionPaidPlan(plan)) break; if (subscription.account == null) { - const signIn = { title: 'Start Free GitKraken Trial' }; + const signIn = { title: 'Start Pro Trial' }; const cancel = { title: 'Cancel', isCloseAffordance: true }; const result = await window.showWarningMessage( `${title}\n\nTry our developer productivity and collaboration services free for 7 days.`, diff --git a/src/plus/workspaces/workspacesService.ts b/src/plus/workspaces/workspacesService.ts index 84364a6476794..79d831c337699 100644 --- a/src/plus/workspaces/workspacesService.ts +++ b/src/plus/workspaces/workspacesService.ts @@ -163,7 +163,7 @@ export class WorkspacesService implements Disposable { cloudWorkspaces: cloudWorkspaces, cloudWorkspaceInfo: filteredSharedWorkspaceCount > 0 - ? `${filteredSharedWorkspaceCount} shared workspaces hidden - upgrade to GitKraken Pro to access.` + ? `${filteredSharedWorkspaceCount} shared workspaces hidden - upgrade to GitLens Pro to access.` : undefined, }; } diff --git a/src/quickpicks/items/directive.ts b/src/quickpicks/items/directive.ts index 28bd14dcca845..4ce7a718a384d 100644 --- a/src/quickpicks/items/directive.ts +++ b/src/quickpicks/items/directive.ts @@ -53,7 +53,7 @@ export function createDirectiveQuickPickItem( detail = 'Preview Pro for 3-days to use this on privately hosted repos'; break; case Directive.ExtendTrial: - label = 'Start Free GitKraken Trial'; + label = 'Start Pro Trial'; detail = 'Continue to use this on privately hosted repos, free for an additional 7 days'; break; case Directive.RequiresVerification: diff --git a/src/webviews/apps/plus/account/components/account-content.ts b/src/webviews/apps/plus/account/components/account-content.ts index 4fe8861dcebdc..b2c9a0db5a4ed 100644 --- a/src/webviews/apps/plus/account/components/account-content.ts +++ b/src/webviews/apps/plus/account/components/account-content.ts @@ -262,19 +262,24 @@ export class AccountContent extends LitElement { case SubscriptionState.FreePreviewTrialExpired: return html`

- Sign up for access to our developer productivity and collaboration services, e.g. Workspaces, or + Your 3-day preview has ended. Start a free GitLens Pro trial to get an additional 7 days, or sign in.

- Sign Up + Start Pro Trial -

Signing up starts a free 7-day GitKraken trial.

+

+ Your Pro trial provides access to the entire + GitKraken suite, unleashing powerful Git + visualization & productivity capabilities everywhere you work: IDE, desktop, browser, and + terminal. +

`; case SubscriptionState.FreePlusTrialExpired: return html`

- Your GitKraken trial has ended, please upgrade to continue to use ✨ features on privately + Your GitLens Pro trial has ended. Please upgrade to continue to use ✨ features on privately hosted repos.

${when( @@ -283,22 +288,22 @@ export class AccountContent extends LitElement { html`

Holiday Special: 50% off first seat of Pro — only $4/month! Includes entire - GitKraken suite of dev tools.Holiday Special: 50% off first seat of Pro — only $4/month!

`, () => html`

- Special: 50% off first seat of Pro — only $4/month! Includes entire GitKraken suite of - dev tools. + Special: 50% off first seat of Pro — only $4/month!

`, )} - Upgrade to Pro + Get GitLens Pro

- You only have access to ✨ features on local and publicly hosted repos and ☁️ features based on - your plan, e.g. Free, Pro, etc. + A Pro account provides access to the entire + GitKraken suite, unleashing powerful Git + visualization & productivity capabilities everywhere you work: IDE, desktop, browser, and + terminal.

`; @@ -314,7 +319,7 @@ export class AccountContent extends LitElement {

Your Pro trial provides access to the entire GitKraken suite, unleashing powerful Git - visualization & productivity capabilities everywhere you work: IDE, desktop, browser and + visualization & productivity capabilities everywhere you work: IDE, desktop, browser, and terminal.

`; @@ -330,9 +335,9 @@ export class AccountContent extends LitElement { ${pluralize('day', this.days, { infix: ' more ', })} - in your GitKraken trial.` + in your GitLens Pro trial.` : `You have - ${this.daysRemaining} remaining in your GitKraken trial.`} + ${this.daysRemaining} remaining in your GitLens Pro trial.`} Once your trial ends, you'll need a paid plan to continue using ✨ features.

${when( @@ -341,25 +346,22 @@ export class AccountContent extends LitElement { html`

Holiday Special: 50% off first seat of Pro — only $4/month! Includes entire - GitKraken suite of dev tools.Holiday Special: 50% off first seat of Pro — only $4/month!

`, () => html`

- Special: 50% off first seat of Pro — only $4/month! Includes entire GitKraken - suite of dev tools. + Special: 50% off first seat of Pro — only $4/month!

`, )} Upgrade to Pro

- You have access to ✨ features on privately hosted repos and ☁️ features based on the Pro plan. -

-

- Try our - other developer tools also included in your trial. + A Pro account provides access to the entire + GitKraken suite, unleashing powerful Git + visualization & productivity capabilities everywhere you work: IDE, desktop, browser, and + terminal.

`; diff --git a/src/webviews/apps/plus/focus/components/focus-app.ts b/src/webviews/apps/plus/focus/components/focus-app.ts index 0c24956aa3317..ee4945a00cbca 100644 --- a/src/webviews/apps/plus/focus/components/focus-app.ts +++ b/src/webviews/apps/plus/focus/components/focus-app.ts @@ -321,15 +321,18 @@ export class GlFocusApp extends LitElement { id="subscription-gate" class="scrollable" >

- Brings all of your GitHub pull requests and issues into a unified actionable view to help to - you more easily juggle work in progress, pending work, reviews, and more. Quickly see if - anything requires your attention while keeping you focused. + Focus View + — brings all of your GitHub pull requests and issues into a unified actionable view to + help to you more easily juggle work in progress, pending work, reviews, and more. Quickly + see if anything requires your attention while keeping you focused.

-

- Your Pro trial provides access to +

✨ Focus View, for effortlessly viewing all your GitHub pull requests and issues in a unified, + >Focus View + — effortlessly view all of your GitHub pull requests and issues in a unified, actionable view.

diff --git a/src/webviews/apps/plus/graph/GraphWrapper.tsx b/src/webviews/apps/plus/graph/GraphWrapper.tsx index 9d7291a0c2e39..78b05a479aa50 100644 --- a/src/webviews/apps/plus/graph/GraphWrapper.tsx +++ b/src/webviews/apps/plus/graph/GraphWrapper.tsx @@ -1362,19 +1362,21 @@ export function GraphWrapper({

- Helps you easily visualize your repository and keep track of all work in progress. + + Commit Graph + + — helps you easily visualize your repository and keep track of all work in progress.

Use the rich commit search to find exactly what you're looking for. It's powerful filters allow you to search by a specific commit, message, author, a changed file or files, or even a specific code change.

-

- Your Pro trial provides access to{' '} +

- ✨ The Commit Graph + Commit Graph - , to easily visualize your repository and keep track of work in progress all in one view. + — easily visualize your repository and keep track of work in progress all in one view.

{graphConfig?.minimap && ( diff --git a/src/webviews/apps/plus/shared/components/feature-gate-plus-state.ts b/src/webviews/apps/plus/shared/components/feature-gate-plus-state.ts index b5bdb1c7c0958..8a81573e8c30d 100644 --- a/src/webviews/apps/plus/shared/components/feature-gate-plus-state.ts +++ b/src/webviews/apps/plus/shared/components/feature-gate-plus-state.ts @@ -79,7 +79,7 @@ export class FeatureGatePlusState extends LitElement { >

Preview Pro for 3 days, or - sign up to start a full 7-day GitKraken trial. + sign up to start a full 7-day GitLens Pro trial.

✨ A trial or paid plan is required to use this on privately hosted repos.

`; @@ -87,19 +87,16 @@ export class FeatureGatePlusState extends LitElement { case SubscriptionState.FreePreviewTrialExpired: return html`

- Your 3-day Pro preview has ended, start a free GitKraken trial to get an additional 7 days, or + Your 3-day preview has ended. Start a free GitLens Pro trial to get an additional 7 days, or sign in.

- Start Free GitKraken Trial -

✨ A trial or paid plan is required to use this on privately hosted repos.

+ Start Pro Trial `; case SubscriptionState.FreePlusTrialExpired: return html`

- Your GitKraken trial has ended, please upgrade to continue to use this on privately hosted + Your GitLens Pro trial has ended. Please upgrade to continue to use this on privately hosted repos.

${when( @@ -108,20 +105,17 @@ export class FeatureGatePlusState extends LitElement { html`

Holiday Special: 50% off first seat of Pro — only $4/month!
- Includes entire GitKraken suite of dev tools.
+ >Holiday Special: 50% off first seat of Pro — only $4/month!

`, () => html`

Special: 50% off first seat of Pro — only $4/month!
- Includes entire GitKraken suite of dev tools.

`, )} Upgrade to ProGet GitLens Pro -

✨ A trial or paid plan is required to use this on privately hosted repos.

`; case SubscriptionState.FreePlusTrialReactivationEligible: diff --git a/src/webviews/apps/plus/timeline/timeline.html b/src/webviews/apps/plus/timeline/timeline.html index 540765495e2ae..e3318b34be0a9 100644 --- a/src/webviews/apps/plus/timeline/timeline.html +++ b/src/webviews/apps/plus/timeline/timeline.html @@ -23,14 +23,17 @@ >

- Visualize the evolution of a file, including when changes were made, how large they were, and who made - them. + Visual File History + — visualize the evolution of a file, including when changes were made, how large they were, and + who made them.

-

- Your Pro trial provides access to +

✨ Visual File History, for identifying when the most impactful changes were made to a file and by whom. + >Visual File History + — quickly identify when the most impactful changes were made to a file and by whom.

diff --git a/src/webviews/apps/shared/components/feature-gate.ts b/src/webviews/apps/shared/components/feature-gate.ts index 4f714678a684d..81eb277f2edc0 100644 --- a/src/webviews/apps/shared/components/feature-gate.ts +++ b/src/webviews/apps/shared/components/feature-gate.ts @@ -108,8 +108,12 @@ export class FeatureGate extends LitElement { `; diff --git a/src/webviews/apps/welcome/welcome.html b/src/webviews/apps/welcome/welcome.html index 4cab49c73bde9..90fe1302a150f 100644 --- a/src/webviews/apps/welcome/welcome.html +++ b/src/webviews/apps/welcome/welcome.html @@ -464,7 +464,7 @@

Try Pro ✨

Unlock the full power of GitLens ✨ and ☁️ features

Start a GitKraken trialStart a Pro trial  or sign in

From 633317949513dd25bad76f4f44129fad1d441e58 Mon Sep 17 00:00:00 2001 From: Ramin Tadayon Date: Wed, 14 Feb 2024 12:49:27 -0700 Subject: [PATCH 3/3] Fixes button text in Worktrees view --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 76a8933652a4c..4f38cb97d6866 100644 --- a/package.json +++ b/package.json @@ -16176,7 +16176,7 @@ }, { "view": "gitlens.views.worktrees", - "contents": "Your GitLens Pro trial has ended. Please upgrade to continue to use this on privately hosted repos.\n\n[Upgrade to Pro](command:gitlens.plus.purchase)\n[✨ Worktrees](https://help.gitkraken.com/gitlens/side-bar/#worktrees-view%e2%9c%a8) — seamlessly work on multiple branches simultaneously.", + "contents": "Your GitLens Pro trial has ended. Please upgrade to continue to use this on privately hosted repos.\n\n[Get GitLens Pro](command:gitlens.plus.purchase)\n[✨ Worktrees](https://help.gitkraken.com/gitlens/side-bar/#worktrees-view%e2%9c%a8) — seamlessly work on multiple branches simultaneously.", "when": "gitlens:plus:required && gitlens:plus:state == 4" }, {