diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts index c581ac0..f11c0f0 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts @@ -319,2 +319,8 @@ configurationRegistry.registerConfiguration({ }, + 'workbench.welcomePage.extraAnnouncements': { + scope: ConfigurationScope.MACHINE, + type: 'boolean', + default: true, + description: localize('workbench.welcomePage.extraAnnouncements', "When enabled, the get started page loads additional announcements from VSCodium's repository.") + }, 'workbench.startupEditor': { diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index 664c55b..43f9e2e 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -113,4 +113,8 @@ type GettingStartedActionEvent = { type RecentEntry = (IRecentFolder | IRecentWorkspace) & { id: string }; +type AnnouncementEntry = { id: string, title: string, url: string }; const REDUCED_MOTION_KEY = 'workbench.welcomePage.preferReducedMotion'; + +const BUILTIN_ANNOUNCEMENTS: AnnouncementEntry[] = [/* BUILTIN_ANNOUNCEMENTS */]; + export class GettingStartedPage extends EditorPane { @@ -149,2 +153,4 @@ export class GettingStartedPage extends EditorPane { private gettingStartedList?: GettingStartedIndexList; + private announcementList?: GettingStartedIndexList; + private announcementData?: AnnouncementEntry[]; @@ -812,2 +818,3 @@ export class GettingStartedPage extends EditorPane { const gettingStartedList = this.buildGettingStartedWalkthroughsList(); + const announcementList = await this.buildAnnouncementList(); @@ -822,3 +829,3 @@ export class GettingStartedPage extends EditorPane { this.container.classList.remove('noWalkthroughs'); - reset(rightColumn, gettingStartedList.getDomElement()); + reset(rightColumn, gettingStartedList.getDomElement(), announcementList.getDomElement()); } @@ -826,3 +833,3 @@ export class GettingStartedPage extends EditorPane { this.container.classList.add('noWalkthroughs'); - reset(rightColumn); + reset(rightColumn, announcementList.getDomElement()); } @@ -978,2 +985,55 @@ export class GettingStartedPage extends EditorPane { + private async buildAnnouncementList(): Promise> { + const renderAnnouncement = (announcement: AnnouncementEntry) => { + const { title, url } = announcement; + const li = $('li'); + + const anchor: HTMLLinkElement = $('a'); + anchor.href = url; + anchor.innerText = title; + anchor.target = '_blank'; + li.appendChild(anchor); + + return li; + }; + + if (this.announcementList) { this.announcementList.dispose(); } + + const announcementList = this.announcementList = new GettingStartedIndexList({ + title: localize('announcements', "VSCodium Announcements"), + klass: 'announcements', + limit: 5, + empty: $('.empty-recent', {}, localize('noAnnouncements', "There are no current announcements.")), + renderElement: renderAnnouncement, + contextService: this.contextService + }); + + if (!this.announcementData) { + const showExtras = this.configurationService.getValue('workbench.welcomePage.extraAnnouncements'); + + if (showExtras) { + const branch = this.productService.quality === 'insider' ? 'insider' : 'master'; + await fetch(`https://raw.githubusercontent.com/VSCodium/vscodium/${branch}/announcements-extra.json`) + .then(async res => { + if (res.ok) { + var extraAnnouncements = await res.json() as AnnouncementEntry[]; + + this.announcementData = [...extraAnnouncements, ...BUILTIN_ANNOUNCEMENTS]; + } else { + this.announcementData = BUILTIN_ANNOUNCEMENTS; + } + }) + .catch(err => { + this.announcementData = BUILTIN_ANNOUNCEMENTS; + }); + } else { + this.announcementData = BUILTIN_ANNOUNCEMENTS; + } + } + + announcementList.setEntries(this.announcementData); + + return announcementList; + } + private buildStartList(): GettingStartedIndexList {