catarse/catarse.js

View on GitHub
legacy/src/c/projects-display.js

Summary

Maintainability
C
1 day
Test Coverage
import m from 'mithril';
import prop from 'mithril/stream';
import projectFilters from '../vms/project-filters-vm';
import models from '../models';
import { catarse } from '../api';
import _ from 'underscore';
import h from '../h';
import projectRow from './project-row';
import projectRowWithHeader from './project-row-with-header';

const projectsDisplay = {
    oninit: function(vnode) {
        const EXPERIMENT_CASE_CURRENT = 'EXPERIMENT_CASE_CURRENT',
            EXPERIMENT_CASE_6SUBHOM = 'EXPERIMENT_CASE_6SUBHOM',
            EXPERIMENT_CASE_3SUBHOM = 'EXPERIMENT_CASE_3SUBHOM';

        // FIXED HOME CASE, 'EXPERIMENT_CASE_3SUBHOM'
        window.__GO_EXPE_NAME = EXPERIMENT_CASE_3SUBHOM;

        const filters = projectFilters().filters,
            currentCase = prop(window.__GO_EXPE_NAME == EXPERIMENT_CASE_CURRENT),
            subHomeWith6 = prop(window.__GO_EXPE_NAME == EXPERIMENT_CASE_6SUBHOM),
            subHomeWith3 = prop(window.__GO_EXPE_NAME == EXPERIMENT_CASE_3SUBHOM),
            sample3 = _.partial(_.sample, _, 3),
            loader = catarse.loaderWithToken,
            project = models.project,
            subHomeWith6CollectionsFilters = ['projects_we_love_not_sub', 'sub', 'covid_19', 'contributed_by_friends'],
            windowEventNOTDispatched = true;

        project.pageSize(20);

        const collectionsMapper = (sampleNo, name) => {
            const f = filters[name],
                forSubPledged = name === 'sub' ? { pledged: 'gte.1000' } : {},
                defaultOptions = {
                    order: 'score.desc',
                    open_for_contributions: 'eq.true',
                    limit: '10',
                    offset: '0',
                },
                cLoader = loader(project.getPageOptions(_.extend(forSubPledged, defaultOptions, f.filter.parameters()))),
                collection = prop([]);

            cLoader
                .load()
                .then(
                    _.compose(
                        collection,
                        sampleNo
                    )
                )
                .then(() => m.redraw());

            const query = f.query || {};
            
            if (!f.query) {
                if (f.mode) {
                    query.mode = f.mode;
                } else {
                    query.filter = f.keyName;
                }
            }

            return {
                title: f.nicename,
                hash: name === 'score' ? 'all' : f.keyName,
                mode: f.mode,
                collection,
                query,
                loader: cLoader,
                showFriends: name === 'contributed_by_friends',
                badges: !_.isUndefined(f.header_badges) ? f.header_badges : [],
            };
        };

        const aonAndFlex_Sub_3 = _.map(subHomeWith6CollectionsFilters, collectionsMapper.bind(collectionsMapper, sample3));

        vnode.state = {
            aonAndFlex_Sub_3,
            currentCase,
            subHomeWith6,
            subHomeWith3,
            windowEventNOTDispatched,
        };
    },

    view: function({ state }) {
        if (state.windowEventNOTDispatched) {
            window.dispatchEvent(new Event('on_projects_controller_loaded'));
            state.windowEventNOTDispatched = false;
        }

        if (state.subHomeWith6()) {
            return m(
                'div',
                _.map(state.aonAndFlex_Sub_6, (collection, index) =>
                    m(projectRowWithHeader, {
                        collection,
                        title: collection.title,
                        ref: `home_${collection.hash === 'all' ? 'score' : collection.hash}`,
                        showFriends: collection.showFriends,
                        isOdd: index & 1,
                    })
                )
            );
        } else if (state.subHomeWith3()) {
            return m(
                'div',
                _.map(state.aonAndFlex_Sub_3, (collection, index) =>
                    m(projectRowWithHeader, {
                        collection,
                        title: collection.title,
                        ref: `home_${collection.hash === 'all' ? 'score' : collection.hash}`,
                        showFriends: collection.showFriends,
                        isOdd: index & 1,
                    })
                )
            );
        } else {
            return m(
                'div',
                _.map(state.collections, collection =>
                    m(projectRow, {
                        collection,
                        title: collection.title,
                        ref: `home_${collection.hash === 'all' ? 'score' : collection.hash}`,
                        showFriends: collection.showFriends,
                    })
                )
            );
        }
    },
};

export default projectsDisplay;