Home Reference Source

js/template/UserTemplate.js

import Template from '~/template/Template';
import SVG from '~/models/Request/SVG';
import ButtonTemplate, { ButtonColor } from '~/template/ButtonTemplate';
import FollowButtonController from '~/controllers/FollowButtonController';
import Auth from '~/models/Auth';

/**
 * A user template for a list of users (generates `li` nodes)
 */
export default class UserTemplate extends Template {
    /**
     * A user element generally in a list of more users. Really basic
     * @param {User} user - The user to display
     */
    constructor(user) {
        super(<li class="user-item"/>);

        /** @type {User} */
        this.user = user;

        /** @type {?FollowButtonController} */
        this.followButtonController = null;

        return (async () => {

            const auth = Auth.shared;
            const isAuthorized = auth.isAuthorized;

            let followColumn = <DocumentFragment/>;

            if (isAuthorized && !user.isMe()) {
                const followButton = new ButtonTemplate({
                    icon: await SVG.load(user.isFollowing ? 'unfollow' : 'follow'),
                    text: user.isFollowing ? 'Unfollow' : 'Follow',
                    color: ButtonColor.accentBorder
                });

                followButton.isActive = user.isFollowing;
                followButton.hasShadow = false;
                followButton.isSmall = true;

                const followButtonNode = followButton.unique();

                this.followButtonController = new FollowButtonController(followButtonNode, auth, user);

                followColumn = (
                    <div class="user-item__column">
                        { followButtonNode }
                    </div>
                );
            }

            const chevron = await SVG.load('right-chevron');
            this.underlyingNode.appendChild(
                <DocumentFragment>
                    <a href={ user.profilePage } target="_blank" class="user-item__column">
                        <img class="user-item__avatar" src={user.avatar} />
                    </a>
                    <a href={ user.profilePage } target="_blank" class="user-item__column user-item__column--size-wide user-item__name">
                        <span>{ user.name }</span>
                        { chevron }
                    </a>
                    { followColumn }
                </DocumentFragment>
            )

            return this;
        })();
    }
}