2018-09-20 11:58:47 -07:00
|
|
|
import { Dispatch } from 'redux';
|
2018-10-04 21:27:02 -07:00
|
|
|
import { CreateFormState } from 'types';
|
2018-11-13 08:07:09 -08:00
|
|
|
import { getProposalDrafts } from 'api/api';
|
2018-09-20 11:58:47 -07:00
|
|
|
import { sleep } from 'utils/helpers';
|
|
|
|
import { AppState } from 'store/reducers';
|
|
|
|
import { createCrowdFund } from 'modules/web3/actions';
|
|
|
|
import { formToBackendData, formToContractData } from './utils';
|
2018-11-13 08:07:09 -08:00
|
|
|
import types, { CreateDraftOptions } from './types';
|
2018-09-20 11:58:47 -07:00
|
|
|
|
|
|
|
type GetState = () => AppState;
|
|
|
|
|
|
|
|
// TODO: Replace with server side storage
|
|
|
|
const LS_DRAFT_KEY = 'CREATE_PROPOSAL_DRAFT';
|
|
|
|
|
|
|
|
export function updateForm(form: Partial<CreateFormState>) {
|
|
|
|
return (dispatch: Dispatch<any>) => {
|
|
|
|
dispatch({
|
|
|
|
type: types.UPDATE_FORM,
|
|
|
|
payload: form,
|
|
|
|
});
|
|
|
|
dispatch(saveDraft());
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function saveDraft() {
|
|
|
|
return async (dispatch: Dispatch<any>, getState: GetState) => {
|
|
|
|
const { form } = getState().create;
|
|
|
|
dispatch({ type: types.SAVE_DRAFT_PENDING });
|
2018-11-13 08:07:09 -08:00
|
|
|
await sleep(1000);
|
2018-09-20 11:58:47 -07:00
|
|
|
|
|
|
|
// TODO: Replace with server side save
|
|
|
|
localStorage.setItem(LS_DRAFT_KEY, JSON.stringify(form));
|
|
|
|
dispatch({ type: types.SAVE_DRAFT_FULFILLED });
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-11-13 08:07:09 -08:00
|
|
|
export function fetchDrafts() {
|
|
|
|
return (dispatch: Dispatch<any>) => {
|
|
|
|
return dispatch({
|
|
|
|
type: types.FETCH_DRAFTS,
|
|
|
|
payload: getProposalDrafts(),
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function createDraft(opts: CreateDraftOptions = {}) {
|
|
|
|
return {
|
|
|
|
type: types.CREATE_DRAFT_PENDING,
|
|
|
|
payload: opts,
|
2018-09-20 11:58:47 -07:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function createProposal(form: CreateFormState) {
|
|
|
|
return async (dispatch: Dispatch<any>, getState: GetState) => {
|
|
|
|
const state = getState();
|
|
|
|
// TODO: Handle if contract is unavailable
|
|
|
|
const contract = state.web3.contracts[0];
|
|
|
|
// TODO: Move more of the backend handling into this action.
|
|
|
|
dispatch(
|
|
|
|
createCrowdFund(contract, formToContractData(form), formToBackendData(form)),
|
|
|
|
);
|
|
|
|
// TODO: dispatch reset conditionally, if crowd fund is success
|
|
|
|
};
|
|
|
|
}
|