mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 15:03:34 +00:00
The old link here broke once we introduced separate APKs per ABI, in zulip/zulip-mobile#5296. We could make a direct link to app-armeabi-v7a-release.apk , the one that's compatible with almost all devices. But perhaps better is to just go back to linking to the release page, where the user can choose the best APK for their device. (If they're in the habit of downloading APKs manually to install on their device, then probably that means they're going to be used to choosing the right one.) User report and discussion: https://chat.zulip.org/#narrow/stream/48-mobile/topic/Direct.20apk.20download.20link.20is.20404/near/1358758
234 lines
8.7 KiB
JavaScript
234 lines
8.7 KiB
JavaScript
import $ from "jquery";
|
|
|
|
import {detect_user_os} from "./tabbed-instructions";
|
|
import render_tabs from "./team";
|
|
|
|
export function path_parts() {
|
|
return window.location.pathname.split("/").filter((chunk) => chunk !== "");
|
|
}
|
|
|
|
const hello_events = function () {
|
|
let counter = 0;
|
|
$(window).on("scroll", function () {
|
|
if (counter % 2 === 0) {
|
|
$(".screen.hero-screen .message-feed").css(
|
|
"transform",
|
|
"translateY(-" + $(this).scrollTop() / 5 + "px)",
|
|
);
|
|
}
|
|
counter += 1;
|
|
});
|
|
|
|
$(".footer").addClass("hello");
|
|
};
|
|
|
|
const apps_events = function () {
|
|
const 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.",
|
|
download_link: "/apps/download/windows",
|
|
show_instructions: true,
|
|
install_guide: "/help/desktop-app-install-guide",
|
|
app_type: "desktop",
|
|
},
|
|
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.",
|
|
download_link: "/apps/download/mac",
|
|
mac_arm64_link: "/apps/download/mac-arm64",
|
|
show_instructions: true,
|
|
install_guide: "/help/desktop-app-install-guide",
|
|
app_type: "desktop",
|
|
},
|
|
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.",
|
|
show_instructions: false,
|
|
play_store_link: "https://play.google.com/store/apps/details?id=com.zulipmobile",
|
|
download_link: "https://github.com/zulip/zulip-mobile/releases/latest",
|
|
app_type: "mobile",
|
|
},
|
|
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.",
|
|
show_instructions: false,
|
|
app_store_link: "https://itunes.apple.com/us/app/zulip/id1203036395",
|
|
app_type: "mobile",
|
|
},
|
|
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.",
|
|
download_link: "/apps/download/linux",
|
|
show_instructions: true,
|
|
install_guide: "/help/desktop-app-install-guide",
|
|
app_type: "desktop",
|
|
},
|
|
};
|
|
|
|
let version;
|
|
|
|
function get_version_from_path() {
|
|
let result;
|
|
const parts = path_parts();
|
|
|
|
for (const version of Object.keys(info)) {
|
|
if (parts.includes(version)) {
|
|
result = version;
|
|
}
|
|
}
|
|
|
|
result = result || detect_user_os();
|
|
return result;
|
|
}
|
|
|
|
const update_page = function () {
|
|
const $download_instructions = $(".download-instructions");
|
|
const $third_party_apps = $("#third-party-apps");
|
|
const $download_android_apk = $("#download-android-apk");
|
|
const $download_from_google_play_store = $(".download-from-google-play-store");
|
|
const $download_from_apple_app_store = $(".download-from-apple-app-store");
|
|
const $download_mac_arm64 = $("#download-mac-arm64");
|
|
const $desktop_download_link = $(".desktop-download-link");
|
|
const version_info = info[version];
|
|
|
|
$(".info .platform").text(version_info.alt);
|
|
$(".info .description").text(version_info.description);
|
|
$desktop_download_link.attr("href", version_info.download_link);
|
|
$download_from_google_play_store.attr("href", version_info.play_store_link);
|
|
$download_from_apple_app_store.attr("href", version_info.app_store_link);
|
|
$download_android_apk.attr("href", version_info.download_link);
|
|
$download_mac_arm64.attr("href", version_info.mac_arm64_link);
|
|
$(".image img").attr("src", version_info.image);
|
|
$download_instructions.find("a").attr("href", version_info.install_guide);
|
|
|
|
$download_instructions.toggle(version_info.show_instructions);
|
|
|
|
$third_party_apps.toggle(version_info.app_type === "desktop");
|
|
$desktop_download_link.toggle(version_info.app_type === "desktop");
|
|
$download_android_apk.toggle(version === "android");
|
|
$download_from_google_play_store.toggle(version === "android");
|
|
$download_from_apple_app_store.toggle(version === "ios");
|
|
$download_mac_arm64.toggle(version === "mac");
|
|
};
|
|
|
|
// init
|
|
version = get_version_from_path();
|
|
update_page();
|
|
};
|
|
|
|
const events = function () {
|
|
// get the location url like `zulip.com/features/`, cut off the trailing
|
|
// `/` and then split by `/` to get ["zulip.com", "features"], then
|
|
// pop the last element to get the current section (eg. `features`).
|
|
const location = window.location.pathname.replace(/\/$/, "").split(/\//).pop();
|
|
|
|
$(`[data-on-page='${CSS.escape(location)}']`).addClass("active");
|
|
|
|
$("body").on("click", (e) => {
|
|
const $e = $(e.target);
|
|
|
|
if ($e.is("nav ul .exit")) {
|
|
$("nav ul").css("transform", "translate(-350px, 0)");
|
|
// See https://ishadeed.com/article/layout-flickering/ for
|
|
// more context as to why the following timeout is important.
|
|
setTimeout(() => {
|
|
$("nav ul").removeClass("show");
|
|
$("nav ul").css("transform", "");
|
|
$("body").removeClass("noscroll");
|
|
}, 500);
|
|
}
|
|
|
|
if ($("nav ul.show") && !$e.closest("nav ul.show").length && !$e.is("nav ul.show")) {
|
|
$("nav ul").removeClass("show");
|
|
$("body").removeClass("noscroll");
|
|
}
|
|
});
|
|
|
|
$(".hamburger").on("click", (e) => {
|
|
$("nav ul").addClass("show");
|
|
$("body").addClass("noscroll");
|
|
e.stopPropagation();
|
|
});
|
|
|
|
if (path_parts().includes("apps")) {
|
|
apps_events();
|
|
}
|
|
|
|
if (path_parts().includes("hello")) {
|
|
hello_events();
|
|
}
|
|
};
|
|
|
|
$(() => {
|
|
// Initiate the bootstrap carousel logic
|
|
$(".carousel").carousel({
|
|
interval: false,
|
|
});
|
|
|
|
// Move to the next slide on clicking inside the carousel container
|
|
$(".carousel-inner .item-container").on("click", function (e) {
|
|
const get_tag_name = e.target.tagName.toLowerCase();
|
|
const is_button = get_tag_name === "button";
|
|
const is_link = get_tag_name === "a";
|
|
const 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
|
|
const move_slide_forward = !is_button && !is_link && !is_last_slide;
|
|
|
|
if (move_slide_forward) {
|
|
$(this).closest(".carousel").carousel("next");
|
|
}
|
|
});
|
|
|
|
$(".carousel").on("slid", function () {
|
|
const $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 (window.location.pathname === "/team/") {
|
|
render_tabs();
|
|
}
|
|
|
|
// Source: https://stackoverflow.com/questions/819416/adjust-width-and-height-of-iframe-to-fit-with-content-in-it
|
|
// Resize tweet to avoid overlapping with image. Since tweet uses an iframe which doesn't adjust with
|
|
// screen resize, we need to manually adjust its width.
|
|
|
|
function resizeIFrameToFitContent(iFrame) {
|
|
$(iFrame).width("38vw");
|
|
}
|
|
|
|
window.addEventListener("resize", () => {
|
|
const iframes = document.querySelectorAll(".twitter-tweet iframe");
|
|
for (const iframe of iframes) {
|
|
resizeIFrameToFitContent(iframe);
|
|
}
|
|
});
|
|
});
|
|
|
|
// Scroll to anchor link when clicked. Note that help.js has a similar
|
|
// function; this file and help.js are never included on the same
|
|
// page.
|
|
$(document).on("click", ".markdown h1, .markdown h2, .markdown h3", function () {
|
|
window.location.hash = $(this).attr("id");
|
|
});
|