Home Reference Source

js/controllers/NukeItemViewController.js

import PostButtonViewController from '~/controllers/PostButtonViewController';
import ErrorManager, { HandleUnhandledPromise } from '~/helpers/ErrorManager';
import PublishNuke from '~/models/Request/PublishNuke';
import ActionControllerDelegate from '~/delegate/ActionControllerDelegate';

export default class NukeItemViewController extends PostButtonViewController {
    /**
     * @param {Object} o options
     * @param {HTMLElement} o.trigger Trigger for deletion
     * @param {Post|Answer} o.item item object
     */
    constructor({ trigger, item }) {
        super(trigger);

        /** @type {Answer|Post} */
        this.item = item;
        trigger.addEventListener("click", ::this.trigger)

        /** @type {ActionControllerDelegate} */
        this.delegate = new ActionControllerDelegate();
    }

    /**
     * Attempt to delete
     */
    trigger() {
        // Ignore delete if we're loading
        if (this.isLoading) return;

        const isSure = window.confirm(`Are you sure you want to ADMIN NUKE this ${this.item.endpoint}?`);
        if (isSure) {
            this.nuke()
                .catch(HandleUnhandledPromise);
        }
    }

    /**
     * Nukes the item from orbit (delete forever).
     */
    async nuke() {
        this.isLoading = true;

        const request = new PublishNuke(this.item);
        const finalResult = await request.run();
        await this.delegate.didSetStateTo(this, finalResult);

        this.isLoading = false;
    }
}