mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-05 08:59:14 +08:00
✨ Create new Redux store for onboarding details
This commit is contained in:
parent
b2e662e246
commit
fc6d05ac37
9 changed files with 184 additions and 0 deletions
2
modules/ppcp-settings/resources/js/data/constants.js
Normal file
2
modules/ppcp-settings/resources/js/data/constants.js
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
export const NAMESPACE = '/wc/v3/wc_paypal';
|
||||||
|
export const STORE_NAME = 'wc/paypal';
|
6
modules/ppcp-settings/resources/js/data/index.js
Normal file
6
modules/ppcp-settings/resources/js/data/index.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
import { STORE_NAME } from './constants';
|
||||||
|
import { initStore } from './store';
|
||||||
|
|
||||||
|
initStore();
|
||||||
|
|
||||||
|
export const WC_PAYPAL_STORE_NAME = STORE_NAME;
|
|
@ -0,0 +1,4 @@
|
||||||
|
export default {
|
||||||
|
SET_ONBOARDING_DETAILS: 'SET_ONBOARDING_DETAILS',
|
||||||
|
SET_IS_SAVING_ONBOARDING_DETAILS: 'SET_IS_SAVING_ONBOARDING_DETAILS',
|
||||||
|
};
|
|
@ -0,0 +1,64 @@
|
||||||
|
import { dispatch, select } from '@wordpress/data';
|
||||||
|
import { apiFetch } from '@wordpress/data-controls';
|
||||||
|
import ACTION_TYPES from './action-types';
|
||||||
|
import { NAMESPACE, STORE_NAME } from '../constants';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent. Set the full onboarding details, usually during app initialization.
|
||||||
|
*
|
||||||
|
* @param {Object} payload
|
||||||
|
* @return {{payload, type: string}} The action.
|
||||||
|
*/
|
||||||
|
export const updateOnboardingDetails = ( payload ) => {
|
||||||
|
return {
|
||||||
|
type: ACTION_TYPES.SET_ONBOARDING_DETAILS,
|
||||||
|
payload,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-persistent. Changes the "saving" flag.
|
||||||
|
*
|
||||||
|
* @param {boolean} isSaving
|
||||||
|
* @return {{type: string, isSaving}} The action.
|
||||||
|
*/
|
||||||
|
export function updateIsSavingOnboardingDetails( isSaving ) {
|
||||||
|
return {
|
||||||
|
type: ACTION_TYPES.SET_IS_SAVING_ONBOARDING_DETAILS,
|
||||||
|
isSaving,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the persistent details to the WP database.
|
||||||
|
*
|
||||||
|
* @return {Generator<any>} A generator function that handles the saving process.
|
||||||
|
*/
|
||||||
|
export function* saveOnboardingDetails() {
|
||||||
|
let error = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const settings = select( STORE_NAME ).getOnboardingDetails();
|
||||||
|
|
||||||
|
yield updateIsSavingOnboardingDetails( true );
|
||||||
|
|
||||||
|
yield apiFetch( {
|
||||||
|
path: `${ NAMESPACE }/onboarding`,
|
||||||
|
method: 'POST',
|
||||||
|
data: settings,
|
||||||
|
} );
|
||||||
|
|
||||||
|
yield dispatch( 'core/notices' ).createSuccessNotice(
|
||||||
|
__( 'Progress saved.', 'woocommerce-paypal-payments' )
|
||||||
|
);
|
||||||
|
} catch ( e ) {
|
||||||
|
error = e;
|
||||||
|
yield dispatch( 'core/notices' ).createErrorNotice(
|
||||||
|
__( 'Error saving progress.', 'woocommerce-paypal-payments' )
|
||||||
|
);
|
||||||
|
} finally {
|
||||||
|
yield updateIsSavingOnboardingDetails( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
return error === null;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
import reducer from './reducer';
|
||||||
|
import * as selectors from './selectors';
|
||||||
|
import * as actions from './actions';
|
||||||
|
import * as resolvers from './resolvers';
|
||||||
|
|
||||||
|
export { reducer, selectors, actions, resolvers };
|
|
@ -0,0 +1,31 @@
|
||||||
|
import ACTION_TYPES from './action-types';
|
||||||
|
|
||||||
|
const defaultState = {
|
||||||
|
isSaving: false,
|
||||||
|
data: {
|
||||||
|
step: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const onboardingReducer = (
|
||||||
|
state = defaultState,
|
||||||
|
{ type, ...action }
|
||||||
|
) => {
|
||||||
|
switch ( type ) {
|
||||||
|
case ACTION_TYPES.SET_ONBOARDING_DETAILS:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
data: action.payload,
|
||||||
|
};
|
||||||
|
|
||||||
|
case ACTION_TYPES.SET_IS_SAVING_ONBOARDING_DETAILS:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
isSaving: action.isSaving,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default onboardingReducer;
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { dispatch } from '@wordpress/data';
|
||||||
|
import { __ } from '@wordpress/i18n';
|
||||||
|
import { apiFetch } from '@wordpress/data-controls';
|
||||||
|
import { NAMESPACE } from '../constants';
|
||||||
|
import { updateOnboardingDetails } from './actions';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve settings from the site's REST API.
|
||||||
|
*/
|
||||||
|
export function* getOnboardingDetails() {
|
||||||
|
const path = `${ NAMESPACE }/onboarding`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = yield apiFetch( { path } );
|
||||||
|
yield updateOnboardingDetails( result );
|
||||||
|
} catch ( e ) {
|
||||||
|
yield dispatch( 'core/notices' ).createErrorNotice(
|
||||||
|
__(
|
||||||
|
'Error retrieving onboarding details.',
|
||||||
|
'woocommerce-paypal-payments'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
const EMPTY_OBJ = {};
|
||||||
|
|
||||||
|
const getOnboardingState = ( state ) => {
|
||||||
|
if ( ! state ) {
|
||||||
|
return EMPTY_OBJ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return state.onboarding || EMPTY_OBJ;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getOnboardingDetails = ( state ) => {
|
||||||
|
return getOnboardingState( state ).data || EMPTY_OBJ;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getOnboardingStep = ( state ) => {
|
||||||
|
return getOnboardingDetails( state ).step || 0;
|
||||||
|
};
|
30
modules/ppcp-settings/resources/js/data/store.js
Normal file
30
modules/ppcp-settings/resources/js/data/store.js
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import { createReduxStore, register, combineReducers } from '@wordpress/data';
|
||||||
|
import { controls } from '@wordpress/data-controls';
|
||||||
|
import { STORE_NAME } from './constants';
|
||||||
|
import * as onboarding from './onboarding';
|
||||||
|
|
||||||
|
const actions = {};
|
||||||
|
const selectors = {};
|
||||||
|
const resolvers = {};
|
||||||
|
|
||||||
|
[ onboarding ].forEach( ( item ) => {
|
||||||
|
Object.assign( actions, { ...item.actions } );
|
||||||
|
Object.assign( selectors, { ...item.selectors } );
|
||||||
|
Object.assign( resolvers, { ...item.resolvers } );
|
||||||
|
} );
|
||||||
|
|
||||||
|
const reducer = combineReducers( {
|
||||||
|
onboarding: onboarding.reducer,
|
||||||
|
} );
|
||||||
|
|
||||||
|
export const initStore = () => {
|
||||||
|
const store = createReduxStore( STORE_NAME, {
|
||||||
|
reducer,
|
||||||
|
controls,
|
||||||
|
actions,
|
||||||
|
selectors,
|
||||||
|
resolvers,
|
||||||
|
} );
|
||||||
|
|
||||||
|
register( store );
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue