diff --git a/app/app.js b/app/app.js
index a9abf52540..bcdab88121 100644
--- a/app/app.js
+++ b/app/app.js
@@ -7,6 +7,7 @@ if (require('electron-squirrel-startup')) {
// Don't npm install this (it breaks). Rely on the global one.
const electron = require('electron');
const appVersion = require('./app.json').version;
+const storage = require('electron-json-storage');
const {app, dialog, ipcMain, autoUpdater, Menu, BrowserWindow, webContents} = electron;
const IS_DEV = process.env.NODE_ENV === 'development';
@@ -84,133 +85,162 @@ app.on('window-all-closed', () => {
});
app.on('ready', () => {
- mainWindow = new BrowserWindow({
- width: 1200,
- height: 600,
- minHeight: 500,
- minWidth: 500,
- acceptFirstMouse: true,
- webPreferences: {
- zoomFactor: zoomFactor
+ storage.get('bounds', (err, data) => {
+ if (err) {
+ console.log('Failed to fetch window bounds', err);
}
- });
- // and load the app.html of the app.
- mainWindow.loadURL(`file://${__dirname}/app.html`);
-
- // Uncomment this to test things
- // mainWindow.toggleDevTools();
-
- // Emitted when the window is closed.
- mainWindow.on('closed', () => {
- // Dereference the window object, usually you would store windows
- // in an array if your app supports multi windows, this is the time
- // when you should delete the corresponding element.
- mainWindow = null;
- });
-
- var template = [
- {
- label: "Application",
- role: "window",
- submenu: [
- {label: "About Application", selector: "orderFrontStandardAboutPanel:"},
- {type: "separator"},
- {
- label: "Quit",
- accelerator: "Command+Q",
- click: function () {
- app.quit();
- }
- }
- ]
- },
- {
- label: "Edit",
- submenu: [
- {label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:"},
- {label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:"},
- {type: "separator"},
- {label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:"},
- {label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:"},
- {label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:"},
- {label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:"}
- ]
- },
- {
- label: "View",
- role: "window",
- submenu: [
- {
- label: "Actual Size",
- accelerator: "CmdOrCtrl+0",
- click: () => {
- const window = electron.BrowserWindow.getFocusedWindow();
- zoomFactor = 1;
- window.webContents.setZoomFactor(zoomFactor);
- }
- },
- {
- label: "Zoom In",
- accelerator: "CmdOrCtrl+Plus",
- click: () => {
- const window = electron.BrowserWindow.getFocusedWindow();
- zoomFactor = Math.min(1.8, zoomFactor + 0.1);
- window.webContents.setZoomFactor(zoomFactor);
- }
- },
- {
- label: "Zoom Out",
- accelerator: "CmdOrCtrl+-",
- click: () => {
- const window = electron.BrowserWindow.getFocusedWindow();
- zoomFactor = Math.max(0.5, zoomFactor - 0.1);
- window.webContents.setZoomFactor(zoomFactor);
- }
- }
- ]
- },
- {
- label: "Help",
- role: "help",
- id: "help",
- submenu: [
- {
- label: "Report an Issue...",
- click: () => {
- electron.shell.openExternal('mailto:support@insomnia.rest');
- }
- },
- {
- label: "Insomnia Help",
- accelerator: "CmdOrCtrl+?",
- click: () => {
- electron.shell.openExternal('http://insomnia.rest');
- }
- }
- ]
+ let bounds = {};
+ try {
+ bounds = JSON.parse(data || '{}');
+ } catch (e) {
+ // This should never happen, but if it does...!
+ console.error('Failed to parse window bounds', err, data);
}
- ];
- if (IS_DEV) {
- template.push({
- label: 'Developer',
- position: 'before=help',
- submenu: [{
- label: 'Reload',
- accelerator: 'Command+R',
- click: function () {
- mainWindow.reload();
- }
- }, {
- label: 'Toggle DevTools',
- accelerator: 'Alt+Command+I',
- click: function () {
- mainWindow.toggleDevTools();
- }
- }]
+ const {x, y, width, height} = bounds;
+
+ mainWindow = new BrowserWindow({
+ x: x,
+ y: y,
+ width: width || 800,
+ height: height || 500,
+ minHeight: 500,
+ minWidth: 500,
+ acceptFirstMouse: true,
+ webPreferences: {
+ zoomFactor: zoomFactor
+ }
});
- }
- Menu.setApplicationMenu(Menu.buildFromTemplate(template));
+ const saveBounds = () => {
+ storage.set('bounds', JSON.stringify(mainWindow.getBounds()), err => {
+ if (err) {
+ console.log('Failed to save window bounds', err);
+ }
+ });
+ };
+
+ mainWindow.on('resize', e => saveBounds());
+ mainWindow.on('move', e => saveBounds());
+
+ // and load the app.html of the app.
+ mainWindow.loadURL(`file://${__dirname}/app.html`);
+
+ // Uncomment this to test things
+ // mainWindow.toggleDevTools();
+
+ // Emitted when the window is closed.
+ mainWindow.on('closed', () => {
+ // Dereference the window object, usually you would store windows
+ // in an array if your app supports multi windows, this is the time
+ // when you should delete the corresponding element.
+ mainWindow = null;
+ });
+
+ var template = [
+ {
+ label: "Application",
+ role: "window",
+ submenu: [
+ {label: "About Application", selector: "orderFrontStandardAboutPanel:"},
+ {type: "separator"},
+ {
+ label: "Quit",
+ accelerator: "Command+Q",
+ click: function () {
+ app.quit();
+ }
+ }
+ ]
+ },
+ {
+ label: "Edit",
+ submenu: [
+ {label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:"},
+ {label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:"},
+ {type: "separator"},
+ {label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:"},
+ {label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:"},
+ {label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:"},
+ {label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:"}
+ ]
+ },
+ {
+ label: "View",
+ role: "window",
+ submenu: [
+ {
+ label: "Actual Size",
+ accelerator: "CmdOrCtrl+0",
+ click: () => {
+ const window = electron.BrowserWindow.getFocusedWindow();
+ zoomFactor = 1;
+ window.webContents.setZoomFactor(zoomFactor);
+ }
+ },
+ {
+ label: "Zoom In",
+ accelerator: IS_MAC ? "CmdOrCtrl+Plus" : "CmdOrCtrl+=",
+ click: () => {
+ const window = electron.BrowserWindow.getFocusedWindow();
+ zoomFactor = Math.min(1.8, zoomFactor + 0.1);
+ window.webContents.setZoomFactor(zoomFactor);
+ }
+ },
+ {
+ label: "Zoom Out",
+ accelerator: "CmdOrCtrl+-",
+ click: () => {
+ const window = electron.BrowserWindow.getFocusedWindow();
+ zoomFactor = Math.max(0.5, zoomFactor - 0.1);
+ window.webContents.setZoomFactor(zoomFactor);
+ }
+ }
+ ]
+ },
+ {
+ label: "Help",
+ role: "help",
+ id: "help",
+ submenu: [
+ {
+ label: "Report an Issue...",
+ click: () => {
+ electron.shell.openExternal('mailto:support@insomnia.rest');
+ }
+ },
+ {
+ label: "Insomnia Help",
+ accelerator: "CmdOrCtrl+?",
+ click: () => {
+ electron.shell.openExternal('http://insomnia.rest');
+ }
+ }
+ ]
+ }
+ ];
+
+ if (IS_DEV) {
+ template.push({
+ label: 'Developer',
+ position: 'before=help',
+ submenu: [{
+ label: 'Reload',
+ accelerator: 'Command+R',
+ click: function () {
+ mainWindow.reload();
+ }
+ }, {
+ label: 'Toggle DevTools',
+ accelerator: 'Alt+Command+I',
+ click: function () {
+ mainWindow.toggleDevTools();
+ }
+ }]
+ });
+ }
+
+ Menu.setApplicationMenu(Menu.buildFromTemplate(template));
+ });
});
diff --git a/app/app.json b/app/app.json
index 13966a8e72..b14641b043 100644
--- a/app/app.json
+++ b/app/app.json
@@ -1,7 +1,7 @@
{
"private": true,
"name": "insomnia",
- "version": "3.0.10",
+ "version": "3.0.11",
"productName": "Insomnia",
"longName": "Insomnia HTTP Client",
"description": "The best REST API Client",
@@ -11,6 +11,7 @@
"dependencies": {
"analytics-node": "^2.1.0",
"electron-squirrel-startup": "^1.0.0",
+ "electron-json-storage": "^2.0.0",
"nedb": "^1.8.0",
"request": "^2.71.0"
}
diff --git a/app/components/RequestPane.js b/app/components/RequestPane.js
index ade02440c7..68392e9c1f 100644
--- a/app/components/RequestPane.js
+++ b/app/components/RequestPane.js
@@ -17,6 +17,7 @@ class RequestPane extends Component {
render () {
const {
request,
+ importFile,
showPasswords,
editorFontSize,
editorLineWrapping,
@@ -36,22 +37,29 @@ class RequestPane extends Component {
-
-
+
-
- New Request
-
- {MOD_SYM}N
-
- Open Settings
-
- {MOD_SYM},
-
-
- Switch Requests
-
- {MOD_SYM}P
+
+
+
+
+
+
+ New Request
+
+ {MOD_SYM}N
+
+ Open Settings
+
+ {MOD_SYM},
+
+
+ Switch Requests
+
+ {MOD_SYM}P
| Send Request | -{MOD_SYM}Enter |
-
| Switch Requests | -{MOD_SYM}P |
-
| Focus Url Bar | -{MOD_SYM}L |
-
| Send Request | +{MOD_SYM}Enter |
+
| Focus Url Bar | +{MOD_SYM}L |
+
| Switch Requests | +{MOD_SYM}P |
+
{change.summary[0]}
, - ...change.summary.slice(1).map((text, i) =>{text}
) + ...change.summary.slice(1).map((text, j) =>{text}
) ] } } @@ -106,7 +106,7 @@ class ChangelogModal extends ModalComponent { ...html,