Home Reference Source

application/redux/actions/issue-actions.js

import BaseService from './../../services/base-service';

class IssueService extends BaseService {

    fetch(opts) {
        return this.get('/v3/issue', opts);
    }

    fetchOne(id) {
        return this.get('/v3/issue/' + id);
    }

    create(data) {
        return this.post('/v3/issue', data);
    }

    update(id, data) {
        return this.put('/v3/issue/' + id, data);
    }

    remove(id) {
        return this.delete('/v3/issue/' + id);
    }
}

const service = new IssueService;

/**
 * Action types
 */
export const ISSUES_REQUEST = 'ISSUES_REQUEST';
export const ISSUES_RECEIVE = 'ISSUES_RECEIVE';
export const ISSUE_RECEIVE = 'ISSUE_RECEIVE';
export const ISSUE_SELECTED = 'ISSUE_SELECTED';
export const ISSUES_INVALIDATE = 'ISSUES_INVALIDATE';

export const ISSUES_FILTER_OPEN = 'ISSUES_FILTER_OPEN';
export const ISSUES_RECEIVE_PAGINATION = 'ISSUES_RECEIVE_PAGINATION';

/**
 * Action creators
 */
export function issuesReceivePagination(pagination) {
    return {
        type: ISSUES_RECEIVE_PAGINATION,
        payload: {
            before: pagination.get('before'),
            current: pagination.get('current'),
            first: pagination.get('first'),
            last: pagination.get('last'),
            limit: pagination.get('limit'),
            next: pagination.get('next'),
            total_items: pagination.get('total_items'),
            total_pages: pagination.get('total_pages'),
        }
    };
}

export function issuesRequest(params = {}) {
    return {
        type: ISSUES_REQUEST,
        payload: {
            params: params
        }
    };
}

export function issuesFilterOpen() {
    return {
        type: ISSUES_FILTER_OPEN,
        payload: {}
    }
}

export function issuesReceive(items) {

    return {
        type: ISSUES_RECEIVE,
        payload: {
            issues: items ? items : []
        }
    };
}

export function issueReceive(item) {
    return {
        type: ISSUE_RECEIVE,
        payload: {
            issue: item ? item : {}
        }
    };
}

export function issueSetSelected(issue) {
    return {
        type: ISSUE_SELECTED,
        payload: {
            selected: issue ? issue : false
        }
    };
}

export function issuesInvalidate() {
    return {
        type: ISSUES_INVALIDATE,
        payload: {
        }
    };
}

export function issuesFilterWebOnly() {
    return {
        type: ISSUES_FILTER_WEBONLY,
        payload: {
        }
    }
}
export function issuesFilterPrintOnly() {
    return {
        type: ISSUES_FILTER_PRINTONLY,
        payload: {
        }
    }
}

export function issuesShouldFetch(state) {
    const issues = state.issues;
    if (!issues.items.length) {
        return true;
    } else if (issues.isFetching) {
        return false;
    }

    return issues.didInvalidate;
}

export function issuesMaybeFetch(params = {}) {
    return function(dispatch, getState) {
        const issues = getState().issues;

        if (!issues.items || !issues.items.size) {
            return dispatch(issuesFetch(params));
        }

        return Promise.resolve();
    }
};

export function issuesFetch(params = {}) {
    return function(dispatch, getState) {
        dispatch(issuesRequest(params));

        params.per_page = params.per_page ? params.per_page : 100;
        params.order = params.order ? params.order : "published_at";
        params.dir = params.dir ? params.dir : "desc";
        params.include_archived = params.include_archived ? params.include_archived : 0;

        return service.fetch(params)
            .then(response => {
                dispatch(issuesReceivePagination(response));
                return dispatch(issuesReceive(response.get('items')));
            });
    };
}

export function issuesFetchOne(id) {
    return function (dispatch, getState) {
        dispatch(issuesRequest({}));

        return service.fetchOne(id)
            .then(response => {
                return dispatch(issueReceive(response.first()));
            });
    };
}

export function issueCreate(issue = {}) {
    return function(dispatch, getState) {
        return service.create(issue)
            .then(response => {
                return dispatch(issueReceive(response.first()));
            });
    }
}

export function issueUpdate(id, issue = {}) {
    return function(dispatch, getState) {
        return service.update(id, issue)
            .then(response => {
                return dispatch(issueReceive(response.first()));
            });
    }
}

export function issuesRemove(uuids) {
    return function(dispatch, getState) {
        dispatch(issuesInvalidate());

        return service.remove(uuids);
    }
}