mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 21:43:21 +00:00
We shouldn't move the slide forward if the user is on the last slide. This commit adds an exception for the same.
297 lines
9.9 KiB
JavaScript
297 lines
9.9 KiB
JavaScript
const ELECTRON_APP_VERSION = "2.3.2";
|
|
const ELECTRON_APP_URL_LINUX = "https://github.com/zulip/zulip-electron/releases/download/v" + ELECTRON_APP_VERSION + "/Zulip-" + ELECTRON_APP_VERSION + "-x86_64.AppImage";
|
|
const ELECTRON_APP_URL_MAC = "https://github.com/zulip/zulip-electron/releases/download/v" + ELECTRON_APP_VERSION + "/Zulip-" + ELECTRON_APP_VERSION + ".dmg";
|
|
const ELECTRON_APP_URL_WINDOWS = "https://github.com/zulip/zulip-electron/releases/download/v" + ELECTRON_APP_VERSION + "/Zulip-Web-Setup-" + ELECTRON_APP_VERSION + ".exe";
|
|
|
|
import render_tabs from './team.js';
|
|
|
|
// this will either smooth scroll to an anchor where the `name`
|
|
// is the same as the `scroll-to` reference, or to a px height
|
|
// (as specified like `scroll-to='0px'`).
|
|
var ScrollTo = function () {
|
|
$("[scroll-to]").click(function () {
|
|
var sel = $(this).attr("scroll-to");
|
|
|
|
// if the `scroll-to` is a parse-able pixel value like `50px`,
|
|
// then use that as the scrollTop, else assume it is a selector name
|
|
// and find the `offsetTop`.
|
|
var top = /\dpx/.test(sel) ?
|
|
parseInt(sel, 10) :
|
|
$("[name='" + sel + "']").offset().top;
|
|
|
|
$("body").animate({ scrollTop: top + "px" }, 300);
|
|
});
|
|
};
|
|
|
|
export function path_parts() {
|
|
return window.location.pathname.split('/').filter(function (chunk) {
|
|
return chunk !== '';
|
|
});
|
|
}
|
|
|
|
var hello_events = function () {
|
|
var counter = 0;
|
|
$(window).scroll(function () {
|
|
if (counter % 2 === 0) {
|
|
$(".screen.hero-screen .message-feed").css("transform", "translateY(-" + $(this).scrollTop() / 5 + "px)");
|
|
}
|
|
counter += 1;
|
|
});
|
|
|
|
$(".footer").addClass("hello");
|
|
};
|
|
|
|
var apps_events = function () {
|
|
var info = {
|
|
windows: {
|
|
image: "/static/images/landing-page/microsoft.png",
|
|
alt: "Windows",
|
|
description: "Zulip for Windows is even better than Zulip on the web, with a cleaner look, tray integration, native notifications, and support for multiple Zulip accounts.",
|
|
link: ELECTRON_APP_URL_WINDOWS,
|
|
show_instructions: true,
|
|
install_guide: "/help/desktop-app-install-guide#installing-on-windows",
|
|
},
|
|
mac: {
|
|
image: "/static/images/landing-page/macbook.png",
|
|
alt: "macOS",
|
|
description: "Zulip on macOS is even better than Zulip on the web, with a cleaner look, tray integration, native notifications, and support for multiple Zulip accounts.",
|
|
link: ELECTRON_APP_URL_MAC,
|
|
show_instructions: true,
|
|
install_guide: "/help/desktop-app-install-guide#installing-on-macos",
|
|
},
|
|
android: {
|
|
image: "/static/images/app-screenshots/zulip-android.png",
|
|
alt: "Android",
|
|
description: "Zulip's native Android app makes it easy to keep up while on the go.",
|
|
link: "https://play.google.com/store/apps/details?id=com.zulipmobile",
|
|
},
|
|
ios: {
|
|
image: "/static/images/app-screenshots/zulip-iphone-rough.png",
|
|
alt: "iOS",
|
|
description: "Zulip's native iOS app makes it easy to keep up while on the go.",
|
|
link: "https://itunes.apple.com/us/app/zulip/id1203036395",
|
|
},
|
|
linux: {
|
|
image: "/static/images/landing-page/ubuntu.png",
|
|
alt: "Linux",
|
|
description: "Zulip on the Linux desktop is even better than Zulip on the web, with a cleaner look, tray integration, native notifications, and support for multiple Zulip accounts.",
|
|
link: ELECTRON_APP_URL_LINUX,
|
|
show_instructions: true,
|
|
install_guide: "/help/desktop-app-install-guide#installing-on-linux",
|
|
},
|
|
};
|
|
|
|
var version;
|
|
|
|
function get_user_os() {
|
|
if (/Android/i.test(navigator.userAgent)) {
|
|
return "android";
|
|
}
|
|
if (/iPhone|iPad|iPod/i.test(navigator.userAgent)) {
|
|
return "ios";
|
|
}
|
|
if (/Mac/i.test(navigator.userAgent)) {
|
|
return "mac";
|
|
}
|
|
if (/Win/i.test(navigator.userAgent)) {
|
|
return "windows";
|
|
}
|
|
if (/Linux/i.test(navigator.userAgent)) {
|
|
return "linux";
|
|
}
|
|
return "mac"; // if unable to determine OS return Mac by default
|
|
}
|
|
|
|
function get_version_from_path() {
|
|
var result;
|
|
var parts = path_parts();
|
|
|
|
Object.keys(info).forEach(function (version) {
|
|
if (parts.indexOf(version) !== -1) {
|
|
result = version;
|
|
}
|
|
});
|
|
|
|
result = result || get_user_os();
|
|
return result;
|
|
}
|
|
|
|
function get_path_from_version() {
|
|
return '/apps/' + version;
|
|
}
|
|
|
|
function update_path() {
|
|
var next_path = get_path_from_version();
|
|
history.pushState(version, '', next_path);
|
|
}
|
|
|
|
var update_page = function () {
|
|
var $download_instructions = $(".download-instructions");
|
|
var $third_party_apps = $("#third-party-apps");
|
|
var version_info = info[version];
|
|
|
|
$(".info .platform").text(version_info.alt);
|
|
$(".info .description").text(version_info.description);
|
|
$(".info .link").attr("href", version_info.link);
|
|
$(".image img").attr("src", version_info.image);
|
|
$download_instructions.find("a").attr("href", version_info.install_guide);
|
|
|
|
if (version_info.show_instructions) {
|
|
$download_instructions.show();
|
|
} else {
|
|
$download_instructions.hide();
|
|
}
|
|
|
|
if (version === "mac" || version === "windows" || version === "linux") {
|
|
$third_party_apps.show();
|
|
} else {
|
|
$third_party_apps.hide();
|
|
}
|
|
|
|
};
|
|
|
|
$(window).on('popstate', function () {
|
|
version = get_version_from_path();
|
|
update_page();
|
|
$("body").animate({ scrollTop: 0 }, 200);
|
|
});
|
|
|
|
$(".apps a .icon").click(function (e) {
|
|
var next_version = $(e.target).closest('a')
|
|
.attr('href')
|
|
.replace('/apps/', '');
|
|
version = next_version;
|
|
|
|
update_path();
|
|
update_page();
|
|
$("body").animate({ scrollTop: 0 }, 200);
|
|
|
|
return false;
|
|
});
|
|
|
|
// init
|
|
version = get_version_from_path();
|
|
history.replaceState(version, '', get_path_from_version());
|
|
update_page();
|
|
};
|
|
|
|
var events = function () {
|
|
ScrollTo();
|
|
|
|
$("a").click(function (e) {
|
|
// if a user is holding the CMD/CTRL key while clicking a link, they
|
|
// want to open the link in another browser tab which means that we
|
|
// should preserve the state of this one. Return out, and don't fade
|
|
// the page.
|
|
if (e.metaKey || e.ctrlKey) {
|
|
return;
|
|
}
|
|
|
|
// if the pathname is different than what we are already on, run the
|
|
// custom transition function.
|
|
if (window.location.pathname !== this.pathname && !this.hasAttribute("download") &&
|
|
!/no-action/.test(this.className)) {
|
|
e.preventDefault();
|
|
|
|
setTimeout(function () {
|
|
window.location.href = $(this).attr("href");
|
|
}.bind(this), 500);
|
|
}
|
|
});
|
|
|
|
// get the location url like `zulipchat.com/features/`, cut off the trailing
|
|
// `/` and then split by `/` to get ["zulipchat.com", "features"], then
|
|
// pop the last element to get the current section (eg. `features`).
|
|
var location = window.location.pathname.replace(/\/#*$/, "").split(/\//).pop();
|
|
|
|
$("[on-page='" + location + "']").addClass("active");
|
|
|
|
$("body").click(function (e) {
|
|
var $e = $(e.target);
|
|
|
|
if ($e.is("nav ul .exit")) {
|
|
$("nav ul").removeClass("show");
|
|
}
|
|
|
|
if ($("nav ul.show") && !$e.closest("nav ul.show").length && !$e.is("nav ul.show")) {
|
|
$("nav ul").removeClass("show");
|
|
}
|
|
});
|
|
|
|
$(".hamburger").click(function (e) {
|
|
$("nav ul").addClass("show");
|
|
e.stopPropagation();
|
|
});
|
|
|
|
if (path_parts().indexOf("apps") !== -1) {
|
|
apps_events();
|
|
}
|
|
|
|
if (path_parts().indexOf('hello') !== -1) {
|
|
hello_events();
|
|
}
|
|
};
|
|
|
|
|
|
// run this callback when the page is determined to have loaded.
|
|
var load = function () {
|
|
|
|
// Initiate the bootstrap carousel logic
|
|
$('.carousel').carousel({
|
|
interval: false,
|
|
});
|
|
|
|
// Move to the next slide on clicking inside the carousel container
|
|
$(".carousel-inner .item-container").click(function (e) {
|
|
var get_tag_name = e.target.tagName.toLowerCase();
|
|
var is_button = get_tag_name === "button";
|
|
var is_link = get_tag_name === "a";
|
|
var is_last_slide = $("#tour-carousel .carousel-inner .item:last-child").hasClass("active");
|
|
|
|
// Do not trigger this event if user clicks on a button, link
|
|
// or if it's the last slide
|
|
var move_slide_forward = !is_button && !is_link && !is_last_slide;
|
|
|
|
if (move_slide_forward) {
|
|
$(this).closest('.carousel').carousel('next');
|
|
}
|
|
});
|
|
|
|
$(".carousel-link-button").click(function () {
|
|
window.location.href = $(this).attr("href");
|
|
});
|
|
|
|
$('.carousel').on('slid', function () {
|
|
var $this = $(this);
|
|
$this.find('.visibility-control').show();
|
|
if ($this.find('.carousel-inner .item:first').hasClass('active')) {
|
|
$this.find('.left.visibility-control').hide();
|
|
} else if ($this.find('.carousel-inner .item:last').hasClass('active')) {
|
|
$this.find('.right.visibility-control').hide();
|
|
}
|
|
});
|
|
|
|
// Set up events / categories / search
|
|
events();
|
|
};
|
|
|
|
if (document.readyState === "complete") {
|
|
load();
|
|
} else {
|
|
$(load);
|
|
}
|
|
|
|
$(function () {
|
|
if (window.location.pathname === '/team/') {
|
|
render_tabs();
|
|
}
|
|
});
|
|
|
|
// Prevent Firefox from bfcaching the page.
|
|
// According to https://developer.mozilla.org/en-US/docs/DOM/window.onunload
|
|
// Using this event handler in your page prevents Firefox from caching the
|
|
// page in the in-memory bfcache (backward/forward cache).
|
|
$(window).on('unload', function () {
|
|
$(window).unbind('unload');
|
|
});
|