import { put, call, retry } from 'redux-saga/effects'; import { FETCH_ISSUES_SUCCESS, FETCH_ISSUES_FAILURE, ADD_LABEL_FAILURE, ADD_LABEL_SUCCESS, REMOVE_LABEL_FAILURE, REMOVE_LABEL_SUCCESS } from '../actions/issues'; import { gitea } from '../../util/gitea'; export function* fetchIssuesSaga(action) { const { project } = action; let issues; try { issues = yield call(gitea.fetchIssues.bind(gitea), action.project); } catch(error) { yield put({ type: FETCH_ISSUES_FAILURE, project, error }); return; } yield put({ type: FETCH_ISSUES_SUCCESS, project, issues }); } export function* addLabelSaga(action) { const { project, issueNumber, label } = action; const labels = yield call(gitea.fetchProjectLabels.bind(gitea), project); const giteaLabel = labels.find(l => l.name === label) if (!giteaLabel) { yield put({ type: ADD_LABEL_FAILURE, error: new Error(`Label "${label}" not found !`) }); return; } try { yield retry(5, 250, gitea.addIssueLabel.bind(gitea), project, issueNumber, giteaLabel.id); } catch(error) { yield put({ type: ADD_LABEL_FAILURE, error }); return; } yield put({ type: ADD_LABEL_SUCCESS, project, issueNumber, label }); } export function* removeLabelSaga(action) { const { project, issueNumber, label } = action; const labels = yield call(gitea.fetchProjectLabels.bind(gitea), project); const giteaLabel = labels.find(l => l.name === label) if (!giteaLabel) { yield put({ type: REMOVE_LABEL_FAILURE, error: new Error(`Label "${label}" not found !`) }); return; } try { yield retry(5, 250, gitea.removeIssueLabel.bind(gitea), project, issueNumber, giteaLabel.id); } catch(error) { yield put({ type: REMOVE_LABEL_FAILURE, error }); return; } yield put({ type: REMOVE_LABEL_SUCCESS, project, issueNumber, label }); }