# sequra/3.1.0/assets/js/src/core/SettingsController.js

seQura, version 3.1.0. 319 lines.

- Page: https://pluginprobe.com/plugins/sequra/3.1.0/code/assets/js/src/core/SettingsController.js
- Raw: https://pluginprobe.com/plugins/sequra/3.1.0/raw/assets/js/src/core/SettingsController.js
- Modified: 2024-10-29T15:19:22+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/sequra/3.1.0/code/assets/js/src/core/SettingsController.js#L10-L20`.

```javascript
if (!window.SequraFE) {
    window.SequraFE = {};
}

(function () {
    /**
     * Handles settings page logic.
     *
     * @param {{
     * getConnectionDataUrl: string,
     * getWidgetSettingsUrl: string,
     * getGeneralSettingsUrl: string,
     * getOrderStatusMappingSettingsUrl: string,
     * getShopOrderStatusesUrl: string,
     * getShopCategoriesUrl: string,
     * getShopPaymentMethodsUrl: string,
     * getSellingCountriesUrl: string,
     * getCountrySettingsUrl: string,
     * getPaymentMethodsUrl: string,
     * getAllPaymentMethodsUrl: string,
     * validateConnectionDataUrl: string,
     * disconnectUrl: string,
     * page: string
     * }} configuration
     * @constructor
     */
    function SettingsController(configuration) {
        const {templateService, elementGenerator: generator, utilities, formFactory} = SequraFE;

        /** @type AjaxServiceType */
        const api = SequraFE.ajaxService;
        let currentStoreId = '';
        /** @type Version */
        let version;
        /** @type Store[] */
        let stores;
        /** @type CountrySettings[] **/
        let countrySettings;
        /** @type ConnectionSettings **/
        let connectionSettings;
        /** @type WidgetSettings **/
        let widgetSettings;

        /**
         * Displays page content.
         *
         * @param {{ state?: string, storeId: string }} config
         */
        this.display = ({storeId}) => {
            utilities.showLoader();
            currentStoreId = storeId;
            templateService.clearMainPage();
            stores = SequraFE.state.getData('stores');
            version = SequraFE.state.getData('version');
            connectionSettings = SequraFE.state.getData('connectionSettings');
            countrySettings = SequraFE.state.getData('countrySettings');
            widgetSettings = SequraFE.state.getData('widgetSettings');

            initializePage();
            renderPage();
        };

        /**
         * Handles rendering of a form based on state.
         */
        const renderPage = () => {
            utilities.showLoader();
            let page = SequraFE.state.getPage();
            let renderer;
            let promises;

            if (!SequraFE.pages.settings.includes(page)) {
                page = SequraFE.pages.settings[0];
            }

            switch (page) {
                case SequraFE.appPages.SETTINGS.CONNECTION:
                    renderer = renderConnectionSettingsForm;
                    promises = Promise.all([])
                    break;
                case SequraFE.appPages.SETTINGS.ORDER_STATUS:
                    renderer = renderOrderStatusMappingSettingsForm;
                    promises = Promise.all([
                        SequraFE.isPromotional ? [] :
                            SequraFE.state.getData('orderStatusSettings') ?? api.get(configuration.getOrderStatusMappingSettingsUrl, null, SequraFE.customHeader),
                        SequraFE.isPromotional ? [] :
                            SequraFE.state.getData('shopOrderStatuses') ?? api.get(configuration.getShopOrderStatusesUrl, null, SequraFE.customHeader)
                    ])
                    break;
                case SequraFE.appPages.SETTINGS.WIDGET:
                    renderer = renderWidgetSettingsForm;
                    promises = Promise.all([
                        SequraFE.state.getData('paymentMethods') ?? api.get(configuration.getPaymentMethodsUrl.replace('{merchantId}', countrySettings[0].merchantId), null, SequraFE.customHeader),
                        SequraFE.state.getData('allPaymentMethods') ?? api.get(configuration.getAllPaymentMethodsUrl, null, SequraFE.customHeader)
                    ])
                    break;
                default:
                    renderer = renderGeneralSettingsForm;
                    promises = Promise.all([
                        SequraFE.isPromotional ? [] :
                            SequraFE.state.getData('generalSettings') ?? api.get(configuration.getGeneralSettingsUrl, null, SequraFE.customHeader),
                        SequraFE.isPromotional ? [] :
                            SequraFE.state.getData('shopCategories') ?? api.get(configuration.getShopCategoriesUrl, null, SequraFE.customHeader),
                        SequraFE?.generalSettings?.useReplacementPaymentMethod && !SequraFE.isPromotional ?
                            SequraFE.state.getData('shopPaymentMethods') ?? api.get(configuration.getShopPaymentMethodsUrl, null, SequraFE.customHeader) : [],
                        SequraFE.state.getData('sellingCountries') ?? api.get(configuration.getSellingCountriesUrl, null, SequraFE.customHeader),
                    ])
            }

            promises
                .then((array) => renderer(...array))
        };

        /**
         * Renders the connection settings form.
         */
        const renderConnectionSettingsForm = () => {
            const form = formFactory.getInstance(
                'connectionSettings',
                {connectionSettings, countrySettings},
                {...configuration, appState: SequraFE.appStates.SETTINGS}
            );

            form?.render();
        }

        /**
         * Renders the order status mappings settings form.
         *
         * @param orderStatusSettings
         * @param shopOrderStatuses
         */
        const renderOrderStatusMappingSettingsForm = (orderStatusSettings, shopOrderStatuses) => {
            if (!SequraFE.state.getData('orderStatusSettings')) {
                SequraFE.state.setData('orderStatusSettings', orderStatusSettings)
            }

            if (!SequraFE.state.getData('shopOrderStatuses')) {
                SequraFE.state.setData('shopOrderStatuses', shopOrderStatuses)
            }

            const form = formFactory.getInstance(
                'orderStatusMappingSettings',
                {orderStatusSettings, shopOrderStatuses},
                {...configuration}
            );

            form?.render();
        }

        /**
         * Renders the widget settings form.
         *
         * @param paymentMethods
         * @param allPaymentMethods
         */
        const renderWidgetSettingsForm = (paymentMethods, allPaymentMethods) => {
            if (!SequraFE.state.getData('paymentMethods')) {
                SequraFE.state.setData('paymentMethods', paymentMethods)
            }

            if (!SequraFE.state.getData('allPaymentMethods')) {
                SequraFE.state.setData('allPaymentMethods', allPaymentMethods)
            }

            const form = formFactory.getInstance(
                'widgetSettings',
                {widgetSettings, connectionSettings, countrySettings, paymentMethods, allPaymentMethods},
                {...configuration, appState: SequraFE.appStates.SETTINGS}
            );

            form?.render();
        }

        /**
         * Renders the general settings form.
         *
         * @param generalSettings
         * @param shopCategories
         * @param shopPaymentMethods
         * @param sellingCountries
         */
        const renderGeneralSettingsForm = (
            generalSettings,
            shopCategories,
            shopPaymentMethods,
            sellingCountries,
        ) => {
            saveFetchedDataToDataStore(generalSettings, shopCategories, shopPaymentMethods, sellingCountries);

            const form = formFactory.getInstance(
                'generalSettings',
                {
                    generalSettings,
                    shopCategories,
                    shopPaymentMethods,
                    sellingCountries,
                    connectionSettings,
                    countrySettings
                },
                {...configuration, appState: SequraFE.appStates.SETTINGS}
            );

            form?.render();
        }

        /**
         * Saves data to data store if fetched on render.
         *
         * @param generalSettings
         * @param shopCategories
         * @param shopPaymentMethods
         * @param sellingCountries
         */
        const saveFetchedDataToDataStore = (generalSettings, shopCategories, shopPaymentMethods, sellingCountries) => {
            if (!SequraFE.state.getData('generalSettings')) {
                SequraFE.state.setData('generalSettings', generalSettings)
            }

            if (!SequraFE.state.getData('shopCategories')) {
                SequraFE.state.setData('shopCategories', shopCategories)
            }

            if (!SequraFE.state.getData('shopPaymentMethods')) {
                SequraFE.state.setData('shopPaymentMethods', shopPaymentMethods)
            }

            if (!SequraFE.state.getData('sellingCountries')) {
                SequraFE.state.setData('sellingCountries', sellingCountries)
            }
        }

        /**
         * Get sidebar link options.
         *
         * @returns {unknown[]}
         */
        const getLinkConfiguration = () => {
            return SequraFE.pages.settings.map((link) => {
                const activePage = SequraFE.state.getPage() ?? SequraFE.pages.settings[0]
                switch (link) {
                    case SequraFE.appPages.SETTINGS.GENERAL:
                        return {
                            label: 'sidebar.generalSettings',
                            href: '#settings-general',
                            icon: 'general',
                            isActive: activePage === SequraFE.appPages.SETTINGS.GENERAL
                        }
                    case SequraFE.appPages.SETTINGS.CONNECTION:
                        return {
                            label: 'sidebar.connectionSettings',
                            href: '#settings-connection',
                            icon: 'connection',
                            isActive: activePage === SequraFE.appPages.SETTINGS.CONNECTION
                        }
                    // case SequraFE.appPages.SETTINGS.ORDER_STATUS:
                    //     return {
                    //         label: 'sidebar.orderStatusSettings',
                    //         href: '#settings-order_status',
                    //         icon: 'order',
                    //         isActive: activePage === SequraFE.appPages.SETTINGS.ORDER_STATUS,
                    //     }
                    case SequraFE.appPages.SETTINGS.WIDGET:
                        return {
                            label: 'sidebar.widgetSettings',
                            href: '#settings-widget',
                            icon: 'widget',
                            isActive: activePage === SequraFE.appPages.SETTINGS.WIDGET
                        }
                    default:
                        return null
                }
            });
        }

        /**
         * Initializes general settings state content.
         */
        const initializePage = () => {
            const pageWrapper = document.getElementById('sq-page-wrapper')

            pageWrapper.append(
                generator.createElement('div', 'sq-page-content-wrapper sqv--settings', '', null, [
                    SequraFE.components.PageHeader.create(
                        {
                            currentVersion: version?.current,
                            newVersion: {
                                versionLabel: version?.new,
                                versionUrl: version?.downloadNewVersionUrl
                            },
                            mode: connectionSettings.environment === 'live' ? connectionSettings.environment : 'test',
                            activeStore: currentStoreId,
                            stores: stores.map((store) => ({label: store.storeName, value: store.storeId})),
                            onChange: (storeId) => {
                                if (storeId !== SequraFE.state.getStoreId()) {
                                    SequraFE.state.setStoreId(storeId);
                                    window.location.hash = '';
                                    SequraFE.state.display();
                                }
                            },
                            menuItems: SequraFE.isPromotional ? [] : SequraFE.utilities.getMenuItems(SequraFE.appStates.SETTINGS)
                        }
                    ),
                    generator.createElement('div', 'sq-page-content', '', null, [getSidebarRow()]),
                    generator.createSupportLink()
                ]))
        }

        const getSidebarRow = () => {
            return generator.createElement('div', 'sq-content-row', '', null, [
                generator.createSettingsSidebar({links: getLinkConfiguration()}),
                generator.createElement('main', 'sq-content')
            ]);
        }
    }

    SequraFE.SettingsController = SettingsController;
})();

```
