@talend/react-containers
Version:
Provide connected components aka containers for @talend/react-cmf based on @talend/react-components.
156 lines (152 loc) • 6.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.deleteResourceCancel = deleteResourceCancel;
exports.deleteResourceValidate = deleteResourceValidate;
exports.getResourceLocator = getResourceLocator;
exports.redirect = redirect;
var _effects = require("redux-saga/effects");
var _reactCmf = _interopRequireDefault(require("@talend/react-cmf"));
var _constants = _interopRequireDefault(require("./constants"));
var _lodash = require("lodash");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* from a resourceType and an optional resourcePath, return a resource locator
* if resourcePath is provided resourceType is prepend to resourcePath
* @param {String} resourceType
* @param {Array<String>} [resourcePath]
* @return {String || Array<String>}
*/
function getResourceLocator(resourceType, resourcePath) {
if (resourcePath) {
if (Array.isArray(resourcePath)) {
return [resourceType, ...resourcePath];
}
throw Error(`Optional parameter resourcePath must be an array of string,
got ${resourcePath}`);
}
return resourceType;
}
function* redirect(url) {
if (!(0, _lodash.isString)(url)) {
throw new Error('redirect url can not be empty');
}
yield (0, _effects.put)({
type: _constants.default.DIALOG_BOX_DELETE_RESOURCE_CLOSE,
cmf: {
routerReplace: url
}
});
}
/**
* Waiting for confirmation event.
* Resolve the resource to delete.
* Call the requested uri.
* Redirect the user.
* @param {string} uri
* @param {string} resourceType
* @param {string} itemId
* @param {Array<String>} [resourcePath]
* @param {string} collectionId - collection which stores resources
* @param {string} resourceUri - uri to delete resource on backend
*/
function* deleteResourceValidate(uri, resourceType, itemId, resourcePath, collectionId, resourceUri) {
const action = yield (0, _effects.take)(_constants.default.DIALOG_BOX_DELETE_RESOURCE_OK);
const safeURI = (0, _lodash.get)(action, 'data.model.uri', uri);
const safeType = (0, _lodash.get)(action, 'data.model.resourceType', resourceType);
const safeId = (0, _lodash.get)(action, 'data.model.id', itemId);
const safePath = (0, _lodash.get)(action, 'data.model.resourcePath', resourcePath);
const resourceCollectionId = (0, _lodash.get)(action, 'data.model.collectionId', collectionId);
const resourceLocator = getResourceLocator(resourceCollectionId || safeType, safePath);
let resource;
if ((0, _lodash.get)(action, 'data.model.resource')) {
resource = (0, _lodash.get)(action, 'data.model.resource');
} else {
resource = yield (0, _effects.select)(_reactCmf.default.selectors.collections.findListItem, resourceLocator, safeId);
}
const safeResourceUri = (0, _lodash.get)(action, 'data.model.resourceUri', resourceUri || `${safeURI}/${safeType}/${safeId}`);
if (resource && safeResourceUri) {
const result = yield (0, _effects.call)(_reactCmf.default.sagas.http.delete, safeResourceUri);
if (result.response.ok) {
yield (0, _effects.put)({
type: _constants.default.DIALOG_BOX_DELETE_RESOURCE_SUCCESS,
model: {
...(0, _lodash.get)(action, 'data.model', {}),
id: safeId,
labelResource: resource.get('label') || resource.get('name', '')
}
});
yield (0, _effects.call)(redirect, (0, _lodash.get)(action, 'data.model.redirectUrl'));
} else {
yield (0, _effects.put)({
type: _constants.default.DIALOG_BOX_DELETE_RESOURCE_ERROR,
error: result.data
});
}
}
}
function* deleteResourceCancel() {
const action = yield (0, _effects.take)(_constants.default.DIALOG_BOX_DELETE_RESOURCE_CANCEL);
const url = (0, _lodash.get)(action, 'data.model.onCancelRedirectUrl', (0, _lodash.get)(action, 'data.model.redirectUrl'));
yield (0, _effects.call)(redirect, url);
}
/**
* For Backward compatibility
* Return a saga for delete resource confirmation dialog box.
* Race between cancel and confirm deleting the resource.
* To be used with the sagaRouter
* @param {object} sagaParams the params to setup the saga
* @param {string} sagaParams.uri the uri of the endpoint to make the calls
* @param {string} sagaParams.resourceType the resource type to call delete endpoint ( at least )
* @param {string} sagaParams.redirectUrl url to redirect after delete action is done or cancel
* @param {Array<String>} sagaParams.resourcePath optional
* @param {string} sagaParams.routerParamsAttribute optional param in route to get the resource id
* @param {string} sagaParams.collectionId optional param to specify collection which stores
* resources,if not provided, will use resourceType as collectionId
* @param {string} sagaParams.resourceUri optionsal param, specify the uri to delete resource.
* if not provided, will use ':uri/:resourceType/:resourceId'
*/
function getDeleteResourceSagaRouter({
uri,
resourceType,
redirectUrl,
resourcePath,
routerParamsAttribute = 'id',
collectionId,
resourceUri
} = {}) {
// eslint-disable-next-line no-console
console.warn(`DEPRECATED: please move the following sagaRouter config as props of DeleteResource container:
{
uri: ${uri},
resourceType: ${resourceType},
redirectUrl: ${redirectUrl},
resourcePath: ${resourcePath},
}`);
return function* deleteResourceSaga(routerParams) {
try {
yield (0, _effects.race)({
deleteConfirmationValidate: (0, _effects.call)(deleteResourceValidate, uri, resourceType, routerParams[routerParamsAttribute], resourcePath, collectionId, resourceUri),
deleteConfirmationCancel: (0, _effects.call)(deleteResourceCancel)
});
} catch (error) {
throw new Error(`DeleteResource failed :${error}`);
}
};
}
function* handle() {
try {
yield (0, _effects.race)({
deleteConfirmationValidate: (0, _effects.call)(deleteResourceValidate),
deleteConfirmationCancel: (0, _effects.call)(deleteResourceCancel)
});
} catch (error) {
throw new Error(`DeleteResource failed: ${error}`);
}
}
// Backward compatibility
getDeleteResourceSagaRouter['DeleteResource#handle'] = handle;
var _default = exports.default = getDeleteResourceSagaRouter;
//# sourceMappingURL=sagas.js.map