@thebigcrunch/sdk
Version:
The big crunch SDK library
269 lines (232 loc) • 9.92 kB
JavaScript
// This file needs good browser support because it's included on everyone's websites.
// It's also not babeled meaning const, let, async await and other modern features don't work that well
// check caniuse before using anything too crazy.
var isMobile = false;
// Mobile detection for resizing.
if (
/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(
navigator.userAgent
) ||
/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(
navigator.userAgent.substr(0, 4)
)
) {
isMobile = true;
}
var wafflebarHeight = 38;
var container = document.getElementById("container");
container.style.width = window.innerWidth + "px";
container.style.height = window.innerHeight - wafflebarHeight + "px";
var url = new URLSearchParams(window.location.search);
var spaceId = url.get("id");
var fullpage = url.get("fullpage");
var aspect = url.get("aspect") || "cellaspect";
var hideWaffleBar = url.get("disableBar") || false;
var lastValue;
var lastSpace;
var sockets;
function draw(value, space, options) {
if (
lastSpace &&
lastSpace.type === TBC.types.visualisation &&
space.type === TBC.types.visualisation &&
lastValue === value &&
lastSpace.layers.length === space.layers.length
) {
// Don't redraw vizzies that are the same
return;
}
container.innerHTML = "";
if (sockets) {
sockets.close();
}
if (space.layers && space.layers.length > 0) {
sockets = TBC.renderLayersToElement(space, container, options);
} else if (space.type === TBC.types.visualisation) {
TBC.renderVisualisationToElement(space, container, options);
} else if (space.value === null) {
// Don't render empty spaces. Visualizations don't have a value doh.
return;
} else {
TBC.renderCellToElement(space, container, options);
}
const innerContainer = container.firstChild;
const containerBox = innerContainer.getBoundingClientRect();
// Fudge 10% stretch mode.
// If the container is within 10% of the container stretch it so that there aren't any borders around it.
if (
containerBox.width + containerBox.width * 0.1 >= window.innerWidth &&
containerBox.height + containerBox.height * 0.1 >= window.innerHeight &&
!options &&
fullpage === "true"
) {
draw(value, space, { fit: "stretch" });
}
}
function updateWaffleBar(space, user) {
if (!space) {
// This happens when the user callback comes back first.
return;
}
document.getElementById("SpaceLink").href = TBC.getWebViewLink(space);
if (user && user.profilePicture) {
document.getElementById(
"ProfilePicture"
).src = TBC.getProfilePictureUrl(user);
}
document.getElementById("ProfilePictureLink").href = TBC.getUserProfileUrl(
user
);
document.getElementById("LinkText").value = TBC.getWebViewLink(space);
document.getElementById("Embed").href = TBC.getWebViewLink(space);
document.getElementById("Weblink").href = TBC.getWebViewLink(space);
if (!space.name || space.name === "") {
document.getElementById("SpaceName").innerText = "Untitled";
} else {
document.getElementById("SpaceName").innerText = space.name;
}
}
let user = undefined;
function crunch() {
var options = { fit: aspect, odo: true };
TBC.crunch(
spaceId,
(value, space) => {
updateWaffleBar(space, user);
document.getElementById("error").style.display = "none";
draw(value, space, options);
lastValue = value;
lastSpace = space;
},
() => {
document.getElementById("error").style.display = "block";
},
user => {
user = user;
updateWaffleBar(lastSpace, user);
}
);
}
// Only resize on mobile.
// SIMON HACKED THIS! XXX
//if (!isMobile) {
window.addEventListener("resize", function() {
var options = { fit: aspect };
container.style.width = window.innerWidth + "px";
container.style.height = window.innerHeight - wafflebarHeight + "px";
// Need to maintain aspect ratio here.
if (container.querySelector("iframe") === null) {
draw(lastValue, lastSpace, options);
}
});
//}
WebFont.load({
google: {
families: [
"Slabo",
"Indie Flower",
"Inconsolata",
"Macondo",
"Monoton",
"Roboto Slab",
"Roboto"
]
},
active: () => {
var options = { fit: aspect };
// Vizzies don't need to redraw when fonts are loaded because they're in an iframe.
if (lastSpace && lastSpace.type !== TBC.types.visualisation)
draw(lastValue, lastSpace, options);
}
});
function analytics() {
const dnt =
navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
if (dnt != "1" && dnt != "yes") {
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(
window,
document,
"script",
"//www.google-analytics.com/analytics.js",
"ga"
);
ga("create", CONFIG.gaCode, "auto");
ga("send", "pageview");
} else {
console.debug(
"Respecting Do-Not-Track, not loading analytics. See https://bigcrunch.io/google-analytics-dnt/"
);
}
}
// Display something while fonts are loading.
crunch();
analytics();
function copyText(id, buttonId) {
const previousText = document.getElementById(buttonId).textContent;
const textToCopy = document.getElementById(id);
textToCopy.select();
document.getElementById(buttonId).textContent = "Copied";
document.execCommand("copy");
setTimeout(() => {
document.getElementById(buttonId).textContent = previousText;
}, 1000);
}
(function onLoad() {
if (!hideWaffleBar) {
document.getElementById("WaffleBar").style.display = "flex";
document.body.classList.add("body-border");
}
document
.getElementById("ShareButton")
.addEventListener("click", function() {
document.getElementById("ShareModal").style.display = "flex";
document
.getElementById("container")
.classList.add("blur-container");
});
document.getElementById("ModalClose").addEventListener("click", function() {
document.getElementById("ShareModal").style.display = "none";
document.getElementById("container").classList.remove("blur-container");
});
document.getElementById("CopyLinkText").addEventListener("click", () => {
copyText("LinkText", "CopyLinkText");
});
// Social buttons
document.getElementById("Facebook").addEventListener("click", function() {
window.open(
`https://www.facebook.com/sharer/sharer.php?u=${TBC.getWebViewLink(
lastSpace
)}`,
"",
"height=400,width=550,centerscreen=yes"
);
});
document.getElementById("LinkedIn").addEventListener("click", function() {
window.open(
`https://linkedin.com/shareArticle?url=${TBC.getWebViewLink(
lastSpace
)}`,
"",
"height=500,width=500,centerscreen=yes"
);
});
document.getElementById("Twitter").addEventListener("click", function() {
window.open(
`https://twitter.com/share?url=${TBC.getWebViewLink(lastSpace)}`,
"",
"height=500,width=500,centerscreen=yes"
);
});
})();