Skip to content

Commit

Permalink
Use autoUpdater
Browse files Browse the repository at this point in the history
Closes #211
  • Loading branch information
will-stone committed Jun 19, 2020
1 parent 18fd106 commit 0f79823
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 77 deletions.
2 changes: 1 addition & 1 deletion src/main/events.ts
Expand Up @@ -3,5 +3,5 @@ export const BROWSERS_SCANNED = 'BROWSERS_SCANNED'
export const FAVOURITE_CHANGED = 'FAVOURITE_CHANGED'
export const HOTKEYS_RETRIEVED = 'HOTKEYS_RETRIEVED'
export const PROTOCOL_STATUS = 'PROTOCOL_STATUS'
export const UPDATE_STATUS = 'UPDATE_STATUS'
export const UPDATE_DOWNLOADED = 'UPDATE_DOWNLOADED'
export const URL_UPDATED = 'URL_UPDATED'
59 changes: 38 additions & 21 deletions src/main/main.ts
@@ -1,8 +1,9 @@
import { app, BrowserWindow, ipcMain, Tray } from 'electron'
import { app, autoUpdater, BrowserWindow, ipcMain, Tray } from 'electron'
import electronIsDev from 'electron-is-dev'
import execa from 'execa'
import path from 'path'

import package_ from '../../package.json'
import { Browser, browsers } from '../config/browsers'
import {
BROWSER_SELECTED,
Expand All @@ -15,10 +16,10 @@ import {
RELOAD,
RENDERER_LOADED,
SET_AS_DEFAULT_BROWSER,
UPDATE_RESTART,
} from '../renderer/events'
import copyToClipboard from '../utils/copyToClipboard'
import getInstalledBrowsers from '../utils/getInstalledBrowsers'
import { checkForUpdate } from '../utils/isUpdateAvailable'
import { logger } from '../utils/logger'
import createWindow from './createWindow'
import {
Expand All @@ -27,7 +28,7 @@ import {
FAVOURITE_CHANGED,
HOTKEYS_RETRIEVED,
PROTOCOL_STATUS,
UPDATE_STATUS,
UPDATE_DOWNLOADED,
URL_UPDATED,
} from './events'
import { Hotkeys, store } from './store'
Expand Down Expand Up @@ -60,6 +61,35 @@ app.on('ready', async () => {
})

store.set('firstRun', false)

// Auto update on production
if (!electronIsDev) {
const feedURL = `https://update.electronjs.org/will-stone/browserosaurus/darwin-x64/${app.getVersion()}`

autoUpdater.setFeedURL({
url: feedURL,
headers: {
'User-Agent': `${package_.name}/${package_.version} (darwin: x64)`,
},
})

autoUpdater.on('before-quit-for-update', () => {
// All windows must be closed before an update can be applied using "restart".
bWindow?.destroy()
})

autoUpdater.on('update-downloaded', () => {
bWindow?.webContents.send(UPDATE_DOWNLOADED)
})

// 1000 * 60 * 60 * 24
const ONE_DAY_MS = 86400000
// Check for updates every day. The first check is done on load: in the
// RENDERER_LOADED listener.
setInterval(() => {
autoUpdater.checkForUpdates()
}, ONE_DAY_MS)
}
})

// App doesn't always close on ctrl-c in console, this fixes that
Expand All @@ -79,26 +109,9 @@ async function sendUrl(url: string) {
}
}

// 1000 * 60 * 60 * 24
const ONE_DAY_MS = 86400000

async function updateChecker(forceUpdateCheck = false) {
const lastUpdateCheck = store.get('lastUpdateCheck') || 0
const now = Date.now()
const hasNotBeenCheckedRecently = lastUpdateCheck + ONE_DAY_MS < now

if (forceUpdateCheck || hasNotBeenCheckedRecently) {
logger('Main', 'Checking for update')
const isUpdateAvailable = await checkForUpdate(app.getVersion())
bWindow?.webContents.send(UPDATE_STATUS, isUpdateAvailable)
store.set('lastUpdateCheck', now)
}
}

app.on('open-url', (event, url) => {
event.preventDefault()
sendUrl(url)
updateChecker()
})

/**
Expand Down Expand Up @@ -130,7 +143,7 @@ ipcMain.on(RENDERER_LOADED, async () => {
app.isDefaultProtocolClient('http'),
)

updateChecker(true)
autoUpdater.checkForUpdates()
})

interface BrowserSelectedEventArgs {
Expand Down Expand Up @@ -198,6 +211,10 @@ ipcMain.on(RELOAD, () => {
bWindow?.reload()
})

ipcMain.on(UPDATE_RESTART, () => {
autoUpdater.quitAndInstall()
})

ipcMain.on(QUIT, () => {
app.quit()
})
Expand Down
10 changes: 5 additions & 5 deletions src/renderer/components/the-main-listeners.tsx
Expand Up @@ -9,7 +9,7 @@ import {
FAVOURITE_CHANGED,
HOTKEYS_RETRIEVED,
PROTOCOL_STATUS,
UPDATE_STATUS,
UPDATE_DOWNLOADED,
URL_UPDATED,
} from '../../main/events'
import { Hotkeys } from '../../main/store'
Expand All @@ -19,7 +19,7 @@ import {
favBrowserIdSelector,
hotkeysSelector,
isDefaultBrowserAtom,
updateAvailableAtom,
isUpdateAvailableAtom,
urlSelector,
versionAtom,
} from '../state'
Expand All @@ -30,7 +30,7 @@ const TheMainListeners: React.FC = () => {
const setBrowsersState = useSetRecoilState(browsersAtom)
const setVersion = useSetRecoilState(versionAtom)
const setFavBrowserId = useSetRecoilState(favBrowserIdSelector)
const setUpdateAvailable = useSetRecoilState(updateAvailableAtom)
const setUpdateAvailable = useSetRecoilState(isUpdateAvailableAtom)
const setIsDefaultBrowser = useSetRecoilState(isDefaultBrowserAtom)
const setHotkeys = useSetRecoilState(hotkeysSelector)

Expand All @@ -47,8 +47,8 @@ const TheMainListeners: React.FC = () => {
* Receive update availability
* main -> renderer
*/
electron.ipcRenderer.on(UPDATE_STATUS, (_: unknown, bool: boolean) => {
setUpdateAvailable(bool)
electron.ipcRenderer.on(UPDATE_DOWNLOADED, () => {
setUpdateAvailable(true)
})

/**
Expand Down
35 changes: 15 additions & 20 deletions src/renderer/components/the-status-bar.tsx
Expand Up @@ -6,15 +6,14 @@ import { faSync } from '@fortawesome/pro-solid-svg-icons/faSync'
import { faTimes } from '@fortawesome/pro-solid-svg-icons/faTimes'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import cc from 'classcat'
import { shell } from 'electron'
import React, { useCallback } from 'react'
import { useRecoilState, useRecoilValue } from 'recoil'

import { quit, reload, setAsDefaultBrowser } from '../sendToMain'
import { quit, reload, setAsDefaultBrowser, updateRestart } from '../sendToMain'
import {
isDefaultBrowserAtom,
isUpdateAvailableAtom,
openMenuSelector,
updateAvailableAtom,
versionAtom,
} from '../state'
import { LightButton } from './button'
Expand All @@ -26,14 +25,9 @@ interface Props {
const TheStatusBar: React.FC<Props> = ({ className }) => {
const [openMenu, setOpenMenu] = useRecoilState(openMenuSelector)
const isDefaultBrowser = useRecoilValue(isDefaultBrowserAtom)
const updateAvailable = useRecoilValue(updateAvailableAtom)
const isUpdateAvailable = useRecoilValue(isUpdateAvailableAtom)
const version = useRecoilValue(versionAtom)

const handleUpdateClick = useCallback(
() => shell.openExternal('https://browserosaurus.com'),
[],
)

const handleFavMenuClick = useCallback(() => {
setOpenMenu((menu) => (menu === 'fav' ? false : 'fav'))
}, [setOpenMenu])
Expand Down Expand Up @@ -86,20 +80,21 @@ const TheStatusBar: React.FC<Props> = ({ className }) => {
{displayedVersion}
</div>

{updateAvailable && (
<LightButton onClick={handleUpdateClick} tone="primary">
{isUpdateAvailable ? (
<LightButton onClick={updateRestart} tone="primary">
<FontAwesomeIcon icon={faGift} />
<span>Update Available</span>
<span>Update</span>
</LightButton>
) : (
<>
<LightButton onClick={reload}>
<FontAwesomeIcon fixedWidth icon={faSync} />
</LightButton>
<LightButton onClick={quit}>
<FontAwesomeIcon fixedWidth icon={faSignOutAlt} />
</LightButton>
</>
)}

<LightButton onClick={reload}>
<FontAwesomeIcon fixedWidth icon={faSync} />
</LightButton>

<LightButton onClick={quit}>
<FontAwesomeIcon fixedWidth icon={faSignOutAlt} />
</LightButton>
</div>
</div>
)
Expand Down
1 change: 1 addition & 0 deletions src/renderer/events.ts
Expand Up @@ -8,3 +8,4 @@ export const QUIT = 'QUIT'
export const RELOAD = 'RELOAD'
export const RENDERER_LOADED = 'RENDERER_LOADED'
export const SET_AS_DEFAULT_BROWSER = 'SET_AS_DEFAULT_BROWSER'
export const UPDATE_RESTART = 'UPDATE_RESTART'
3 changes: 3 additions & 0 deletions src/renderer/sendToMain.ts
Expand Up @@ -12,6 +12,7 @@ import {
QUIT,
RELOAD,
SET_AS_DEFAULT_BROWSER,
UPDATE_RESTART,
} from './events'

export const selectBrowser = (
Expand Down Expand Up @@ -39,6 +40,8 @@ export const escapePressed = (): void => ipcRenderer.send(ESCAPE_PRESSED)
export const mainLog = (string: string): void =>
ipcRenderer.send(LOGGER, string)

export const updateRestart = (): void => ipcRenderer.send(UPDATE_RESTART)

export const quit = (): void => ipcRenderer.send(QUIT)

export const setAsDefaultBrowser = (): void =>
Expand Down
4 changes: 2 additions & 2 deletions src/renderer/state.ts
Expand Up @@ -28,8 +28,8 @@ const openMenuAtom = atom<MenuState>({
default: false,
})

export const updateAvailableAtom = atom({
key: 'updateAvailableAtom',
export const isUpdateAvailableAtom = atom<boolean>({
key: 'isUpdateAvailableAtom',
default: false,
})

Expand Down
28 changes: 0 additions & 28 deletions src/utils/isUpdateAvailable.ts

This file was deleted.

0 comments on commit 0f79823

Please sign in to comment.