view mam.js @ 34:45bd945c5722

Change all blur events to change, prevents a stanza when no change occured.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 23 Dec 2018 20:31:02 +0100
parents 6c620e9f7d2c
children 6d861d881b96
line wrap: on
line source

'use strict';

function initMAM(connection) {
    const prefs_default = document.getElementById('mam-prefs-default');
    const prefs_always = document.getElementById('mam-prefs-always');
    const prefs_never = document.getElementById('mam-prefs-never');
    const prefs_spinner = document.getElementById('mam-prefs-spinner');

    const mam_retrieve = document.getElementById('mam-retrieve');
    const download_button = document.getElementById('mam-download');
    const retrieve_spinner = document.getElementById('mam-retrieve-spinner');

    const mam_data = [];

    download_button.disabled = true;

    const iq = $iq({type: 'get'})
        .c('prefs', {xmlns: NS.mam});
    connection.sendIQ(iq, onMAMPrefs, onMAMPrefsError.bind(null, 'query failed.'));
    displaySpinner(prefs_spinner);

    function onMAMPrefs(result_iq)
    {
        const prefs = parseXPath(result_iq, './mam:prefs');
        if (prefs == null)
            return onMAMPrefsError('server error.');
        const default_ = prefs.getAttributeNS(null, 'default');
        prefs_default.value = default_;
        prefs_default.disabled = false;
        hideSpinner(prefs_spinner);
        const always = parseXPath(prefs, './mam:always/mam:jid', XPathResult.ORDERED_NODE_ITERATOR_TYPE);
        const always_array = [];
        while (true) {
            const item = always.iterateNext();
            if (!item)
                break;
            const jid = item.textContent;
            always_array.push(jid);
        }
        prefs_always.value = always_array.join('\n');
        const never = parseXPath(prefs, './mam:never/mam:jid', XPathResult.ORDERED_NODE_ITERATOR_TYPE);
        const never_array = [];
        while (true) {
            const item = never.iterateNext();
            if (!item)
                break;
            const jid = item.textContent;
            never_array.push(jid);
        }
        prefs_never.value = never_array.join('\n');
    }

    function onMAMPrefsError(string)
    {
        console.log('Failed to retrieve your message archiving preferences: ' + string);
        spinnerError(prefs_spinner);
    }

    function submitPrefs(evt) {
        const iq = $iq({type: 'set'})
            .c('prefs', {xmlns: NS.mam, 'default': prefs_default.value})
                .c('always');
        const always_array = prefs_always.value.split('\n');
        for (let line of always_array) {
            iq.c('jid').t(line).up();
        }
        iq.up().c('never');
        const never_array = prefs_never.value.split('\n');
        for (let line of never_array) {
            iq.c('jid').t(line).up();
        }
        connection.sendIQ(iq, onPrefsSet, onPrefsError);
        displaySpinner(prefs_spinner);
    }

    prefs_default.addEventListener('change', submitPrefs);
    prefs_always.addEventListener('change', submitPrefs);
    prefs_never.addEventListener('change', submitPrefs);

    function onPrefsSet(iq)
    {
        console.log('MAM preferences successfully updated.');
        spinnerOk(prefs_spinner);
    }

    function onPrefsError(iq)
    {
        console.log('Error while changing MAM preferences.');
        spinnerError(prefs_spinner);
    }

    mam_retrieve.addEventListener('click', function (evt) {
        connection.mam.query(null, {
            onMessage: function (message, delay, id) {
                console.log('Got a MAM message:', message, delay, id);
                const result = document.createElementNS(NS.mam, 'result');
                result.setAttributeNS(null, 'id', id);
                const forwarded = document.createElementNS(NS.forward, 'forwarded');
                forwarded.appendChild(delay);
                forwarded.appendChild(message);
                result.appendChild(forwarded);
                mam_data.push(result);
            },
            onComplete: function () {
                console.log('Received all messages, you can now download a backup of your archive.');
                download_button.disabled = false;
                spinnerOk(retrieve_spinner);
            },
        });
        displaySpinner(retrieve_spinner);
    });

    download_button.addEventListener('click', function (evt) {
        // TODO: extend XEP-0227 with MAM support.
        const messages = document.createElementNS('https://prosody.im/protocol/pie-mam', 'message-archive');
        for (let result of mam_data)
            messages.appendChild(result);
        const blob = new Blob([messages.outerHTML], {type: 'text/xml'});
        const link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
        link.hidden = false;
        link.href = URL.createObjectURL(blob);
        link.download = Strophe.getBareJidFromJid(connection.jid) + '-archive.xml';
        console.log(link.download);
        document.body.appendChild(link);
        link.click();
        URL.revokeObjectURL(link.href);
        document.body.removeChild(link);
    });
}