UNPKG

@zootools/waitlist-js

Version:

Viral whitelists / waitlists for nfts and web3 projects

258 lines (257 loc) 12.8 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; exports.__esModule = true; var FORM_ENDPOINT = "https://form.waitlistpanda.com/go"; var API_ENDPOINT = "https://api.waitlistpanda.com"; var WRAPPER_ID = "WaitlistPanda-wrapper"; var SPINNER_ID = "WaitlistPanda-spinner"; var IFRAME_ID = "WaitlistPanda-form"; var OVERLAY_ID = "WaitlistPanda-overlay"; var FORM_DATA_KEY = "waitlist-id"; function checkUser(email, listId) { return __awaiter(this, void 0, void 0, function () { var hasAccess; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, fetch("".concat(API_ENDPOINT, "/lists/").concat(listId, "/members/").concat(email, "/has_access"))["catch"](function (error) { return console.log(error); })]; case 1: hasAccess = _a.sent(); return [2 /*return*/, hasAccess]; } }); }); } function addGlobalStyles() { var styles = "\n @-webkit-keyframes hinge {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(0.8, 0.8, 0.8);\n transform: scale3d(0.8, 0.8, 0.8);\n }\n 75% {\n opacity: 1;\n -webkit-transform: scale3d(1.05, 1.05, 1.05);\n transform: scale3d(1.05, 1.05, 1.05);\n }\n 100% {\n opacity: 1;\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n }\n @keyframes hinge {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(0.8, 0.8, 0.8);\n transform: scale3d(0.8, 0.8, 0.8);\n }\n 75% {\n opacity: 1;\n -webkit-transform: scale3d(1.05, 1.05, 1.05);\n transform: scale3d(1.05, 1.05, 1.05);\n }\n 100% {\n opacity: 1;\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n }\n\n @-webkit-keyframes load8 {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n }\n @keyframes load8 {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n }\n\n @-webkit-keyframes wrapperAnimation {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n }\n\n @keyframes wrapperAnimation {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n\n #".concat(SPINNER_ID, ",\n #").concat(SPINNER_ID, ":after {\n border-radius: 50%;\n width: 50px;\n height: 50px;\n }\n #").concat(SPINNER_ID, " {\n margin: 60px auto;\n font-size: 10px;\n position: relative;\n z-index: 2;\n text-indent: -9999em;\n border-top: 7px solid rgba(255, 255, 255, 0.6);\n border-right: 7px solid rgba(255, 255, 255, 0.6);\n border-bottom: 7px solid rgba(255, 255, 255, 0.6);\n border-left: 7px solid #ffffff;\n -webkit-transform: translateZ(0);\n -ms-transform: translateZ(0);\n transform: translateZ(0);\n -webkit-animation: load8 1.1s infinite linear;\n animation: load8 1.1s infinite linear;\n }\n "); var styleSheet = document.createElement("style"); styleSheet.innerText = styles; document.head.appendChild(styleSheet); } function showPopup(iframe, options) { if (options === void 0) { options = { showSpinner: true }; } var wrapper = document.getElementById(WRAPPER_ID); var overlay = document.getElementById(OVERLAY_ID); var spinner = document.getElementById(SPINNER_ID); iframe.style.opacity = "0"; wrapper.style.display = "flex"; overlay.style.opacity = "1"; wrapper.style.animation = "wrapperAnimation 200ms ease-in-out"; if (options.showSpinner) { spinner.style.display = "block"; } } function showIframe(iframe) { iframe.style.animation = "hinge 400ms ease-in-out"; iframe.style.opacity = "1"; var spinner = document.getElementById(SPINNER_ID); setTimeout(function () { if (spinner) { spinner.style.display = "none"; } }, 250); } function hideIframe(iframe) { iframe.style.animation = ""; iframe.style.opacity = "0"; } function hidePopup(iframe) { var wrapper = document.getElementById(WRAPPER_ID); var overlay = document.getElementById(OVERLAY_ID); var spinner = document.getElementById(SPINNER_ID); hideIframe(iframe); wrapper.style.animation = ""; wrapper.style.display = "none"; overlay.style.opacity = "0"; spinner.style.display = "none"; } function createPopup(url) { var wrapper = document.createElement("div"); wrapper.style.alignItems = "center"; wrapper.style.backgroundColor = "100%"; wrapper.style.display = "flex"; wrapper.style.height = "100%"; wrapper.style.justifyContent = "center"; wrapper.style.left = "0"; wrapper.style.position = "fixed"; wrapper.style.top = "0"; wrapper.style.width = "100%"; wrapper.style.zIndex = "100"; wrapper.id = WRAPPER_ID; var overlay = document.createElement("div"); overlay.style.width = "100%"; overlay.style.height = "100%"; overlay.style.backgroundColor = "#333333c4"; overlay.style.position = "absolute"; overlay.style.inset = "0"; overlay.style.opacity = "0"; overlay.style.animation = ""; overlay.style.zIndex = "1"; overlay.style.transition = "opacity 0.25s ease-in-out"; overlay.id = OVERLAY_ID; wrapper.appendChild(overlay); var spinner = buildLoaderIcon(); wrapper.appendChild(spinner); var ifrm = document.createElement("iframe"); ifrm.setAttribute("src", url); ifrm.allow = "autoplay; clipboard-read; picture-in-picture; clipboard-write"; ifrm.allowFullscreen = true; ifrm.style.maxWidth = "540px"; ifrm.style.width = "100%"; ifrm.style.height = "520px"; ifrm.style.position = "absolute"; ifrm.style.background = "#fff"; ifrm.style.zIndex = "3"; ifrm.style.border = "none"; ifrm.style.borderRadius = "8px"; ifrm.style.overflow = "hidden"; ifrm.style.opacity = "0"; ifrm.id = IFRAME_ID; ifrm.onclose = function () { }; ifrm.onload = function () { // console.log("iframe onloaded!"); showIframe(ifrm); }; wrapper.appendChild(ifrm); // Event listenters for the modal overlay.onclick = function () { var isLoading = window.getComputedStyle(spinner, null).display === "block"; if (!isLoading) { hidePopup(ifrm); } }; // Add the whole wrapper into the UI... document.body.appendChild(wrapper); showPopup(ifrm); addGlobalStyles(); } function updateIframeUrl(iframe, url) { iframe.setAttribute("src", url); } function hasIframeTargetUrl(iframe, url) { return iframe.src === url; } function launchAndCreatePopup(url) { var popup = document.getElementById(WRAPPER_ID); if (popup) { var iframe = document.getElementById(IFRAME_ID); if (!hasIframeTargetUrl(iframe, url)) { showPopup(iframe); updateIframeUrl(iframe, url); } else { showPopup(iframe, { showSpinner: false }); showIframe(iframe); } } else { createPopup(url); } } function handleClickButton(event, url) { event.preventDefault(); launchAndCreatePopup(url); } var buildLoaderIcon = function () { // const fillColor = "#fff" var loaderIcon = document.createElement("div"); loaderIcon.id = SPINNER_ID; return loaderIcon; }; function getButtons() { return document.querySelectorAll("[data-".concat(FORM_DATA_KEY, "]")); } function runWaitlistScript() { var elements = getButtons(); elements.forEach(function (element) { var waitlistId = element.dataset.waitlistId; var listId = waitlistId; var formUrl = "".concat(FORM_ENDPOINT, "/").concat(listId); element.onclick = function (event) { handleClickButton(event, formUrl); }; element.dataset.wlLoaded = "true"; }); } function loadScript() { // https://stackoverflow.com/a/807997 // @ts-ignore: Unreachable code error if (window.attachEvent) { // @ts-ignore: Unreachable code error window.attachEvent("onload", runWaitlistScript); } else { if (window.onload) { var curronload = window.onload; var newonload = function (evt) { // @ts-ignore: Unreachable code error curronload(evt); // @ts-ignore: Unreachable code error runWaitlistScript(evt); }; window.onload = newonload; // @ts-ignore: Unreachable code error } else { window.onload = runWaitlistScript; } } } function listenEvents() { document.addEventListener("DOMContentLoaded", runWaitlistScript, false); if (document.readyState === "interactive" || document.readyState === "complete") { runWaitlistScript(); } } function init() { if (typeof window === "undefined") { return; } loadScript(); // Listen events to re-create the popup actions on page change. listenEvents(); } function openPopup(listId) { var formUrl = "".concat(FORM_ENDPOINT, "/").concat(listId); launchAndCreatePopup(formUrl); } exports["default"] = { checkUser: checkUser, init: init, openPopup: openPopup };