120 lines
2.6 KiB
JavaScript
120 lines
2.6 KiB
JavaScript
import { createAction } from 'redux-actions';
|
|
import requestAction from 'Utilities/requestAction';
|
|
import getSectionState from 'Utilities/State/getSectionState';
|
|
import updateSectionState from 'Utilities/State/updateSectionState';
|
|
import { createThunk, handleThunks } from 'Store/thunks';
|
|
import createHandleActions from './Creators/createHandleActions';
|
|
|
|
//
|
|
// Variables
|
|
|
|
export const section = 'captcha';
|
|
|
|
//
|
|
// State
|
|
|
|
export const defaultState = {
|
|
refreshing: false,
|
|
token: null,
|
|
siteKey: null,
|
|
secretToken: null,
|
|
ray: null,
|
|
stoken: null,
|
|
responseUrl: null
|
|
};
|
|
|
|
//
|
|
// Actions Types
|
|
|
|
export const REFRESH_CAPTCHA = 'captcha/refreshCaptcha';
|
|
export const GET_CAPTCHA_COOKIE = 'captcha/getCaptchaCookie';
|
|
export const SET_CAPTCHA_VALUE = 'captcha/setCaptchaValue';
|
|
export const RESET_CAPTCHA = 'captcha/resetCaptcha';
|
|
|
|
//
|
|
// Action Creators
|
|
|
|
export const refreshCaptcha = createThunk(REFRESH_CAPTCHA);
|
|
export const getCaptchaCookie = createThunk(GET_CAPTCHA_COOKIE);
|
|
export const setCaptchaValue = createAction(SET_CAPTCHA_VALUE);
|
|
export const resetCaptcha = createAction(RESET_CAPTCHA);
|
|
|
|
//
|
|
// Action Handlers
|
|
|
|
export const actionHandlers = handleThunks({
|
|
|
|
[REFRESH_CAPTCHA]: function(getState, payload, dispatch) {
|
|
const actionPayload = {
|
|
action: 'checkCaptcha',
|
|
...payload
|
|
};
|
|
|
|
dispatch(setCaptchaValue({
|
|
refreshing: true
|
|
}));
|
|
|
|
const promise = requestAction(actionPayload);
|
|
|
|
promise.done((data) => {
|
|
if (!data.captchaRequest) {
|
|
dispatch(setCaptchaValue({
|
|
refreshing: false
|
|
}));
|
|
}
|
|
|
|
dispatch(setCaptchaValue({
|
|
refreshing: false,
|
|
...data.captchaRequest
|
|
}));
|
|
});
|
|
|
|
promise.fail(() => {
|
|
dispatch(setCaptchaValue({
|
|
refreshing: false
|
|
}));
|
|
});
|
|
},
|
|
|
|
[GET_CAPTCHA_COOKIE]: function(getState, payload, dispatch) {
|
|
const state = getState().captcha;
|
|
|
|
const queryParams = {
|
|
responseUrl: state.responseUrl,
|
|
ray: state.ray,
|
|
captchaResponse: payload.captchaResponse
|
|
};
|
|
|
|
const actionPayload = {
|
|
action: 'getCaptchaCookie',
|
|
queryParams,
|
|
...payload
|
|
};
|
|
|
|
const promise = requestAction(actionPayload);
|
|
|
|
promise.done((data) => {
|
|
dispatch(setCaptchaValue({
|
|
token: data.captchaToken
|
|
}));
|
|
});
|
|
}
|
|
});
|
|
|
|
//
|
|
// Reducers
|
|
|
|
export const reducers = createHandleActions({
|
|
|
|
[SET_CAPTCHA_VALUE]: function(state, { payload }) {
|
|
const newState = Object.assign(getSectionState(state, section), payload);
|
|
|
|
return updateSectionState(state, section, newState);
|
|
},
|
|
|
|
[RESET_CAPTCHA]: function(state) {
|
|
return updateSectionState(state, section, defaultState);
|
|
}
|
|
|
|
}, defaultState);
|