Skip to content
This repository was archived by the owner on Feb 18, 2021. It is now read-only.

Commit 73ccee0

Browse files
committed
feat(mailbox): ability to use protonmail beta
In Settings sections its now possible to choose mail.protonmail.com for the MailBox implements #180
1 parent 2a978fe commit 73ccee0

File tree

13 files changed

+86
-21
lines changed

13 files changed

+86
-21
lines changed

src/renderer/components/MailBox/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export default class MailBox extends React.Component {
88
error: PropTypes.object,
99
hideWebviews: PropTypes.func.isRequired,
1010
onReload: PropTypes.func.isRequired,
11+
useProtonMailBeta: PropTypes.bool.isRequired,
1112
username: PropTypes.string.isRequired,
1213
};
1314

@@ -50,6 +51,7 @@ export default class MailBox extends React.Component {
5051
handleDisplayWebview() {
5152
this.props.displayWebview({
5253
darkTheme: this.props.darkTheme,
54+
useBeta: this.props.useProtonMailBeta,
5355
});
5456
}
5557

src/renderer/components/MailBox/index.test.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,48 @@ describe('components/MailBox', () => {
1515
hideWebviews: sinon.spy(),
1616
onReload: sinon.spy(),
1717
reloadWebview: sinon.spy(),
18+
useProtonMailBeta: false,
1819
username: 'jan.banan',
1920
};
2021
});
2122

2223
it('should call prop displayWebview upon mount if error is falsy', () => {
2324
const darkTheme = true;
2425
const displayWebview = sinon.spy();
26+
const useProtonMailBeta = true;
2527
shallow(<MailBox
2628
{...defaultProps}
2729
darkTheme={darkTheme}
2830
displayWebview={displayWebview}
31+
useProtonMailBeta={useProtonMailBeta}
2932
/>);
3033

31-
expect(displayWebview).to.have.been.calledWith({ darkTheme });
34+
expect(displayWebview).to.have.been.calledWith({
35+
darkTheme,
36+
useBeta: useProtonMailBeta,
37+
});
3238
});
3339

3440
it('should display view with updated username', () => {
3541
const displayWebview = sinon.spy();
3642
const darkTheme = false;
43+
const useProtonMailBeta = true;
3744
const context = shallow(<MailBox
3845
{...defaultProps}
3946
darkTheme={darkTheme}
4047
username="jan"
4148
displayWebview={displayWebview}
49+
useProtonMailBeta={useProtonMailBeta}
4250
/>);
4351
displayWebview.resetHistory();
4452
const username = 'albert';
4553

4654
context.setProps({ username });
4755

48-
expect(displayWebview).to.have.been.calledWith({ darkTheme });
56+
expect(displayWebview).to.have.been.calledWith({
57+
darkTheme,
58+
useBeta: useProtonMailBeta,
59+
});
4960

5061
context.setProps({ username });
5162

@@ -102,11 +113,13 @@ describe('components/MailBox', () => {
102113
const username = 'rudolf';
103114
const displayWebview = sinon.spy();
104115
const darkTheme = true;
116+
const useProtonMailBeta = false;
105117
const context = shallow(<MailBox
106118
{...defaultProps}
107119
darkTheme={darkTheme}
108120
displayWebview={displayWebview}
109121
error={{ message: '' }}
122+
useProtonMailBeta={useProtonMailBeta}
110123
username={username}
111124
/>);
112125

@@ -116,6 +129,7 @@ describe('components/MailBox', () => {
116129

117130
expect(displayWebview).to.have.been.calledWith({
118131
darkTheme,
132+
useBeta: useProtonMailBeta,
119133
});
120134
});
121135
});

src/renderer/components/Settings/index.js

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export default class Settings extends React.Component {
77
static propTypes = {
88
darkTheme: PropTypes.bool.isRequired,
99
onChangeSetting: PropTypes.func.isRequired,
10+
useProtonMailBeta: PropTypes.bool.isRequired,
1011
};
1112

1213
handleChangeCheckbox({ target }) {
@@ -18,16 +19,31 @@ export default class Settings extends React.Component {
1819
<div className={styles.Container}>
1920
<h1>Settings</h1>
2021

21-
<input
22-
checked={this.props.darkTheme}
23-
id="settings-dark-theme"
24-
name="darkTheme"
25-
type="checkbox"
26-
onChange={this.handleChangeCheckbox.bind(this)}
27-
/>
28-
<label htmlFor="settings-dark-theme">
29-
Dark theme
30-
</label>
22+
<div className={styles.FormControl}>
23+
<input
24+
checked={this.props.darkTheme}
25+
id="settings-dark-theme"
26+
name="darkTheme"
27+
type="checkbox"
28+
onChange={this.handleChangeCheckbox.bind(this)}
29+
/>
30+
<label htmlFor="settings-dark-theme">
31+
Dark theme
32+
</label>
33+
</div>
34+
35+
<div className={styles.FormControl}>
36+
<input
37+
checked={this.props.useProtonMailBeta}
38+
id="settings-use-beta"
39+
name="useProtonMailBeta"
40+
type="checkbox"
41+
onChange={this.handleChangeCheckbox.bind(this)}
42+
/>
43+
<label htmlFor="settings-use-beta">
44+
Use beta.protonmail.com
45+
</label>
46+
</div>
3147
</div>
3248
);
3349
}

src/renderer/components/Settings/index.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ describe('components/Settings', () => {
99
const defaultProps = {
1010
darkTheme: false,
1111
onChangeSetting: () => null,
12+
useProtonMailBeta: false,
1213
};
1314

1415
it('should call onChangeSetting upon toggling checkbox for dark theme', () => {
@@ -23,4 +24,15 @@ describe('components/Settings', () => {
2324
expect(onChangeSetting).to.have.been.calledWith(name, checked);
2425
});
2526

27+
it('should call onChangeSetting upon toggling checkbox for useProtonMailBeta', () => {
28+
const onChangeSetting = sinon.spy();
29+
const wrapper = shallow(<Settings {...defaultProps} onChangeSetting={onChangeSetting} />);
30+
31+
const name = 'useProtonMailBeta';
32+
const checked = 'whatever';
33+
const event = { target: { name, checked } };
34+
wrapper.find({ name }).simulate('change', event);
35+
36+
expect(onChangeSetting).to.have.been.calledWith(name, checked);
37+
});
2638
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
.Container {
22
padding: 20px;
33
}
4+
5+
.FormControl {
6+
padding-bottom: 20px;
7+
8+
:global label {
9+
padding-left: 10px;
10+
}
11+
}

src/renderer/containers/App/reducer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const initialState = {
66
settings: {
77
darkTheme: false,
88
hideSidebar: false,
9+
useBeta: false,
910
},
1011
webviewStatuses: {},
1112
};

src/renderer/containers/App/reducer.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ describe('containers/App/reducer', () => {
3939
expect(App(undefined, {}).settings).to.eql({
4040
darkTheme: false,
4141
hideSidebar: false,
42+
useBeta: false,
4243
});
4344
});
4445

src/renderer/containers/MailBox.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ import MailBox from '../components/MailBox';
99

1010
const mapStateToProps = (state, ownProps) => ({
1111
error: (state.webviewStatuses[ownProps.username] || {}).error,
12-
darkTheme: state.settings.darkTheme
12+
darkTheme: state.settings.darkTheme,
13+
useProtonMailBeta: state.settings.useProtonMailBeta,
1314
});
1415

1516
const mapDispatchToProps = (dispatch, { username }) => ({
16-
displayWebview: ({ darkTheme }) => dispatch({
17+
displayWebview: ({ darkTheme, useBeta }) => dispatch({
1718
type: DISPLAY_WEBVIEW,
1819
darkTheme,
1920
name: username,
21+
useBeta,
2022
}),
2123
hideWebviews: () => dispatch({
2224
type: HIDE_WEBVIEWS,

src/renderer/containers/Settings.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Settings from '../components/Settings';
44

55
const mapStateToProps = ({ settings }) => ({
66
darkTheme: settings.darkTheme,
7+
useProtonMailBeta: settings.useProtonMailBeta,
78
});
89

910
const mapDispatchToProps = dispatch => ({

src/renderer/lib/webview-handler.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ const containerStyleHidden = 'position: absolute; height: 0;';
1212
*/
1313

1414
export class WebviewHandler {
15+
protonMailUrl = 'https://mail.protonmail.com/';
16+
protonMailBetaUrl = 'https://beta.protonmail.com/';
17+
1518
static create() {
1619
const webviewHandler = new WebviewHandler();
1720
webviewHandler.container = null;
@@ -52,6 +55,9 @@ export class WebviewHandler {
5255
}
5356

5457
if (this.addedWebviews.indexOf(name) === -1) {
58+
/**
59+
* TODO: Remove? Is this ever reached?
60+
*/
5561
this.addWebview(name);
5662
}
5763

@@ -84,13 +90,13 @@ export class WebviewHandler {
8490
return this.container.querySelector(`[data-name='${name}']`);
8591
}
8692

87-
addWebview(name) {
93+
addWebview(name, url) {
8894
if (!this.container) {
89-
return this._queueCommand(this.displayView.bind(this, name));
95+
return this._queueCommand(this.displayView.bind(this, name, url));
9096
}
9197

9298
const webview = document.createElement('webview');
93-
webview.setAttribute('src', 'https://mail.protonmail.com/');
99+
webview.setAttribute('src', url);
94100
webview.setAttribute('style', webviewStyle);
95101
webview.setAttribute('data-name', name);
96102

src/renderer/lib/webview-handler.test.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,14 @@ describe('lib/WebviewHandler', () => {
262262
};
263263
const name = 'beatrice';
264264
sandbox.stub(document, 'createElement').returns(mockElem);
265+
const url = 'https://something.protonmail.com/';
265266

266-
const webview = webviewHandler.addWebview(name);
267+
const webview = webviewHandler.addWebview(name, url);
267268

268269
expect(webview).to.equal(mockElem);
269270

270271
expect(document.createElement).to.have.been.calledWith('webview');
271-
expect(mockElem.setAttribute).to.have.been.calledWith('src', 'https://mail.protonmail.com/');
272+
expect(mockElem.setAttribute).to.have.been.calledWith('src', url);
272273
expect(mockElem.setAttribute).to.have.been.calledWith('style', sinon.match(/absolute/));
273274
expect(mockElem.setAttribute).to.have.been.calledWith('data-name', name);
274275

src/renderer/middlewares/Webviews/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ const WebviewsMiddleware = ({ dispatch }) => next => action => {
1313
switch (action.type) {
1414
case DISPLAY_WEBVIEW:
1515
if (!createdWebviews[action.name]) {
16-
const webview = WebviewHandler.addWebview(action.name);
16+
const url = action.useBeta ? WebviewHandler.protonMailBetaUrl : WebviewHandler.protonMailUrl;
17+
const webview = WebviewHandler.addWebview(action.name, url);
1718
dispatch(monitorWebview(webview, action.name));
1819
createdWebviews[action.name] = true;
1920
}

src/renderer/middlewares/Webviews/index.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ describe('middlewares/Webviews', () => {
7272
expect(WebviewHandler.displayView).to.have.been.calledWith(name, {
7373
classNames: {
7474
darkTheme
75-
}
75+
},
7676
});
7777
});
7878

0 commit comments

Comments
 (0)