Skip to content
Snippets Groups Projects
blubber.js 3.79 KiB
Newer Older
const Blubber = {
    init() {
        const blubberPage = document.querySelector('#blubber-index, #messenger-course, .blubber_panel.vueinstance');
        if (blubberPage !== null) {
            const blubberPanel = document.querySelector('.blubber_panel');
            if (blubberPanel !== null) {
                connectBlubber(blubberPanel, 'BlubberCommunityPage');
        $(document).on('dialog-open', function (event, { dialog }) {
            const blubberPanel = dialog.querySelector('.blubber_panel');
            if (blubberPanel !== null) {
                connectBlubber(blubberPanel, 'BlubberDialogPanel');

        function connectBlubber(blubberPanel, componentName) {
            return Promise.all([window.STUDIP.Vue.load(), Blubber.plugin()]).then(
                ([{ Vue, createApp, store }, BlubberPlugin]) => {
                    Vue.use(BlubberPlugin, { store });
                    const { initialThreadId, search } = blubberPanel.dataset;
                    return createApp({
                        el: blubberPanel,
                        render: (h) => h(Vue.component(componentName), { props: { initialThreadId, search } }),
                    });
    plugin() {
        return import('@/vue/plugins/blubber.js').then(({ BlubberPlugin }) => BlubberPlugin);
    },
    refreshThread(data) {
        STUDIP.eventBus.emit('studip:select-blubber-thread', data.thread_id);
    followunfollow(thread_id, follow) {
        const elements = $(`.blubber_panel .followunfollow[data-thread_id="${thread_id}"]`);
        if (follow === undefined) {
            follow = elements.hasClass('unfollowed');
        }
        elements.addClass('loading');

        return STUDIP.Vue.load().then(async ({ store }) => {
            return store.dispatch('studip/blubber/changeThreadSubscription', {
                id: thread_id,
                subscribe: follow,
            });
        }).then(() => {
            elements.attr('aria-pressed', follow ? 'true' : 'false');
            elements.toggleClass('unfollowed', !follow);
        }).finally(() => {
            elements.removeClass('loading');
        });
    },
    Composer: {
        vue: null,
        init() {
            STUDIP.Vue.load()
                .then(({ createApp }) => {
                    let components = STUDIP.Blubber.components;
                    return createApp({
                        el: '#blubber_contact_ids',
                        data() {
                            return {
                                users: [],
                            };
                        methods: {
                            addUser: function (user_id, name) {
                                this.users.push({
                                    user_id: user_id,
                                    name: name,
                                });
                            },
                            removeUser: function (event) {
                                let user_id = $(event.target).closest('li').find('input').val();
                                for (let i in this.users) {
                                    if (this.users[i].user_id === user_id) {
                                        this.$delete(this.users, i);
                                    }
                            },
                            clearUsers: function () {
                                this.users = [];
                            },
                        components,
                    });
                })
                .then((app) => {
                    STUDIP.Blubber.Composer.vue = app;
};

export default Blubber;