UNPKG

@onereach/webform

Version:

Content Builder includes several views for: - Content builder view itself; - Web Form view; - Slack block-kit builder;

1,057 lines (874 loc) 30.1 kB
import WSService from '@/api/services/ws.service'; import MessageService from '@/api/services/message.service'; import config from '../../config'; import EventBus from '../../helpers/eventBus'; import { encryptAuth } from './webform-helpers/index'; import { clearLSByVuexPersistedKey } from '../../utils/index'; import { WEBFORM_SET_KEY, WEBFORM_SET_ENV, OUTPUT_RESET_GENERIC_MODEL, WEBFORM_SET_EMBUS_WSS_URL, OUTPUT_SET_GENERIC, SET_MESSAGE, CLEAR_MESSAGE, WEBFORM_SET_FORM_STEP, WEBFORM_RESET_STATE, WEBFORM_CLEAR_STATE } from '@/store/mutation-types'; const dayjs = require('dayjs'); const customParseFormat = require('dayjs/plugin/customParseFormat'); dayjs.extend(customParseFormat); const initialState = { EMBUS_WSS_URL: null, env: null, queryParams: {}, preview: false, loading: false, endpoint: undefined, key: undefined, accountId: undefined, wsHandlers: undefined, eventManager: undefined, callback: undefined, readQueuePromise: undefined, readQueue: undefined, sessionId: undefined, responseKey: undefined, updateCallback: undefined, multiStepForm: false, multiStepLevel: 0, multiStepData: [{ goBack: false, isCancelHandling: false, endOfForm: false }], config: null, isSingleCancelHandling: true, hideForm: false, beginningSessionId: undefined, previousSessionId: undefined }; const getters = { isMultiStepGoBack: state => _.get(state.multiStepData, `[${state.multiStepLevel}].goBack`, false), isCancelHandling: state => _.get(state.multiStepData, `[${state.multiStepLevel}].isCancelHandling`, false), isMultiStepEndOfForm: state => _.get(state.multiStepData, `[${state.multiStepLevel}].endOfForm`, false), isMultiStepItems: state => _.get(state.multiStepData, `[${state.multiStepLevel}].data`, false) }; const actions = { async getGenericDataModel ({ dispatch, commit, state, rootState }) { commit(WEBFORM_SET_KEY, { key: 'loading', payload: true }); try { let attempt = 0; let response; do { const key = state.sessionId || state.key; let params = { p: key }; if (state.queryParams) { if (state.queryParams.q) { delete state.queryParams.q; } params = Object.assign(params, state.queryParams); } const urlParams = new URLSearchParams(Object.entries(params)); response = await fetch(`${state.endpoint}?` + urlParams, { method: 'GET' }); attempt += 1; } while (response.status !== 200 && attempt < 5); if (!response.ok) { const errorMessage = 'The form has expired'; EventBus.$emit('on-webform-error', { message: errorMessage }); throw new Error(errorMessage); } const data = await response.json(); let genericModel = _.get(data, 'data.data'); const stepId = _.get(data, 'data.stepId', null); const multiStepLevel = _.get(state, 'multiStepLevel', null); const multiStepData = _.get(state, 'multiStepData', null); if (state.sessionId && stepId && stepId === _.get(multiStepData, `[${multiStepLevel}].stepId`)) { genericModel = _.get(multiStepData, `[${multiStepLevel}].data`); } commit(`output/${OUTPUT_SET_GENERIC}`, genericModel, { root: true }); const multiStepForm = _.get(data, 'data.multiStepForm'); const isSingleCancelHandling = _.get(data, 'data.isCancelHandling'); if (multiStepForm) { commit(WEBFORM_SET_KEY, { key: 'multiStepForm', payload: multiStepForm }); const formDataOut = { goBack: _.get(data, 'data.goBack', false), isCancelHandling: _.get(data, 'data.isCancelHandling', false), data: _.cloneDeep(genericModel), endOfForm: false, stepId }; if ( formDataOut.goBack && !_.get( state, `multiStepData[${state.multiStepLevel - 1}].data.children.length` ) ) { formDataOut.goBack = false; } commit(WEBFORM_SET_FORM_STEP, formDataOut); } commit(WEBFORM_SET_KEY, { key: 'isSingleCancelHandling', payload: isSingleCancelHandling }); if (!state.preview && state.multiStepForm) { await dispatch('initEventEmiter', _.get(data, 'data.unauthorized')); // start a new session if the first page has no children // then go to the next page if ( state.multiStepLevel === 0 && (!_.get(rootState, 'output.genericModel.children.length') || _.get(data, 'data.immediateSession')) ) { await dispatch('startNewSession'); } else if (state.sessionId) { await dispatch('updateCallback'); } } commit(WEBFORM_SET_KEY, { key: 'loading', payload: false }); EventBus.$emit('on-webform-loaded'); } catch (error) { commit( SET_MESSAGE, { type: 'error', message: error, status: 500 }, { root: true } ); commit(WEBFORM_SET_KEY, { key: 'loading', payload: false }); throw new Error(error); } }, prepareFormDataObject ({ commit, state, rootState }, submit = false) { let children = []; if (submit) { if (state.multiStepForm) { children = state.multiStepData.reduce((acc, field) => { const children = _.get(field, 'data.children'); if (children) { acc = [...acc, ...children]; } return acc; }, []); children = Object.values( [ ...children, ..._.get(rootState, 'output.genericModel.children', []) ].reduce((result, { id, ...rest }) => { result[id] = { ...(result[id] || {}), id, ...rest }; return result; }, {}) ); } else { children = [..._.get(rootState, 'output.genericModel.children', [])]; } } else { children = [..._.get(rootState, 'output.genericModel.children', [])]; } if (!children) { return commit( SET_MESSAGE, { type: 'error', message: 'Error schema of generic model data', status: 500 }, { root: true } ); } const staticTypes = ['attachments', 'text', 'divider', 'image']; const getInputData = (children) => children.reduce((acc, item) => { let value = _.get(item, 'props.value'); const isDatepicker = item.type === 'datePicker'; if (isDatepicker && typeof value === 'string' && value.trim().length) { const dateFormat = _.get(item, 'props.web.dateFormat'); const date = dayjs( `${value}T00:00:00+00`, `${dateFormat}[T]HH:mm:ssZZ` ); value = { input: value, iso: date.toISOString() }; } if (item.type === 'video') { return acc.concat({ id: item.id, value: { watched: _.get(item, 'props.watched') }, name: _.get(item, 'props.variableName') || _.get(item, 'props.web.variableName') || item.id }); } return acc.concat({ id: item.id, value, name: _.get(item, 'props.variableName') || _.get(item, 'props.web.variableName') || item.id }); }, []); return getInputData(children); }, async fetchConfig ({ state, commit }, url) { let attempt = 0; let response; do { response = await fetch(url); attempt += 1; } while (response.status !== 200 && attempt < 5); const data = await response.json(); if (response.status !== 200) { const message = data.message || data.error; throw new Error(`Can't get config: ${message}`); } else { return data || null; } }, async onWSConnect ({ dispatch, commit, state, rootState }) { const sessionId = state.sessionId; // console.log('onWSConnect sessionId -> ', sessionId); if (sessionId) { const messagesFromQueue = await MessageService.getMessagesFromQueue({ sessionId }); config.debug && console.debug('[EWPS::onWSConnect] messagesFromQueue ', messagesFromQueue); if (messagesFromQueue && messagesFromQueue.length) { dispatch('addMessagesOneByOne', messagesFromQueue); } await MessageService.updateCallback({ sessionId }); await MessageService.clearQueue({ sessionId }); } // commit('notifications/showNotification', NOTIFICATION_TYPES.REMOVE_NOTIFICATION, { root: true }); // commit(`config/${mutationTypes.CHANGE_CONNECTION_STATUS}`, true, { root: true }); }, /* createEventManager ({ state }, authString) { let embusWssUrlFormatted; if (state.EMBUS_WSS_URL) { const wsProtocolPrefix = 'wss://'; embusWssUrlFormatted = state.EMBUS_WSS_URL.match(wsProtocolPrefix) ? state.EMBUS_WSS_URL : `${wsProtocolPrefix}${state.EMBUS_WSS_URL}`; } const eventManagerConfig = { authorization: authString, embusWssUrl: embusWssUrlFormatted || (state.env ? `wss://embus-${state.env}.onereach.ai` : config.EMBUS_WSS_URL), getRemainingTimeInMillis () { return 72 * 60 * 60 * 1000; } }; return new EventManager({ flow: { config: eventManagerConfig }, config: eventManagerConfig, log: console }); }, */ /* async createReadQueue ({ state }, eventManager) { const readQueue = await eventManager.getReadQueue(); const readQueuePromise = await readQueue.connect(true); const callback = await readQueuePromise.getCallback(); return { readQueue, readQueuePromise, callback }; }, */ /* async onWSClose () { await new Promise(resolve => setTimeout(resolve, 1000)); window.location.reload(); }, async onWSOpen ({ state }) { state.readQueuePromise.getCallback(); }, */ async onMessage ({ state, commit }, { result }) { const formDataOut = _.get(result, 'resolve.formDataOut'); // console.log('onWSData formDataOut ->', formDataOut); if (!formDataOut) return; if ( formDataOut.goBack && !_.get( state, `multiStepData[${state.multiStepLevel}].data.children.length` ) ) { // console.log('onWSData goBack toggle multiStepData -> ', state.multiStepData); // console.log('onWSData goBack toggle multiStepLevel -> ', state.multiStepLevel); formDataOut.goBack = false; } commit(WEBFORM_SET_KEY, { key: 'multiStepLevel', payload: (state.multiStepLevel = state.multiStepLevel + 1) }); if (formDataOut.stepId === _.get(state, `multiStepData[${state.multiStepLevel}].stepId`)) { formDataOut.data = state.multiStepData[state.multiStepLevel].data; } commit(WEBFORM_SET_FORM_STEP, formDataOut); const formPartData = _.get(formDataOut, 'data'); if (formPartData) { commit(`output/${OUTPUT_SET_GENERIC}`, _.cloneDeep(formPartData), { root: true }); commit(WEBFORM_SET_KEY, { key: 'loading', payload: false }); } // console.log('onWSData end state -> ', state); }, /* addWSListeners ({ state, dispatch, commit }) { const wsHandlers = { 'wsq:close': () => dispatch('onWSClose'), 'wsq:open': () => dispatch('onWSOpen'), 'data': (data) => dispatch('onWSData', data) }; commit(WEBFORM_SET_KEY, { key: 'wsHandlers', payload: wsHandlers }); _.forEach(wsHandlers, (handler, name) => { state.readQueuePromise.on(name, handler); }); // state.readQueuePromise.on('wsq:close', async () => dispatch('onWSClose')); // state.readQueuePromise.on('wsq:open', async () => dispatch('onWSOpen')); // state.readQueuePromise.on('data', async data => dispatch('onWSData', data)); }, */ async initEventEmiter ({ state, commit, dispatch }, isUnauthorized) { if (state.eventManager && Object.keys(state.eventManager).length) { // await dispatch('deleteEventManager'); } let authStr = 'UNAUTHORIZED'; if (!isUnauthorized) { const url = `${ state.env ? 'https://sdkapi.' + state.env + '.api.onereach.ai' : config.SDK_API_URL }/http/${state.accountId}/content-builder-form/${state.key}`; const configuration = await dispatch('fetchConfig', url); if (!configuration) return; const { sessionId } = configuration; if (sessionId) { commit(WEBFORM_SET_KEY, { key: 'sessionId', payload: sessionId }); commit(WEBFORM_SET_KEY, { key: 'updateCallback', payload: true }); } authStr = encryptAuth(configuration); } let embusWssUrlFormatted; if (state.EMBUS_WSS_URL) { const wsProtocolPrefix = 'wss://'; embusWssUrlFormatted = state.EMBUS_WSS_URL.match(wsProtocolPrefix) ? state.EMBUS_WSS_URL : `${wsProtocolPrefix}${state.EMBUS_WSS_URL}`; } const eventManagerConfig = { token: authStr, emBusWssUrl: embusWssUrlFormatted || (state.env ? `wss://embus-${state.env}.onereach.ai` : config.EMBUS_WSS_URL) }; WSService.init(eventManagerConfig); WSService.connect(); // WSService.addOnConnectListener(() => dispatch('onWSConnect')); WSService.addOnMessageListener((data) => dispatch('onMessage', data)); // const eventManager = await dispatch('createEventManager', authStr); // commit(WEBFORM_SET_KEY, { key: 'eventManager', payload: eventManager }); // const { readQueue, readQueuePromise, callback } = await dispatch('createReadQueue', eventManager); // commit(WEBFORM_SET_KEY, { key: 'callback', payload: callback }); // commit(WEBFORM_SET_KEY, { key: 'readQueuePromise', payload: readQueuePromise }); // commit(WEBFORM_SET_KEY, { key: 'readQueue', payload: readQueue }); // await dispatch('addWSListeners'); }, /* removeWSListeners ({ state, commit }) { _.forEach(state.wsHandlers, (handler, name) => { state.readQueuePromise.off(name, handler); }); commit(WEBFORM_SET_KEY, { key: 'wsHandlers', payload: undefined }); }, */ async deleteEventManager ({ state, commit, dispatch }) { // WSService.close(); // await dispatch('removeWSListeners'); commit(WEBFORM_SET_KEY, { key: 'callback', payload: undefined }); commit(WEBFORM_SET_KEY, { key: 'readQueuePromise', payload: undefined }); commit(WEBFORM_SET_KEY, { key: 'readQueue', payload: undefined }); commit(WEBFORM_SET_KEY, { key: 'eventManager', payload: undefined }); }, async goBack ({ state, commit, rootState }, step = 1) { // console.log('goBack state -> ', state); // console.log('goBack step -> ', step); const transcription = _.get(rootState, 'output.genericModel'); if (transcription) { commit(WEBFORM_SET_FORM_STEP, { data: _.cloneDeep(transcription), transcription: true }); } commit(WEBFORM_SET_KEY, { key: 'hideForm', payload: true }); try { await MessageService.sendMessage({ name: `form/go-back/${state.sessionId}`, params: { callback: state.callback } }, true, { token: 'UNAUTHORIZED', accountId: state.accountId }); /* await state.eventManager.emit({ name: `form/go-back/${state.sessionId}`, params: { callback: state.callback } }); */ } catch (error) { commit( SET_MESSAGE, { type: 'error', message: error, status: 500 }, { root: true } ); } /* console.log( 'goBack state.multiStepLevel before -> ', state.multiStepLevel ); console.log( 'goBack state.multiStepLevel -> ', state.multiStepLevel - step ); */ commit(WEBFORM_SET_KEY, { key: 'multiStepLevel', payload: (state.multiStepLevel = state.multiStepLevel - step) }); commit( `output/${OUTPUT_SET_GENERIC}`, _.cloneDeep(state.multiStepData[state.multiStepLevel].data), { root: true } ); commit(WEBFORM_SET_KEY, { key: 'hideForm', payload: false }); }, async startNewSession ({ commit, state, rootState }) { // console.log('startNewSession'); const transcription = _.get(rootState, 'output.genericModel'); // console.log('transcription -> ', transcription); if (transcription) { commit(WEBFORM_SET_FORM_STEP, { data: _.cloneDeep(transcription), transcription: true }); } const formData = {}; const config = { name: `form/start-session/${state.key}`, params: { callback: state.callback, formData, queryParams: state.queryParams, beginningSessionId: state.beginningSessionId, previousSessionId: state.previousSessionId }, target: state.accountId }; try { const res = await MessageService.sendMessage(config, true, { token: 'UNAUTHORIZED', accountId: state.accountId }); // await state.eventManager.emit(config); if (res && res.sessionId) { commit(WEBFORM_SET_KEY, { key: 'sessionId', payload: res.sessionId }); } EventBus.$emit('on-webform-start-session-success', { result: res, formData }); } catch (error) { commit( SET_MESSAGE, { type: 'error', message: error, status: 500 }, { root: true } ); throw new Error(error); } }, async updateCallback ({ commit, state }) { const config = { name: `form/UPDATE_CALLBACK/${state.sessionId}`, params: { callback: state.callback, beginningSessionId: state.beginningSessionId, previousSessionId: state.previousSessionId }, target: state.accountId }; try { await MessageService.sendMessage(config, true, { token: 'UNAUTHORIZED', accountId: state.accountId }); // const res = await state.eventManager.emit(config); // console.log('updateCallback res -> ', res); } catch (error) { commit( SET_MESSAGE, { type: 'error', message: error, status: 500 }, { root: true } ); throw new Error(error); } }, async submitNextStep ({ commit, state, dispatch, rootState }) { const transcription = _.get(rootState, 'output.genericModel'); if (transcription) { commit(WEBFORM_SET_FORM_STEP, { data: _.cloneDeep(transcription), transcription: true }); } const fields = await dispatch('prepareFormDataObject'); const formData = {}; fields.forEach((field) => { formData[field.name || field.id] = field.value; }); // console.log('submitNextStep formData -> ', formData); const config = { name: state.multiStepLevel === 0 && !state.sessionId ? `form/start-session/${state.key}` : `form/response/${state.sessionId}`, params: { callback: state.callback, formData, queryParams: state.queryParams, beginningSessionId: state.beginningSessionId, previousSessionId: state.previousSessionId }, target: state.accountId }; try { commit(WEBFORM_SET_KEY, { key: 'loading', payload: true }); const pagePayload = { key: state.key, formData }; EventBus.$emit('on-webform-next-page', pagePayload); const res = await MessageService.sendMessage(config, true, { token: 'UNAUTHORIZED', accountId: state.accountId }); // console.log('submitNextStep res -> ', res); /* if (!res) { const errorMessage = 'The form has expired'; EventBus.$emit('on-webform-error', { message: errorMessage }); commit(WEBFORM_SET_KEY, { key: 'loading', payload: false }); commit( SET_MESSAGE, { type: 'error', message: errorMessage, status: 500 }, { root: true } ); throw new Error(errorMessage); // console.log('submitNextStep error happened -> ', errorMessage); } */ // await state.eventManager.emit(config); if (res && res.sessionId) { commit(WEBFORM_SET_KEY, { key: 'sessionId', payload: res.sessionId }); } EventBus.$emit('on-webform-next-step-success', { result: res, formData }); commit(WEBFORM_SET_KEY, { key: 'updateCallback', payload: false }); } catch (error) { // const errorMessage = 'The form has expired'; // EventBus.$emit('on-webform-error', { message: errorMessage }); // console.log('submitNextStep error happened -> ', error); commit(WEBFORM_SET_KEY, { key: 'loading', payload: false }); commit( SET_MESSAGE, { type: 'error', message: error, status: 500 }, { root: true } ); throw new Error(error); } }, async prepareAllResponses ({ dispatch }) { const currentField = await dispatch('prepareFormDataObject'); const currentData = {}; currentField.forEach((field) => { currentData[field.name || field.id] = field.value; }); const fields = await dispatch('prepareFormDataObject', true); const formData = { response: currentData }; const allResponses = {}; fields.forEach((field) => { allResponses[field.name || field.id] = field.value; }); formData.allResponses = allResponses; return formData; }, async submitForm ({ commit, state, dispatch, rootState }) { EventBus.$emit('on-webform-submit'); const formData = await dispatch('prepareAllResponses'); const body = JSON.stringify({ type: 'submit', sessionId: state.sessionId, data: formData }); let response = null; try { let params = { p: state.key }; if (state.queryParams) { if (state.queryParams.q) { delete state.queryParams.q; } params = Object.assign(params, state.queryParams); } const urlParams = new URLSearchParams(Object.entries(params)); response = await fetch(`${state.endpoint}?` + urlParams, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body, queryParams: params }); const result = await response.json(); EventBus.$emit('on-webform-submit-success', { result, formData }); } catch (error) { const messageError = `Submit error: ${error}`; commit( SET_MESSAGE, { type: 'error', message: messageError, status: 500 }, { root: true } ); EventBus.$emit('on-webform-error', { message: messageError }); throw new Error(error); } if (!response.ok) { const messageError = 'The number of form submissions has already ended'; commit( SET_MESSAGE, { type: 'error', message: messageError, status: 500 }, { root: true } ); EventBus.$emit('on-webform-error', { message: messageError }); throw new Error(messageError); } if (state.multiStepForm) { commit(WEBFORM_CLEAR_STATE); } await dispatch('deleteEventManager'); commit(WEBFORM_SET_KEY, { key: 'sessionId', payload: undefined }); commit(`output/${OUTPUT_RESET_GENERIC_MODEL}`, null, { root: true }); clearLSByVuexPersistedKey(); }, async cancelForm ({ commit, state, dispatch }) { EventBus.$emit('on-webform-cancel'); const formData = await dispatch('prepareAllResponses'); const body = JSON.stringify({ type: 'cancel', sessionId: state.sessionId, data: formData }); let response = null; try { let params = { p: state.key }; if (state.queryParams) { if (state.queryParams.q) { delete state.queryParams.q; } params = Object.assign(params, state.queryParams); } const urlParams = new URLSearchParams(Object.entries(params)); response = await fetch(`${state.endpoint}?` + urlParams, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body, queryParams: params }); const result = await response.json(); EventBus.$emit('on-webform-cancel-success', { result, formData }); } catch (error) { commit( SET_MESSAGE, { type: 'error', message: error, status: 500 }, { root: true } ); throw new Error(error); } if (state.multiStepForm) { commit(WEBFORM_CLEAR_STATE); } await dispatch('deleteEventManager'); commit(WEBFORM_SET_KEY, { key: 'sessionId', payload: undefined }); commit(`output/${OUTPUT_RESET_GENERIC_MODEL}`, null, { root: true }); clearLSByVuexPersistedKey(); }, async initWebForm ({ commit, state, dispatch }, { $route, formUrl }) { commit(CLEAR_MESSAGE, null, { root: true }); let accountId, key, beginningSessionId, previousSessionId, env, EMBUS_WSS_URL; if ($route) { env = $route.params.env; accountId = $route.params.accountId; key = $route.params.key; EMBUS_WSS_URL = $route.params.embusWssUrl; } // set webform key // console.log('setting key by formUrl -> ', formUrl); if (formUrl) { env = formUrl.env; accountId = formUrl.accountId; key = formUrl.key; EMBUS_WSS_URL = formUrl.EMBUS_WSS_URL; } // console.log('initWebForm state.key -> ', state.key); // console.log('initWebForm key -> ', key); if (state.key && (state.key !== key)) { commit(WEBFORM_RESET_STATE); } if ($route && $route.query) { beginningSessionId = $route.query.beginningSessionId; previousSessionId = $route.query.previousSessionId; commit(WEBFORM_SET_KEY, { key: 'queryParams', payload: $route.query }); } if (beginningSessionId && previousSessionId) { commit(WEBFORM_SET_KEY, { key: 'beginningSessionId', payload: beginningSessionId }); commit(WEBFORM_SET_KEY, { key: 'previousSessionId', payload: previousSessionId }); } if (EMBUS_WSS_URL) { commit(WEBFORM_SET_EMBUS_WSS_URL, { payload: EMBUS_WSS_URL }); } if (env) { commit(WEBFORM_SET_ENV, { payload: env }); } function b64DecodeUnicode (str) { // Going backwards: from bytestream, to percent-encoding, to original string. return decodeURIComponent( atob(str) .split('') .map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }) .join('') ); } const encryptAccountId = b64DecodeUnicode(accountId); commit(WEBFORM_SET_KEY, { key: 'accountId', payload: encryptAccountId }); const endpoint = `${ state.env ? 'https://sdkapi.' + state.env + '.api.onereach.ai' : config.SDK_API_URL }/http/${encryptAccountId}/ephemeral-web-page`; if (!endpoint || !key) { const errorMessage = 'Missing parameters (endpoint, key)'; commit( SET_MESSAGE, { type: 'error', message: errorMessage }, { root: true } ); EventBus.$emit('on-webform-error', { message: errorMessage }); throw new Error(errorMessage); } commit(WEBFORM_SET_KEY, { key: 'endpoint', payload: endpoint }); commit(WEBFORM_SET_KEY, { key: 'key', payload: key }); try { await dispatch('getGenericDataModel'); } catch (error) { console.error(error); EventBus.$emit('on-webform-submit-error', error); throw new Error(error); } } }; const mutations = { [WEBFORM_RESET_STATE] (state) { // console.log('WEBFORM_RESET_STATE state -> ', state); Object.keys(initialState).forEach(key => { state[key] = initialState[key]; }); }, [WEBFORM_CLEAR_STATE] (state) { state.multiStepForm = false; state.multiStepLevel = 0; state.multiStepData = [{ goBack: false, isCancelHandling: false, endOfForm: false }]; }, [WEBFORM_SET_FORM_STEP] (state, payload) { if (state.multiStepData[state.multiStepLevel]) { const { goBack, isCancelHandling, stepId, endOfForm, data, transcription } = payload; // console.log('WEBFORM_SET_FORM_STEP payload -> ', payload); if (transcription) { state.multiStepData[state.multiStepLevel].data = data; } else { // console.log('WEBFORM_SET_FORM_STEP !transcription stepId -> ', stepId); // console.log('WEBFORM_SET_FORM_STEP !transcription multiStepLevel -> ', state.multiStepLevel); /* if (stepId !== state.multiStepData[state.multiStepLevel].stepId) { state.multiStepData[state.multiStepLevel].data = data; state.multiStepData[state.multiStepLevel].stepId = stepId; } */ state.multiStepData[state.multiStepLevel].stepId = stepId; state.multiStepData[state.multiStepLevel].goBack = goBack; state.multiStepData[state.multiStepLevel].isCancelHandling = isCancelHandling; state.multiStepData[state.multiStepLevel].endOfForm = endOfForm; } } else { // console.log('WEBFORM_SET_FORM_STEP else payload -> ', payload); state.multiStepData.push(payload); } }, [WEBFORM_SET_ENV] (state, { payload }) { if (!payload) return; state.env = payload; }, [WEBFORM_SET_EMBUS_WSS_URL] (state, { payload }) { if (!payload) return; state.EMBUS_WSS_URL = payload; }, [WEBFORM_SET_KEY] (state, { key, payload }) { if (!key) return; state[key] = payload; } }; export default { namespaced: true, state: () => _.cloneDeep(initialState), getters, actions, mutations };