NodeBB/NodeBB

View on GitHub
public/src/admin/settings/email.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';


define('admin/settings/email', ['ace/ace', 'alerts', 'admin/settings'], function (ace, alerts) {
    const module = {};
    let emailEditor;

    module.init = function () {
        configureEmailTester();
        configureEmailEditor();
        handleDigestHourChange();

        $(window).off('action:admin.settingsLoaded', onSettingsLoaded)
            .on('action:admin.settingsLoaded', onSettingsLoaded);
        $(window).off('action:admin.settingsSaved', onSettingsSaved)
            .on('action:admin.settingsSaved', onSettingsSaved);
    };

    function onSettingsLoaded() {
        handleDigestHourChange();
        handleSmtpServiceChange();
    }

    function onSettingsSaved() {
        handleDigestHourChange();
        socket.emit('admin.user.restartJobs');
    }

    function configureEmailTester() {
        $('button[data-action="email.test"]').off('click').on('click', function () {
            socket.emit('admin.email.test', { template: $('#test-email').val() }, function (err) {
                if (err) {
                    console.error(err.message);
                    return alerts.error(err);
                }
                alerts.success('Test Email Sent');
            });
            return false;
        });
    }

    function configureEmailEditor() {
        $('#email-editor-selector').on('change', updateEmailEditor);

        emailEditor = ace.edit('email-editor');
        emailEditor.$blockScrolling = Infinity;
        emailEditor.setTheme('ace/theme/twilight');
        emailEditor.getSession().setMode('ace/mode/html');

        emailEditor.on('change', function () {
            const emailPath = $('#email-editor-selector').val();
            let original;
            ajaxify.data.emails.forEach(function (email) {
                if (email.path === emailPath) {
                    original = email.original;
                }
            });
            const newEmail = emailEditor.getValue();
            $('#email-editor-holder').val(newEmail !== original ? newEmail : '');
        });

        $('button[data-action="email.revert"]').off('click').on('click', function () {
            ajaxify.data.emails.forEach(function (email) {
                if (email.path === $('#email-editor-selector').val()) {
                    emailEditor.getSession().setValue(email.original);
                    $('#email-editor-holder').val('');
                }
            });
        });

        updateEmailEditor();
    }

    function updateEmailEditor() {
        ajaxify.data.emails.forEach(function (email) {
            if (email.path === $('#email-editor-selector').val()) {
                emailEditor.getSession().setValue(email.text);
                $('#email-editor-holder')
                    .val(email.text !== email.original ? email.text : '')
                    .attr('data-field', 'email:custom:' + email.path);
            }
        });
    }

    function handleDigestHourChange() {
        let hour = parseInt($('#digestHour').val(), 10);

        if (isNaN(hour)) {
            hour = 17;
        } else if (hour > 23 || hour < 0) {
            hour = 0;
        }

        socket.emit('admin.getServerTime', {}, function (err, now) {
            if (err) {
                return alerts.error(err);
            }

            const date = new Date(now.timestamp);
            const offset = (new Date().getTimezoneOffset() - now.offset) / 60;
            date.setHours(date.getHours() + offset);

            $('#serverTime').text(date.toLocaleTimeString());

            date.setHours(parseInt(hour, 10) - offset, 0, 0, 0);

            // If adjusted time is in the past, move to next day
            if (date.getTime() < Date.now()) {
                date.setDate(date.getDate() + 1);
            }

            $('#nextDigestTime').text(date.toLocaleString());
        });
    }

    function handleSmtpServiceChange() {
        function toggleCustomService() {
            const isCustom = $('[id="email:smtpTransport:service"]').val() === 'nodebb-custom-smtp';
            $('[id="email:smtpTransport:custom-service"]')[isCustom ? 'slideDown' : 'slideUp'](isCustom);
        }
        toggleCustomService();
        $('[id="email:smtpTransport:service"]').change(function () {
            toggleCustomService();

            const enabledEl = document.getElementById('email:smtpTransport:enabled');
            if (enabledEl) {
                if (!enabledEl.checked) {
                    enabledEl.checked = true;
                    alerts.alert({
                        message: '[[admin/settings/email:smtp-transport.auto-enable-toast]]',
                        timeout: 5000,
                    });
                }
            }
        });
    }

    return module;
});