diff --git a/desktop/app/src/fb-stubs/config.tsx b/desktop/app/src/fb-stubs/config.tsx
index 08cf3a8fe..dcbf058ad 100644
--- a/desktop/app/src/fb-stubs/config.tsx
+++ b/desktop/app/src/fb-stubs/config.tsx
@@ -7,10 +7,13 @@
* @format
*/
+import ReleaseChannel from '../ReleaseChannel';
+
export default {
updateServer: 'https://www.facebook.com/fbflipper/public/latest.json',
showLogin: false,
showFlipperRating: false,
warnFBEmployees: true,
isFBBuild: false,
+ getReleaseChannel: () => ReleaseChannel.STABLE,
};
diff --git a/desktop/app/src/init.tsx b/desktop/app/src/init.tsx
index e64f112e6..c7de39b7f 100644
--- a/desktop/app/src/init.tsx
+++ b/desktop/app/src/init.tsx
@@ -20,6 +20,7 @@ import {Store} from './reducers/index';
import dispatcher from './dispatcher/index';
import TooltipProvider from './ui/components/TooltipProvider';
import config from './utils/processConfig';
+import appConfig from '../src/fb-stubs/config';
import {initLauncherHooks} from './utils/launcher';
import {setPersistor} from './utils/persistor';
import React from 'react';
@@ -40,6 +41,7 @@ import {
_setGlobalInteractionReporter,
} from 'flipper-plugin';
import isProduction from './utils/isProduction';
+import ReleaseChannel from './ReleaseChannel';
if (process.env.NODE_ENV === 'development' && os.platform() === 'darwin') {
// By default Node.JS has its internal certificate storage and doesn't use
@@ -116,7 +118,10 @@ function init() {
store,
{name: 'loadTheme', fireImmediately: true, throttleMs: 500},
(state) => ({
- sandy: GK.get('flipper_sandy') && !state.settingsState.disableSandy,
+ sandy:
+ (GK.get('flipper_sandy') ||
+ appConfig.getReleaseChannel() === ReleaseChannel.INSIDERS) &&
+ !state.settingsState.disableSandy,
dark: state.settingsState.darkMode,
}),
(theme) => {
diff --git a/desktop/app/src/sandy-chrome/TemporarilyTitlebar.tsx b/desktop/app/src/sandy-chrome/TemporarilyTitlebar.tsx
index dad15e415..824d07347 100644
--- a/desktop/app/src/sandy-chrome/TemporarilyTitlebar.tsx
+++ b/desktop/app/src/sandy-chrome/TemporarilyTitlebar.tsx
@@ -18,6 +18,8 @@ import UpdateIndicator from '../chrome/UpdateIndicator';
import {Version} from '../chrome/TitleBar';
import {useStore} from '../utils/useStore';
import {remote} from 'electron';
+import config from '../fb-stubs/config';
+import ReleaseChannel from '../ReleaseChannel';
const version = remote.app.getVersion();
@@ -54,7 +56,13 @@ export function TemporarilyTitlebar() {
[Sandy] Flipper{' '}
{!isProduction() && }
{!isProduction() && }
- {version + (isProduction() ? '' : '-dev')}
+
+ {version +
+ (isProduction() ? '' : '-dev') +
+ (config.getReleaseChannel() !== ReleaseChannel.STABLE
+ ? `-${config.getReleaseChannel()}`
+ : '')}
+
{isAutoUpdaterEnabled() ? (
) : (
diff --git a/desktop/app/src/utils/useIsDarkMode.tsx b/desktop/app/src/utils/useIsDarkMode.tsx
index 75568c07a..1dba64626 100644
--- a/desktop/app/src/utils/useIsDarkMode.tsx
+++ b/desktop/app/src/utils/useIsDarkMode.tsx
@@ -8,7 +8,9 @@
*/
import {useStore} from '../../../app/src/utils/useStore';
+import config from '../fb-stubs/config';
import GK from '../fb-stubs/GK';
+import ReleaseChannel from '../ReleaseChannel';
/**
* This hook returns whether dark mode is currently being used.
* Generally should be avoided in favor of using the above theme object,
@@ -17,7 +19,8 @@ import GK from '../fb-stubs/GK';
export function useIsDarkMode(): boolean {
return useStore(
(state) =>
- GK.get('flipper_sandy') &&
+ (GK.get('flipper_sandy') ||
+ config.getReleaseChannel() === ReleaseChannel.INSIDERS) &&
!state.settingsState.disableSandy &&
state.settingsState.darkMode,
);
diff --git a/desktop/scripts/build-release.ts b/desktop/scripts/build-release.ts
index 805502f34..021f8648c 100755
--- a/desktop/scripts/build-release.ts
+++ b/desktop/scripts/build-release.ts
@@ -61,6 +61,11 @@ const argv = yargs
type: 'number',
default: 0,
},
+ channel: {
+ description: 'Release channel for the build',
+ choices: ['stable', 'insiders'],
+ default: 'stable',
+ },
})
.help()
.strict()
@@ -79,6 +84,12 @@ const argv = yargs
})
.parse(process.argv.slice(1));
+if (isFB) {
+ process.env.FLIPPER_FB = 'true';
+}
+
+process.env.FLIPPER_RELEASE_CHANNEL = argv.channel;
+
async function generateManifest(versionNumber: string) {
await fs.writeFile(
path.join(distDir, 'manifest.json'),
@@ -93,6 +104,7 @@ async function modifyPackageManifest(
buildFolder: string,
versionNumber: string,
hgRevision: string | null,
+ channel: string,
) {
// eslint-disable-next-line no-console
console.log('Creating package.json manifest');
@@ -108,6 +120,7 @@ async function modifyPackageManifest(
if (hgRevision != null) {
manifest.revision = hgRevision;
}
+ manifest.releaseChannel = channel;
await fs.writeFile(
path.join(buildFolder, 'package.json'),
JSON.stringify(manifest, null, ' '),
@@ -244,9 +257,6 @@ function downloadIcons(buildFolder: string) {
}
(async () => {
- if (isFB) {
- process.env.FLIPPER_FB = 'true';
- }
const dir = await buildFolder();
// eslint-disable-next-line no-console
console.log('Created build directory', dir);
@@ -258,7 +268,7 @@ function downloadIcons(buildFolder: string) {
await compileRenderer(dir);
const versionNumber = getVersionNumber(argv.version);
const hgRevision = await genMercurialRevision();
- await modifyPackageManifest(dir, versionNumber, hgRevision);
+ await modifyPackageManifest(dir, versionNumber, hgRevision, argv.channel);
await fs.ensureDir(distDir);
await generateManifest(versionNumber);
await buildDist(dir);
diff --git a/desktop/scripts/start-dev-server.ts b/desktop/scripts/start-dev-server.ts
index 29f7b4ee4..db67bc91f 100644
--- a/desktop/scripts/start-dev-server.ts
+++ b/desktop/scripts/start-dev-server.ts
@@ -71,6 +71,11 @@ const argv = yargs
'[FB-internal only] Will yield `true` on any GK. Disabled by default. Setting env var FLIPPER_ENABLE_ALL_GKS is equivalent',
type: 'boolean',
},
+ channel: {
+ describe:
+ '[FB-internal only] Release channel. "stable" by default. Setting env var "FLIPPER_RELEASE_CHANNEL" is equivalent.',
+ choices: ['stable', 'insiders'],
+ },
})
.version('DEV')
.help()
@@ -115,6 +120,10 @@ if (argv['enabled-plugins'] !== undefined) {
process.env.FLIPPER_ENABLED_PLUGINS = argv['enabled-plugins'].join(',');
}
+if (argv.channel !== undefined) {
+ process.env.FLIPPER_RELEASE_CHANNEL = argv.channel;
+}
+
function looksLikeDevServer(): boolean {
const hn = hostname();
if (/^devvm.*\.facebook\.com$/.test(hn)) {