mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import $ from "jquery";
 | 
						|
 | 
						|
import {localstorage} from "./localstorage";
 | 
						|
import * as notifications from "./notifications";
 | 
						|
import {page_params} from "./page_params";
 | 
						|
import * as unread_ops from "./unread_ops";
 | 
						|
import * as unread_ui from "./unread_ui";
 | 
						|
import * as util from "./util";
 | 
						|
 | 
						|
export function resize_app() {
 | 
						|
    const panels_height = $("#panels").height();
 | 
						|
    $("body > .app").height("calc(100% - " + panels_height + "px)");
 | 
						|
 | 
						|
    // the floating recipient bar is usually positioned right below
 | 
						|
    // the `.header` element (including padding).
 | 
						|
    const frb_top =
 | 
						|
        panels_height +
 | 
						|
        $(".header").height() +
 | 
						|
        Number.parseInt($(".header").css("paddingBottom"), 10);
 | 
						|
    $("#floating_recipient_bar").css("top", frb_top + "px");
 | 
						|
}
 | 
						|
 | 
						|
const show_step = function ($process, step) {
 | 
						|
    $process
 | 
						|
        .find("[data-step]")
 | 
						|
        .hide()
 | 
						|
        .filter("[data-step=" + step + "]")
 | 
						|
        .show();
 | 
						|
};
 | 
						|
 | 
						|
const get_step = function ($process) {
 | 
						|
    return $process.find("[data-step]:visible").data("step");
 | 
						|
};
 | 
						|
 | 
						|
function should_show_notifications(ls) {
 | 
						|
    // if the user said to never show banner on this computer again, it will
 | 
						|
    // be stored as `true` so we want to negate that.
 | 
						|
    if (localstorage.supported() && ls.get("dontAskForNotifications") === true) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    return (
 | 
						|
        // notifications *basically* don't work on any mobile platforms, so don't
 | 
						|
        // event show the banners. This prevents trying to access things that
 | 
						|
        // don't exist like `Notification.permission`.
 | 
						|
        !util.is_mobile() &&
 | 
						|
        // if permission has not been granted yet.
 | 
						|
        !notifications.granted_desktop_notifications_permission() &&
 | 
						|
        // if permission is allowed to be requested (e.g. not in "denied" state).
 | 
						|
        notifications.permission_state() !== "denied"
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
export function check_profile_incomplete() {
 | 
						|
    if (!page_params.is_admin) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    // Eventually, we might also check page_params.realm_icon_source,
 | 
						|
    // but it feels too aggressive to ask users to do change that
 | 
						|
    // since their organization might not have a logo yet.
 | 
						|
    if (
 | 
						|
        page_params.realm_description === "" ||
 | 
						|
        /^Organization imported from [A-Za-z]+[!.]$/.test(page_params.realm_description)
 | 
						|
    ) {
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
export function show_profile_incomplete(is_profile_incomplete) {
 | 
						|
    if (is_profile_incomplete) {
 | 
						|
        $("[data-process='profile-incomplete']").show();
 | 
						|
    } else {
 | 
						|
        $("[data-process='profile-incomplete']").hide();
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
export function initialize() {
 | 
						|
    const ls = localstorage();
 | 
						|
    if (page_params.insecure_desktop_app) {
 | 
						|
        open($("[data-process='insecure-desktop-app']"));
 | 
						|
    } else if (page_params.warn_no_email === true && page_params.is_admin) {
 | 
						|
        // if email has not been set up and the user is the admin,
 | 
						|
        // display a warning to tell them to set up an email server.
 | 
						|
        open($("[data-process='email-server']"));
 | 
						|
    } else if (should_show_notifications(ls)) {
 | 
						|
        open($("[data-process='notifications']"));
 | 
						|
    } else if (unread_ui.should_display_bankruptcy_banner()) {
 | 
						|
        open($("[data-process='bankruptcy']"));
 | 
						|
    } else if (check_profile_incomplete()) {
 | 
						|
        open($("[data-process='profile-incomplete']"));
 | 
						|
    }
 | 
						|
 | 
						|
    // Configure click handlers.
 | 
						|
    $(".request-desktop-notifications").on("click", function (e) {
 | 
						|
        e.preventDefault();
 | 
						|
        $(this).closest(".alert").hide();
 | 
						|
        notifications.request_desktop_notifications_permission();
 | 
						|
        resize_app();
 | 
						|
    });
 | 
						|
 | 
						|
    $(".reject-notifications").on("click", function () {
 | 
						|
        $(this).closest(".alert").hide();
 | 
						|
        ls.set("dontAskForNotifications", true);
 | 
						|
        resize_app();
 | 
						|
    });
 | 
						|
 | 
						|
    $(".accept-bankruptcy").on("click", function (e) {
 | 
						|
        e.preventDefault();
 | 
						|
        $(this).closest(".alert").hide();
 | 
						|
        $(".bankruptcy-loader").show();
 | 
						|
        setTimeout(unread_ops.mark_all_as_read, 1000);
 | 
						|
        resize_app();
 | 
						|
    });
 | 
						|
 | 
						|
    $("#panels").on("click", ".alert .close, .alert .exit", function (e) {
 | 
						|
        e.stopPropagation();
 | 
						|
        const $process = $(e.target).closest("[data-process]");
 | 
						|
        if (get_step($process) === 1 && $process.data("process") === "notifications") {
 | 
						|
            show_step($process, 2);
 | 
						|
        } else {
 | 
						|
            $(this).closest(".alert").hide();
 | 
						|
        }
 | 
						|
        resize_app();
 | 
						|
    });
 | 
						|
 | 
						|
    // Treat Enter with links in the panels UI focused like a click.,
 | 
						|
    $("#panels").on("keyup", ".alert-link[role=button]", function (e) {
 | 
						|
        e.stopPropagation();
 | 
						|
        if (e.key === "Enter") {
 | 
						|
            $(this).click();
 | 
						|
        }
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
export function open($process) {
 | 
						|
    $("[data-process]").hide();
 | 
						|
    $process.show();
 | 
						|
    resize_app();
 | 
						|
}
 |