aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.all-contributorsrc12
-rw-r--r--README.md64
-rw-r--r--appveyor.yml2
-rw-r--r--package-lock.json232
-rw-r--r--package.json6
-rw-r--r--src/api/RecipePreviewsApi.js2
-rw-r--r--src/components/settings/account/AccountDashboard.js316
-rw-r--r--src/containers/settings/AccountScreen.js37
-rw-r--r--src/i18n/locales/defaultMessages.json98
-rw-r--r--src/i18n/locales/en-US.json2
-rw-r--r--src/i18n/messages/src/components/settings/account/AccountDashboard.json98
11 files changed, 502 insertions, 367 deletions
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 487175335..20179d7dc 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -251,7 +251,17 @@
251 "contributions": [ 251 "contributions": [
252 "doc" 252 "doc"
253 ] 253 ]
254 },
255 {
256 "login": "FWDekker",
257 "name": "Felix W. Dekker",
258 "avatar_url": "https://avatars0.githubusercontent.com/u/13442533?v=4",
259 "profile": "https://fwdekker.com/",
260 "contributions": [
261 "doc"
262 ]
254 } 263 }
255 ], 264 ],
256 "contributorsPerLine": 6 265 "contributorsPerLine": 6,
266 "skipCi": true
257} 267}
diff --git a/README.md b/README.md
index 3dca5a62c..c2a4f4aeb 100644
--- a/README.md
+++ b/README.md
@@ -18,14 +18,14 @@
18<details> 18<details>
19<summary>Toggle navigation</summary> 19<summary>Toggle navigation</summary>
20<ul> 20<ul>
21<li><a href="#what-is-ferdi-">What is Ferdi ?</a></li> 21<li><a href="#what-is-ferdi">What is Ferdi?</a></li>
22<li><a href="#what-ferdi-looks-like-">What Ferdi looks like ?</a></li> 22<li><a href="#what-does-ferdi-look-like">What does Ferdi look like?</a></li>
23<li><a href="#download-ferdi">Download Ferdi</a> 23<li><a href="#download-ferdi">Download Ferdi</a>
24<ul> 24<ul>
25<li><a href="#or-use-homebrew-macos-only">Or use homebrew</a></li> 25<li><a href="#or-use-homebrew-macos-only">Or use homebrew</a></li>
26</ul> 26</ul>
27</li> 27</li>
28<li><a href="#ferdi-specific-features">Ferdi-specific Features</a></li> 28<li><a href="#ferdi-specific-features">Ferdi-specific features</a></li>
29<li><a href="#development">Development</a></li> 29<li><a href="#development">Development</a></li>
30<ul> 30<ul>
31<li><a href="#install-os-dependencies">Install OS dependencies</a></li> 31<li><a href="#install-os-dependencies">Install OS dependencies</a></li>
@@ -42,11 +42,11 @@
42</ul> 42</ul>
43</details> 43</details>
44 44
45### What is Ferdi ? 45### What is Ferdi?
46 46
47Ferdi is a messaging browser that allows you to combine your favorite messaging services into one application. It is based on Franz - a software already used by thousands of people - with the difference that Ferdi gives you many additonal features and doesn't restrict its usage! Ferdi is compatible with your existing Franz account so you can continue right where you left off. Find out more about Ferdi and its features on [getferdi.com](https://getferdi.com). 47Ferdi is a messaging browser that allows you to combine your favorite messaging services into one application. It is based on Franz - a software already used by thousands of people - with the difference that Ferdi gives you many additonal features and doesn't restrict its usage! Ferdi is compatible with your existing Franz account so you can continue right where you left off. Find out more about Ferdi and its features on [getferdi.com](https://getferdi.com).
48 48
49### What Ferdi looks like ? 49### What does Ferdi look like?
50 50
51<details> 51<details>
52<summary>Toggle screenshots</summary> 52<summary>Toggle screenshots</summary>
@@ -75,10 +75,10 @@ You can find the installers in the [latest stable release](https://github.com/ge
75### Or use AUR (Arch Linux) 75### Or use AUR (Arch Linux)
76 76
77Ferdi has two seperate AUR packages you can use: 77Ferdi has two seperate AUR packages you can use:
78- **ferdi-build**: Uses your debian build and extracts it to Arch 78- **ferdi-bin**: Uses your debian build and extracts it to Arch
79- **ferdi-git**: Uses system electron version 79- **ferdi-git**: Uses system electron version
80 80
81If you use a AUR Helper e.g. yay, simply install it via Β΄yay -S ferdi-binΒ΄ 81If you use an AUR Helper e.g. yay, simply install it via `yay -S ferdi-bin`.
82 82
83`ferdi-git` may not work on all systems so we advice you to use `ferdi-bin` instead. 83`ferdi-git` may not work on all systems so we advice you to use `ferdi-bin` instead.
84 84
@@ -206,40 +206,44 @@ When pushing a new tag, the CI builds will create a draft GitHub release and upl
206Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 206Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
207 207
208<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> 208<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
209<!-- prettier-ignore --> 209<!-- prettier-ignore-start -->
210<!-- markdownlint-disable -->
210<table> 211<table>
211 <tr> 212 <tr>
212 <td align="center"><a href="https://vantezzen.io"><img src="https://avatars2.githubusercontent.com/u/10333196?v=4" width="40px;" alt="Bennett"/><br /><sub><b>Bennett</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=vantezzen" title="Code">πŸ’»</a> <a href="#design-vantezzen" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=vantezzen" title="Documentation">πŸ“–</a> <a href="#ideas-vantezzen" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="#translation-vantezzen" title="Translation">🌍</a> <a href="#example-vantezzen" title="Examples">πŸ’‘</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Avantezzen" title="Bug reports">πŸ›</a> <a href="#content-vantezzen" title="Content">πŸ–‹</a> <a href="#infra-vantezzen" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#userTesting-vantezzen" title="User Testing">πŸ““</a> <a href="#question-vantezzen" title="Answering Questions">πŸ’¬</a> <a href="#projectManagement-vantezzen" title="Project Management">πŸ“†</a> <a href="#review-vantezzen" title="Reviewed Pull Requests">πŸ‘€</a></td> 213 <td align="center"><a href="https://vantezzen.io"><img src="https://avatars2.githubusercontent.com/u/10333196?v=4" width="40px;" alt=""/><br /><sub><b>Bennett</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=vantezzen" title="Code">πŸ’»</a> <a href="#design-vantezzen" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=vantezzen" title="Documentation">πŸ“–</a> <a href="#ideas-vantezzen" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="#translation-vantezzen" title="Translation">🌍</a> <a href="#example-vantezzen" title="Examples">πŸ’‘</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Avantezzen" title="Bug reports">πŸ›</a> <a href="#content-vantezzen" title="Content">πŸ–‹</a> <a href="#infra-vantezzen" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#userTesting-vantezzen" title="User Testing">πŸ““</a> <a href="#question-vantezzen" title="Answering Questions">πŸ’¬</a> <a href="#projectManagement-vantezzen" title="Project Management">πŸ“†</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3Avantezzen" title="Reviewed Pull Requests">πŸ‘€</a></td>
213 <td align="center"><a href="http://www.adlk.io"><img src="https://avatars1.githubusercontent.com/u/3265004?v=4" width="40px;" alt="Stefan Malzner"/><br /><sub><b>Stefan Malzner</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Code">πŸ’»</a> <a href="#content-adlk" title="Content">πŸ–‹</a> <a href="#design-adlk" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Documentation">πŸ“–</a> <a href="#ideas-adlk" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="#infra-adlk" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#projectManagement-adlk" title="Project Management">πŸ“†</a> <a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Tests">⚠️</a> <a href="#translation-adlk" title="Translation">🌍</a></td> 214 <td align="center"><a href="http://www.adlk.io"><img src="https://avatars1.githubusercontent.com/u/3265004?v=4" width="40px;" alt=""/><br /><sub><b>Stefan Malzner</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Code">πŸ’»</a> <a href="#content-adlk" title="Content">πŸ–‹</a> <a href="#design-adlk" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Documentation">πŸ“–</a> <a href="#ideas-adlk" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="#infra-adlk" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#projectManagement-adlk" title="Project Management">πŸ“†</a> <a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Tests">⚠️</a> <a href="#translation-adlk" title="Translation">🌍</a></td>
214 <td align="center"><a href="https://twitter.com/kytwb"><img src="https://avatars0.githubusercontent.com/u/412895?v=4" width="40px;" alt="Amine Mouafik"/><br /><sub><b>Amine Mouafik</b></sub></a><br /><a href="#question-kytwb" title="Answering Questions">πŸ’¬</a> <a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Code">πŸ’»</a> <a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Documentation">πŸ“–</a> <a href="#ideas-kytwb" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="#maintenance-kytwb" title="Maintenance">🚧</a> <a href="#platform-kytwb" title="Packaging/porting to new platform">πŸ“¦</a> <a href="#projectManagement-kytwb" title="Project Management">πŸ“†</a> <a href="#review-kytwb" title="Reviewed Pull Requests">πŸ‘€</a> <a href="#infra-kytwb" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#fundingFinding-kytwb" title="Funding Finding">πŸ”</a> <a href="#blog-kytwb" title="Blogposts">πŸ“</a></td> 215 <td align="center"><a href="https://twitter.com/kytwb"><img src="https://avatars0.githubusercontent.com/u/412895?v=4" width="40px;" alt=""/><br /><sub><b>Amine Mouafik</b></sub></a><br /><a href="#question-kytwb" title="Answering Questions">πŸ’¬</a> <a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Code">πŸ’»</a> <a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Documentation">πŸ“–</a> <a href="#ideas-kytwb" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="#maintenance-kytwb" title="Maintenance">🚧</a> <a href="#platform-kytwb" title="Packaging/porting to new platform">πŸ“¦</a> <a href="#projectManagement-kytwb" title="Project Management">πŸ“†</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3Akytwb" title="Reviewed Pull Requests">πŸ‘€</a> <a href="#infra-kytwb" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#fundingFinding-kytwb" title="Funding Finding">πŸ”</a> <a href="#blog-kytwb" title="Blogposts">πŸ“</a></td>
215 <td align="center"><a href="http://seriesgt.com"><img src="https://avatars3.githubusercontent.com/u/5977640?v=4" width="40px;" alt="ZeroCool"/><br /><sub><b>ZeroCool</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=ZeroCool940711" title="Code">πŸ’»</a> <a href="#ideas-ZeroCool940711" title="Ideas, Planning, & Feedback">πŸ€”</a></td> 216 <td align="center"><a href="http://seriesgt.com"><img src="https://avatars3.githubusercontent.com/u/5977640?v=4" width="40px;" alt=""/><br /><sub><b>ZeroCool</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=ZeroCool940711" title="Code">πŸ’»</a> <a href="#ideas-ZeroCool940711" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
216 <td align="center"><a href="https://github.com/rseitbekov"><img src="https://avatars2.githubusercontent.com/u/35684439?v=4" width="40px;" alt="rseitbekov"/><br /><sub><b>rseitbekov</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=rseitbekov" title="Code">πŸ’»</a></td> 217 <td align="center"><a href="https://github.com/rseitbekov"><img src="https://avatars2.githubusercontent.com/u/35684439?v=4" width="40px;" alt=""/><br /><sub><b>rseitbekov</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=rseitbekov" title="Code">πŸ’»</a></td>
217 <td align="center"><a href="https://djangogigs.com/developers/peter-bittner/"><img src="https://avatars2.githubusercontent.com/u/665072?v=4" width="40px;" alt="Peter Bittner"/><br /><sub><b>Peter Bittner</b></sub></a><br /><a href="#ideas-bittner" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Abittner" title="Bug reports">πŸ›</a></td> 218 <td align="center"><a href="https://djangogigs.com/developers/peter-bittner/"><img src="https://avatars2.githubusercontent.com/u/665072?v=4" width="40px;" alt=""/><br /><sub><b>Peter Bittner</b></sub></a><br /><a href="#ideas-bittner" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Abittner" title="Bug reports">πŸ›</a></td>
218 </tr> 219 </tr>
219 <tr> 220 <tr>
220 <td align="center"><a href="https://github.com/justus-saul"><img src="https://avatars1.githubusercontent.com/u/5861826?v=4" width="40px;" alt="Justus Saul"/><br /><sub><b>Justus Saul</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Ajustus-saul" title="Bug reports">πŸ›</a> <a href="#ideas-justus-saul" title="Ideas, Planning, & Feedback">πŸ€”</a></td> 221 <td align="center"><a href="https://github.com/justus-saul"><img src="https://avatars1.githubusercontent.com/u/5861826?v=4" width="40px;" alt=""/><br /><sub><b>Justus Saul</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Ajustus-saul" title="Bug reports">πŸ›</a> <a href="#ideas-justus-saul" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
221 <td align="center"><a href="https://github.com/igreil"><img src="https://avatars0.githubusercontent.com/u/17239151?v=4" width="40px;" alt="igreil"/><br /><sub><b>igreil</b></sub></a><br /><a href="#ideas-igreil" title="Ideas, Planning, & Feedback">πŸ€”</a></td> 222 <td align="center"><a href="https://github.com/igreil"><img src="https://avatars0.githubusercontent.com/u/17239151?v=4" width="40px;" alt=""/><br /><sub><b>igreil</b></sub></a><br /><a href="#ideas-igreil" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
222 <td align="center"><a href="http://marcolopes.eu"><img src="https://avatars1.githubusercontent.com/u/431889?v=4" width="40px;" alt="Marco Lopes"/><br /><sub><b>Marco Lopes</b></sub></a><br /><a href="#ideas-marcolopes" title="Ideas, Planning, & Feedback">πŸ€”</a></td> 223 <td align="center"><a href="http://marcolopes.eu"><img src="https://avatars1.githubusercontent.com/u/431889?v=4" width="40px;" alt=""/><br /><sub><b>Marco Lopes</b></sub></a><br /><a href="#ideas-marcolopes" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
223 <td align="center"><a href="https://github.com/dayzlun"><img src="https://avatars3.githubusercontent.com/u/17259690?v=4" width="40px;" alt="dayzlun"/><br /><sub><b>dayzlun</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Adayzlun" title="Bug reports">πŸ›</a></td> 224 <td align="center"><a href="https://github.com/dayzlun"><img src="https://avatars3.githubusercontent.com/u/17259690?v=4" width="40px;" alt=""/><br /><sub><b>dayzlun</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Adayzlun" title="Bug reports">πŸ›</a></td>
224 <td align="center"><a href="https://twitter.com/tobigue_"><img src="https://avatars2.githubusercontent.com/u/1560152?v=4" width="40px;" alt="Tobias GΓΌnther"/><br /><sub><b>Tobias GΓΌnther</b></sub></a><br /><a href="#ideas-tobigue" title="Ideas, Planning, & Feedback">πŸ€”</a></td> 225 <td align="center"><a href="https://twitter.com/tobigue_"><img src="https://avatars2.githubusercontent.com/u/1560152?v=4" width="40px;" alt=""/><br /><sub><b>Tobias GΓΌnther</b></sub></a><br /><a href="#ideas-tobigue" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
225 <td align="center"><a href="https://github.com/AGCaesar"><img src="https://avatars3.githubusercontent.com/u/7844066?v=4" width="40px;" alt="AGCaesar"/><br /><sub><b>AGCaesar</b></sub></a><br /><a href="#platform-AGCaesar" title="Packaging/porting to new platform">πŸ“¦</a></td> 226 <td align="center"><a href="https://github.com/AGCaesar"><img src="https://avatars3.githubusercontent.com/u/7844066?v=4" width="40px;" alt=""/><br /><sub><b>AGCaesar</b></sub></a><br /><a href="#platform-AGCaesar" title="Packaging/porting to new platform">πŸ“¦</a></td>
226 </tr> 227 </tr>
227 <tr> 228 <tr>
228 <td align="center"><a href="https://github.com/Makazzz"><img src="https://avatars2.githubusercontent.com/u/49844464?v=4" width="40px;" alt="Makazzz"/><br /><sub><b>Makazzz</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3AMakazzz" title="Bug reports">πŸ›</a> <a href="https://github.com/getferdi/ferdi/commits?author=Makazzz" title="Code">πŸ’»</a> <a href="#translation-Makazzz" title="Translation">🌍</a> <a href="#content-Makazzz" title="Content">πŸ–‹</a> <a href="https://github.com/getferdi/ferdi/commits?author=Makazzz" title="Documentation">πŸ“–</a> <a href="#platform-Makazzz" title="Packaging/porting to new platform">πŸ“¦</a></td> 229 <td align="center"><a href="https://github.com/Makazzz"><img src="https://avatars2.githubusercontent.com/u/49844464?v=4" width="40px;" alt=""/><br /><sub><b>Makazzz</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3AMakazzz" title="Bug reports">πŸ›</a> <a href="https://github.com/getferdi/ferdi/commits?author=Makazzz" title="Code">πŸ’»</a> <a href="#translation-Makazzz" title="Translation">🌍</a> <a href="#content-Makazzz" title="Content">πŸ–‹</a> <a href="https://github.com/getferdi/ferdi/commits?author=Makazzz" title="Documentation">πŸ“–</a> <a href="#platform-Makazzz" title="Packaging/porting to new platform">πŸ“¦</a></td>
229 <td align="center"><a href="https://github.com/xthursdayx"><img src="https://avatars0.githubusercontent.com/u/18044308?v=4" width="40px;" alt="xthursdayx"/><br /><sub><b>xthursdayx</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=xthursdayx" title="Code">πŸ’»</a> <a href="https://github.com/getferdi/ferdi/commits?author=xthursdayx" title="Documentation">πŸ“–</a> <a href="#infra-xthursdayx" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#platform-xthursdayx" title="Packaging/porting to new platform">πŸ“¦</a></td> 230 <td align="center"><a href="https://github.com/xthursdayx"><img src="https://avatars0.githubusercontent.com/u/18044308?v=4" width="40px;" alt=""/><br /><sub><b>xthursdayx</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=xthursdayx" title="Code">πŸ’»</a> <a href="https://github.com/getferdi/ferdi/commits?author=xthursdayx" title="Documentation">πŸ“–</a> <a href="#infra-xthursdayx" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#platform-xthursdayx" title="Packaging/porting to new platform">πŸ“¦</a></td>
230 <td align="center"><a href="https://github.com/Gaboris"><img src="https://avatars2.githubusercontent.com/u/9462372?v=4" width="40px;" alt="Gaboris"/><br /><sub><b>Gaboris</b></sub></a><br /><a href="#question-Gaboris" title="Answering Questions">πŸ’¬</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3AGaboris" title="Bug reports">πŸ›</a></td> 231 <td align="center"><a href="https://github.com/Gaboris"><img src="https://avatars2.githubusercontent.com/u/9462372?v=4" width="40px;" alt=""/><br /><sub><b>Gaboris</b></sub></a><br /><a href="#question-Gaboris" title="Answering Questions">πŸ’¬</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3AGaboris" title="Bug reports">πŸ›</a></td>
231 <td align="center"><a href="http://www.cu3ed.com/"><img src="https://avatars1.githubusercontent.com/u/61343?v=4" width="40px;" alt="Ce"/><br /><sub><b>Ce</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Aincace" title="Bug reports">πŸ›</a></td> 232 <td align="center"><a href="http://www.cu3ed.com/"><img src="https://avatars1.githubusercontent.com/u/61343?v=4" width="40px;" alt=""/><br /><sub><b>Ce</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Aincace" title="Bug reports">πŸ›</a></td>
232 <td align="center"><a href="http://pztrn.name/"><img src="https://avatars1.githubusercontent.com/u/869402?v=4" width="40px;" alt="Stanislav N."/><br /><sub><b>Stanislav N.</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Apztrn" title="Bug reports">πŸ›</a></td> 233 <td align="center"><a href="http://pztrn.name/"><img src="https://avatars1.githubusercontent.com/u/869402?v=4" width="40px;" alt=""/><br /><sub><b>Stanislav N.</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Apztrn" title="Bug reports">πŸ›</a></td>
233 <td align="center"><a href="http://www.patrickcurl.com"><img src="https://avatars1.githubusercontent.com/u/1470061?v=4" width="40px;" alt="Patrick Curl"/><br /><sub><b>Patrick Curl</b></sub></a><br /><a href="#ideas-patrickcurl" title="Ideas, Planning, & Feedback">πŸ€”</a></td> 234 <td align="center"><a href="http://www.patrickcurl.com"><img src="https://avatars1.githubusercontent.com/u/1470061?v=4" width="40px;" alt=""/><br /><sub><b>Patrick Curl</b></sub></a><br /><a href="#ideas-patrickcurl" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
234 </tr> 235 </tr>
235 <tr> 236 <tr>
236 <td align="center"><a href="https://github.com/Stanzilla"><img src="https://avatars3.githubusercontent.com/u/75278?v=4" width="40px;" alt="Benjamin Staneck"/><br /><sub><b>Benjamin Staneck</b></sub></a><br /><a href="#design-Stanzilla" title="Design">🎨</a></td> 237 <td align="center"><a href="https://github.com/Stanzilla"><img src="https://avatars3.githubusercontent.com/u/75278?v=4" width="40px;" alt=""/><br /><sub><b>Benjamin Staneck</b></sub></a><br /><a href="#design-Stanzilla" title="Design">🎨</a></td>
237 <td align="center"><a href="https://github.com/ammarmalhas"><img src="https://avatars1.githubusercontent.com/u/57057209?v=4" width="40px;" alt="ammarmalhas"/><br /><sub><b>ammarmalhas</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Aammarmalhas" title="Bug reports">πŸ›</a> <a href="#security-ammarmalhas" title="Security">πŸ›‘οΈ</a></td> 238 <td align="center"><a href="https://github.com/ammarmalhas"><img src="https://avatars1.githubusercontent.com/u/57057209?v=4" width="40px;" alt=""/><br /><sub><b>ammarmalhas</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Aammarmalhas" title="Bug reports">πŸ›</a> <a href="#security-ammarmalhas" title="Security">πŸ›‘οΈ</a></td>
238 <td align="center"><a href="https://github.com/steliyan"><img src="https://avatars1.githubusercontent.com/u/1850292?v=4" width="40px;" alt="Steliyan Stoyanov"/><br /><sub><b>Steliyan Stoyanov</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=steliyan" title="Code">πŸ’»</a> <a href="#ideas-steliyan" title="Ideas, Planning, & Feedback">πŸ€”</a></td> 239 <td align="center"><a href="https://github.com/steliyan"><img src="https://avatars1.githubusercontent.com/u/1850292?v=4" width="40px;" alt=""/><br /><sub><b>Steliyan Stoyanov</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=steliyan" title="Code">πŸ’»</a> <a href="#ideas-steliyan" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
239 <td align="center"><a href="https://github.com/brorbw"><img src="https://avatars2.githubusercontent.com/u/5909562?v=4" width="40px;" alt="Bror Winther"/><br /><sub><b>Bror Winther</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=brorbw" title="Documentation">πŸ“–</a></td> 240 <td align="center"><a href="https://github.com/brorbw"><img src="https://avatars2.githubusercontent.com/u/5909562?v=4" width="40px;" alt=""/><br /><sub><b>Bror Winther</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=brorbw" title="Documentation">πŸ“–</a></td>
241 <td align="center"><a href="https://fwdekker.com/"><img src="https://avatars0.githubusercontent.com/u/13442533?v=4" width="40px;" alt=""/><br /><sub><b>Felix W. Dekker</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=FWDekker" title="Documentation">πŸ“–</a></td>
240 </tr> 242 </tr>
241</table> 243</table>
242 244
245<!-- markdownlint-enable -->
246<!-- prettier-ignore-end -->
243<!-- ALL-CONTRIBUTORS-LIST:END --> 247<!-- ALL-CONTRIBUTORS-LIST:END -->
244 248
245<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> 249<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
diff --git a/appveyor.yml b/appveyor.yml
index a0b33d1e1..693fdb700 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,7 +1,7 @@
1environment: 1environment:
2 APPVEYOR_CACHE_SKIP_RESTORE: true 2 APPVEYOR_CACHE_SKIP_RESTORE: true
3 3
4version: 5.4.1-beta.2.{build} 4version: 5.4.1-beta.3.{build}
5 5
6install: 6install:
7 - git submodule update --init --recursive 7 - git submodule update --init --recursive
diff --git a/package-lock.json b/package-lock.json
index c551ecf2f..2ffd534e0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "ferdi", 2 "name": "ferdi",
3 "version": "5.4.1-beta.2", 3 "version": "5.4.1-beta.3",
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
@@ -2592,9 +2592,9 @@
2592 } 2592 }
2593 }, 2593 },
2594 "@electron/get": { 2594 "@electron/get": {
2595 "version": "1.7.1", 2595 "version": "1.7.2",
2596 "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.7.1.tgz", 2596 "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.7.2.tgz",
2597 "integrity": "sha512-+BOIzkmYbe+oOBGqSByq8zXYXCFztccoymR3uNkvX5ckJ/5xU+4peVyEvFyH6+zfv58hCo99RxgIpwuaMfRtRg==", 2597 "integrity": "sha512-LSE4LZGMjGS9TloDx0yO44D2UTbaeKRk+QjlhWLiQlikV6J4spgDCjb6z4YIcqmPAwNzlNCnWF4dubytwI+ATA==",
2598 "dev": true, 2598 "dev": true,
2599 "requires": { 2599 "requires": {
2600 "debug": "^4.1.1", 2600 "debug": "^4.1.1",
@@ -2604,7 +2604,7 @@
2604 "global-tunnel-ng": "^2.7.1", 2604 "global-tunnel-ng": "^2.7.1",
2605 "got": "^9.6.0", 2605 "got": "^9.6.0",
2606 "sanitize-filename": "^1.6.2", 2606 "sanitize-filename": "^1.6.2",
2607 "sumchecker": "^3.0.0" 2607 "sumchecker": "^3.0.1"
2608 }, 2608 },
2609 "dependencies": { 2609 "dependencies": {
2610 "env-paths": { 2610 "env-paths": {
@@ -4509,108 +4509,103 @@
4509 "@types/node": ">= 8" 4509 "@types/node": ">= 8"
4510 } 4510 }
4511 }, 4511 },
4512 "@sentry/apm": {
4513 "version": "5.10.2",
4514 "resolved": "https://registry.npmjs.org/@sentry/apm/-/apm-5.10.2.tgz",
4515 "integrity": "sha512-rPeAFsD/6ontvs7bsuHh+XAg1ohWo04ms08SNWqEvLRQJx7WfiWnjziyC0S3dXIYZDGdhruSsqQJPJN8r6Aj5g==",
4516 "requires": {
4517 "@sentry/hub": "5.10.2",
4518 "@sentry/minimal": "5.10.2",
4519 "@sentry/types": "5.10.0",
4520 "@sentry/utils": "5.10.2",
4521 "tslib": "^1.9.3"
4522 }
4523 },
4512 "@sentry/browser": { 4524 "@sentry/browser": {
4513 "version": "4.6.6", 4525 "version": "5.10.2",
4514 "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-4.6.6.tgz", 4526 "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.10.2.tgz",
4515 "integrity": "sha512-+9VsQ+oQYU+PYlLJG2ex7JCMSVQbnUvWPI2uZOofWdI9sWIPUub3boWItMzRQNQ1T4S3FZd4FqAWNFd3azdnBw==", 4527 "integrity": "sha512-r3eyBu2ln7odvWtXARCZPzpuGrKsD6U9F3gKTu4xdFkA0swSLUvS7AC2FUksj/1BE23y+eB/zzPT+RYJ58tidA==",
4516 "requires": { 4528 "requires": {
4517 "@sentry/core": "4.6.6", 4529 "@sentry/core": "5.10.2",
4518 "@sentry/types": "4.5.3", 4530 "@sentry/types": "5.10.0",
4519 "@sentry/utils": "4.6.5", 4531 "@sentry/utils": "5.10.2",
4520 "tslib": "^1.9.3" 4532 "tslib": "^1.9.3"
4521 } 4533 }
4522 }, 4534 },
4523 "@sentry/core": { 4535 "@sentry/core": {
4524 "version": "4.6.6", 4536 "version": "5.10.2",
4525 "resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.6.6.tgz", 4537 "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.10.2.tgz",
4526 "integrity": "sha512-7z9HKLTNr3zVBR3tBRheTxkkkuK2IqISUc5Iyo3crN2OecOLtpptT96f5XjLndBEL2ab39eCBPpA5OFjbpzrIA==", 4538 "integrity": "sha512-sKVeFH3v8K8xw2vM5MKMnnyAAwih+JSE3pbNL0CcCCA+/SwX+3jeAo2BhgXev2SAR/TjWW+wmeC9TdIW7KyYbg==",
4527 "requires": { 4539 "requires": {
4528 "@sentry/hub": "4.6.5", 4540 "@sentry/hub": "5.10.2",
4529 "@sentry/minimal": "4.6.5", 4541 "@sentry/minimal": "5.10.2",
4530 "@sentry/types": "4.5.3", 4542 "@sentry/types": "5.10.0",
4531 "@sentry/utils": "4.6.5", 4543 "@sentry/utils": "5.10.2",
4532 "tslib": "^1.9.3" 4544 "tslib": "^1.9.3"
4533 } 4545 }
4534 }, 4546 },
4535 "@sentry/electron": { 4547 "@sentry/electron": {
4536 "version": "0.17.4", 4548 "version": "1.1.0",
4537 "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-0.17.4.tgz", 4549 "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-1.1.0.tgz",
4538 "integrity": "sha512-1IU0o+E8eY5Lrthj6Pqf+Dh8MptddHsFFmcOwKlft/bbZ+6RTKEefLtFOclKUMLR64C7GTqa80Yddq0ssjOv5w==", 4550 "integrity": "sha512-ot6nYOhZOjylSlK2LEaBuqzPEEcmRn76SDf+VZpujOxig5Jv/LIbgwha/xou/mggOD2y3a5cM2o8ubbs5U5Bfg==",
4539 "requires": { 4551 "requires": {
4540 "@sentry/browser": "4.6.2 || ~4.6.4", 4552 "@sentry/browser": "~5.10.0",
4541 "@sentry/core": "4.6.2 || ~4.6.4", 4553 "@sentry/core": "~5.10.0",
4542 "@sentry/minimal": "^4.5.0", 4554 "@sentry/minimal": "~5.10.0",
4543 "@sentry/node": "4.6.2 || ~4.6.4", 4555 "@sentry/node": "~5.10.0",
4544 "@sentry/types": "^4.5.0", 4556 "@sentry/types": "~5.10.0",
4545 "@sentry/utils": "4.6.2 || ~4.6.4", 4557 "@sentry/utils": "~5.10.0",
4546 "electron-fetch": "1.3.0", 4558 "form-data": "2.5.1",
4547 "form-data": "2.3.2", 4559 "node-fetch": "^2.6.0",
4548 "util.promisify": "1.0.0" 4560 "util.promisify": "1.0.0",
4561 "win-ca": "^3.1.1"
4549 }, 4562 },
4550 "dependencies": { 4563 "dependencies": {
4551 "combined-stream": {
4552 "version": "1.0.6",
4553 "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
4554 "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
4555 "requires": {
4556 "delayed-stream": "~1.0.0"
4557 }
4558 },
4559 "electron-fetch": {
4560 "version": "1.3.0",
4561 "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.3.0.tgz",
4562 "integrity": "sha512-WzHnWZqKdiCKHqqHu+GphezoWRSUVH6BQ/f13vu16VwYKJRZNt2dUrx40eZJcyZcDGn6RJDTAHS6jVoHoglgNw==",
4563 "requires": {
4564 "encoding": "^0.1.12"
4565 }
4566 },
4567 "form-data": { 4564 "form-data": {
4568 "version": "2.3.2", 4565 "version": "2.5.1",
4569 "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 4566 "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
4570 "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 4567 "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
4571 "requires": { 4568 "requires": {
4572 "asynckit": "^0.4.0", 4569 "asynckit": "^0.4.0",
4573 "combined-stream": "1.0.6", 4570 "combined-stream": "^1.0.6",
4574 "mime-types": "^2.1.12" 4571 "mime-types": "^2.1.12"
4575 } 4572 }
4576 } 4573 }
4577 } 4574 }
4578 }, 4575 },
4579 "@sentry/hub": { 4576 "@sentry/hub": {
4580 "version": "4.6.5", 4577 "version": "5.10.2",
4581 "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.6.5.tgz", 4578 "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.10.2.tgz",
4582 "integrity": "sha512-v9vee8s8C1fK/DPtNOzv6r+AMbPDOWfnasouNcBUkbQUSN5wUNyCDvt51QbWaw5kMMY5TSqjdVqY6gXQZI0APQ==", 4579 "integrity": "sha512-hSlZIiu3hcR/I5yEhlpN9C0nip+U7hiRzRzUQaBiHO4YG4TC58NqnOPR89D/ekiuHIXzFpjW9OQmqtAMRoSUYA==",
4583 "requires": { 4580 "requires": {
4584 "@sentry/types": "4.5.3", 4581 "@sentry/types": "5.10.0",
4585 "@sentry/utils": "4.6.5", 4582 "@sentry/utils": "5.10.2",
4586 "tslib": "^1.9.3" 4583 "tslib": "^1.9.3"
4587 } 4584 }
4588 }, 4585 },
4589 "@sentry/minimal": { 4586 "@sentry/minimal": {
4590 "version": "4.6.5", 4587 "version": "5.10.2",
4591 "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.6.5.tgz", 4588 "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.10.2.tgz",
4592 "integrity": "sha512-tf+J+uUNmSgzC7d9JSN8Ekw1HeBAX87Efa/jyFbzLvaw80oibvTiLSLqDjQ9PgvyIzBUuuPImkS2NpvPQGWFtg==", 4589 "integrity": "sha512-GalixiM9sckYfompH5HHTp9XT2BcjawBkcl1DMEKUBEi37+kUq0bivOBmnN1G/I4/wWOUdnAI/kagDWaWpbZPg==",
4593 "requires": { 4590 "requires": {
4594 "@sentry/hub": "4.6.5", 4591 "@sentry/hub": "5.10.2",
4595 "@sentry/types": "4.5.3", 4592 "@sentry/types": "5.10.0",
4596 "tslib": "^1.9.3" 4593 "tslib": "^1.9.3"
4597 } 4594 }
4598 }, 4595 },
4599 "@sentry/node": { 4596 "@sentry/node": {
4600 "version": "4.6.6", 4597 "version": "5.10.2",
4601 "resolved": "https://registry.npmjs.org/@sentry/node/-/node-4.6.6.tgz", 4598 "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.10.2.tgz",
4602 "integrity": "sha512-+zZHE2uOwQTgypP6N9oBd0Io6BKXaJh6mdmZBauF0G46/8V28sBQ/dXBtJJNZ8tW7eVlLGpLSGuJb9Ai7c/rNw==", 4599 "integrity": "sha512-1ib1hAhVtmfXOThpcCfR4S6wFopd6lHqgOMrAUPo9saHy8zseZPRC7iTWGoSPy2RMwjrURAk54VvFnLe7G+PdQ==",
4603 "requires": { 4600 "requires": {
4604 "@sentry/core": "4.6.6", 4601 "@sentry/apm": "5.10.2",
4605 "@sentry/hub": "4.6.5", 4602 "@sentry/core": "5.10.2",
4606 "@sentry/types": "4.5.3", 4603 "@sentry/hub": "5.10.2",
4607 "@sentry/utils": "4.6.5", 4604 "@sentry/types": "5.10.0",
4608 "@types/stack-trace": "0.0.29", 4605 "@sentry/utils": "5.10.2",
4609 "cookie": "0.3.1", 4606 "cookie": "^0.3.1",
4610 "https-proxy-agent": "2.2.1", 4607 "https-proxy-agent": "^3.0.0",
4611 "lru_map": "0.3.3", 4608 "lru_map": "^0.3.3",
4612 "lsmod": "1.0.0",
4613 "stack-trace": "0.0.10",
4614 "tslib": "^1.9.3" 4609 "tslib": "^1.9.3"
4615 }, 4610 },
4616 "dependencies": { 4611 "dependencies": {
@@ -4623,27 +4618,27 @@
4623 } 4618 }
4624 }, 4619 },
4625 "https-proxy-agent": { 4620 "https-proxy-agent": {
4626 "version": "2.2.1", 4621 "version": "3.0.1",
4627 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 4622 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz",
4628 "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 4623 "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==",
4629 "requires": { 4624 "requires": {
4630 "agent-base": "^4.1.0", 4625 "agent-base": "^4.3.0",
4631 "debug": "^3.1.0" 4626 "debug": "^3.1.0"
4632 } 4627 }
4633 } 4628 }
4634 } 4629 }
4635 }, 4630 },
4636 "@sentry/types": { 4631 "@sentry/types": {
4637 "version": "4.5.3", 4632 "version": "5.10.0",
4638 "resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.5.3.tgz", 4633 "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.10.0.tgz",
4639 "integrity": "sha512-7ll1PAFNjrBNX9rzy3P2qAQrpQwHaDO3uKj735qsnGw34OtAS8Xr8WYrjI14f9fMPa/XIeWvMPb4GMic28V/ag==" 4634 "integrity": "sha512-TW20GzkCWsP6uAxR2JIpIkiitCKyIOfkyDsKBeLqYj4SaZjfvBPnzgNCcYR0L0UsP1/Es6oHooZfIGSkp6GGxQ=="
4640 }, 4635 },
4641 "@sentry/utils": { 4636 "@sentry/utils": {
4642 "version": "4.6.5", 4637 "version": "5.10.2",
4643 "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.6.5.tgz", 4638 "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.10.2.tgz",
4644 "integrity": "sha512-rTISJtRRbWsd3UE+TkA3QG1C0VzPKPW8w74tieBwYhtTCGmOHNwz2nDC/MZGbGj4OgDmNKKl4CCyQr88EX08hA==", 4639 "integrity": "sha512-UcbbaFpYrGSV448lQ16Cr+W/MPuKUflQQUdrMCt5vgaf5+M7kpozlcji4GGGZUCXIA7oRP93ABoXj55s1OM9zw==",
4645 "requires": { 4640 "requires": {
4646 "@sentry/types": "4.5.3", 4641 "@sentry/types": "5.10.0",
4647 "tslib": "^1.9.3" 4642 "tslib": "^1.9.3"
4648 } 4643 }
4649 }, 4644 },
@@ -4874,11 +4869,6 @@
4874 "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.0.tgz", 4869 "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.0.tgz",
4875 "integrity": "sha512-1OzrNb4RuAzIT7wHSsgZRlMBlNsJl+do6UblR7JMW4oB7bbR+uBEYtUh7gEc/jM84GGilh68lSOokyM/zNUlBA==" 4870 "integrity": "sha512-1OzrNb4RuAzIT7wHSsgZRlMBlNsJl+do6UblR7JMW4oB7bbR+uBEYtUh7gEc/jM84GGilh68lSOokyM/zNUlBA=="
4876 }, 4871 },
4877 "@types/stack-trace": {
4878 "version": "0.0.29",
4879 "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz",
4880 "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g=="
4881 },
4882 "@types/stack-utils": { 4872 "@types/stack-utils": {
4883 "version": "1.0.1", 4873 "version": "1.0.1",
4884 "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", 4874 "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
@@ -9634,9 +9624,9 @@
9634 "dev": true 9624 "dev": true
9635 }, 9625 },
9636 "electron": { 9626 "electron": {
9637 "version": "7.1.2", 9627 "version": "7.1.6",
9638 "resolved": "https://registry.npmjs.org/electron/-/electron-7.1.2.tgz", 9628 "resolved": "https://registry.npmjs.org/electron/-/electron-7.1.6.tgz",
9639 "integrity": "sha512-7hjONYt2GlQfKuKgQrhhUL1P9lbGWLBfMUq+2QFU3yeLtCvM0ROfPJCRP4OF5pVp3KDyfFp4DtmhuVzAnxV3jA==", 9629 "integrity": "sha512-0QSxQYYzSrBRbctKgAWS79k/I+vm95I7bz/zTuF0Qv4PvTtQf5hK21q6wtyKVPPJFFXnmSyvfQ2ce6iktfgK8g==",
9640 "dev": true, 9630 "dev": true,
9641 "requires": { 9631 "requires": {
9642 "@electron/get": "^1.0.1", 9632 "@electron/get": "^1.0.1",
@@ -13497,9 +13487,9 @@
13497 }, 13487 },
13498 "dependencies": { 13488 "dependencies": {
13499 "core-js": { 13489 "core-js": {
13500 "version": "3.4.4", 13490 "version": "3.5.0",
13501 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.4.4.tgz", 13491 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.5.0.tgz",
13502 "integrity": "sha512-vKea1DrcLA80Hrfc7AQgfoGvEaByfR5mH08t+zuWOWY94TFBmabdEL56mUbcijvadG9RxsXR2gUUFrfj4/iTcA==", 13492 "integrity": "sha512-Ifh3kj78gzQ7NAoJXeTu+XwzDld0QRIwjBLRqAMhuLhP3d2Av5wmgE9ycfnvK6NAEjTkQ1sDPeoEZAWO3Hx1Uw==",
13503 "dev": true, 13493 "dev": true,
13504 "optional": true 13494 "optional": true
13505 }, 13495 },
@@ -13563,15 +13553,13 @@
13563 "dev": true 13553 "dev": true
13564 }, 13554 },
13565 "globalthis": { 13555 "globalthis": {
13566 "version": "1.0.0", 13556 "version": "1.0.1",
13567 "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.0.tgz", 13557 "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz",
13568 "integrity": "sha512-vcCAZTJ3r5Qcu5l8/2oyVdoFwxKgfYnMTR2vwWeux/NAVZK3PwcMaWkdUIn4GJbmKuRK7xcvDsLuK+CKcXyodg==", 13558 "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==",
13569 "dev": true, 13559 "dev": true,
13570 "optional": true, 13560 "optional": true,
13571 "requires": { 13561 "requires": {
13572 "define-properties": "^1.1.2", 13562 "define-properties": "^1.1.3"
13573 "function-bind": "^1.1.1",
13574 "object-keys": "^1.0.12"
13575 } 13563 }
13576 }, 13564 },
13577 "globby": { 13565 "globby": {
@@ -16047,6 +16035,11 @@
16047 "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 16035 "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
16048 "dev": true 16036 "dev": true
16049 }, 16037 },
16038 "is-electron": {
16039 "version": "2.2.0",
16040 "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.0.tgz",
16041 "integrity": "sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q=="
16042 },
16050 "is-equal-shallow": { 16043 "is-equal-shallow": {
16051 "version": "0.1.3", 16044 "version": "0.1.3",
16052 "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 16045 "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
@@ -18183,11 +18176,6 @@
18183 "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", 18176 "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
18184 "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" 18177 "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0="
18185 }, 18178 },
18186 "lsmod": {
18187 "version": "1.0.0",
18188 "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz",
18189 "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks="
18190 },
18191 "macos-notification-state": { 18179 "macos-notification-state": {
18192 "version": "1.3.1", 18180 "version": "1.3.1",
18193 "resolved": "https://registry.npmjs.org/macos-notification-state/-/macos-notification-state-1.3.1.tgz", 18181 "resolved": "https://registry.npmjs.org/macos-notification-state/-/macos-notification-state-1.3.1.tgz",
@@ -18222,7 +18210,6 @@
18222 "version": "1.3.0", 18210 "version": "1.3.0",
18223 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 18211 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
18224 "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 18212 "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
18225 "dev": true,
18226 "requires": { 18213 "requires": {
18227 "pify": "^3.0.0" 18214 "pify": "^3.0.0"
18228 } 18215 }
@@ -20901,8 +20888,7 @@
20901 "pify": { 20888 "pify": {
20902 "version": "3.0.0", 20889 "version": "3.0.0",
20903 "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 20890 "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
20904 "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 20891 "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
20905 "dev": true
20906 }, 20892 },
20907 "pinkie": { 20893 "pinkie": {
20908 "version": "2.0.4", 20894 "version": "2.0.4",
@@ -24225,7 +24211,6 @@
24225 "version": "1.0.1", 24211 "version": "1.0.1",
24226 "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 24212 "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
24227 "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 24213 "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
24228 "dev": true,
24229 "requires": { 24214 "requires": {
24230 "through": "2" 24215 "through": "2"
24231 } 24216 }
@@ -25187,8 +25172,7 @@
25187 "through": { 25172 "through": {
25188 "version": "2.3.8", 25173 "version": "2.3.8",
25189 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 25174 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
25190 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 25175 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
25191 "dev": true
25192 }, 25176 },
25193 "through2": { 25177 "through2": {
25194 "version": "3.0.1", 25178 "version": "3.0.1",
@@ -26954,6 +26938,24 @@
26954 "string-width": "^2.1.1" 26938 "string-width": "^2.1.1"
26955 } 26939 }
26956 }, 26940 },
26941 "win-ca": {
26942 "version": "3.1.1",
26943 "resolved": "https://registry.npmjs.org/win-ca/-/win-ca-3.1.1.tgz",
26944 "integrity": "sha512-uZj8zifF459u1apoVjXKVBBnh4NyILbC0W5asVtILwseNenc+krP44C0FWn6RXGjOHvxLKfYoIm0xl/R8wlw+g==",
26945 "requires": {
26946 "is-electron": "^2.2.0",
26947 "make-dir": "^1.3.0",
26948 "node-forge": "^0.8.2",
26949 "split": "^1.0.1"
26950 },
26951 "dependencies": {
26952 "node-forge": {
26953 "version": "0.8.5",
26954 "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz",
26955 "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q=="
26956 }
26957 }
26958 },
26957 "window-size": { 26959 "window-size": {
26958 "version": "0.1.4", 26960 "version": "0.1.4",
26959 "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 26961 "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
diff --git a/package.json b/package.json
index f60556f51..2641cb721 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
2 "name": "ferdi", 2 "name": "ferdi",
3 "productName": "Ferdi", 3 "productName": "Ferdi",
4 "appId": "com.kytwb.ferdi", 4 "appId": "com.kytwb.ferdi",
5 "version": "5.4.1-beta.2", 5 "version": "5.4.1-beta.3",
6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.", 6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.",
7 "copyright": "kytwb", 7 "copyright": "kytwb",
8 "main": "index.js", 8 "main": "index.js",
@@ -56,7 +56,7 @@
56 "@meetfranz/forms": "file:packages/forms", 56 "@meetfranz/forms": "file:packages/forms",
57 "@meetfranz/theme": "file:packages/theme", 57 "@meetfranz/theme": "file:packages/theme",
58 "@meetfranz/ui": "file:packages/ui", 58 "@meetfranz/ui": "file:packages/ui",
59 "@sentry/electron": "0.17.4", 59 "@sentry/electron": "1.1.0",
60 "address-rfc2822": "^2.0.1", 60 "address-rfc2822": "^2.0.1",
61 "atob": "2.1.2", 61 "atob": "2.1.2",
62 "auto-launch": "5.0.5", 62 "auto-launch": "5.0.5",
@@ -152,7 +152,7 @@
152 "cross-env": "^5.0.5", 152 "cross-env": "^5.0.5",
153 "cz-conventional-changelog": "2.1.0", 153 "cz-conventional-changelog": "2.1.0",
154 "dotenv": "^4.0.0", 154 "dotenv": "^4.0.0",
155 "electron": "7.1.2", 155 "electron": "7.1.6",
156 "electron-builder": "21.2.0", 156 "electron-builder": "21.2.0",
157 "electron-notarize": "0.2.1", 157 "electron-notarize": "0.2.1",
158 "electron-rebuild": "1.8.8", 158 "electron-rebuild": "1.8.8",
diff --git a/src/api/RecipePreviewsApi.js b/src/api/RecipePreviewsApi.js
index d9c675d76..a56fa587f 100644
--- a/src/api/RecipePreviewsApi.js
+++ b/src/api/RecipePreviewsApi.js
@@ -1,4 +1,4 @@
1export default class ServicesApi { 1export default class RecipePreviewsApi {
2 constructor(server) { 2 constructor(server) {
3 this.server = server; 3 this.server = server;
4 } 4 }
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 83dc34a52..7d6bad883 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -3,9 +3,7 @@ import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import ReactTooltip from 'react-tooltip'; 5import ReactTooltip from 'react-tooltip';
6import { 6import { ProBadge, H1, H2 } from '@meetfranz/ui';
7 ProBadge, H1, H2,
8} from '@meetfranz/ui';
9import moment from 'moment'; 7import moment from 'moment';
10 8
11import Loader from '../../ui/Loader'; 9import Loader from '../../ui/Loader';
@@ -13,6 +11,7 @@ import Button from '../../ui/Button';
13import Infobox from '../../ui/Infobox'; 11import Infobox from '../../ui/Infobox';
14import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen'; 12import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen';
15import { i18nPlanName } from '../../../helpers/plan-helpers'; 13import { i18nPlanName } from '../../../helpers/plan-helpers';
14import { LOCAL_SERVER } from '../../../config';
16 15
17const messages = defineMessages({ 16const messages = defineMessages({
18 headline: { 17 headline: {
@@ -69,11 +68,13 @@ const messages = defineMessages({
69 }, 68 },
70 deleteInfo: { 69 deleteInfo: {
71 id: 'settings.account.deleteInfo', 70 id: 'settings.account.deleteInfo',
72 defaultMessage: '!!!If you don\'t need your Ferdi account any longer, you can delete your account and all related data here.', 71 defaultMessage:
72 "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
73 }, 73 },
74 deleteEmailSent: { 74 deleteEmailSent: {
75 id: 'settings.account.deleteEmailSent', 75 id: 'settings.account.deleteEmailSent',
76 defaultMessage: '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!', 76 defaultMessage:
77 '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!',
77 }, 78 },
78 trial: { 79 trial: {
79 id: 'settings.account.trial', 80 id: 'settings.account.trial',
@@ -89,7 +90,16 @@ const messages = defineMessages({
89 }, 90 },
90 trialUpdateBillingInformation: { 91 trialUpdateBillingInformation: {
91 id: 'settings.account.trialUpdateBillingInfo', 92 id: 'settings.account.trialUpdateBillingInfo',
92 defaultMessage: '!!!Please update your billing info to continue using {license} after your trial period.', 93 defaultMessage:
94 '!!!Please update your billing info to continue using {license} after your trial period.',
95 },
96 accountUnavailable: {
97 id: 'settings.account.accountUnavailable',
98 defaultMessage: 'Account is unavailable',
99 },
100 accountUnavailableInfo: {
101 id: 'settings.account.accountUnavailableInfo',
102 defaultMessage: 'You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.',
93 }, 103 },
94}); 104});
95 105
@@ -110,6 +120,7 @@ class AccountDashboard extends Component {
110 upgradeToPro: PropTypes.func.isRequired, 120 upgradeToPro: PropTypes.func.isRequired,
111 openInvoices: PropTypes.func.isRequired, 121 openInvoices: PropTypes.func.isRequired,
112 onCloseSubscriptionWindow: PropTypes.func.isRequired, 122 onCloseSubscriptionWindow: PropTypes.func.isRequired,
123 server: PropTypes.string.isRequired,
113 }; 124 };
114 125
115 static contextTypes = { 126 static contextTypes = {
@@ -132,6 +143,7 @@ class AccountDashboard extends Component {
132 upgradeToPro, 143 upgradeToPro,
133 openInvoices, 144 openInvoices,
134 onCloseSubscriptionWindow, 145 onCloseSubscriptionWindow,
146 server,
135 } = this.props; 147 } = this.props;
136 const { intl } = this.context; 148 const { intl } = this.context;
137 149
@@ -141,6 +153,8 @@ class AccountDashboard extends Component {
141 planName = i18nPlanName(user.team.plan, intl); 153 planName = i18nPlanName(user.team.plan, intl);
142 } 154 }
143 155
156 const isUsingWithoutAccount = server === LOCAL_SERVER;
157
144 return ( 158 return (
145 <div className="settings__main"> 159 <div className="settings__main">
146 <div className="settings__header"> 160 <div className="settings__header">
@@ -149,154 +163,186 @@ class AccountDashboard extends Component {
149 </span> 163 </span>
150 </div> 164 </div>
151 <div className="settings__body"> 165 <div className="settings__body">
152 {isLoading && ( 166 {isUsingWithoutAccount && (
153 <Loader /> 167 <>
168 <h1 style={{ marginBottom: 0 }}>
169 {intl.formatMessage(messages.accountUnavailable)}
170 </h1>
171 <p
172 className="settings__message"
173 style={{
174 borderTop: 0,
175 marginTop: 0,
176 }}
177 >
178 {intl.formatMessage(messages.accountUnavailableInfo)}
179 </p>
180 </>
154 )} 181 )}
182 {!isUsingWithoutAccount && (
183 <>
184 {isLoading && <Loader />}
155 185
156 {!isLoading && userInfoRequestFailed && ( 186 {!isLoading && userInfoRequestFailed && (
157 <Infobox 187 <Infobox
158 icon="alert" 188 icon="alert"
159 type="danger" 189 type="danger"
160 ctaLabel={intl.formatMessage(messages.tryReloadUserInfoRequest)} 190 ctaLabel={intl.formatMessage(
161 ctaLoading={isLoading} 191 messages.tryReloadUserInfoRequest,
162 ctaOnClick={retryUserInfoRequest} 192 )}
163 > 193 ctaLoading={isLoading}
164 {intl.formatMessage(messages.userInfoRequestFailed)} 194 ctaOnClick={retryUserInfoRequest}
165 </Infobox> 195 >
166 )} 196 {intl.formatMessage(messages.userInfoRequestFailed)}
197 </Infobox>
198 )}
167 199
168 {!userInfoRequestFailed && ( 200 {!userInfoRequestFailed && (
169 <>
170 {!isLoading && (
171 <> 201 <>
172 <div className="account"> 202 {!isLoading && (
173 <div className="account__box account__box--flex"> 203 <>
174 <div className="account__avatar"> 204 <div className="account">
175 <img 205 <div className="account__box account__box--flex">
176 src="./assets/images/logo.svg" 206 <div className="account__avatar">
177 alt="" 207 <img src="./assets/images/logo.svg" alt="" />
178 /> 208 </div>
179 </div> 209 <div className="account__info">
180 <div className="account__info"> 210 <H1>
181 <H1> 211 <span className="username">{`${user.firstname} ${user.lastname}`}</span>
182 <span className="username">{`${user.firstname} ${user.lastname}`}</span> 212 {user.isPremium && (
183 {user.isPremium && ( 213 <>
184 <> 214 {' '}
185 {' '} 215 <ProBadge />
186 <ProBadge /> 216 </>
187 </> 217 )}
188 )} 218 </H1>
189 </H1> 219 <p>
190 <p> 220 {user.organization && `${user.organization}, `}
191 {user.organization && `${user.organization}, `} 221 {user.email}
192 {user.email} 222 </p>
193 </p> 223 {user.isPremium && (
194 {user.isPremium && ( 224 <div className="manage-user-links">
195 <div className="manage-user-links"> 225 <Button
226 label={intl.formatMessage(
227 messages.accountEditButton,
228 )}
229 className="franz-form__button--inverted"
230 onClick={openEditAccount}
231 />
232 </div>
233 )}
234 </div>
235 {!user.isPremium && (
196 <Button 236 <Button
197 label={intl.formatMessage(messages.accountEditButton)} 237 label={intl.formatMessage(
238 messages.accountEditButton,
239 )}
198 className="franz-form__button--inverted" 240 className="franz-form__button--inverted"
199 onClick={openEditAccount} 241 onClick={openEditAccount}
200 /> 242 />
201 </div>
202 )}
203 </div>
204 {!user.isPremium && (
205 <Button
206 label={intl.formatMessage(messages.accountEditButton)}
207 className="franz-form__button--inverted"
208 onClick={openEditAccount}
209 />
210 )}
211 </div>
212 </div>
213 {user.isPremium && user.isSubscriptionOwner && (
214 <div className="account">
215 <div className="account__box">
216 <H2>
217 {intl.formatMessage(messages.yourLicense)}
218 </H2>
219 <p>
220 Franz
221 {' '}
222 {isPremiumOverrideUser ? 'Premium' : planName}
223 {user.team.isTrial && (
224 <>
225 {' – '}
226 {intl.formatMessage(messages.trial)}
227 </>
228 )} 243 )}
229 </p> 244 </div>
230 {user.team.isTrial && ( 245 </div>
231 <> 246 {user.isPremium && user.isSubscriptionOwner && (
232 <br /> 247 <div className="account">
233 <p> 248 <div className="account__box">
234 {intl.formatMessage(messages.trialEndsIn, { 249 <H2>{intl.formatMessage(messages.yourLicense)}</H2>
235 duration: moment.duration(moment().diff(user.team.trialEnd)).humanize(),
236 })}
237 </p>
238 <p> 250 <p>
239 {intl.formatMessage(messages.trialUpdateBillingInformation, { 251 Franz
240 license: planName, 252 {' '}
241 })} 253 {isPremiumOverrideUser ? 'Premium' : planName}
254 {user.team.isTrial && (
255 <>
256 {' – '}
257 {intl.formatMessage(messages.trial)}
258 </>
259 )}
242 </p> 260 </p>
243 </> 261 {user.team.isTrial && (
244 )} 262 <>
245 {!isProUser && ( 263 <br />
246 <div className="manage-user-links"> 264 <p>
247 <Button 265 {intl.formatMessage(messages.trialEndsIn, {
248 label={intl.formatMessage(messages.upgradeAccountToPro)} 266 duration: moment
249 className="franz-form__button--primary" 267 .duration(
250 onClick={upgradeToPro} 268 moment().diff(user.team.trialEnd),
269 )
270 .humanize(),
271 })}
272 </p>
273 <p>
274 {intl.formatMessage(
275 messages.trialUpdateBillingInformation,
276 {
277 license: planName,
278 },
279 )}
280 </p>
281 </>
282 )}
283 {!isProUser && (
284 <div className="manage-user-links">
285 <Button
286 label={intl.formatMessage(
287 messages.upgradeAccountToPro,
288 )}
289 className="franz-form__button--primary"
290 onClick={upgradeToPro}
291 />
292 </div>
293 )}
294 <div className="manage-user-links">
295 <Button
296 label={intl.formatMessage(
297 messages.manageSubscriptionButtonLabel,
298 )}
299 className="franz-form__button--inverted"
300 onClick={openBilling}
301 />
302 <Button
303 label={intl.formatMessage(
304 messages.invoicesButton,
305 )}
306 className="franz-form__button--inverted"
307 onClick={openInvoices}
308 />
309 </div>
310 </div>
311 </div>
312 )}
313 {!user.isPremium && (
314 <div className="account franz-form">
315 <div className="account__box">
316 <SubscriptionForm
317 onCloseWindow={onCloseSubscriptionWindow}
251 /> 318 />
252 </div> 319 </div>
253 )} 320 </div>
254 <div className="manage-user-links"> 321 )}
255 <Button 322 </>
256 label={intl.formatMessage(messages.manageSubscriptionButtonLabel)} 323 )}
257 className="franz-form__button--inverted" 324
258 onClick={openBilling} 325 <div className="account franz-form">
259 /> 326 <div className="account__box">
327 <H2>{intl.formatMessage(messages.headlineDangerZone)}</H2>
328 {!isDeleteAccountSuccessful && (
329 <div className="account__subscription">
330 <p>{intl.formatMessage(messages.deleteInfo)}</p>
260 <Button 331 <Button
261 label={intl.formatMessage(messages.invoicesButton)} 332 label={intl.formatMessage(messages.deleteAccount)}
262 className="franz-form__button--inverted" 333 buttonType="danger"
263 onClick={openInvoices} 334 onClick={() => deleteAccount()}
335 loaded={!isLoadingDeleteAccount}
264 /> 336 />
265 </div> 337 </div>
266 </div> 338 )}
267 </div> 339 {isDeleteAccountSuccessful && (
268 )} 340 <p>{intl.formatMessage(messages.deleteEmailSent)}</p>
269 {!user.isPremium && ( 341 )}
270 <div className="account franz-form">
271 <div className="account__box">
272 <SubscriptionForm
273 onCloseWindow={onCloseSubscriptionWindow}
274 />
275 </div>
276 </div> 342 </div>
277 )} 343 </div>
278 </> 344 </>
279 )} 345 )}
280
281 <div className="account franz-form">
282 <div className="account__box">
283 <H2>{intl.formatMessage(messages.headlineDangerZone)}</H2>
284 {!isDeleteAccountSuccessful && (
285 <div className="account__subscription">
286 <p>{intl.formatMessage(messages.deleteInfo)}</p>
287 <Button
288 label={intl.formatMessage(messages.deleteAccount)}
289 buttonType="danger"
290 onClick={() => deleteAccount()}
291 loaded={!isLoadingDeleteAccount}
292 />
293 </div>
294 )}
295 {isDeleteAccountSuccessful && (
296 <p>{intl.formatMessage(messages.deleteEmailSent)}</p>
297 )}
298 </div>
299 </div>
300 </> 346 </>
301 )} 347 )}
302 </div> 348 </div>
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index 93ab44690..12c912bac 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -6,12 +6,16 @@ import PaymentStore from '../../stores/PaymentStore';
6import UserStore from '../../stores/UserStore'; 6import UserStore from '../../stores/UserStore';
7import AppStore from '../../stores/AppStore'; 7import AppStore from '../../stores/AppStore';
8import FeaturesStore from '../../stores/FeaturesStore'; 8import FeaturesStore from '../../stores/FeaturesStore';
9import SettingsStore from '../../stores/SettingsStore';
9 10
10import AccountDashboard from '../../components/settings/account/AccountDashboard'; 11import AccountDashboard from '../../components/settings/account/AccountDashboard';
11import ErrorBoundary from '../../components/util/ErrorBoundary'; 12import ErrorBoundary from '../../components/util/ErrorBoundary';
12import { WEBSITE } from '../../environment'; 13import { WEBSITE } from '../../environment';
13 14
14export default @inject('stores', 'actions') @observer class AccountScreen extends Component { 15export default
16@inject('stores', 'actions')
17@observer
18class AccountScreen extends Component {
15 onCloseWindow() { 19 onCloseWindow() {
16 const { user, features } = this.props.stores; 20 const { user, features } = this.props.stores;
17 user.getUserInfoRequest.invalidate({ immediately: true }); 21 user.getUserInfoRequest.invalidate({ immediately: true });
@@ -32,7 +36,9 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
32 36
33 let url; 37 let url;
34 if (api === 'https://api.franzinfra.com') { 38 if (api === 'https://api.franzinfra.com') {
35 url = stores.user.getAuthURL(`${WEBSITE}${route}?utm_source=app&utm_medium=account_dashboard`); 39 url = stores.user.getAuthURL(
40 `${WEBSITE}${route}?utm_source=app&utm_medium=account_dashboard`,
41 );
36 } else { 42 } else {
37 url = `${api}${route}`; 43 url = `${api}${route}`;
38 } 44 }
@@ -41,11 +47,13 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
41 } 47 }
42 48
43 render() { 49 render() {
44 const { user, payment, features } = this.props.stores;
45 const { 50 const {
46 user: userActions, 51 user,
47 payment: paymentActions, 52 payment,
48 } = this.props.actions; 53 features,
54 settings,
55 } = this.props.stores;
56 const { user: userActions, payment: paymentActions } = this.props.actions;
49 57
50 const isLoadingUserInfo = user.getUserInfoRequest.isExecuting; 58 const isLoadingUserInfo = user.getUserInfoRequest.isExecuting;
51 const isLoadingPlans = payment.plansRequest.isExecuting; 59 const isLoadingPlans = payment.plansRequest.isExecuting;
@@ -55,19 +63,29 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
55 return ( 63 return (
56 <ErrorBoundary> 64 <ErrorBoundary>
57 <AccountDashboard 65 <AccountDashboard
66 server={settings.all.app.server}
58 user={user.data} 67 user={user.data}
59 isPremiumOverrideUser={user.isPremiumOverride} 68 isPremiumOverrideUser={user.isPremiumOverride}
60 isProUser={user.isPro} 69 isProUser={user.isPro}
61 isLoading={isLoadingUserInfo} 70 isLoading={isLoadingUserInfo}
62 isLoadingPlans={isLoadingPlans} 71 isLoadingPlans={isLoadingPlans}
63 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError} 72 userInfoRequestFailed={
73 user.getUserInfoRequest.wasExecuted
74 && user.getUserInfoRequest.isError
75 }
64 retryUserInfoRequest={() => this.reloadData()} 76 retryUserInfoRequest={() => this.reloadData()}
65 onCloseSubscriptionWindow={() => this.onCloseWindow()} 77 onCloseSubscriptionWindow={() => this.onCloseWindow()}
66 deleteAccount={userActions.delete} 78 deleteAccount={userActions.delete}
67 isLoadingDeleteAccount={user.deleteAccountRequest.isExecuting} 79 isLoadingDeleteAccount={user.deleteAccountRequest.isExecuting}
68 isDeleteAccountSuccessful={user.deleteAccountRequest.wasExecuted && !user.deleteAccountRequest.isError} 80 isDeleteAccountSuccessful={
81 user.deleteAccountRequest.wasExecuted
82 && !user.deleteAccountRequest.isError
83 }
69 openEditAccount={() => this.handleWebsiteLink('/user/profile')} 84 openEditAccount={() => this.handleWebsiteLink('/user/profile')}
70 upgradeToPro={() => upgradeAccount({ planId: features.features.pricingConfig.plans.pro.yearly.id })} 85 upgradeToPro={() => upgradeAccount({
86 planId: features.features.pricingConfig.plans.pro.yearly.id,
87 })
88 }
71 openBilling={() => this.handleWebsiteLink('/user/billing')} 89 openBilling={() => this.handleWebsiteLink('/user/billing')}
72 openInvoices={() => this.handleWebsiteLink('/user/invoices')} 90 openInvoices={() => this.handleWebsiteLink('/user/invoices')}
73 /> 91 />
@@ -81,6 +99,7 @@ AccountScreen.wrappedComponent.propTypes = {
81 user: PropTypes.instanceOf(UserStore).isRequired, 99 user: PropTypes.instanceOf(UserStore).isRequired,
82 features: PropTypes.instanceOf(FeaturesStore).isRequired, 100 features: PropTypes.instanceOf(FeaturesStore).isRequired,
83 payment: PropTypes.instanceOf(PaymentStore).isRequired, 101 payment: PropTypes.instanceOf(PaymentStore).isRequired,
102 settings: PropTypes.instanceOf(SettingsStore).isRequired,
84 app: PropTypes.instanceOf(AppStore).isRequired, 103 app: PropTypes.instanceOf(AppStore).isRequired,
85 }).isRequired, 104 }).isRequired,
86 actions: PropTypes.shape({ 105 actions: PropTypes.shape({
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index cc60891c3..429930278 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -1533,169 +1533,169 @@
1533 "defaultMessage": "!!!Account", 1533 "defaultMessage": "!!!Account",
1534 "end": { 1534 "end": {
1535 "column": 3, 1535 "column": 3,
1536 "line": 21 1536 "line": 20
1537 }, 1537 },
1538 "file": "src/components/settings/account/AccountDashboard.js", 1538 "file": "src/components/settings/account/AccountDashboard.js",
1539 "id": "settings.account.headline", 1539 "id": "settings.account.headline",
1540 "start": { 1540 "start": {
1541 "column": 12, 1541 "column": 12,
1542 "line": 18 1542 "line": 17
1543 } 1543 }
1544 }, 1544 },
1545 { 1545 {
1546 "defaultMessage": "!!!Your Subscription", 1546 "defaultMessage": "!!!Your Subscription",
1547 "end": { 1547 "end": {
1548 "column": 3, 1548 "column": 3,
1549 "line": 25 1549 "line": 24
1550 }, 1550 },
1551 "file": "src/components/settings/account/AccountDashboard.js", 1551 "file": "src/components/settings/account/AccountDashboard.js",
1552 "id": "settings.account.headlineSubscription", 1552 "id": "settings.account.headlineSubscription",
1553 "start": { 1553 "start": {
1554 "column": 24, 1554 "column": 24,
1555 "line": 22 1555 "line": 21
1556 } 1556 }
1557 }, 1557 },
1558 { 1558 {
1559 "defaultMessage": "!!Danger Zone", 1559 "defaultMessage": "!!Danger Zone",
1560 "end": { 1560 "end": {
1561 "column": 3, 1561 "column": 3,
1562 "line": 29 1562 "line": 28
1563 }, 1563 },
1564 "file": "src/components/settings/account/AccountDashboard.js", 1564 "file": "src/components/settings/account/AccountDashboard.js",
1565 "id": "settings.account.headlineDangerZone", 1565 "id": "settings.account.headlineDangerZone",
1566 "start": { 1566 "start": {
1567 "column": 22, 1567 "column": 22,
1568 "line": 26 1568 "line": 25
1569 } 1569 }
1570 }, 1570 },
1571 { 1571 {
1572 "defaultMessage": "!!!Manage your subscription", 1572 "defaultMessage": "!!!Manage your subscription",
1573 "end": { 1573 "end": {
1574 "column": 3, 1574 "column": 3,
1575 "line": 33 1575 "line": 32
1576 }, 1576 },
1577 "file": "src/components/settings/account/AccountDashboard.js", 1577 "file": "src/components/settings/account/AccountDashboard.js",
1578 "id": "settings.account.manageSubscription.label", 1578 "id": "settings.account.manageSubscription.label",
1579 "start": { 1579 "start": {
1580 "column": 33, 1580 "column": 33,
1581 "line": 30 1581 "line": 29
1582 } 1582 }
1583 }, 1583 },
1584 { 1584 {
1585 "defaultMessage": "!!!Upgrade to Franz Professional", 1585 "defaultMessage": "!!!Upgrade to Franz Professional",
1586 "end": { 1586 "end": {
1587 "column": 3, 1587 "column": 3,
1588 "line": 37 1588 "line": 36
1589 }, 1589 },
1590 "file": "src/components/settings/account/AccountDashboard.js", 1590 "file": "src/components/settings/account/AccountDashboard.js",
1591 "id": "settings.account.upgradeToPro.label", 1591 "id": "settings.account.upgradeToPro.label",
1592 "start": { 1592 "start": {
1593 "column": 23, 1593 "column": 23,
1594 "line": 34 1594 "line": 33
1595 } 1595 }
1596 }, 1596 },
1597 { 1597 {
1598 "defaultMessage": "!!!Basic Account", 1598 "defaultMessage": "!!!Basic Account",
1599 "end": { 1599 "end": {
1600 "column": 3, 1600 "column": 3,
1601 "line": 41 1601 "line": 40
1602 }, 1602 },
1603 "file": "src/components/settings/account/AccountDashboard.js", 1603 "file": "src/components/settings/account/AccountDashboard.js",
1604 "id": "settings.account.accountType.basic", 1604 "id": "settings.account.accountType.basic",
1605 "start": { 1605 "start": {
1606 "column": 20, 1606 "column": 20,
1607 "line": 38 1607 "line": 37
1608 } 1608 }
1609 }, 1609 },
1610 { 1610 {
1611 "defaultMessage": "!!!Premium Supporter Account", 1611 "defaultMessage": "!!!Premium Supporter Account",
1612 "end": { 1612 "end": {
1613 "column": 3, 1613 "column": 3,
1614 "line": 45 1614 "line": 44
1615 }, 1615 },
1616 "file": "src/components/settings/account/AccountDashboard.js", 1616 "file": "src/components/settings/account/AccountDashboard.js",
1617 "id": "settings.account.accountType.premium", 1617 "id": "settings.account.accountType.premium",
1618 "start": { 1618 "start": {
1619 "column": 22, 1619 "column": 22,
1620 "line": 42 1620 "line": 41
1621 } 1621 }
1622 }, 1622 },
1623 { 1623 {
1624 "defaultMessage": "!!!Edit Account", 1624 "defaultMessage": "!!!Edit Account",
1625 "end": { 1625 "end": {
1626 "column": 3, 1626 "column": 3,
1627 "line": 49 1627 "line": 48
1628 }, 1628 },
1629 "file": "src/components/settings/account/AccountDashboard.js", 1629 "file": "src/components/settings/account/AccountDashboard.js",
1630 "id": "settings.account.account.editButton", 1630 "id": "settings.account.account.editButton",
1631 "start": { 1631 "start": {
1632 "column": 21, 1632 "column": 21,
1633 "line": 46 1633 "line": 45
1634 } 1634 }
1635 }, 1635 },
1636 { 1636 {
1637 "defaultMessage": "!!Invoices", 1637 "defaultMessage": "!!Invoices",
1638 "end": { 1638 "end": {
1639 "column": 3, 1639 "column": 3,
1640 "line": 53 1640 "line": 52
1641 }, 1641 },
1642 "file": "src/components/settings/account/AccountDashboard.js", 1642 "file": "src/components/settings/account/AccountDashboard.js",
1643 "id": "settings.account.headlineInvoices", 1643 "id": "settings.account.headlineInvoices",
1644 "start": { 1644 "start": {
1645 "column": 18, 1645 "column": 18,
1646 "line": 50 1646 "line": 49
1647 } 1647 }
1648 }, 1648 },
1649 { 1649 {
1650 "defaultMessage": "!!!Download", 1650 "defaultMessage": "!!!Download",
1651 "end": { 1651 "end": {
1652 "column": 3, 1652 "column": 3,
1653 "line": 57 1653 "line": 56
1654 }, 1654 },
1655 "file": "src/components/settings/account/AccountDashboard.js", 1655 "file": "src/components/settings/account/AccountDashboard.js",
1656 "id": "settings.account.invoiceDownload", 1656 "id": "settings.account.invoiceDownload",
1657 "start": { 1657 "start": {
1658 "column": 19, 1658 "column": 19,
1659 "line": 54 1659 "line": 53
1660 } 1660 }
1661 }, 1661 },
1662 { 1662 {
1663 "defaultMessage": "!!!Could not load user information", 1663 "defaultMessage": "!!!Could not load user information",
1664 "end": { 1664 "end": {
1665 "column": 3, 1665 "column": 3,
1666 "line": 61 1666 "line": 60
1667 }, 1667 },
1668 "file": "src/components/settings/account/AccountDashboard.js", 1668 "file": "src/components/settings/account/AccountDashboard.js",
1669 "id": "settings.account.userInfoRequestFailed", 1669 "id": "settings.account.userInfoRequestFailed",
1670 "start": { 1670 "start": {
1671 "column": 25, 1671 "column": 25,
1672 "line": 58 1672 "line": 57
1673 } 1673 }
1674 }, 1674 },
1675 { 1675 {
1676 "defaultMessage": "!!!Try again", 1676 "defaultMessage": "!!!Try again",
1677 "end": { 1677 "end": {
1678 "column": 3, 1678 "column": 3,
1679 "line": 65 1679 "line": 64
1680 }, 1680 },
1681 "file": "src/components/settings/account/AccountDashboard.js", 1681 "file": "src/components/settings/account/AccountDashboard.js",
1682 "id": "settings.account.tryReloadUserInfoRequest", 1682 "id": "settings.account.tryReloadUserInfoRequest",
1683 "start": { 1683 "start": {
1684 "column": 28, 1684 "column": 28,
1685 "line": 62 1685 "line": 61
1686 } 1686 }
1687 }, 1687 },
1688 { 1688 {
1689 "defaultMessage": "!!!Delete account", 1689 "defaultMessage": "!!!Delete account",
1690 "end": { 1690 "end": {
1691 "column": 3, 1691 "column": 3,
1692 "line": 69 1692 "line": 68
1693 }, 1693 },
1694 "file": "src/components/settings/account/AccountDashboard.js", 1694 "file": "src/components/settings/account/AccountDashboard.js",
1695 "id": "settings.account.deleteAccount", 1695 "id": "settings.account.deleteAccount",
1696 "start": { 1696 "start": {
1697 "column": 17, 1697 "column": 17,
1698 "line": 66 1698 "line": 65
1699 } 1699 }
1700 }, 1700 },
1701 { 1701 {
@@ -1708,14 +1708,14 @@
1708 "id": "settings.account.deleteInfo", 1708 "id": "settings.account.deleteInfo",
1709 "start": { 1709 "start": {
1710 "column": 14, 1710 "column": 14,
1711 "line": 70 1711 "line": 69
1712 } 1712 }
1713 }, 1713 },
1714 { 1714 {
1715 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 1715 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
1716 "end": { 1716 "end": {
1717 "column": 3, 1717 "column": 3,
1718 "line": 77 1718 "line": 78
1719 }, 1719 },
1720 "file": "src/components/settings/account/AccountDashboard.js", 1720 "file": "src/components/settings/account/AccountDashboard.js",
1721 "id": "settings.account.deleteEmailSent", 1721 "id": "settings.account.deleteEmailSent",
@@ -1728,52 +1728,78 @@
1728 "defaultMessage": "!!!Free Trial", 1728 "defaultMessage": "!!!Free Trial",
1729 "end": { 1729 "end": {
1730 "column": 3, 1730 "column": 3,
1731 "line": 81 1731 "line": 82
1732 }, 1732 },
1733 "file": "src/components/settings/account/AccountDashboard.js", 1733 "file": "src/components/settings/account/AccountDashboard.js",
1734 "id": "settings.account.trial", 1734 "id": "settings.account.trial",
1735 "start": { 1735 "start": {
1736 "column": 9, 1736 "column": 9,
1737 "line": 78 1737 "line": 79
1738 } 1738 }
1739 }, 1739 },
1740 { 1740 {
1741 "defaultMessage": "!!!Your Franz License:", 1741 "defaultMessage": "!!!Your Franz License:",
1742 "end": { 1742 "end": {
1743 "column": 3, 1743 "column": 3,
1744 "line": 85 1744 "line": 86
1745 }, 1745 },
1746 "file": "src/components/settings/account/AccountDashboard.js", 1746 "file": "src/components/settings/account/AccountDashboard.js",
1747 "id": "settings.account.yourLicense", 1747 "id": "settings.account.yourLicense",
1748 "start": { 1748 "start": {
1749 "column": 15, 1749 "column": 15,
1750 "line": 82 1750 "line": 83
1751 } 1751 }
1752 }, 1752 },
1753 { 1753 {
1754 "defaultMessage": "!!!Your free trial ends in {duration}.", 1754 "defaultMessage": "!!!Your free trial ends in {duration}.",
1755 "end": { 1755 "end": {
1756 "column": 3, 1756 "column": 3,
1757 "line": 89 1757 "line": 90
1758 }, 1758 },
1759 "file": "src/components/settings/account/AccountDashboard.js", 1759 "file": "src/components/settings/account/AccountDashboard.js",
1760 "id": "settings.account.trialEndsIn", 1760 "id": "settings.account.trialEndsIn",
1761 "start": { 1761 "start": {
1762 "column": 15, 1762 "column": 15,
1763 "line": 86 1763 "line": 87
1764 } 1764 }
1765 }, 1765 },
1766 { 1766 {
1767 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.", 1767 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
1768 "end": { 1768 "end": {
1769 "column": 3, 1769 "column": 3,
1770 "line": 93 1770 "line": 95
1771 }, 1771 },
1772 "file": "src/components/settings/account/AccountDashboard.js", 1772 "file": "src/components/settings/account/AccountDashboard.js",
1773 "id": "settings.account.trialUpdateBillingInfo", 1773 "id": "settings.account.trialUpdateBillingInfo",
1774 "start": { 1774 "start": {
1775 "column": 33, 1775 "column": 33,
1776 "line": 90 1776 "line": 91
1777 }
1778 },
1779 {
1780 "defaultMessage": "Account is unavailable",
1781 "end": {
1782 "column": 3,
1783 "line": 99
1784 },
1785 "file": "src/components/settings/account/AccountDashboard.js",
1786 "id": "settings.account.accountUnavailable",
1787 "start": {
1788 "column": 22,
1789 "line": 96
1790 }
1791 },
1792 {
1793 "defaultMessage": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
1794 "end": {
1795 "column": 3,
1796 "line": 103
1797 },
1798 "file": "src/components/settings/account/AccountDashboard.js",
1799 "id": "settings.account.accountUnavailableInfo",
1800 "start": {
1801 "column": 26,
1802 "line": 100
1777 } 1803 }
1778 } 1804 }
1779 ], 1805 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index e586cb852..ee85566bb 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -224,6 +224,8 @@
224 "settings.account.account.editButton": "Edit account", 224 "settings.account.account.editButton": "Edit account",
225 "settings.account.accountType.basic": "Basic Account", 225 "settings.account.accountType.basic": "Basic Account",
226 "settings.account.accountType.premium": "Premium Supporter Account", 226 "settings.account.accountType.premium": "Premium Supporter Account",
227 "settings.account.accountUnavailable": "Account is unavailable",
228 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
227 "settings.account.buttonSave": "Update profile", 229 "settings.account.buttonSave": "Update profile",
228 "settings.account.deleteAccount": "Delete account", 230 "settings.account.deleteAccount": "Delete account",
229 "settings.account.deleteEmailSent": "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 231 "settings.account.deleteEmailSent": "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
diff --git a/src/i18n/messages/src/components/settings/account/AccountDashboard.json b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
index 48078c18d..f0bb087d6 100644
--- a/src/i18n/messages/src/components/settings/account/AccountDashboard.json
+++ b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Account", 4 "defaultMessage": "!!!Account",
5 "file": "src/components/settings/account/AccountDashboard.js", 5 "file": "src/components/settings/account/AccountDashboard.js",
6 "start": { 6 "start": {
7 "line": 18, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 21, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Your Subscription", 17 "defaultMessage": "!!!Your Subscription",
18 "file": "src/components/settings/account/AccountDashboard.js", 18 "file": "src/components/settings/account/AccountDashboard.js",
19 "start": { 19 "start": {
20 "line": 22, 20 "line": 21,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 25, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!Danger Zone", 30 "defaultMessage": "!!Danger Zone",
31 "file": "src/components/settings/account/AccountDashboard.js", 31 "file": "src/components/settings/account/AccountDashboard.js",
32 "start": { 32 "start": {
33 "line": 26, 33 "line": 25,
34 "column": 22 34 "column": 22
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 29, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Manage your subscription", 43 "defaultMessage": "!!!Manage your subscription",
44 "file": "src/components/settings/account/AccountDashboard.js", 44 "file": "src/components/settings/account/AccountDashboard.js",
45 "start": { 45 "start": {
46 "line": 30, 46 "line": 29,
47 "column": 33 47 "column": 33
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 33, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Upgrade to Franz Professional", 56 "defaultMessage": "!!!Upgrade to Franz Professional",
57 "file": "src/components/settings/account/AccountDashboard.js", 57 "file": "src/components/settings/account/AccountDashboard.js",
58 "start": { 58 "start": {
59 "line": 34, 59 "line": 33,
60 "column": 23 60 "column": 23
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 37, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Basic Account", 69 "defaultMessage": "!!!Basic Account",
70 "file": "src/components/settings/account/AccountDashboard.js", 70 "file": "src/components/settings/account/AccountDashboard.js",
71 "start": { 71 "start": {
72 "line": 38, 72 "line": 37,
73 "column": 20 73 "column": 20
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 41, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Premium Supporter Account", 82 "defaultMessage": "!!!Premium Supporter Account",
83 "file": "src/components/settings/account/AccountDashboard.js", 83 "file": "src/components/settings/account/AccountDashboard.js",
84 "start": { 84 "start": {
85 "line": 42, 85 "line": 41,
86 "column": 22 86 "column": 22
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 45, 89 "line": 44,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Edit Account", 95 "defaultMessage": "!!!Edit Account",
96 "file": "src/components/settings/account/AccountDashboard.js", 96 "file": "src/components/settings/account/AccountDashboard.js",
97 "start": { 97 "start": {
98 "line": 46, 98 "line": 45,
99 "column": 21 99 "column": 21
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 49, 102 "line": 48,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!Invoices", 108 "defaultMessage": "!!Invoices",
109 "file": "src/components/settings/account/AccountDashboard.js", 109 "file": "src/components/settings/account/AccountDashboard.js",
110 "start": { 110 "start": {
111 "line": 50, 111 "line": 49,
112 "column": 18 112 "column": 18
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 53, 115 "line": 52,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Download", 121 "defaultMessage": "!!!Download",
122 "file": "src/components/settings/account/AccountDashboard.js", 122 "file": "src/components/settings/account/AccountDashboard.js",
123 "start": { 123 "start": {
124 "line": 54, 124 "line": 53,
125 "column": 19 125 "column": 19
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 57, 128 "line": 56,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Could not load user information", 134 "defaultMessage": "!!!Could not load user information",
135 "file": "src/components/settings/account/AccountDashboard.js", 135 "file": "src/components/settings/account/AccountDashboard.js",
136 "start": { 136 "start": {
137 "line": 58, 137 "line": 57,
138 "column": 25 138 "column": 25
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 61, 141 "line": 60,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Try again", 147 "defaultMessage": "!!!Try again",
148 "file": "src/components/settings/account/AccountDashboard.js", 148 "file": "src/components/settings/account/AccountDashboard.js",
149 "start": { 149 "start": {
150 "line": 62, 150 "line": 61,
151 "column": 28 151 "column": 28
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 65, 154 "line": 64,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Delete account", 160 "defaultMessage": "!!!Delete account",
161 "file": "src/components/settings/account/AccountDashboard.js", 161 "file": "src/components/settings/account/AccountDashboard.js",
162 "start": { 162 "start": {
163 "line": 66, 163 "line": 65,
164 "column": 17 164 "column": 17
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 69, 167 "line": 68,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,7 +173,7 @@
173 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 173 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
174 "file": "src/components/settings/account/AccountDashboard.js", 174 "file": "src/components/settings/account/AccountDashboard.js",
175 "start": { 175 "start": {
176 "line": 70, 176 "line": 69,
177 "column": 14 177 "column": 14
178 }, 178 },
179 "end": { 179 "end": {
@@ -190,7 +190,7 @@
190 "column": 19 190 "column": 19
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 77, 193 "line": 78,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Free Trial", 199 "defaultMessage": "!!!Free Trial",
200 "file": "src/components/settings/account/AccountDashboard.js", 200 "file": "src/components/settings/account/AccountDashboard.js",
201 "start": { 201 "start": {
202 "line": 78, 202 "line": 79,
203 "column": 9 203 "column": 9
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 81, 206 "line": 82,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Your Franz License:", 212 "defaultMessage": "!!!Your Franz License:",
213 "file": "src/components/settings/account/AccountDashboard.js", 213 "file": "src/components/settings/account/AccountDashboard.js",
214 "start": { 214 "start": {
215 "line": 82, 215 "line": 83,
216 "column": 15 216 "column": 15
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 85, 219 "line": 86,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Your free trial ends in {duration}.", 225 "defaultMessage": "!!!Your free trial ends in {duration}.",
226 "file": "src/components/settings/account/AccountDashboard.js", 226 "file": "src/components/settings/account/AccountDashboard.js",
227 "start": { 227 "start": {
228 "line": 86, 228 "line": 87,
229 "column": 15 229 "column": 15
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 89, 232 "line": 90,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,37 @@
238 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.", 238 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
239 "file": "src/components/settings/account/AccountDashboard.js", 239 "file": "src/components/settings/account/AccountDashboard.js",
240 "start": { 240 "start": {
241 "line": 90, 241 "line": 91,
242 "column": 33 242 "column": 33
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 93, 245 "line": 95,
246 "column": 3
247 }
248 },
249 {
250 "id": "settings.account.accountUnavailable",
251 "defaultMessage": "Account is unavailable",
252 "file": "src/components/settings/account/AccountDashboard.js",
253 "start": {
254 "line": 96,
255 "column": 22
256 },
257 "end": {
258 "line": 99,
259 "column": 3
260 }
261 },
262 {
263 "id": "settings.account.accountUnavailableInfo",
264 "defaultMessage": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
265 "file": "src/components/settings/account/AccountDashboard.js",
266 "start": {
267 "line": 100,
268 "column": 26
269 },
270 "end": {
271 "line": 103,
246 "column": 3 272 "column": 3
247 } 273 }
248 } 274 }