127 lines
3.3 KiB
JavaScript
127 lines
3.3 KiB
JavaScript
/*!
|
|
* Copyright (c) 2024 PLANKA Software GmbH
|
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
|
*/
|
|
|
|
import omit from 'lodash/omit';
|
|
import truncate from 'lodash/truncate';
|
|
import { call, put, select } from 'redux-saga/effects';
|
|
import toast from 'react-hot-toast';
|
|
|
|
import request from '../request';
|
|
import selectors from '../../../selectors';
|
|
import actions from '../../../actions';
|
|
import api from '../../../api';
|
|
import { createLocalId } from '../../../utils/local-id';
|
|
import { AttachmentTypes } from '../../../constants/Enums';
|
|
import ToastTypes from '../../../constants/ToastTypes';
|
|
|
|
export function* createAttachment(cardId, data) {
|
|
const localId = yield call(createLocalId);
|
|
const currentUserId = yield select(selectors.selectCurrentUserId);
|
|
|
|
const nextData = {
|
|
...data,
|
|
name: truncate(data.name, {
|
|
length: 128,
|
|
}),
|
|
};
|
|
|
|
yield put(
|
|
actions.createAttachment({
|
|
...omit(nextData, ['file', 'url']),
|
|
cardId,
|
|
id: localId,
|
|
creatorUserId: currentUserId,
|
|
}),
|
|
);
|
|
|
|
let attachment;
|
|
try {
|
|
({ item: attachment } = yield nextData.type === AttachmentTypes.FILE
|
|
? call(request, api.createAttachmentWithFile, cardId, nextData, localId)
|
|
: call(request, api.createAttachment, cardId, nextData));
|
|
} catch (error) {
|
|
yield put(actions.createAttachment.failure(localId, error));
|
|
|
|
if (error.code === 'E_UNPROCESSABLE_ENTITY') {
|
|
let toastType;
|
|
if (error.message.startsWith('Upload limit')) {
|
|
toastType = ToastTypes.FILE_IS_TOO_BIG;
|
|
} else if (error.message === 'Storage limit reached') {
|
|
toastType = ToastTypes.NOT_ENOUGH_STORAGE;
|
|
}
|
|
|
|
if (toastType) {
|
|
yield call(toast, {
|
|
type: toastType,
|
|
});
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
yield put(actions.createAttachment.success(localId, attachment));
|
|
}
|
|
|
|
export function* createAttachmentInCurrentCard(data) {
|
|
const { cardId } = yield select(selectors.selectPath);
|
|
|
|
yield call(createAttachment, cardId, data);
|
|
}
|
|
|
|
export function* handleAttachmentCreate(attachment, requestId) {
|
|
const isExists = yield select(selectors.selectIsAttachmentWithIdExists, requestId);
|
|
|
|
if (!isExists) {
|
|
yield put(actions.handleAttachmentCreate(attachment));
|
|
}
|
|
}
|
|
|
|
export function* updateAttachment(id, data) {
|
|
yield put(actions.updateAttachment(id, data));
|
|
|
|
let attachment;
|
|
try {
|
|
({ item: attachment } = yield call(request, api.updateAttachment, id, data));
|
|
} catch (error) {
|
|
yield put(actions.updateAttachment.failure(id, error));
|
|
return;
|
|
}
|
|
|
|
yield put(actions.updateAttachment.success(attachment));
|
|
}
|
|
|
|
export function* handleAttachmentUpdate(attachment) {
|
|
yield put(actions.handleAttachmentUpdate(attachment));
|
|
}
|
|
|
|
export function* deleteAttachment(id) {
|
|
yield put(actions.deleteAttachment(id));
|
|
|
|
let attachment;
|
|
try {
|
|
({ item: attachment } = yield call(request, api.deleteAttachment, id));
|
|
} catch (error) {
|
|
yield put(actions.deleteAttachment.failure(id, error));
|
|
return;
|
|
}
|
|
|
|
yield put(actions.deleteAttachment.success(attachment));
|
|
}
|
|
|
|
export function* handleAttachmentDelete(attachment) {
|
|
yield put(actions.handleAttachmentDelete(attachment));
|
|
}
|
|
|
|
export default {
|
|
createAttachment,
|
|
createAttachmentInCurrentCard,
|
|
handleAttachmentCreate,
|
|
updateAttachment,
|
|
handleAttachmentUpdate,
|
|
deleteAttachment,
|
|
handleAttachmentDelete,
|
|
};
|