aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/settings
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/settings')
-rw-r--r--src/components/settings/account/AccountDashboard.js49
-rw-r--r--src/components/settings/services/EditServiceForm.js77
-rw-r--r--src/components/settings/settings/EditSettingsForm.js6
3 files changed, 107 insertions, 25 deletions
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 75dbdef49..89fa07800 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -28,6 +28,10 @@ const messages = defineMessages({
28 id: 'settings.account.headlineInvoices', 28 id: 'settings.account.headlineInvoices',
29 defaultMessage: '!!Invoices', 29 defaultMessage: '!!Invoices',
30 }, 30 },
31 headlineDangerZone: {
32 id: 'settings.account.headlineDangerZone',
33 defaultMessage: '!!Danger Zone',
34 },
31 manageSubscriptionButtonLabel: { 35 manageSubscriptionButtonLabel: {
32 id: 'settings.account.manageSubscription.label', 36 id: 'settings.account.manageSubscription.label',
33 defaultMessage: '!!!Manage your subscription', 37 defaultMessage: '!!!Manage your subscription',
@@ -72,6 +76,18 @@ const messages = defineMessages({
72 id: 'settings.account.mining.cancel', 76 id: 'settings.account.mining.cancel',
73 defaultMessage: '!!!Cancel mining', 77 defaultMessage: '!!!Cancel mining',
74 }, 78 },
79 deleteAccount: {
80 id: 'settings.account.deleteAccount',
81 defaultMessage: '!!!Delete account',
82 },
83 deleteInfo: {
84 id: 'settings.account.deleteInfo',
85 defaultMessage: '!!!If you don\'t need your Franz account any longer, you can delete your account and all related data here.',
86 },
87 deleteEmailSent: {
88 id: 'settings.account.deleteEmailSent',
89 defaultMessage: '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!',
90 },
75}); 91});
76 92
77@observer 93@observer
@@ -90,6 +106,9 @@ export default class AccountDashboard extends Component {
90 openExternalUrl: PropTypes.func.isRequired, 106 openExternalUrl: PropTypes.func.isRequired,
91 onCloseSubscriptionWindow: PropTypes.func.isRequired, 107 onCloseSubscriptionWindow: PropTypes.func.isRequired,
92 stopMiner: PropTypes.func.isRequired, 108 stopMiner: PropTypes.func.isRequired,
109 deleteAccount: PropTypes.func.isRequired,
110 isLoadingDeleteAccount: PropTypes.bool.isRequired,
111 isDeleteAccountSuccessful: PropTypes.bool.isRequired,
93 }; 112 };
94 113
95 static contextTypes = { 114 static contextTypes = {
@@ -111,6 +130,9 @@ export default class AccountDashboard extends Component {
111 retryUserInfoRequest, 130 retryUserInfoRequest,
112 onCloseSubscriptionWindow, 131 onCloseSubscriptionWindow,
113 stopMiner, 132 stopMiner,
133 deleteAccount,
134 isLoadingDeleteAccount,
135 isDeleteAccountSuccessful,
114 } = this.props; 136 } = this.props;
115 const { intl } = this.context; 137 const { intl } = this.context;
116 138
@@ -201,7 +223,7 @@ export default class AccountDashboard extends Component {
201 /> 223 />
202 </div> 224 </div>
203 </div> 225 </div>
204 <div className="account__box account__box--last"> 226 <div className="account__box">
205 <h2>{intl.formatMessage(messages.headlineInvoices)}</h2> 227 <h2>{intl.formatMessage(messages.headlineInvoices)}</h2>
206 <table className="invoices"> 228 <table className="invoices">
207 <tbody> 229 <tbody>
@@ -230,7 +252,7 @@ export default class AccountDashboard extends Component {
230 252
231 {user.isMiner && ( 253 {user.isMiner && (
232 <div className="account franz-form"> 254 <div className="account franz-form">
233 <div className="account__box"> 255 <div className="account__box account__box--last">
234 <h2>{intl.formatMessage(messages.headlineSubscription)}</h2> 256 <h2>{intl.formatMessage(messages.headlineSubscription)}</h2>
235 <div className="account__subscription"> 257 <div className="account__subscription">
236 <div> 258 <div>
@@ -267,7 +289,7 @@ export default class AccountDashboard extends Component {
267 <Loader /> 289 <Loader />
268 ) : ( 290 ) : (
269 <div className="account franz-form"> 291 <div className="account franz-form">
270 <div className="account__box account__box--last"> 292 <div className="account__box">
271 <h2>{intl.formatMessage(messages.headlineUpgrade)}</h2> 293 <h2>{intl.formatMessage(messages.headlineUpgrade)}</h2>
272 <SubscriptionForm 294 <SubscriptionForm
273 onCloseWindow={onCloseSubscriptionWindow} 295 onCloseWindow={onCloseSubscriptionWindow}
@@ -276,8 +298,29 @@ export default class AccountDashboard extends Component {
276 </div> 298 </div>
277 ) 299 )
278 )} 300 )}
301
302 <div className="account franz-form">
303 <div className="account__box">
304 <h2>{intl.formatMessage(messages.headlineDangerZone)}</h2>
305 {!isDeleteAccountSuccessful && (
306 <div className="account__subscription">
307 <p>{intl.formatMessage(messages.deleteInfo)}</p>
308 <Button
309 label={intl.formatMessage(messages.deleteAccount)}
310 buttonType="danger"
311 onClick={() => deleteAccount()}
312 loaded={!isLoadingDeleteAccount}
313 />
314 </div>
315 )}
316 {isDeleteAccountSuccessful && (
317 <p>{intl.formatMessage(messages.deleteEmailSent)}</p>
318 )}
319 </div>
320 </div>
279 </div> 321 </div>
280 )} 322 )}
323
281 </div> 324 </div>
282 <ReactTooltip place="right" type="dark" effect="solid" /> 325 <ReactTooltip place="right" type="dark" effect="solid" />
283 </div> 326 </div>
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index 36cefe87c..4458c4c5a 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -47,6 +47,10 @@ const messages = defineMessages({
47 id: 'settings.service.form.tabOnPremise', 47 id: 'settings.service.form.tabOnPremise',
48 defaultMessage: '!!!Self hosted ⭐️', 48 defaultMessage: '!!!Self hosted ⭐️',
49 }, 49 },
50 useHostedService: {
51 id: 'settings.service.form.useHostedService',
52 defaultMessage: '!!!Use the hosted {name} service.',
53 },
50 customUrlValidationError: { 54 customUrlValidationError: {
51 id: 'settings.service.form.customUrlValidationError', 55 id: 'settings.service.form.customUrlValidationError',
52 defaultMessage: '!!!Could not validate custom {name} server.', 56 defaultMessage: '!!!Could not validate custom {name} server.',
@@ -67,6 +71,18 @@ const messages = defineMessages({
67 id: 'settings.service.form.isMutedInfo', 71 id: 'settings.service.form.isMutedInfo',
68 defaultMessage: '!!!When disabled, all notification sounds and audio playback are muted', 72 defaultMessage: '!!!When disabled, all notification sounds and audio playback are muted',
69 }, 73 },
74 headlineNotifications: {
75 id: 'settings.service.form.headlineNotifications',
76 defaultMessage: '!!!Notifications',
77 },
78 headlineBadges: {
79 id: 'settings.service.form.headlineBadges',
80 defaultMessage: '!!!Unread message dadges',
81 },
82 headlineGeneral: {
83 id: 'settings.service.form.headlineGeneral',
84 defaultMessage: '!!!General',
85 },
70}); 86});
71 87
72@observer 88@observer
@@ -108,7 +124,6 @@ export default class EditServiceForm extends Component {
108 this.props.form.submit({ 124 this.props.form.submit({
109 onSuccess: async (form) => { 125 onSuccess: async (form) => {
110 const values = form.values(); 126 const values = form.values();
111
112 let isValid = true; 127 let isValid = true;
113 128
114 if (recipe.validateUrl && values.customUrl) { 129 if (recipe.validateUrl && values.customUrl) {
@@ -166,6 +181,13 @@ export default class EditServiceForm extends Component {
166 /> 181 />
167 ); 182 );
168 183
184 let activeTabIndex = 0;
185 if (recipe.hasHostedOption && service.team) {
186 activeTabIndex = 1;
187 } else if (recipe.hasHostedOption && service.customUrl) {
188 activeTabIndex = 2;
189 }
190
169 return ( 191 return (
170 <div className="settings__main"> 192 <div className="settings__main">
171 <div className="settings__header"> 193 <div className="settings__header">
@@ -198,11 +220,20 @@ export default class EditServiceForm extends Component {
198 <Input field={form.$('name')} focus /> 220 <Input field={form.$('name')} focus />
199 {(recipe.hasTeamId || recipe.hasCustomUrl) && ( 221 {(recipe.hasTeamId || recipe.hasCustomUrl) && (
200 <Tabs 222 <Tabs
201 active={service.customUrl ? 1 : 0} 223 active={activeTabIndex}
202 > 224 >
225 {recipe.hasHostedOption && (
226 <TabItem title={recipe.name}>
227 {intl.formatMessage(messages.useHostedService, { name: recipe.name })}
228 </TabItem>
229 )}
203 {recipe.hasTeamId && ( 230 {recipe.hasTeamId && (
204 <TabItem title={intl.formatMessage(messages.tabHosted)}> 231 <TabItem title={intl.formatMessage(messages.tabHosted)}>
205 <Input field={form.$('team')} suffix={recipe.urlInputSuffix} /> 232 <Input
233 field={form.$('team')}
234 prefix={recipe.urlInputPrefix}
235 suffix={recipe.urlInputSuffix}
236 />
206 </TabItem> 237 </TabItem>
207 )} 238 )}
208 {recipe.hasCustomUrl && ( 239 {recipe.hasCustomUrl && (
@@ -231,20 +262,32 @@ export default class EditServiceForm extends Component {
231 </Tabs> 262 </Tabs>
232 )} 263 )}
233 <div className="settings__options"> 264 <div className="settings__options">
234 <Toggle field={form.$('isNotificationEnabled')} /> 265 <div className="settings__settings-group">
235 {recipe.hasIndirectMessages && ( 266 <h3>{intl.formatMessage(messages.headlineNotifications)}</h3>
236 <div> 267 <Toggle field={form.$('isNotificationEnabled')} />
237 <Toggle field={form.$('isIndirectMessageBadgeEnabled')} /> 268 <Toggle field={form.$('isMuted')} />
238 <p className="settings__help"> 269 <p className="settings__help">
239 {intl.formatMessage(messages.indirectMessageInfo)} 270 {intl.formatMessage(messages.isMutedInfo)}
240 </p> 271 </p>
241 </div> 272 </div>
242 )} 273
243 <Toggle field={form.$('isMuted')} /> 274 <div className="settings__settings-group">
244 <p className="settings__help"> 275 <h3>{intl.formatMessage(messages.headlineBadges)}</h3>
245 {intl.formatMessage(messages.isMutedInfo)} 276 <Toggle field={form.$('isBadgeEnabled')} />
246 </p> 277 {recipe.hasIndirectMessages && form.$('isBadgeEnabled').value && (
247 <Toggle field={form.$('isEnabled')} /> 278 <div>
279 <Toggle field={form.$('isIndirectMessageBadgeEnabled')} />
280 <p className="settings__help">
281 {intl.formatMessage(messages.indirectMessageInfo)}
282 </p>
283 </div>
284 )}
285 </div>
286
287 <div className="settings__settings-group">
288 <h3>{intl.formatMessage(messages.headlineGeneral)}</h3>
289 <Toggle field={form.$('isEnabled')} />
290 </div>
248 </div> 291 </div>
249 {recipe.message && ( 292 {recipe.message && (
250 <p className="settings__message"> 293 <p className="settings__message">
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 4ce9b7ab2..ff398aa33 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -64,10 +64,6 @@ const messages = defineMessages({
64 id: 'settings.app.currentVersion', 64 id: 'settings.app.currentVersion',
65 defaultMessage: '!!!Current version:', 65 defaultMessage: '!!!Current version:',
66 }, 66 },
67 restartRequired: {
68 id: 'settings.app.restartRequired',
69 defaultMessage: '!!!Changes require restart',
70 },
71}); 67});
72 68
73@observer 69@observer
@@ -142,6 +138,7 @@ export default class EditSettingsForm extends Component {
142 {/* Appearance */} 138 {/* Appearance */}
143 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2> 139 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2>
144 <Toggle field={form.$('showDisabledServices')} /> 140 <Toggle field={form.$('showDisabledServices')} />
141 <Toggle field={form.$('showMessageBadgeWhenMuted')} />
145 142
146 {/* Language */} 143 {/* Language */}
147 <h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2> 144 <h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2>
@@ -157,7 +154,6 @@ export default class EditSettingsForm extends Component {
157 {/* Advanced */} 154 {/* Advanced */}
158 <h2 id="advanced">{intl.formatMessage(messages.headlineAdvanced)}</h2> 155 <h2 id="advanced">{intl.formatMessage(messages.headlineAdvanced)}</h2>
159 <Toggle field={form.$('enableSpellchecking')} /> 156 <Toggle field={form.$('enableSpellchecking')} />
160 <p className="settings__help">{intl.formatMessage(messages.restartRequired)}</p>
161 {/* <Select field={form.$('spellcheckingLanguage')} /> */} 157 {/* <Select field={form.$('spellcheckingLanguage')} /> */}
162 158
163 {/* Updates */} 159 {/* Updates */}