Skip to content

Commit b63324b

Browse files
author
Matthias Rütten
authored
Merge pull request #59 from codecentric/task-refactor-update-handling
refactor update handling
2 parents 4abf2b4 + 9f868f0 commit b63324b

23 files changed

+384
-168
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ This will start the application with hot-reload so you can instantly start devel
4949
yarn start
5050
```
5151

52+
### Logs
53+
You will find the application logs in the following folder: `~/Library/Logs/merge-request-notifier/`
54+
5255
### New Releases
5356
#### Create a new Release and Publish it
5457
```bash

dev-app-update.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
owner: codecentric
2+
repo: merge-request-notifier
3+
provider: github
4+
updaterCacheDirName: merge-request-notifier-updater

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "merge-request-notifier",
3-
"version": "0.9.1",
3+
"version": "1.0.0",
44
"description": "This app shows your merge requests grouped by projects and WIP status. It is accessible from the system tray.",
55
"main": "./dist/main.js",
66
"homepage": "https://github.com/codecentric/merge-request-notifier",

src/main/main.ts

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ let win: BrowserWindow | null
1212
const WINDOW_WIDTH = 380
1313
const WINDOW_HEIGHT = 460
1414

15-
let TEST_MODE = false
16-
1715
const installExtensions = async () => {
1816
const installer = require('electron-devtools-installer')
1917
const forceDownload = !!process.env.UPGRADE_EXTENSIONS
@@ -58,13 +56,14 @@ const setup = async () => {
5856
log.debug('Starting the app')
5957

6058
try {
59+
autoUpdater.autoDownload = false
60+
6161
if (process.env.NODE_ENV !== 'production') {
62+
// __dirname is the "dist" folder
63+
autoUpdater.updateConfigPath = path.join(__dirname, '../dev-app-update.yml')
6264
await installExtensions()
6365
}
6466

65-
const updateInfo = await autoUpdater.checkForUpdatesAndNotify()
66-
log.info(`Latest result for the update check: ${JSON.stringify(updateInfo)}`)
67-
6867
createTray()
6968
createWindow()
7069
createMenu()
@@ -122,17 +121,15 @@ const createMenu = () => {
122121
},
123122
},
124123
{
125-
label: 'Toggle Test Mode',
124+
label: 'Toggle Test Data',
126125
click: () => {
127-
if (win) {
128-
if (TEST_MODE) {
129-
win.loadURL('http://localhost:2003')
130-
} else {
131-
win.loadURL('http://localhost:2003?test')
132-
}
133-
134-
TEST_MODE = !TEST_MODE
135-
}
126+
toggleQueryParam('test-data')
127+
},
128+
},
129+
{
130+
label: 'Toggle Fake update',
131+
click: () => {
132+
toggleQueryParam('fake-update')
136133
},
137134
},
138135
]
@@ -169,6 +166,20 @@ const createMenu = () => {
169166
Menu.setApplicationMenu(menu)
170167
}
171168

169+
const toggleQueryParam = (parameter: string) => {
170+
if (win) {
171+
const currentUrl = new URL(win.webContents.getURL())
172+
173+
if (currentUrl.searchParams.has(parameter)) {
174+
currentUrl.searchParams.delete(parameter)
175+
} else {
176+
currentUrl.searchParams.set(parameter, '1')
177+
}
178+
179+
win.loadURL(currentUrl.href)
180+
}
181+
}
182+
172183
const createWindow = () => {
173184
win = new BrowserWindow({
174185
width: WINDOW_WIDTH,
@@ -202,9 +213,7 @@ const createWindow = () => {
202213
})
203214

204215
win.on('blur', () => {
205-
if (!TEST_MODE) {
206-
hideWindow()
207-
}
216+
hideWindow()
208217
})
209218
}
210219

@@ -240,6 +249,18 @@ ipcMain.on('update-open-merge-requests', (_: any, openMergeRequests: number) =>
240249
}
241250
})
242251

252+
ipcMain.on('download-and-install-update', () => {
253+
autoUpdater.once('update-downloaded', () => {
254+
autoUpdater.quitAndInstall()
255+
})
256+
257+
autoUpdater.downloadUpdate()
258+
})
259+
260+
ipcMain.handle('check-for-updates', async () => {
261+
return autoUpdater.checkForUpdates().catch(error => log.error('error while checking for updates', error))
262+
})
263+
243264
ipcMain.on('close-application', () => {
244265
app.quit()
245266
})

src/renderer/app.scss

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,11 @@ button {
1111
all: unset;
1212
cursor: pointer;
1313
}
14+
15+
.release-notes {
16+
p,
17+
ul {
18+
margin-top: 0;
19+
margin-bottom: 8px;
20+
}
21+
}

src/renderer/components/Application.tsx

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,36 @@
11
import { hot } from 'react-hot-loader/root'
22
import * as React from 'react'
3-
import { BrowserRouter, Route } from 'react-router-dom'
3+
import { BrowserRouter } from 'react-router-dom'
44
import { ThemeProvider } from 'emotion-theming'
55

66
import { Header } from './layout/Header'
77
import { Footer } from './layout/Footer'
88
import { theme } from './theme'
99
import { ConfigProvider } from '../hooks/config'
10-
import { BackendProvider } from '../hooks/backend'
10+
import { BackendProvider } from '../hooks/merge-requests/backend'
11+
import { UpdaterProvider } from '../hooks/updater'
1112
import { Content } from './Content'
1213
import { Wrapper } from './layout/Wrapper'
1314
import { Main } from './layout/Main'
1415
import { NotificationsEmiter } from './NotificationsEmiter'
15-
import { Switch } from '@material-ui/core'
1616

1717
const Application: React.FunctionComponent = () => (
1818
<ConfigProvider>
1919
<BackendProvider>
20-
<NotificationsEmiter />
21-
<ThemeProvider theme={theme}>
22-
<BrowserRouter>
23-
<Wrapper>
24-
<Header />
25-
<Main>
26-
<Content />
27-
</Main>
28-
<Footer />
29-
</Wrapper>
30-
</BrowserRouter>
31-
</ThemeProvider>
20+
<UpdaterProvider>
21+
<NotificationsEmiter />
22+
<ThemeProvider theme={theme}>
23+
<BrowserRouter>
24+
<Wrapper>
25+
<Header />
26+
<Main>
27+
<Content />
28+
</Main>
29+
<Footer />
30+
</Wrapper>
31+
</BrowserRouter>
32+
</ThemeProvider>
33+
</UpdaterProvider>
3234
</BackendProvider>
3335
</ConfigProvider>
3436
)

src/renderer/components/Content.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@ import { useConfig } from '../hooks/config'
66
import { MergeRequestsPage } from './merge-requests/MergeRequestsPage'
77
import { SettingsPage } from './settings/SettingsPage'
88
import { AboutUsPage } from './about-us/AboutUsPage'
9+
import { UpdateInfoPage } from './update/UpdateInfoPage'
10+
import { useUpdater } from '../hooks/updater'
11+
import { NewUpdateAlert } from './update/NewUpdateAlert'
912

1013
export const Content: React.FunctionComponent = () => {
1114
const { config } = useConfig()
15+
const { updateInfo } = useUpdater()
1216

1317
return (
1418
<Box>
@@ -19,8 +23,12 @@ export const Content: React.FunctionComponent = () => {
1923
<Route path='/about-us'>
2024
<AboutUsPage />
2125
</Route>
26+
<Route path='/update'>
27+
<UpdateInfoPage />
28+
</Route>
2229
{config ? (
2330
<Route path='/'>
31+
{updateInfo && <NewUpdateAlert />}
2432
<MergeRequestsPage />
2533
</Route>
2634
) : (

src/renderer/components/NotificationsEmiter.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { useState, useEffect } from 'react'
2-
import { ipcRenderer } from 'electron'
32

4-
import { useBackend } from '../hooks/backend'
5-
import { MergeRequestWithProject } from '../hooks/types'
3+
import { useBackend } from '../hooks/merge-requests/backend'
4+
import { MergeRequestWithProject } from '../hooks/merge-requests/types'
65

76
export const NotificationsEmiter = () => {
87
const { mergeRequestWithProjects } = useBackend()

src/renderer/components/about-us/AboutUsPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { remote, shell } from 'electron'
21
import * as React from 'react'
2+
import { remote, shell } from 'electron'
33
import { Box, Text } from 'rebass'
44

55
const openUrl = (url: string): React.MouseEventHandler<HTMLAnchorElement> => event => {

src/renderer/components/layout/Footer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import InfoIcon from '@material-ui/icons/Info'
77
import SettingsIcon from '@material-ui/icons/Settings'
88
import ExitToAppIcon from '@material-ui/icons/ExitToApp'
99
import { LoadingIndicator } from '../util/LoadingIndicator'
10-
import { useBackend } from '../../hooks/backend'
10+
import { useBackend } from '../../hooks/merge-requests/backend'
1111

1212
const closeApp = () => {
1313
ipcRenderer.send('close-application')

0 commit comments

Comments
 (0)