144 lines
3.9 KiB
TypeScript
144 lines
3.9 KiB
TypeScript
|
import { isLoggedIn } from 'soapbox/utils/auth';
|
||
|
|
||
|
import api from '../api';
|
||
|
|
||
|
import type { AxiosError } from 'axios';
|
||
|
import type { History } from 'history';
|
||
|
import type { AppDispatch, RootState } from 'soapbox/store';
|
||
|
import type { APIEntity } from 'soapbox/types/entities';
|
||
|
|
||
|
const GROUP_CREATE_REQUEST = 'GROUP_CREATE_REQUEST';
|
||
|
const GROUP_CREATE_SUCCESS = 'GROUP_CREATE_SUCCESS';
|
||
|
const GROUP_CREATE_FAIL = 'GROUP_CREATE_FAIL';
|
||
|
|
||
|
const GROUP_UPDATE_REQUEST = 'GROUP_UPDATE_REQUEST';
|
||
|
const GROUP_UPDATE_SUCCESS = 'GROUP_UPDATE_SUCCESS';
|
||
|
const GROUP_UPDATE_FAIL = 'GROUP_UPDATE_FAIL';
|
||
|
|
||
|
const GROUP_EDITOR_VALUE_CHANGE = 'GROUP_EDITOR_VALUE_CHANGE';
|
||
|
const GROUP_EDITOR_RESET = 'GROUP_EDITOR_RESET';
|
||
|
const GROUP_EDITOR_SETUP = 'GROUP_EDITOR_SETUP';
|
||
|
|
||
|
const submit = (routerHistory: History) =>
|
||
|
(dispatch: AppDispatch, getState: () => RootState) => {
|
||
|
const groupId = getState().group_editor.get('groupId') as string;
|
||
|
const title = getState().group_editor.get('title') as string;
|
||
|
const description = getState().group_editor.get('description') as string;
|
||
|
const coverImage = getState().group_editor.get('coverImage') as any;
|
||
|
|
||
|
if (groupId === null) {
|
||
|
dispatch(create(title, description, coverImage, routerHistory));
|
||
|
} else {
|
||
|
dispatch(update(groupId, title, description, coverImage, routerHistory));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const create = (title: string, description: string, coverImage: File, routerHistory: History) =>
|
||
|
(dispatch: AppDispatch, getState: () => RootState) => {
|
||
|
if (!isLoggedIn(getState)) return;
|
||
|
|
||
|
dispatch(createRequest());
|
||
|
|
||
|
const formData = new FormData();
|
||
|
formData.append('title', title);
|
||
|
formData.append('description', description);
|
||
|
|
||
|
if (coverImage !== null) {
|
||
|
formData.append('cover_image', coverImage);
|
||
|
}
|
||
|
|
||
|
api(getState).post('/api/v1/groups', formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then(({ data }) => {
|
||
|
dispatch(createSuccess(data));
|
||
|
routerHistory.push(`/groups/${data.id}`);
|
||
|
}).catch(err => dispatch(createFail(err)));
|
||
|
};
|
||
|
|
||
|
const createRequest = (id?: string) => ({
|
||
|
type: GROUP_CREATE_REQUEST,
|
||
|
id,
|
||
|
});
|
||
|
|
||
|
const createSuccess = (group: APIEntity) => ({
|
||
|
type: GROUP_CREATE_SUCCESS,
|
||
|
group,
|
||
|
});
|
||
|
|
||
|
const createFail = (error: AxiosError) => ({
|
||
|
type: GROUP_CREATE_FAIL,
|
||
|
error,
|
||
|
});
|
||
|
|
||
|
const update = (groupId: string, title: string, description: string, coverImage: File, routerHistory: History) =>
|
||
|
(dispatch: AppDispatch, getState: () => RootState) => {
|
||
|
if (!isLoggedIn(getState)) return;
|
||
|
|
||
|
dispatch(updateRequest(groupId));
|
||
|
|
||
|
const formData = new FormData();
|
||
|
formData.append('title', title);
|
||
|
formData.append('description', description);
|
||
|
|
||
|
if (coverImage !== null) {
|
||
|
formData.append('cover_image', coverImage);
|
||
|
}
|
||
|
|
||
|
api(getState).put(`/api/v1/groups/${groupId}`, formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then(({ data }) => {
|
||
|
dispatch(updateSuccess(data));
|
||
|
routerHistory.push(`/groups/${data.id}`);
|
||
|
}).catch(err => dispatch(updateFail(err)));
|
||
|
};
|
||
|
|
||
|
const updateRequest = (id: string) => ({
|
||
|
type: GROUP_UPDATE_REQUEST,
|
||
|
id,
|
||
|
});
|
||
|
|
||
|
const updateSuccess = (group: APIEntity) => ({
|
||
|
type: GROUP_UPDATE_SUCCESS,
|
||
|
group,
|
||
|
});
|
||
|
|
||
|
const updateFail = (error: AxiosError) => ({
|
||
|
type: GROUP_UPDATE_FAIL,
|
||
|
error,
|
||
|
});
|
||
|
|
||
|
const changeValue = (field: string, value: string | File) => ({
|
||
|
type: GROUP_EDITOR_VALUE_CHANGE,
|
||
|
field,
|
||
|
value,
|
||
|
});
|
||
|
|
||
|
const reset = () => ({
|
||
|
type: GROUP_EDITOR_RESET,
|
||
|
});
|
||
|
|
||
|
const setUp = (group: string) => ({
|
||
|
type: GROUP_EDITOR_SETUP,
|
||
|
group,
|
||
|
});
|
||
|
|
||
|
export {
|
||
|
GROUP_CREATE_REQUEST,
|
||
|
GROUP_CREATE_SUCCESS,
|
||
|
GROUP_CREATE_FAIL,
|
||
|
GROUP_UPDATE_REQUEST,
|
||
|
GROUP_UPDATE_SUCCESS,
|
||
|
GROUP_UPDATE_FAIL,
|
||
|
GROUP_EDITOR_VALUE_CHANGE,
|
||
|
GROUP_EDITOR_RESET,
|
||
|
GROUP_EDITOR_SETUP,
|
||
|
submit,
|
||
|
create,
|
||
|
createRequest,
|
||
|
createSuccess,
|
||
|
createFail,
|
||
|
update,
|
||
|
updateRequest,
|
||
|
updateSuccess,
|
||
|
updateFail,
|
||
|
changeValue,
|
||
|
reset,
|
||
|
setUp,
|
||
|
};
|