PluginProbe
seQura / 3.2.2
seQura v3.2.2
4.3.4 4.3.3 4.3.2 4.3.1 trunk 2.0.0 2.0.10 2.0.11 2.0.12 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 3.0.0 3.0.2 3.0.5 3.0.6 3.0.7 3.1.0 3.1.1 3.2.0 3.2.1 3.2.2 4.0.0 All 30 releases
sequra / assets / js / src / core / OnboardingController.js

OnboardingController.js in seQura 3.2.2, at assets/js/src/core/OnboardingController.js

256 lines 9.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 if (!window.SequraFE) {
2 window.SequraFE = {};
3 }
4
5 (function () {
6 /**
7 * Handles onboarding page logic.
8 *
9 * @param {{
10 * validateConnectionDataUrl: string,
11 * getConnectionDataUrl: string,
12 * saveConnectionDataUrl: string,
13 * getSellingCountriesUrl: string,
14 * getCountrySettingsUrl: string,
15 * saveCountrySettingsUrl: string,
16 * getWidgetSettingsUrl: string,
17 * saveWidgetSettingsUrl: string,
18 * getPaymentMethodsUrl: string,
19 * page: string}} configuration
20 * @constructor
21 */
22 function OnboardingController(configuration) {
23 /** @type AjaxServiceType */
24 const api = SequraFE.ajaxService;
25 const {
26 templateService,
27 elementGenerator: generator,
28 utilities,
29 formFactory,
30 } = SequraFE;
31
32 /** @type string */
33 let currentStoreId = '';
34 /** @type Version */
35 let version;
36 /** @type Store[] */
37 let stores;
38 /** @type CountrySettings[] **/
39 let countrySettings;
40 /** @type ConnectionSettings **/
41 let connectionSettings;
42 /** @type WidgetSettings **/
43 let widgetSettings;
44
45 /**
46 * Displays page content.
47 *
48 * @param {{ state?: string, storeId: string }} config
49 */
50 this.display = ({storeId}) => {
51 utilities.showLoader();
52 currentStoreId = storeId;
53 templateService.clearMainPage();
54 stores = SequraFE.state.getData('stores');
55 version = SequraFE.state.getData('version');
56 connectionSettings = SequraFE.state.getData('connectionSettings');
57 countrySettings = SequraFE.state.getData('countrySettings');
58 widgetSettings = SequraFE.state.getData('widgetSettings');
59
60 initializePage();
61 renderPage();
62 };
63
64 /**
65 * Handles rendering of a form based on state.
66 */
67 const renderPage = () => {
68 utilities.showLoader();
69 let page = SequraFE.state.getPage();
70 let renderer;
71 let promises;
72
73 switch (page) {
74 case SequraFE.appPages.ONBOARDING.COUNTRIES:
75 renderer = renderCountrySettingsForm;
76 promises = Promise.all([
77 SequraFE.state.getData('sellingCountries') ?? api.get(configuration.getSellingCountriesUrl, null, SequraFE.customHeader)
78 ])
79 break;
80 case SequraFE.appPages.ONBOARDING.WIDGETS:
81 renderer = renderWidgetSettingsForm;
82 promises = Promise.all([
83 SequraFE.state.getData('paymentMethods') ?? api.get(configuration.getPaymentMethodsUrl.replace('{merchantId}', countrySettings[0].merchantId), null, SequraFE.customHeader),
84 ])
85 break;
86 default:
87 renderer = renderConnectionSettingsForm;
88 promises = Promise.all([])
89 }
90
91 promises
92 .then((array) => renderer(...array))
93 .catch(() => {})
94 .finally(() => utilities.hideLoader());
95 };
96
97 /**
98 * Renders the country settings form.
99 *
100 * @param sellingCountries
101 */
102 const renderCountrySettingsForm = (sellingCountries) => {
103 if (!SequraFE.state.getData('sellingCountries')) {
104 SequraFE.state.setData('sellingCountries', sellingCountries)
105 }
106
107 const form = formFactory.getInstance(
108 'generalSettings',
109 {countrySettings, sellingCountries, connectionSettings},
110 {...configuration, appState: SequraFE.appStates.ONBOARDING}
111 );
112
113 form?.render();
114 }
115
116 /**
117 * Renders the widgets settings form.
118 *
119 * @param paymentMethods
120 */
121 const renderWidgetSettingsForm = (paymentMethods) => {
122 if (!SequraFE.state.getData('paymentMethods')) {
123 SequraFE.state.setData('paymentMethods', paymentMethods)
124 }
125
126 const form = formFactory.getInstance(
127 'widgetSettings',
128 {widgetSettings, connectionSettings, countrySettings, paymentMethods},
129 {...configuration, appState: SequraFE.appStates.ONBOARDING}
130 );
131
132 form?.render();
133 }
134
135 /**
136 * Renders the connection settings form.
137 */
138 const renderConnectionSettingsForm = () => {
139 const form = formFactory.getInstance(
140 'connectionSettings',
141 {connectionSettings},
142 {...configuration, appState: SequraFE.appStates.ONBOARDING}
143 );
144
145 form?.render();
146 }
147
148 /**
149 * Returns sidebar steps.
150 *
151 * @returns {unknown[]}
152 */
153 const getStepConfiguration = () => {
154 const firstStep = {
155 label: 'sidebar.stepOneLabel',
156 description: 'sidebar.stepOneDescription',
157 href: '#',
158 isCompleted: true
159 };
160
161 const lastStep = {
162 label: 'sidebar.stepFiveLabel',
163 href: '#',
164 }
165
166 const pageSteps = SequraFE.pages.onboarding.map((page) => {
167 const activePage = SequraFE.state.getPage() ?? SequraFE.pages.settings[0];
168
169 switch (page) {
170 case SequraFE.appPages.ONBOARDING.CONNECT:
171 return {
172 label: 'sidebar.stepTwoLabel',
173 href: '#onboarding-connect',
174 isCompleted: SequraFE.pages.onboarding.indexOf(SequraFE.state.getPage()) >
175 SequraFE.pages.onboarding.indexOf(SequraFE.appPages.ONBOARDING.CONNECT),
176 isActive: activePage === SequraFE.appPages.ONBOARDING.CONNECT
177 }
178 case SequraFE.appPages.ONBOARDING.COUNTRIES:
179 return {
180 label: 'sidebar.stepThreeLabel',
181 href: '#onboarding-countries',
182 isCompleted: SequraFE.pages.onboarding.indexOf(SequraFE.state.getPage()) >
183 SequraFE.pages.onboarding.indexOf(SequraFE.appPages.ONBOARDING.COUNTRIES),
184 isActive: activePage === SequraFE.appPages.ONBOARDING.COUNTRIES
185 }
186 case SequraFE.appPages.ONBOARDING.WIDGETS:
187 return {
188 label: 'sidebar.stepFourLabel',
189 href: '#onboarding-widgets',
190 isCompleted: SequraFE.pages.onboarding.indexOf(SequraFE.state.getPage()) >
191 SequraFE.pages.onboarding.indexOf(SequraFE.appPages.ONBOARDING.WIDGETS),
192 isActive: activePage === SequraFE.appPages.ONBOARDING.WIDGETS
193 }
194 }
195 });
196
197 return [firstStep, ...pageSteps, lastStep]
198 }
199
200 /**
201 * Initializes general onboarding state content.
202 */
203 const initializePage = () => {
204 const pageWrapper = document.getElementById('sq-page-wrapper')
205
206 pageWrapper.append(
207 generator.createElement('div', 'sq-page-content-wrapper sqv--onboarding', '', null, [
208 generator.createElement('div', 'sq-page-content', '', null, [
209 version?.current ? generator.createElement('div', 'sq-version-header', '', null, [
210 generator.createVersionBadge(version.current)
211 ]) : [],
212 getSetupWizardRow()
213 ]),
214 ]),
215 generator.createSupportLink()
216 )
217 }
218
219 const getSetupWizardRow = () => {
220 return generator.createElement(
221 'div',
222 `sq-content-row ${version?.current ? '' : 'sqs--no-version'}`,
223 '',
224 null,
225 [
226 generator.createWizardSidebar({
227 steps: getStepConfiguration()
228 }),
229 generator.createElement('main', 'sq-content', '', null, [
230 generator.createElement('div', 'sqp-content-header', '', null, [
231 generator.createElementFromHTML(SequraFE.imagesProvider.logo || ''),
232 !stores || stores?.length <= 1 ? [] : generator.createStoreSwitcher({
233 label: 'general.selectStore',
234 value: currentStoreId,
235 options: stores.map((store) => ({
236 label: store.storeName,
237 value: store.storeId
238 })),
239 onChange: (storeId) => {
240 if (storeId !== SequraFE.state.getStoreId()) {
241 SequraFE.state.setStoreId(storeId);
242 window.location.hash = '';
243 SequraFE.state.display();
244 }
245 }
246 })
247 ])
248 ])
249 ]
250 )
251 }
252 }
253
254 SequraFE.OnboardingController = OnboardingController;
255 })();
256