Skip to content

Commit 97139d3

Browse files
committed
Move form submission functions back to actions
1 parent 9c6f5bb commit 97139d3

File tree

8 files changed

+123
-137
lines changed

8 files changed

+123
-137
lines changed

client/modules/IDE/actions/files.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import apiClient from '../../../utils/apiClient';
44
import * as ActionTypes from '../../../constants';
55
import { setUnsavedChanges, closeNewFolderModal, closeNewFileModal } from './ide';
66
import { setProjectSavedTime } from './project';
7+
import { createError } from './ide';
78

89

910
function appendToFilename(filename, string) {
@@ -72,6 +73,29 @@ export function submitFile(formProps, files, parentId, projectId) {
7273
});
7374
}
7475

76+
export function handleCreateFile(formProps) {
77+
return (dispatch, getState) => {
78+
const state = getState();
79+
const { files } = state;
80+
const { parentId } = state.ide;
81+
const projectId = state.project.id;
82+
return new Promise((resolve, reject) => {
83+
submitFile(formProps, files, parentId, projectId).then((response) => {
84+
const { file, updatedAt } = response;
85+
dispatch(createFile(file, parentId));
86+
if (updatedAt) dispatch(setProjectSavedTime(updatedAt));
87+
dispatch(closeNewFileModal());
88+
dispatch(setUnsavedChanges(true));
89+
resolve();
90+
}).catch((error) => {
91+
const { response } = error;
92+
dispatch(createError(response.data));
93+
reject();
94+
});
95+
});
96+
};
97+
}
98+
7599
export function submitFolder(formProps, files, parentId, projectId) {
76100
if (projectId) {
77101
const postParams = {
@@ -103,6 +127,29 @@ export function submitFolder(formProps, files, parentId, projectId) {
103127
});
104128
}
105129

130+
export function handleCreateFolder(formProps) {
131+
return (dispatch, getState) => {
132+
const state = getState();
133+
const { files } = state;
134+
const { parentId } = state.ide;
135+
const projectId = state.project.id;
136+
return new Promise((resolve, reject) => {
137+
submitFolder(formProps, files, parentId, projectId).then((response) => {
138+
const { file, updatedAt } = response;
139+
dispatch(createFile(file, parentId));
140+
if (updatedAt) dispatch(setProjectSavedTime(updatedAt));
141+
dispatch(closeNewFolderModal());
142+
dispatch(setUnsavedChanges(true));
143+
resolve();
144+
}).catch((error) => {
145+
const { response } = error;
146+
dispatch(createError(response.data));
147+
reject();
148+
});
149+
});
150+
};
151+
}
152+
106153
export function updateFileName(id, name) {
107154
return (dispatch) => {
108155
dispatch(setUnsavedChanges(true));

client/modules/IDE/components/NewFileForm.jsx

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,19 @@
11
import React, { useEffect, useRef } from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { Form, Field } from 'react-final-form';
4-
import { useDispatch, useSelector } from 'react-redux';
5-
import { submitFile, createFile } from '../actions/files';
6-
import { setProjectSavedTime } from '../actions/project';
7-
import { closeNewFileModal, setUnsavedChanges, createError } from '../actions/ide';
4+
import { useDispatch } from 'react-redux';
5+
import { handleCreateFile } from '../actions/files';
86
import { CREATE_FILE_REGEX } from '../../../../server/utils/fileUtils';
97

108
import Button from '../../../common/Button';
119

1210
function NewFileForm() {
1311
const fileNameInput = useRef(null);
1412
const { t } = useTranslation();
15-
const files = useSelector(state => state.files);
16-
const parentId = useSelector(state => state.ide.parentId);
17-
const projectId = useSelector(state => state.project.id);
1813
const dispatch = useDispatch();
1914

20-
function handleCreateFile(formProps) {
21-
submitFile(formProps, files, parentId, projectId).then((response) => {
22-
const { file, updatedAt } = response;
23-
dispatch(createFile(file, parentId));
24-
if (updatedAt) dispatch(setProjectSavedTime(updatedAt));
25-
dispatch(closeNewFileModal());
26-
dispatch(setUnsavedChanges(true));
27-
}).catch((error) => {
28-
const { response } = error;
29-
dispatch(createError(response.data));
30-
});
15+
function onSubmit(formProps) {
16+
return dispatch(handleCreateFile(formProps));
3117
}
3218

3319
function validate(formProps) {
@@ -50,7 +36,7 @@ function NewFileForm() {
5036
<Form
5137
fields={['name']}
5238
validate={validate}
53-
onSubmit={handleCreateFile}
39+
onSubmit={onSubmit}
5440
>
5541
{({
5642
handleSubmit, errors, touched, invalid, submitting

client/modules/IDE/components/NewFolderForm.jsx

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import React, { useRef, useEffect } from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { Form, Field } from 'react-final-form';
4-
import { useDispatch, useSelector } from 'react-redux';
4+
import { useDispatch } from 'react-redux';
55
import Button from '../../../common/Button';
6-
import { submitFolder, createFile } from '../actions/files';
7-
import { setProjectSavedTime } from '../actions/project';
8-
import { closeNewFolderModal, setUnsavedChanges } from '../actions/ide';
6+
import { handleCreateFolder } from '../actions/files';
97

108
function NewFolderForm() {
119
const folderNameInput = useRef(null);
@@ -14,9 +12,6 @@ function NewFolderForm() {
1412
});
1513
const { t } = useTranslation();
1614
const dispatch = useDispatch();
17-
const files = useSelector(state => state.files);
18-
const parentId = useSelector(state => state.ide.parentId);
19-
const projectId = useSelector(state => state.project.id);
2015

2116
function validate(formProps) {
2217
const errors = {};
@@ -30,21 +25,15 @@ function NewFolderForm() {
3025
return errors;
3126
}
3227

33-
function handleCreateFolder(formProps) {
34-
submitFolder(formProps, files, parentId, projectId).then((response) => {
35-
const { file, updatedAt } = response;
36-
dispatch(createFile(file, parentId));
37-
if (updatedAt) dispatch(setProjectSavedTime(updatedAt));
38-
dispatch(closeNewFolderModal());
39-
dispatch(setUnsavedChanges(true));
40-
});
28+
function onSubmit(formProps) {
29+
return dispatch(handleCreateFolder(formProps));
4130
}
4231

4332
return (
4433
<Form
4534
fields={['name']}
4635
validate={validate}
47-
onSubmit={handleCreateFolder}
36+
onSubmit={onSubmit}
4837
>
4938
{({
5039
handleSubmit, invalid, submitting, touched, errors

client/modules/User/actions.js

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -48,26 +48,45 @@ export function setPreferences(preferences) {
4848
};
4949
}
5050

51-
export function validateAndLoginUser(previousPath, formProps, dispatch) {
52-
return new Promise((resolve, reject) => {
53-
loginUser(formProps)
54-
.then((response) => {
55-
dispatch({
56-
type: ActionTypes.AUTH_USER,
57-
user: response.data
58-
});
59-
dispatch({
60-
type: ActionTypes.SET_PREFERENCES,
61-
preferences: response.data.preferences
51+
export function validateAndLoginUser(formProps) {
52+
return (dispatch, getState) => {
53+
const state = getState();
54+
const { previousPath } = state.ide;
55+
return new Promise((resolve, reject) => {
56+
loginUser(formProps)
57+
.then((response) => {
58+
dispatch(loginUserSuccess(response.data));
59+
dispatch(setPreferences(response.data.preferences));
60+
dispatch(setLanguage(response.data.preferences.language, { persistPreference: false }));
61+
dispatch(justOpenedProject());
62+
browserHistory.push(previousPath);
63+
resolve();
64+
})
65+
.catch(error =>
66+
reject({ password: error.response.data.message, _error: 'Login failed!' })); // eslint-disable-line
67+
});
68+
};
69+
}
70+
71+
export function validateAndSignUpUser(formValues) {
72+
return (dispatch, getState) => {
73+
const state = getState();
74+
const { previousPath } = state.ide;
75+
return new Promise((resolve, reject) => {
76+
signUpUser(formValues)
77+
.then((response) => {
78+
dispatch(authenticateUser(response.data));
79+
dispatch(justOpenedProject());
80+
browserHistory.push(previousPath);
81+
resolve();
82+
})
83+
.catch((error) => {
84+
const { response } = error;
85+
dispatch(authError(response.data.error));
86+
reject();
6287
});
63-
setLanguage(response.data.preferences.language, { persistPreference: false });
64-
dispatch(justOpenedProject());
65-
browserHistory.push(previousPath);
66-
resolve();
67-
})
68-
.catch(error =>
69-
reject({ password: error.response.data.message, _error: 'Login failed!' })); // eslint-disable-line
70-
});
88+
});
89+
};
7190
}
7291

7392
export function getUser() {
@@ -125,22 +144,21 @@ export function logoutUser() {
125144
}
126145

127146
export function initiateResetPassword(formValues) {
128-
return (dispatch) => {
147+
return dispatch => new Promise((resolve, reject) => {
129148
dispatch({
130149
type: ActionTypes.RESET_PASSWORD_INITIATE
131150
});
132-
apiClient.post('/reset-password', formValues)
133-
.then(() => {
134-
// do nothing
135-
})
151+
return apiClient.post('/reset-password', formValues)
152+
.then(() => resolve())
136153
.catch((error) => {
137154
const { response } = error;
138155
dispatch({
139156
type: ActionTypes.ERROR,
140157
message: response.data
141158
});
159+
reject();
142160
});
143-
};
161+
});
144162
}
145163

146164
export function initiateVerification() {
@@ -228,17 +246,16 @@ export function submitSettings(formValues) {
228246

229247
export function updateSettings(formValues) {
230248
return dispatch =>
231-
apiClient.put('/account', formValues)
232-
.then((response) => {
249+
new Promise((resolve, reject) =>
250+
submitSettings(formValues).then((response) => {
233251
dispatch(updateSettingsSuccess(response.data));
234-
browserHistory.push('/');
235252
dispatch(showToast(5500));
236253
dispatch(setToastText('Toast.SettingsSaved'));
237-
})
238-
.catch((error) => {
254+
resolve();
255+
}).catch((error) => {
239256
const { response } = error;
240-
Promise.reject(new Error(response.data.error));
241-
});
257+
reject(response.data.error);
258+
}));
242259
}
243260

244261
export function createApiKeySuccess(user) {

client/modules/User/components/AccountForm.jsx

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ import React from 'react';
22
import { Form, Field } from 'react-final-form';
33
import { useSelector, useDispatch } from 'react-redux';
44
import { useTranslation } from 'react-i18next';
5-
import { browserHistory } from 'react-router';
65
import Button from '../../../common/Button';
76
import { validateSettings } from '../../../utils/reduxFormUtils';
8-
import { submitSettings, initiateVerification, updateSettingsSuccess } from '../actions';
9-
import { showToast, setToastText } from '../../IDE/actions/toast';
7+
import { updateSettings, initiateVerification } from '../actions';
108
import apiClient from '../../../utils/apiClient';
119

1210
function asyncValidate(fieldToValidate, value) {
@@ -33,34 +31,25 @@ function AccountForm() {
3331
dispatch(initiateVerification());
3432
};
3533

36-
function validateUsername(username, _, meta) {
34+
function validateUsername(username) {
3735
if (username === user.username) return '';
3836
return asyncValidate('username', username);
3937
}
4038

41-
function validateEmail(email, _, meta) {
39+
function validateEmail(email) {
4240
if (email === user.email) return '';
4341
return asyncValidate('email', email);
4442
}
4543

46-
function updateSettings(formValues) {
47-
return submitSettings(formValues).then((response) => {
48-
dispatch(updateSettingsSuccess(response.data));
49-
// browserHistory.push('/');
50-
dispatch(showToast(5500));
51-
dispatch(setToastText('Toast.SettingsSaved'));
52-
})
53-
.catch((error) => {
54-
const { response } = error;
55-
Promise.reject(new Error(response.data.error));
56-
});
44+
function onSubmit(formProps) {
45+
return dispatch(updateSettings(formProps));
5746
}
5847

5948
return (
6049
<Form
6150
fields={['username', 'email', 'currentPassword', 'newPassword']}
6251
validate={validateSettings}
63-
onSubmit={updateSettings}
52+
onSubmit={onSubmit}
6453
>
6554
{({
6655
handleSubmit, submitting, invalid, restart

client/modules/User/components/LoginForm.jsx

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,22 @@ import PropTypes from 'prop-types';
22
import React from 'react';
33
import { withTranslation } from 'react-i18next';
44
import { Form, Field } from 'react-final-form';
5-
import { browserHistory } from 'react-router';
6-
import { useDispatch, useSelector } from 'react-redux';
5+
import { useDispatch } from 'react-redux';
76
import Button from '../../../common/Button';
87
import { validateLogin } from '../../../utils/reduxFormUtils';
9-
import { loginUser, loginUserSuccess, setPreferences } from '../actions';
10-
import { setLanguage } from '../../IDE/actions/preferences';
11-
import { justOpenedProject } from '../../IDE/actions/ide';
8+
import { validateAndLoginUser } from '../actions';
129

1310
function LoginForm(props) {
1411
const dispatch = useDispatch();
15-
const previousPath = useSelector(state => state.ide.previousPath);
16-
function validateAndLoginUser(formProps) {
17-
return new Promise((resolve, reject) => {
18-
loginUser(formProps)
19-
.then((response) => {
20-
dispatch(loginUserSuccess(response.data));
21-
dispatch(setPreferences(response.data.preferences));
22-
dispatch(setLanguage(response.data.preferences.language, { persistPreference: false }));
23-
dispatch(justOpenedProject());
24-
browserHistory.push(previousPath);
25-
resolve();
26-
})
27-
.catch(error =>
28-
reject({ password: error.response.data.message, _error: 'Login failed!' })); // eslint-disable-line
29-
});
12+
function onSubmit(formProps) {
13+
return dispatch(validateAndLoginUser(formProps));
3014
}
3115

3216
return (
3317
<Form
3418
fields={['email', 'password']}
3519
validate={validateLogin}
36-
onSubmit={validateAndLoginUser}
20+
onSubmit={onSubmit}
3721
>
3822
{({
3923
handleSubmit, pristine, submitting, invalid

0 commit comments

Comments
 (0)