UNPKG

@ribajs/bs4

Version:

Bootstrap 4 module for Riba.js

259 lines 20 kB
import { Component } from "@ribajs/core"; import { getUrl } from "@ribajs/utils"; import labelTemplate from "./bs4-share.label.html?raw"; import { DropdownService } from "@ribajs/bs4"; import { hasChildNodesTrim } from "@ribajs/utils/src/dom.js"; export class Bs4ShareComponent extends Component { static tagName = "bs4-share"; _debug = false; static get observedAttributes() { return [ "type", "title", "text", "url", "media-url", "label", "dropdown-direction", ]; } dropdown; static count = 0; scope; constructor() { super(); this.scope = this.getScopeDefaults(); this.debug("constructor", this.scope); Bs4ShareComponent.count++; this.onExternalOpenEvent = this.onExternalOpenEvent.bind(this); this.onExternalCloseEvent = this.onExternalCloseEvent.bind(this); } getDefaultShareServices() { const newLine = "%0A"; const shareItems = [ { id: "facebook", label: "Facebook", urlTemplate: "https://www.facebook.com/sharer/sharer.php?u={{url}}", mediaUrlTemplate: "https://www.facebook.com/sharer/sharer.php?u={{media_url}}", type: "popup", url: "", availableFor: ["page", "image", "video"], }, { id: "twitter", label: "Twitter", urlTemplate: "https://twitter.com/intent/tweet?text={{text}}&url={{url}}", mediaUrlTemplate: `https://twitter.com/intent/tweet?text={{text}}&url={{media_url}}${newLine}({{url}})`, url: "", availableFor: ["page", "image", "video"], }, { id: "pinterest", label: "Pinterest", urlTemplate: "http://www.pinterest.com/pin/create/button/" + "?url={{url}}&media={{media_url}}&description={{text}}", type: "popup", url: "", availableFor: ["image", "video"], }, { id: "whatsapp", label: "WhatsApp", urlTemplate: `https://api.whatsapp.com/send?text={{text}}${newLine}${newLine}{{url}}`, mediaUrlTemplate: `https://api.whatsapp.com/send?text={{text}}${newLine}${newLine}{{media_url}}${newLine}({{url}})`, type: "popup", url: "", availableFor: ["page", "image", "video"], }, { id: "telegram", label: "Telegram", urlTemplate: `https://telegram.me/share/url?url={{media_url}}&text={{text}}`, mediaUrlTemplate: `https://telegram.me/share/url?url={{media_url}}&text={{text}}${newLine}({{url}})`, type: "popup", url: "", availableFor: ["page", "image", "video"], }, { id: "email", label: "Email", urlTemplate: `mailto:?subject={{title}}&body={{text}}${newLine}${newLine}{{url}}`, mediaUrlTemplate: `mailto:?subject={{title}}&body={{text}}${newLine}${newLine}{{media_url}}${newLine}({{url}})`, type: "href", url: "", availableFor: ["page", "image", "video"], }, { id: "download", label: "Download image", urlTemplate: "{{raw_media_url}}", type: "download", url: "", availableFor: ["image", "video"], }, ]; return shareItems; } isIos() { return navigator.userAgent.match(/iPhone|iPad|iPod/i) !== null; } isAndroid() { return navigator.userAgent.match(/Android/i) !== null; } browserSupportsNativeShare() { return typeof navigator.share === "function"; } getScopeDefaults() { const scope = { type: "page", title: document.title, text: "Look at this! 👀🤩", url: window.location.href, label: "Share", labelTemplate, isAndroid: this.isAndroid(), isIos: this.isIos(), isDesktop: false, isNative: this.browserSupportsNativeShare(), dropdownId: "dropdownShare" + Bs4ShareComponent.count, shareItems: this.getDefaultShareServices(), dropdownDirection: "down", share: this.share, shareOnService: this.shareOnService, }; scope.isDesktop = !scope.isIos && !scope.isAndroid; return scope; } onExternalOpenEvent() { this.dropdown?.show(); } onExternalCloseEvent() { this.dropdown?.close(); } connectedCallback() { super.connectedCallback(); this.init(Bs4ShareComponent.observedAttributes); this.addEventListeners(); } disconnectedCallback() { super.disconnectedCallback(); this.removeEventListeners(); } addEventListeners() { this.addEventListener("open", this.onExternalOpenEvent); this.addEventListener("close", this.onExternalCloseEvent); } removeEventListeners() { this.removeEventListener("open", this.onExternalOpenEvent); this.removeEventListener("close", this.onExternalOpenEvent); } getURLForShare() { if (this.scope.type === "page" && this.scope.url) { return getUrl(this.scope.url); } return window.location.href; } getMediaUrlForShare() { if (this.scope.type !== "page" && this.scope.url) { return getUrl(this.scope.url); } return ""; } getTextForShare() { return this.scope.text; } getTitleForShare() { return this.scope.title; } updateShareURLs() { for (const shareItem of this.scope.shareItems) { const url = this.getURLForShare(); const mediaUrl = this.getMediaUrlForShare(); const shareText = this.getTextForShare(); const shareTitle = this.getTitleForShare(); let urlTemplate = shareItem.urlTemplate; if (this.scope.type !== "page" && shareItem.mediaUrlTemplate) { urlTemplate = shareItem.mediaUrlTemplate; } const shareURL = urlTemplate .replace("{{url}}", encodeURIComponent(url)) .replace("{{url}}", encodeURIComponent(url)) .replace("{{media_url}}", encodeURIComponent(mediaUrl)) .replace("{{raw_media_url}}", mediaUrl) .replace("{{text}}", encodeURIComponent(shareText)) .replace("{{title}}", encodeURIComponent(shareTitle)); shareItem.available = shareItem.availableFor.includes(this.scope.type); shareItem.url = shareURL; } } initDropdown() { const dropDownButtonElement = this.querySelector(".dropdown-toggle-share"); if (!dropDownButtonElement) { console.warn('Element with selector ".dropdown-toggle-share" not found!', this); return; } this.dropdown = new DropdownService(dropDownButtonElement); } shareOnService(event, controller, el) { this.debug("Open popup"); this.dropdown?.close(); if (!el || !el.href) { console.error("No href attribute found"); return false; } if ((el.hasAttribute("type") && el.getAttribute("type") === "download") || el.getAttribute("type") === "href") { return true; } event.preventDefault(); event.stopPropagation(); window.open(el.href, "Share", "scrollbars=yes,resizable=yes,toolbar=no," + "location=yes,width=550,height=420,top=100,left=" + (window.screen ? Math.round(screen.width / 2 - 275) : 100)); return false; } async share(event) { this.debug("share", this.scope); event.preventDefault(); event.stopPropagation(); if (this.scope.isNative && !this.scope.isDesktop) { return navigator .share({ title: this.scope.title, text: `${this.scope.text}\r\n\r\n`, url: this.scope.url || window.location.href, }) .catch((error) => { if (error.name === "AbortError") { return; } console.error(`Error ${error.name}: ${error.message}`, error); }); } else { this.updateShareURLs(); return this.dropdown?.toggle(); } } async beforeBind() { await super.beforeBind(); } async afterBind() { this.initDropdown(); await super.afterBind(); } requiredAttributes() { return ["url"]; } async template() { this.debug("template", this, hasChildNodesTrim(this)); if (this && hasChildNodesTrim(this)) { this.scope.labelTemplate = this.innerHTML; this.debug("Custom label template: ", this.scope.labelTemplate); } const { default: template } = await import("./bs4-share.component.html?raw"); return template; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM0LXNoYXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2JzNC1zaGFyZS9iczQtc2hhcmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWEsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBd0Q3RCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsU0FBUztJQUN2QyxNQUFNLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQztJQUU3QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRXRCLE1BQU0sS0FBSyxrQkFBa0I7UUFDM0IsT0FBTztZQUNMLE1BQU07WUFDTixPQUFPO1lBQ1AsTUFBTTtZQUNOLEtBQUs7WUFDTCxXQUFXO1lBQ1gsT0FBTztZQUNQLG9CQUFvQjtTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVTLFFBQVEsQ0FBbUI7SUFHckMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFVixLQUFLLENBQVE7SUFFcEI7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9ELElB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