Home Reference Source

js/template/LoginMethodTemplate.js

import Template from '~/template/Template';
import Theme from '~/models/Theme';
import Cross from '~/svg/Cross';

import { ButtonColor, ButtonStyle } from '~/template/ButtonTemplate';
import ProgressButtonTemplate from '~/template/ProgressButtonTemplate';

import { empty } from 'rxjs/index';
import { first, mapTo } from 'rxjs/operators';

/**
 * Template for a login method.
 */
export default class LoginMethodTemplate extends Template {

    /**
     * Create login template from infos _about_ template. Mind = blowk kaboom
     * @param {LoginMethod} loginMethod
     * @param {boolean} allowDelete - If allowed to delete
     */
    constructor(loginMethod, allowDelete) {
        const root = <div class="login-method"/>;
        super(root);

        const lastUsed = loginMethod.lastUsed ? moment(loginMethod.lastUsed).fromNow() : "never";
        const usedRecently = loginMethod.lastUsed && moment().diff(loginMethod.lastUsed, 'days') <= 7

        /** @type {LoginMethod} */
        this.loginMethod = loginMethod;

        /** @type {?RemoveButton}] */
        this.removeButton = null;

        let button = <DocumentFragment/>;
        if (allowDelete) {
            const removeButton = new ProgressButtonTemplate({
                text: 'remove',
                icon: Cross.cloneNode(true),
                color: ButtonColor.red,
                style: ButtonStyle.minimal
            });

            this.removeButton = removeButton;

            button = removeButton.unique();
        }

        root.appendChild(
            <DocumentFragment>
                <img class="login-method__column login-method__column--size-icon login-method__column--pad-around login-method__column--align-center" src={ Theme.current.staticImageForTheme(loginMethod.siteIcon) }/>
                <div class="login-method__column login-method__column--size-primary">
                    <span class="login-method__data login-method__data--style-primary">{ loginMethod.siteName }</span>
                    <span class="login-method__data login-method__data--style-value">{ loginMethod.identifier }</span>
                    <span class={`login-method__data login-method__data--style-detail ${usedRecently ? 'login-method__data--style-detail-highlight' : ""}`}>Last used { lastUsed }</span>
                </div>
                <div class="login-method__column login-method__column--align-center">
                    { button }
                </div>
            </DocumentFragment>
        );
    }

    /**
     * Called when removing. Emits the login method ID.
     * @return {Observable<Object>} emits object `{ method: ..., button: ... }`
     */
    observeRemove() {
        if (this.removeButton) {
            return this.removeButton
                .observeClick()
                .pipe(
                    first(),
                    mapTo(this));
        } else {
            return empty();
        }
    }
}