diff --git a/opentech/static_src/src/app/src/api/index.js b/opentech/static_src/src/app/src/api/index.js new file mode 100644 index 0000000000000000000000000000000000000000..770802352d45563c36a504bc8c3fa7b55a39bb7a --- /dev/null +++ b/opentech/static_src/src/app/src/api/index.js @@ -0,0 +1,5 @@ +import { fetchSubmissionsByRound } from '@api/submissions'; + +export default { + fetchSubmissionsByRound, +}; diff --git a/opentech/static_src/src/app/src/api/submissions.js b/opentech/static_src/src/app/src/api/submissions.js new file mode 100644 index 0000000000000000000000000000000000000000..5b8f5b169b5b3566d48a18c578ce1b49269e9666 --- /dev/null +++ b/opentech/static_src/src/app/src/api/submissions.js @@ -0,0 +1,5 @@ +import { apiFetch } from '@api/utils'; + +export async function fetchSubmissionsByRound(id) { + return apiFetch('/apply/api/submissions/'); +} diff --git a/opentech/static_src/src/app/src/api/utils.js b/opentech/static_src/src/app/src/api/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..19bc84419fbe2fb7d8f3e2a0752b9435fdf15592 --- /dev/null +++ b/opentech/static_src/src/app/src/api/utils.js @@ -0,0 +1,19 @@ +const getBaseUrl = () => { + return 'http://apply.localhost:8000/'; +}; + +export async function apiFetch(path, method = 'GET', params, options) { + console.log('apifetch'); + const url = new URL(getBaseUrl()); + url.pathname = path; + + if (params !== undefined) { + url.searchParams = new URLSearchParams(params); + } + + return fetch(url, { + ...options, + method, + mode: 'same-origin', + }); +} diff --git a/opentech/static_src/src/app/src/components/SubmissionsByRoundListHeading.js b/opentech/static_src/src/app/src/components/SubmissionsByRoundListHeading.js index e3e2dd4e20e5bc4853708b1b7e26fdcd9a565690..4291cd7c9fc9c3b31c850c4f148f6af898700355 100644 --- a/opentech/static_src/src/app/src/components/SubmissionsByRoundListHeading.js +++ b/opentech/static_src/src/app/src/components/SubmissionsByRoundListHeading.js @@ -6,7 +6,7 @@ export default class SubmissionsByRoundListHeading extends React.Component { render() { return ( <li> - <h2>{this.props.title}</h2> + <h2>{this.props.title} ({this.props.count})</h2> </li> ); } diff --git a/opentech/static_src/src/app/src/containers/SubmissionsByRoundContainer.js b/opentech/static_src/src/app/src/containers/SubmissionsByRoundContainer.js index 96c5095c3b0b82e791a7fcc26d555d68dcd7c366..1d5f23de94c8d07b2d3abb352ac91bb702dcd5c2 100644 --- a/opentech/static_src/src/app/src/containers/SubmissionsByRoundContainer.js +++ b/opentech/static_src/src/app/src/containers/SubmissionsByRoundContainer.js @@ -3,14 +3,18 @@ import PropTypes from 'prop-types'; import { connect } from 'react-redux' import SubmissionsByRoundList from '@components/SubmissionsByRoundList'; -import { getCurrentRoundSubmissions } from '@selectors/submissions'; -import { setCurrentSubmissionRound } from '@actions/submissions'; +import { getCurrentRoundSubmissionsByStatus } from '@selectors/submissions'; +import { setCurrentSubmissionRound, fetchSubmissionsByRound } from '@actions/submissions'; class SubmissionsByRoundContainer extends React.Component { constructor(props) { super(props); - props.dispatch(setCurrentSubmissionRound(props.roundId)); + } + + componentDidMount() { + this.props.setSubmissionRound(this.props.roundId); + this.props.loadSubmissions(this.props.roundId); } render() { @@ -25,14 +29,26 @@ class SubmissionsByRoundContainer extends React.Component { const mapStateToProps = state => { return { - items: getCurrentRoundSubmissions(state), + items: getCurrentRoundSubmissionsByStatus(state), }; }; +const mapDispatchToProps = dispatch => { + return { + loadSubmissions: id => { + dispatch(fetchSubmissionsByRound(id)); + }, + setSubmissionRound: id => { + dispatch(setCurrentSubmissionRound(id)); + }, + } +}; + SubmissionsByRoundContainer.propTypes = { roundId: PropTypes.number, + loadSubmissions: PropTypes.func, }; -export default connect(mapStateToProps)(SubmissionsByRoundContainer); +export default connect(mapStateToProps, mapDispatchToProps)(SubmissionsByRoundContainer); diff --git a/opentech/static_src/src/app/src/index.js b/opentech/static_src/src/app/src/index.js index 326d703a11ba36084c291223f78223e785a0e55c..a3359dcd20e16a996c34286a795cb5879963e59e 100644 --- a/opentech/static_src/src/app/src/index.js +++ b/opentech/static_src/src/app/src/index.js @@ -10,7 +10,6 @@ const container = document.getElementById('submissions-by-round-react-app'); const store = createStore(); -console.log(container.dataset); ReactDOM.render( <Provider store={store}> <SubmissionsByRoundApp pageContent={container.innerHTML} roundId={parseInt(container.dataset.roundId)} /> diff --git a/opentech/static_src/src/app/src/redux/actions/submissions.js b/opentech/static_src/src/app/src/redux/actions/submissions.js index aaf0f900cd11a9ba526ea35c676e080f462d1525..5902baf027b4ade64110e0b592bad5489c9a25e6 100644 --- a/opentech/static_src/src/app/src/redux/actions/submissions.js +++ b/opentech/static_src/src/app/src/redux/actions/submissions.js @@ -1,6 +1,38 @@ +import api from '@api'; + + export const SET_CURRENT_SUBMISSION_ROUND = 'SET_CURRENT_SUBMISSION_ROUND'; +export const UPDATE_SUBMISSIONS_BY_ROUND = 'UPDATE_SUBMISSIONS_BY_ROUND'; + export const setCurrentSubmissionRound = id => ({ type: SET_CURRENT_SUBMISSION_ROUND, id, }); + +export const fetchSubmissionsByRound = id => { + console.log('fetch submissions by round'); + return async function(dispatch) { + //dispatch(fetchSubmissionsByRoundBegin()); + try { + console.log('before api call'); + const response = await api.fetchSubmissionsByRound(id); + console.log('response', response); + const json = await response.json(); + if (!response.ok) { + // handle error + } + dispatch(updateSubmissionsByRound(id, json)); + } catch (e) { + console.error(e); + // handle error + } + }; +}; + + +export const updateSubmissionsByRound = (roundId, data) => ({ + type: UPDATE_SUBMISSIONS_BY_ROUND, + roundId, + data, +}); diff --git a/opentech/static_src/src/app/src/redux/reducers/submissions.js b/opentech/static_src/src/app/src/redux/reducers/submissions.js index 0fe5c95fb9c84a302f5e57fad081aadbadf1718d..2f82a4ff26dd28e36b9299543ede1e47205f4f24 100644 --- a/opentech/static_src/src/app/src/redux/reducers/submissions.js +++ b/opentech/static_src/src/app/src/redux/reducers/submissions.js @@ -1,19 +1,8 @@ -import { SET_CURRENT_SUBMISSION_ROUND } from '@actions/submissions'; +import { SET_CURRENT_SUBMISSION_ROUND, UPDATE_SUBMISSIONS_BY_ROUND } from '@actions/submissions'; const initialState = { currentRound: null, - itemsByRound: { - 796: [ - { - title: "Test stage 1", - applications: [], - }, - { - title: "Test stage 2 blabla", - applications: [], - }, - ] - } + itemsByRound: {} }; export default function submissions(state = initialState, action) { @@ -23,6 +12,17 @@ export default function submissions(state = initialState, action) { ...state, currentRound: action.id, }; + case UPDATE_SUBMISSIONS_BY_ROUND: + const newData = {}; + newData[action.roundId] = action.data.results; + + return { + ...state, + itemsByRound: { + ...state.itemsByRound, + ...newData, + }, + }; default: return state; } diff --git a/opentech/static_src/src/app/src/redux/selectors/submissions.js b/opentech/static_src/src/app/src/redux/selectors/submissions.js index 7d03d44830a775ff68121f70f0561892976c8f12..37a267695a1cef9d864901e3311648a4090ad1fd 100644 --- a/opentech/static_src/src/app/src/redux/selectors/submissions.js +++ b/opentech/static_src/src/app/src/redux/selectors/submissions.js @@ -9,6 +9,18 @@ const getCurrentRoundSubmissions = createSelector( (submissionsByRound, currentRound) => submissionsByRound[currentRound] || [] ); +const getCurrentRoundSubmissionsByStatus = createSelector( + [getCurrentRoundSubmissions] , + currentRoundSubmissions => { + const submissionsByStatus = [{ + title: 'Test stage', + applications: currentRoundSubmissions, + }]; + return submissionsByStatus; + } +); + export { getCurrentRoundSubmissions, + getCurrentRoundSubmissionsByStatus, }; diff --git a/opentech/static_src/src/app/webpack.base.config.js b/opentech/static_src/src/app/webpack.base.config.js index 1915d2ae367f74f0e368f7a0b2e0d0c12794abf5..be11bcbcbab7b62e6994f22191ec221ae7988673 100644 --- a/opentech/static_src/src/app/webpack.base.config.js +++ b/opentech/static_src/src/app/webpack.base.config.js @@ -63,6 +63,7 @@ module.exports = { '@reducers': path.resolve(__dirname, 'src/redux/reducers'), '@selectors': path.resolve(__dirname, 'src/redux/selectors'), '@actions': path.resolve(__dirname, 'src/redux/actions'), + '@api': path.resolve(__dirname, 'src/api'), } } };