Skip to content

Commit

Permalink
feat: opt-in to pre-release updates
Browse files Browse the repository at this point in the history
  • Loading branch information
jgresham committed Dec 7, 2023
1 parent 0b6bf4c commit 23e7c0a
Show file tree
Hide file tree
Showing 9 changed files with 99 additions and 0 deletions.
2 changes: 2 additions & 0 deletions assets/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@
"Privacy": "Privacy",
"SendErrorReports": "Send error reports",
"SendErrorReportsDescription": "Enabled by default in alpha releases to fix bugs and improve the app.",
"PreReleaseUpdates": "Pre-release Updates",
"PreReleaseUpdatesDescription": "Disabled by default. Enable to update and test pre-release versions of the app. Pre-releases are more likely to have issues.",
"YouAreRunningNiceNode": "You are running NiceNode",
"NoNotificationsYet": "No notifications yet",
"WellLetYouKnow": "We’ll let you know when something interesting happens!",
Expand Down
7 changes: 7 additions & 0 deletions src/main/ipc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import {
setThemeSetting,
ThemeSetting,
setIsEventReportingEnabled,
getSetIsPreReleaseUpdatesEnabled,
} from './state/settings';
import { getSystemInfo } from './systemInfo';
import startPodman from './podman/start';
Expand Down Expand Up @@ -242,6 +243,12 @@ export const initialize = () => {
return setIsEventReportingEnabled(isEventReportingEnabled);
},
);
ipcMain.handle(
'getSetIsPreReleaseUpdatesEnabled',
(_event, isPreReleaseUpdatesEnabled?: boolean) => {
return getSetIsPreReleaseUpdatesEnabled(isPreReleaseUpdatesEnabled);
},
);

// Notifications
ipcMain.handle('getNotifications', getNotifications);
Expand Down
6 changes: 6 additions & 0 deletions src/main/preload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ contextBridge.exposeInMainWorld('electron', {
setIsEventReportingEnabled: (isEventReportingEnabled: boolean) => {
ipcRenderer.invoke('setIsEventReportingEnabled', isEventReportingEnabled);
},
getSetIsPreReleaseUpdatesEnabled: (isPreReleaseUpdatesEnabled?: boolean) => {
ipcRenderer.invoke(
'getSetIsPreReleaseUpdatesEnabled',
isPreReleaseUpdatesEnabled,
);
},

// Notifications
getNotifications: () => ipcRenderer.invoke('getNotifications'),
Expand Down
22 changes: 22 additions & 0 deletions src/main/state/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { getPlatform, isLinux } from '../platform';

import store from './store';
import { setOpenAtLoginLinux } from '../util/linuxAutostartFile';
import { setAllowPrerelease } from '../updater';

// export type Settings = Record<string, string | object | boolean>;
const SETTINGS_KEY = 'settings';
Expand All @@ -21,6 +22,7 @@ const APP_THEME_SETTING = 'appThemeSetting';
const APP_IS_OPEN_ON_STARTUP = 'appIsOpenOnStartup';
const APP_IS_NOTIFICATIONS_ENABLED = 'appIsNotificationsEnabled';
const APP_IS_EVENT_REPORTING_ENABLED = 'appIsEventReportingEnabled';
const APP_IS_PRE_RELEASE_UPDATES_ENABLED = 'appIsPreReleaseUpdatesEnabled';

export type ThemeSetting = 'light' | 'dark' | 'auto';
export type Settings = {
Expand All @@ -34,6 +36,7 @@ export type Settings = {
[APP_IS_OPEN_ON_STARTUP]?: boolean;
[APP_IS_NOTIFICATIONS_ENABLED]?: boolean;
[APP_IS_EVENT_REPORTING_ENABLED]?: boolean;
[APP_IS_PRE_RELEASE_UPDATES_ENABLED]?: boolean;
};

/**
Expand Down Expand Up @@ -165,6 +168,25 @@ export const setIsEventReportingEnabled = (
);
};

export const getSetIsPreReleaseUpdatesEnabled = (
isPreReleaseUpdatesEnabled?: boolean,
) => {
if (isPreReleaseUpdatesEnabled !== undefined) {
logger.info(
`Setting isPreReleaseUpdatesEnabled to ${isPreReleaseUpdatesEnabled}`,
);
store.set(
`${SETTINGS_KEY}.${APP_IS_PRE_RELEASE_UPDATES_ENABLED}`,
isPreReleaseUpdatesEnabled,
);
setAllowPrerelease(isPreReleaseUpdatesEnabled);
}
const savedIsPreReleaseUpdatesEnabled: boolean = store.get(
`${SETTINGS_KEY}.${APP_IS_PRE_RELEASE_UPDATES_ENABLED}`,
);
return savedIsPreReleaseUpdatesEnabled;
};

// listen to OS theme updates
nativeTheme.on('updated', () => {
console.log("nativeTheme.on('updated')");
Expand Down
9 changes: 9 additions & 0 deletions src/main/updater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import sleep from 'await-sleep';
import logger, { autoUpdateLogger } from './logger';
import { reportEvent } from './events';
import { i18nMain } from './i18nMain';
import { getSetIsPreReleaseUpdatesEnabled } from './state/settings';

let notifyUserIfNoUpdateAvailable: boolean;

Expand Down Expand Up @@ -89,6 +90,9 @@ export const initialize = (mainWindow: BrowserWindow) => {
autoUpdater.logger = autoUpdateLogger;
autoUpdater.autoDownload = false;
autoUpdater.autoInstallOnAppQuit = false;
const isPreReleaseUpdatesEnabled = getSetIsPreReleaseUpdatesEnabled();
logger.info(`isPreReleaseUpdatesEnabled: ${isPreReleaseUpdatesEnabled}`);
autoUpdater.allowPrerelease = isPreReleaseUpdatesEnabled;
notifyUserIfNoUpdateAvailable = false;
intiUpdateHandlers(mainWindow);
};
Expand All @@ -97,3 +101,8 @@ export const checkForUpdates = (notifyIfNoUpdateAvailable: boolean) => {
notifyUserIfNoUpdateAvailable = notifyIfNoUpdateAvailable;
autoUpdater.checkForUpdatesAndNotify();
};

export const setAllowPrerelease = (isAllowPrerelease: boolean) => {
logger.info(`updater.allowPrerelease set to: ${isAllowPrerelease}`);
autoUpdater.allowPrerelease = isAllowPrerelease;
};
6 changes: 6 additions & 0 deletions src/renderer/Presentational/ModalManager/PreferencesModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ export const PreferencesModal = ({ modalOnClose }: Props) => {
isOpenOnStartup,
isNotificationsEnabled,
isEventReportingEnabled,
isPreReleaseUpdatesEnabled,
language,
} = updatedConfig || (modalConfig as ModalConfig);

Expand All @@ -54,6 +55,11 @@ export const PreferencesModal = ({ modalOnClose }: Props) => {
await electron.setIsEventReportingEnabled(isEventReportingEnabled);
setRemoteEventReportingEnabled(isEventReportingEnabled);
}
if (isPreReleaseUpdatesEnabled !== undefined) {
await electron.getSetIsPreReleaseUpdatesEnabled(
isPreReleaseUpdatesEnabled,
);
}
if (language) {
await electron.setLanguage(language);
qSettings.refetch();
Expand Down
32 changes: 32 additions & 0 deletions src/renderer/Presentational/Preferences/Preferences.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@ export type Preference =
| 'isOpenOnStartup'
| 'isNotificationsEnabled'
| 'isEventReportingEnabled'
| 'isPreReleaseUpdatesEnabled'
| 'language';
export interface PreferencesProps {
themeSetting?: ThemeSetting;
isOpenOnStartup?: boolean;
osDarkMode?: boolean;
isNotificationsEnabled?: boolean;
isEventReportingEnabled?: boolean;
isPreReleaseUpdatesEnabled?: boolean;
version?: string;
language?: string;
onChange?: (preference: Preference, value: unknown) => void;
Expand All @@ -53,6 +55,7 @@ const Preferences = ({
osDarkMode,
isNotificationsEnabled,
isEventReportingEnabled,
isPreReleaseUpdatesEnabled,
version,
language,
onChange,
Expand Down Expand Up @@ -245,6 +248,35 @@ const Preferences = ({
]}
/>
</div>
<div className={preferenceSection}>
<div className={sectionTitle}>{t('Advanced')}</div>
<HorizontalLine />
<LineLabelSettings
items={[
{
sectionTitle: '',
items: [
{
label: t('PreReleaseUpdates'),
description: t('PreReleaseUpdatesDescription'),
value: (
<Toggle
onText={t('Enabled')}
offText={t('Disabled')}
checked={isPreReleaseUpdatesEnabled}
onChange={(newValue) => {
if (onChange) {
onChange('isPreReleaseUpdatesEnabled', newValue);
}
}}
/>
),
},
],
},
]}
/>
</div>
<div className={versionContainer}>
{t('YouAreRunningNiceNode')} {version} {process.env.NICENODE_ENV}
</div>
Expand Down
12 changes: 12 additions & 0 deletions src/renderer/Presentational/Preferences/PreferencesWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ const PreferencesWrapper = ({
useState<boolean>();
const [sIsEventReportingEnabled, setIsEventReportingEnabled] =
useState<boolean>();
const [sIsPreReleaseUpdatesEnabled, setIsPreReleaseUpdatesEnabled] =
useState<boolean>();
const [sNiceNodeVersion, setNiceNodeVersion] = useState<string>();
const [sLanguageSetting, setLanguageSetting] = useState<string>();

Expand All @@ -45,11 +47,14 @@ const PreferencesWrapper = ({
const isOpenAtStartupSetting = userSettings.appIsOpenOnStartup || false;
const isEventReportingEnabled =
userSettings.appIsEventReportingEnabled || false;
const isPreReleaseUpdatesEnabled =
userSettings.appIsPreReleaseUpdatesEnabled || false;
setThemeSetting(themeSetting);
setOsIsDarkMode(osIsDarkMode);
setIsNotificationsEnabled(notificationsSetting);
setIsOpenOnStartup(isOpenAtStartupSetting);
setIsEventReportingEnabled(isEventReportingEnabled);
setIsPreReleaseUpdatesEnabled(isPreReleaseUpdatesEnabled);
};

const getNiceNodeVersion = async () => {
Expand Down Expand Up @@ -112,6 +117,12 @@ const PreferencesWrapper = ({
modalOnChangeConfig({
isEventReportingEnabled,
});
} else if (preference === 'isPreReleaseUpdatesEnabled') {
const isPreReleaseUpdatesEnabled = value as boolean;
setIsPreReleaseUpdatesEnabled(isPreReleaseUpdatesEnabled);
modalOnChangeConfig({
isPreReleaseUpdatesEnabled,
});
} else if (preference === 'language') {
const language = value as string;
setLanguageSetting(language);
Expand All @@ -132,6 +143,7 @@ const PreferencesWrapper = ({
version={sNiceNodeVersion}
isNotificationsEnabled={sIsNotificationsEnabled}
isEventReportingEnabled={sIsEventReportingEnabled}
isPreReleaseUpdatesEnabled={sIsPreReleaseUpdatesEnabled}
language={sLanguageSetting}
onChange={onChangePreference}
/>
Expand Down
3 changes: 3 additions & 0 deletions src/renderer/preload.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ declare global {
setIsOpenOnStartup(isOpenOnStartup: boolean): void;
getSetIsNotificationsEnabled(isNotificationsEnabled?: boolean): void;
setIsEventReportingEnabled(isEventReportingEnabled: boolean): void;
getSetIsPreReleaseUpdatesEnabled(
isPreReleaseUpdatesEnabled?: boolean,
): void;

// Notifications
getNotifications(): any;
Expand Down

0 comments on commit 23e7c0a

Please sign in to comment.