@ribajs/bs5
Version:
Bootstrap 5 module for Riba.js
297 lines • 22.6 kB
JavaScript
import { Component } from "@ribajs/core";
import { getUrl } from "@ribajs/utils/src/url";
import template from "./bs5-share.component.html?raw";
import labelTemplate from "./bs5-share.label.html?raw";
import { Dropdown } from "@ribajs/bs5";
import { hasChildNodesTrim, copyTextToClipboard, stripHtml, } from "@ribajs/utils";
export class Bs5ShareComponent extends Component {
static tagName = "bs5-share";
_debug = false;
static get observedAttributes() {
return [
"type",
"title",
"text",
"url",
"media-url",
"filename",
"label",
"dropdown-direction",
"dropdown-alignment",
"label-facebook",
"label-twitter",
"label-pinterest",
"label-whatsapp",
"label-telegram",
"label-email",
"label-download",
"label-clipboard",
];
}
dropdown;
static count = 0;
scope;
constructor() {
super();
this.scope = this.getScopeDefaults();
Bs5ShareComponent.count++;
this.onExternalOpenEvent = this.onExternalOpenEvent.bind(this);
this.onExternalCloseEvent = this.onExternalCloseEvent.bind(this);
}
getFilename(item) {
if (item.filename) {
return item.filename;
}
const url = this.getMediaUrlForShare();
const filename = url.split("/").pop();
return filename;
}
getDefaultShareServices() {
const newLine = "%0A";
const shareItems = [
{
id: "facebook",
label: this.scope.labelFacebook,
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: this.scope.labelTwitter,
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: this.scope.labelPinterest,
urlTemplate: "http://www.pinterest.com/pin/create/button/" +
"?url={{url}}&media={{media_url}}&description={{text}}",
type: "popup",
url: "",
availableFor: ["image", "video"],
},
{
id: "whatsapp",
label: this.scope.labelWhatsapp,
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: this.scope.labelTelegram,
urlTemplate: `https://telegram.me/share/url?url={{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: this.scope.labelEmail,
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: this.scope.labelDownload,
urlTemplate: "{{raw_media_url}}",
type: "download",
url: "",
availableFor: ["image", "video"],
filename: this.scope.filename,
},
{
id: "clipboard",
label: this.scope.labelClipboard,
urlTemplate: "{{url}}",
mediaUrlTemplate: `{{media_url}}`,
type: "clipboard",
url: "",
availableFor: ["page", "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: undefined,
label: "Share",
labelTemplate,
isAndroid: this.isAndroid(),
isIos: this.isIos(),
isDesktop: false,
isNative: this.browserSupportsNativeShare(),
dropdownId: "dropdownShare" + Bs5ShareComponent.count,
shareItems: [],
dropdownDirection: "down",
dropdownAlignment: "auto",
labelFacebook: "Facebook",
labelTwitter: "Twitter",
labelPinterest: "Pinterest",
labelWhatsapp: "Whatsapp",
labelTelegram: "Telegram",
labelEmail: "Email",
labelDownload: "Download",
labelClipboard: "Copy to clipboard",
share: this.share,
shareOnService: this.shareOnService,
getFilename: this.getFilename,
};
scope.isDesktop = !scope.isIos && !scope.isAndroid;
return scope;
}
onExternalOpenEvent() {
this.dropdown?.show();
}
onExternalCloseEvent() {
this.dropdown?.hide();
}
connectedCallback() {
super.connectedCallback();
this.init(Bs5ShareComponent.observedAttributes);
this.addEventListeners();
}
disconnectedCallback() {
super.disconnectedCallback();
this.removeEventListeners();
}
addEventListeners() {
this.addEventListener("open", this.onExternalOpenEvent);
this.addEventListener("btn-close", this.onExternalCloseEvent);
}
removeEventListeners() {
this.removeEventListener("open", this.onExternalOpenEvent);
this.removeEventListener("btn-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 stripHtml(this.scope.text);
}
getTitleForShare() {
return stripHtml(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 encode = shareItem.type === "clipboard" ? false : true;
const shareURL = urlTemplate
.replace("{{url}}", encode ? encodeURIComponent(url) : url)
.replace("{{media_url}}", encode ? encodeURIComponent(mediaUrl) : mediaUrl)
.replace("{{raw_media_url}}", mediaUrl)
.replace("{{text}}", encode ? encodeURIComponent(shareText) : shareText)
.replace("{{title}}", encode ? encodeURIComponent(shareTitle) : 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 Dropdown(dropDownButtonElement);
}
async shareOnService(item, event) {
this.dropdown?.hide();
if (item.type === "clipboard") {
event.preventDefault();
event.stopPropagation();
await copyTextToClipboard(item.url);
return false;
}
if (item.type === "download") {
return true;
}
event.preventDefault();
event.stopPropagation();
window.open(item.url, "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) {
try {
await 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();
this.debug("afterBind", this.scope);
this.scope.shareItems = this.getDefaultShareServices();
await super.afterBind();
}
requiredAttributes() {
return [];
}
template() {
if (this && hasChildNodesTrim(this)) {
this.scope.labelTemplate = this.innerHTML;
}
return template;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM1LXNoYXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2JzNS1zaGFyZS9iczUtc2hhcmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQStCLE1BQU0sY0FBYyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLFFBQVEsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQW1FdkIsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFNBQVM7SUFDdkMsTUFBTSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUM7SUFFN0IsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV0QixNQUFNLEtBQUssa0JBQWtCO1FBQzNCLE9BQU87WUFDTCxNQUFNO1lBQ04sT0FBTztZQUNQLE1BQU07WUFDTixLQUFLO1lBQ0wsV0FBVztZQUNYLFVBQVU7WUFDVixPQUFPO1lBQ1Asb0JBQW9CO1lBQ3BCLG9CQUFvQjtZQUNwQixnQkFBZ0I7WUFDaEIsZUFBZTtZQUNmLGlCQUFpQjtZQUNqQixnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsaUJBQWlCO1NBQ2xCLENBQUM7SUFDSixDQUFDO0lBRVMsUUFBUSxDQUFZO0lBRzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRVYsS0FBSyxDQUFRO0lBRXBCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFD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