mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import $ from "jquery";
 | 
						|
 | 
						|
import render_favicon_svg from "../templates/favicon.svg.hbs";
 | 
						|
 | 
						|
import favicon_font_url from "!url-loader!font-subset-loader2?glyphs=0123456789KMGT∞!source-sans/TTF/SourceSans3-Bold.ttf";
 | 
						|
 | 
						|
let favicon_state;
 | 
						|
 | 
						|
function set_favicon() {
 | 
						|
    $("#favicon").attr("href", favicon_state.url);
 | 
						|
}
 | 
						|
 | 
						|
export function update_favicon(new_message_count, pm_count) {
 | 
						|
    if (favicon_state !== undefined) {
 | 
						|
        favicon_state.image.removeEventListener("load", set_favicon);
 | 
						|
 | 
						|
        // We need to remove this src so revokeObjectURL doesn't cause a
 | 
						|
        // net::ERR_FILE_NOT_FOUND error in Chrome. This seems to be the
 | 
						|
        // simplest way to do that without triggering an expensive network
 | 
						|
        // request or spewing a different console error.
 | 
						|
        favicon_state.image.src = "data:,";
 | 
						|
 | 
						|
        URL.revokeObjectURL(favicon_state.url);
 | 
						|
        favicon_state = undefined;
 | 
						|
    }
 | 
						|
 | 
						|
    if (new_message_count === 0 && pm_count === 0) {
 | 
						|
        $("#favicon").attr("href", "/static/images/favicon.svg?v=4");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    const pow = Math.floor(Math.log10(new_message_count) / 3);
 | 
						|
    const suffix = ["", "K", "M", "G", "T"][pow];
 | 
						|
    const count =
 | 
						|
        new_message_count === 0
 | 
						|
            ? ""
 | 
						|
            : pow < 5
 | 
						|
            ? `${Math.floor(new_message_count / 1e3 ** pow)}${suffix}`
 | 
						|
            : "∞";
 | 
						|
    const count_long = count.length > 2;
 | 
						|
    const rendered_favicon = render_favicon_svg({
 | 
						|
        count,
 | 
						|
        count_long,
 | 
						|
        have_pm: pm_count !== 0,
 | 
						|
        favicon_font_url,
 | 
						|
    });
 | 
						|
 | 
						|
    favicon_state = {
 | 
						|
        url: URL.createObjectURL(new Blob([rendered_favicon], {type: "image/svg+xml"})),
 | 
						|
        image: new Image(),
 | 
						|
    };
 | 
						|
 | 
						|
    // Without loading the SVG in an Image first, Chrome mysteriously fails to
 | 
						|
    // render the webfont (https://crbug.com/1140920).
 | 
						|
    favicon_state.image.src = favicon_state.url;
 | 
						|
    favicon_state.image.addEventListener("load", set_favicon);
 | 
						|
}
 |