127.0.0.1:8000 watch-together / master src / js / home.js
master

Tree @master (Download .tar.gz)

home.js @masterraw · history · blame

require('../scss/style.scss');
require('../scss/home.scss');
const logger_commands = require('./utils/logger');
const $ = require('jquery');
const utils = require('./utils');
const websocket = require('./websocket');
const api = require('./utils/api');
import HugeUploader from 'huge-uploader';
const ui = require('./ui/common');
const copyToClipboard = require('./utils/copyToClipboard');
const pretty_bytes = require('pretty-bytes');
const query_string = require('query-string');

const $sidebar_items = $(".left-sidebar").children();

let qs = query_string.parse(location.search);
logger.log(qs);

if (qs.watchroom) {
    websocket.send({
        command: "start-watching",
        data: qs.watchroom
    });
}

$("#save_display_name").on("click", function() {
    utils.validate.keys({
        display_name: $("#display_name").val().trim()
    }, [
        ["display_name", "Username cannot be empty"]
    ]).then(function(data) {
        return api.post("/account/update/display-name", data);
    }).then(function(data) {
        ui.show_banner(data);
    }).catch(api.handle_error_message);
});

ui.init_new_password();

$("#save_new_password").on("click", function() {
    utils.validate.keys({
        current_password: $("#current_password").val(),
        new_password: $("#new_password").val()
    }, [
        ["current_password", "Current password required"],
        ["new_password", "Passwords don't match", password => password === $("#confirm_password").val()],
        ["new_password", "You must appease the password strength meter", password => utils.validate.password(password).score]
    ]).then(function(data) {
        return api.post("/account/update/password", data);
    }).then(function(data) {
        ui.show_banner(data);
    }).catch(api.handle_error_message);
});

$("#request_account_deletion").on("click", function() {
    api.post("/account/delete/request").then(function(data) {
        ui.show_banner(data);
        $("#deletion_code_wrapper").slideDown();
    }).catch(api.handle_error_message);
});

$("#submit_account_deletion").on("click", function() {
    utils.validate.keys({
        code: $("#deletion_code").val(),
        current_password: $("#deletion_current_password").val()
    }, [
        ["code", "You must enter the deletion code emailed to you"],
        ["current_password", "Current password required"]
    ]).then(function(data) {
        return api.post("/account/delete", data);
    }).then(function() {
        location.reload();
    }).catch(api.handle_error_message);
});

toggle_logger_settings_state(
    logger_commands.logs_enabled(),
    false
);
$("#toggle_logs").on("click", function() {
    toggle_logger_settings_state(
        logger_commands.toggle_logs(), true
    );
});

function toggle_logger_settings_state(enable, show_banner) {
    if (enable) {
        $("#logs_size").text(pretty_bytes(logger_commands.logs_memory_usage()));
        $("#logs_enabled_message").show();
        $("#logs_disabled_message").hide();
        $("#toggle_logs").text("Disable Logs");
        $("#export_logs").removeClass("disabled-button").on("click", function() {
            logger_commands.export_logs().then(function() {
                ui.show_banner({
                    message: "Logs Exported"
                });
                $("#logs_size").text(pretty_bytes(logger_commands.logs_memory_usage()));
            }).catch(api.handle_error_message);
        });
        if (show_banner) {
            ui.show_banner({
                message: "Logs Enabled"
            });
        }
    } else {
        $("#logs_enabled_message").hide();
        $("#logs_disabled_message").show();
        $("#toggle_logs").text("Enable Logs");
        $("#export_logs").addClass("disabled-button").off("click");
        if (show_banner) {
            ui.show_banner({
                message: "Logs Disabled"
            });
        }
    }
}

$("#settings").on("click", function() {
    $("#logs_size").text(pretty_bytes(logger_commands.logs_memory_usage()));
});

$("#file-upload").on("change", function() {
    let files = document.getElementById("file-upload").files;
    const $queued = $(".queued-files");
    if (files.length) {
        let total_size = 0;
        $queued.removeClass("queued-files-empty").empty();
        for (let i = 0; i < files.length; i++) {
            const file = files[i];
            total_size += file.size;
            $queued.append(
                `<div class="queued-file">
                    <div>
                        <span class="queued-file-name">${file.name}</span>
                        ${pretty_bytes(file.size)}
                    </div>
                    <div class="queued-file-progress">
                        <span class="queued-file-progress-label">Uploaded:</span>
                        <progress class="upload-progress" max="100" value="0"></progress>
                    </div>
                </div>`
            );
        }
        $(".file-upload-total").text("Total: " + pretty_bytes(total_size)).show();
    } else {
        $queued.addClass("queued-files-empty").text("No Files Selected");
        $(".file-upload-total").hide();
    }
});

const $upload_button = $(".upload-button").on("click", function() {
    let files = document.getElementById("file-upload").files;
    if (files.length && !$upload_button.hasClass("disabled-button")) {
        $upload_button.html(`<img class="upload-button-loading-gif" src="/images/loading.gif">Uploading...`).addClass("disabled-button");
        uploadFiles(files, 0);
    }
});

function uploadFiles(files, curr_file_index) {
    if (curr_file_index >= files.length) {
        logger.log("All files uploaded");
        document.getElementById("file-upload").value = "";
        $(".queued-files").addClass("queued-files-empty").text("All Files Uploaded");
        $(".file-upload-total").hide();
        $upload_button.html(`Upload`).removeClass("disabled-button");
        return;
    }

    const name = files[curr_file_index].name;

    api.post("/video/upload/request", {
        name: name,
        bytes: files[curr_file_index].size
    }).then(function() {
        const curr_file = $(".queued-file").get(0);
        const $progress = $(curr_file).find(".upload-progress");

        const uploader = new HugeUploader({
            endpoint: '/api/video/upload',
            file: files[curr_file_index],
            chunkSize: 10
        });

        uploader.on('error', function(error) {
            logger.error('HugeUploader Error:', error.detail);
            ui.show_banner({
                message: "Error uploading " + files[curr_file_index].name,
                color: "red"
            });
        });

        uploader.on('progress', function(progress) {
            logger.log(`Uploading ${name} - ${progress.detail}%`);
            $progress.val(progress.detail);
        });

        uploader.on('finish', function() {
            $(curr_file).remove();
            uploadFiles(files, curr_file_index + 1);
        });
    }).catch(api.handle_error_message);
}

$("#generate_registration_link").on("click", function() {
    api.post('/registration/request-token').then(function(data) {
        $("#registration-link").text("https://watch-together.luchianov.dev/register?token=" + data.token);
        $("#registration-link-copy").show();
    }).catch(api.handle_error_message);
});

$("#registration-link-copy").on("click", function() {
    if (copyToClipboard($("#registration-link").text())) {
        ui.show_banner({
            message: "Link copied"
        });
    } else {
        ui.show_banner({
            message: "Couldn't copy link",
            color: "red"
        });
    }
});

["library", "account", "settings", "registration"].forEach(function(item) {
    $(`#${item}`).on("click", function() {
        $sidebar_items.removeClass("selected");
        $(this).addClass("selected");
        $(".content").hide();
        $(`#${item}_content`).show();
    });
});

$("#logout").on("click", function() {
    location.href = "/logout";
});

$(".mobile-menu-icon").on("mousedown", function(event) {
    let $this = $(this);
    if ($this.hasClass("left")) {
        $(".right-sidebar").removeClass("open");
        $(".left-sidebar").toggleClass("open");
    } else {
        $(".left-sidebar").removeClass("open");
        $(".right-sidebar").toggleClass("open");
    }
    event.stopPropagation();
});
$(document.body).on("mousedown", function() {
    $(".left-sidebar").removeClass("open");
    $(".right-sidebar").removeClass("open");
});

let $donate_info = $(".donate-info");
$(".donate-button").on("mouseenter", function() {
    $donate_info.show();
}).on("mousemove", function(event) {
    $donate_info.css({
        left: Math.max(10, event.originalEvent.x - $donate_info.outerWidth() - 10),
        top: event.originalEvent.y - $donate_info.outerHeight() - 10
    });
}).on("mouseout", function() {
    $donate_info.hide();
});