vue-socials
Version:
Social media share buttons and counts for Vue.js
1,769 lines (1,595 loc) • 78.9 kB
JavaScript
import { defineComponent, h } from 'vue';
/**
* A simple function to format object to window.open() string features.
* It formats all values to a number.
* @example { width: 500, menubar: true, toolbar: false } => 'width=500,menubar=1,toolbar=0'
* @link https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features
*/
function getFormattedWindowFeatures(object) {
var keys = Object.keys(object);
return keys.map(function (key) {
return "".concat(key, "=").concat(Number(object[key]));
}).join(',');
}
/**
* A simple function to get window client rect.
* It works with minimized windows, user zoom, and dual-screen.
* @link http://www.xtf.dk/2011/08/center-new-popup-window-even-on.html
*/
function getPopupClientRect(width, height) {
var systemZoom = window.innerWidth / window.screen.availWidth;
var finalWidth = width / systemZoom;
var finalHeight = height / systemZoom;
var left = (window.innerWidth - width) / 2 / systemZoom + window.screenLeft;
var top = (window.innerHeight - height) / 2 / systemZoom + window.screenTop;
return {
width: finalWidth,
height: finalHeight,
top: top,
left: left
};
}
/**
* Convenience inspection utilities
*/
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types,@typescript-eslint/no-explicit-any
function isArray(value) {
return Array.isArray(value);
} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types,@typescript-eslint/no-explicit-any
function isUndefined(value) {
return value === undefined;
}
/**
* Hey!
*
* Base socials mixin used for every social component
* which have share window. It provides a method for window.open()
* and has props for window features. Also has a method for component render.
*/
var DEFAULT_WINDOW_FEATURES = {
width: 600,
height: 540
};
/**
* Wrapper around Vue mixin to pass parameters inside.
* We use multiple parameters instead of a single object because
* it causes problems with tree-shaking. I don't know why.
* A little bit inconvenient, but overall OK :)
*/
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function BaseSocials(name, customWindowFeatures, customShareOptions, customAriaLabel, isShareOptionsRequired, isWindowFeaturesRequired) {
return /* #__PURE__ */defineComponent({
props: {
/**
* Requested features of the new window
* @link https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features
*/
windowFeatures: {
type: Object,
default: function _default() {
return customWindowFeatures || DEFAULT_WINDOW_FEATURES;
},
required: isWindowFeaturesRequired
},
/**
* Share parameters for social network
*/
shareOptions: {
type: Object,
default: function _default() {
return customShareOptions || {};
},
required: isShareOptionsRequired || true
},
/**
* Use native link behavior instead of window.open()
*/
useNativeBehavior: {
type: Boolean,
default: false
}
},
data: function data() {
return {
shareDialog: null,
shareDialogCloseIntervalId: undefined
};
},
emits: ['click', 'popup-block', 'popup-open', 'popup-close', 'popup-focus'],
/**
* Make sure interval has been cleared
*/
beforeUnmount: function beforeUnmount() {
window.clearInterval(this.shareDialogCloseIntervalId);
},
computed: {
/**
* Merge default and user window features
*/
mergedWindowFeatures: function mergedWindowFeatures() {
var windowFeatures = this.windowFeatures;
/**
* We use `Object.assign` instead of the spread operator
* to prevent adding the polyfill (about 150 bytes gzipped)
*/
return Object.assign({}, DEFAULT_WINDOW_FEATURES, windowFeatures);
},
/**
* Calculate the aria-label for a link.
* It replaces @s in a string with a social network name.
*/
ariaLabel: function ariaLabel() {
var $attrs = this.$attrs;
var target = $attrs.target;
var label = customAriaLabel || 'Share this with @s.';
if (target === '_blank' || isUndefined(target)) {
label += ' (opens in new window)';
}
return label.replace(/@s/g, name);
}
},
methods: {
/**
* Create new share popup from url
* @link https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Syntax
*/
openShareDialog: function openShareDialog(url) {
var _this$shareDialog,
_this = this;
var mergedWindowFeatures = this.mergedWindowFeatures;
var _mergedWindowFeatures = mergedWindowFeatures.width,
width = _mergedWindowFeatures === void 0 ? DEFAULT_WINDOW_FEATURES.width : _mergedWindowFeatures,
_mergedWindowFeatures2 = mergedWindowFeatures.height,
height = _mergedWindowFeatures2 === void 0 ? DEFAULT_WINDOW_FEATURES.height : _mergedWindowFeatures2;
var shareDialogClientRect = getPopupClientRect(width, height);
var formattedFeatures = getFormattedWindowFeatures(Object.assign({}, mergedWindowFeatures, shareDialogClientRect));
/**
* If the pointer to the window object in memory does not exist
* or if such pointer exists but the window was closed
*/
if (this.shareDialog === null || (_this$shareDialog = this.shareDialog) !== null && _this$shareDialog !== void 0 && _this$shareDialog.closed) {
/**
* then create it. The new window will be created and
* will be brought on top of any other window.
*/
this.shareDialog = window.open(url, '_blank', formattedFeatures);
/**
* If window.open has been blocked – emit 'block' event and then do nothing
* If not – emit 'open' event
*/
if (!this.shareDialog) {
this.$emit('popup-block');
return;
}
this.$emit('popup-open');
/**
* window.onbeforeunload event didn't work because of Same Origin Policy
* So we check if it has been closed every 300 ms
* @link https://atashbahar.com/post/2010-04-27-detect-when-a-javascript-popup-window-gets-closed
*/
this.shareDialogCloseIntervalId = window.setInterval(function () {
var _this$shareDialog2;
if (_this.shareDialog === null || (_this$shareDialog2 = _this.shareDialog) !== null && _this$shareDialog2 !== void 0 && _this$shareDialog2.closed) {
window.clearInterval(_this.shareDialogCloseIntervalId);
_this.$emit('popup-close');
/**
* Unset reference to the popup window
* @link https://web.dev/detached-window-memory-leaks/#solution-unset-references
*/
_this.shareDialog = null;
}
}, 300);
} else {
/**
* else the window reference must exist and the window
* is not closed; therefore, we can bring it back on top of any other
* window with the focus() method. There would be no need to re-create
* the window or to reload the referenced resource.
*/
this.shareDialog.focus();
this.$emit('popup-focus');
}
},
/**
* Create new share component
*/
generateComponent: function generateComponent(url) {
var _this2 = this,
_this$$slots$default,
_this$$slots;
return h('a', {
href: url,
target: '_blank',
rel: 'nofollow noopener noreferrer',
'aria-label': this.ariaLabel,
onClick: function onClick(event) {
if (!_this2.useNativeBehavior) {
event.preventDefault();
_this2.openShareDialog(url);
}
_this2.$emit('click');
}
}, (_this$$slots$default = (_this$$slots = this.$slots).default) === null || _this$$slots$default === void 0 ? void 0 : _this$$slots$default.call(_this$$slots));
}
}
});
}
/**
* A simple function to format object to GET parameters.
* It skips undefined, null, and NaN values.
* @example { foo: 'bar', bar: undefined, foobar: 'foo bar', } => '?foo=bar&foobar=foo%20bar'
* @example { foo: null, bar: undefined, foobar: NaN, } => ''
*/
function getSerialisedParams(object) {
var params = Object.entries(object).filter(function (param) {
return param[1] !== undefined && param[1] !== null && !Number.isNaN(param[1]) && param[1] !== '';
}).map(function (param) {
return "".concat(encodeURIComponent(param[0]), "=").concat(encodeURIComponent(String(param[1])));
});
return params.length > 0 ? "?".concat(params.join('&')) : '';
}
/**
* Hey!
*
* SBlogger component used for Blogger social network
* @link https://www.blogger.com/
* @example https://www.blogger.com/blog-this.g?u=https%3A%2F%2Fgithub.com%2F&t=Text&n=Title/
*/
/**
* Share parameters for link
* @link https://stackoverflow.com/a/22583473/13374604
* url => u
* title => n
* text => t
*/
var SBlogger = /* #__PURE__ */defineComponent({
name: 'SBlogger',
mixins: [BaseSocials('Blogger', undefined, undefined, undefined, true)],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://www.blogger.com/blog-this.g';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title,
text = shareOptions.text;
var serialisedParams = getSerialisedParams({
u: url,
t: text,
n: title
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* A simple function to format array to a comma-separated list.
*/
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types,@typescript-eslint/no-explicit-any
function getSeparatedList(array) {
var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';
if (isArray(array)) {
return array.join(separator);
}
return '';
}
/**
* Hey!
*
* SDevTo component used for DevTo social network
* @link https://dev.to/
* @example https://dev.to/new?prefill=%0A%20%20%20%20%20%20%20%20---%0A%20%20%20%20%20%20%20%20title%3ATitle%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20tags%3Atag%0A%20%20%20%20%20%20%20%20---%0A%20%20%20%20%20%20%20%20Text%201%0AText%202%0A%7B%25%20wikipedia%20https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FWikipedia%20%25%7D
*/
/**
* Share parameters for link
* @link https://dev.to/devteam/announcing-off-platform-share-to-dev-functionality-57j9
*/
var SDevTo = /* #__PURE__ */defineComponent({
name: 'SDevTo',
mixins: [BaseSocials('DevTo')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://dev.to/new';
var shareOptions = this.shareOptions;
var title = shareOptions.title,
isPublished = shareOptions.isPublished,
tags = shareOptions.tags,
content = shareOptions.content;
var formattedTitle = title ? "title:".concat(title) : '';
var formattedPublish = isPublished ? "published:".concat(isPublished) : '';
var formattedTags = tags ? "tags:".concat(getSeparatedList(tags, ', ')) : '';
var formattedContent = content || '';
var serialisedParams = getSerialisedParams({
prefill: "\n ---\n ".concat(formattedTitle, "\n ").concat(formattedPublish, "\n ").concat(formattedTags, "\n ---\n ").concat(formattedContent)
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SDiaspora component used for DiasporaFoundation social network
* @link https://diasporafoundation.org/
* @example https://share.diasporafoundation.org/?url=https%3A%2F%2Fgithub.com%2F&title=Title/
*/
/**
* Share parameters for link
* @link https://share.diasporafoundation.org/about.html
* @link https://wiki.diasporafoundation.org/FAQ_for_web_developers
*/
var SDiaspora = /* #__PURE__ */defineComponent({
name: 'SDiaspora',
mixins: [BaseSocials('Diaspora', {
width: 600,
height: 540
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://share.diasporafoundation.org';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title;
var serialisedParams = getSerialisedParams({
url: url,
title: title
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SDouban component used for Douban social network
* @link https://www.douban.com
* @example https://accounts.douban.com/passport/login?redir=https%3A//www.douban.com/share/service%3Fname%3D%26href%3D%26image%3D%26updated%3D%26bm%3D%26name%3DTitle%26text%3DText%26comment%3Dhttps%253A%252F%252Fgithub.com%252F%26href%3Dhttps%253A%252F%252Fgithub.com%252F
*/
/**
* Share parameters for link
* @link https://blog.duncanworthy.me/misc/how-to-add-chinese-social-media-sharing-links-on-wordpress/comment-page-1/
*/
var SDouban = /* #__PURE__ */defineComponent({
name: 'SDouban',
mixins: [BaseSocials('Douban', {
width: 1100,
height: 450
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'http://www.douban.com/recommend/';
var shareOptions = this.shareOptions;
var title = shareOptions.title,
url = shareOptions.url;
var serialisedParams = getSerialisedParams({
url: url,
title: title
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SEmail component used for sending Email via an HTML link
* @example mailto:google@gmail.com?subject=Subject&body=Hello%0AWorld&cc=google1%40gmail.com&bcc=google2%40gmail.com
*/
/**
* Share parameters for link
* @link https://tools.ietf.org/html/rfc2368
* @link https://css-tricks.com/snippets/html/mailto-links/
* @description cc – carbon copy
* @description bcc – blind carbon copy
*/
var SEmail = /* #__PURE__ */defineComponent({
name: 'SEmail',
props: {
/**
* Share parameters for Email
*/
shareOptions: {
type: Object,
required: true
}
},
computed: {
networkURL: function networkURL() {
var BASE_URL = 'mailto:';
var shareOptions = this.shareOptions;
var mail = shareOptions.mail,
subject = shareOptions.subject,
body = shareOptions.body,
cc = shareOptions.cc,
bcc = shareOptions.bcc;
var serialisedParams = getSerialisedParams({
subject: subject,
body: body,
cc: getSeparatedList(cc, ', '),
bcc: getSeparatedList(bcc, ', ')
});
return "".concat(BASE_URL).concat(mail).concat(serialisedParams);
},
ariaLabel: function ariaLabel() {
var shareOptions = this.shareOptions;
var mail = shareOptions.mail,
cc = shareOptions.cc,
bcc = shareOptions.bcc;
var LABELS = ["Send an e-mail to ".concat(mail)];
if (cc) {
LABELS.push("add a carbon copy for ".concat(getSeparatedList(cc, ', ')));
}
if (bcc) {
LABELS.push("add a blind carbon copy for ".concat(getSeparatedList(bcc, ', ')));
}
return "".concat(LABELS.join(' and '), ".");
}
},
render: function render() {
var _this$$slots$default, _this$$slots;
return h('a', {
href: this.networkURL,
rel: 'noopener noreferrer',
'aria-label': this.ariaLabel
}, (_this$$slots$default = (_this$$slots = this.$slots).default) === null || _this$$slots$default === void 0 ? void 0 : _this$$slots$default.call(_this$$slots));
}
});
/**
* Hey!
*
* SEvernote component used for Evernote social network
* @link https://www.evernote.com/
* @example https://www.evernote.com/clip.action?url=https%3A%2F%2Fgithub.com%2F&title=Title
*/
/**
* Share parameters for link
*/
var SEvernote = /* #__PURE__ */defineComponent({
name: 'SEvernote',
mixins: [BaseSocials('Evernote', {
width: 800,
height: 560
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://www.evernote.com/clip.action';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title;
var serialisedParams = getSerialisedParams({
url: url,
title: title
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SFacebook component used for Facebook social network.
* @link https://www.facebook.com/
* @example https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fgithub.com%2F"e=Quote&hashtag=%23Github
*/
/**
* Share parameters for link
* @link https://developers.facebook.com/docs/workplace/sharing/share-dialog/
*/
var SFacebook = /* #__PURE__ */defineComponent({
name: 'SFacebook',
mixins: [BaseSocials('Facebook', {
width: 685,
height: 600
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://www.facebook.com/sharer/sharer.php';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
quote = shareOptions.quote,
hashtag = shareOptions.hashtag;
return "".concat(BASE_URL).concat(getSerialisedParams({
u: url,
quote: quote,
hashtag: hashtag
}));
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Simple implementation of JSONP.
* It creates window.callbackRegistry to minimize global window pollution.
* It uses callback to prevent adding the promise polyfill.
*/
function JSONP(url, callback, callbackName) {
var script = document.createElement('script');
var cbName = callbackName || 'callback';
if (callback) {
if (!window.callbackRegistry) {
window.callbackRegistry = {};
}
var _key = "cb".concat(String(Math.random()).slice(-6));
script.src = "".concat(url).concat(url.indexOf('?') === -1 ? '?' : '&').concat(cbName, "=callbackRegistry.").concat(_key);
script.onerror = function JSONPOnError() {
delete window.callbackRegistry[_key];
callback(new Error(), null);
};
window.callbackRegistry[_key] = function JSONPCallback(response) {
delete window.callbackRegistry[_key];
callback(null, response);
};
} else {
script.src = url;
}
document.head.removeChild(document.head.appendChild(script));
}
/**
* Hey!
*
* Base count mixin used for every social count component.
*/
/**
* Wrapper around Vue mixin to pass parameters inside.
* We use multiple parameters instead of a single object because
* it causes problems with tree-shaking. I don't know why.
* A little bit inconvenient, but overall OK :)
*/
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function BaseCount(name, customShareOptions, isShareOptionsRequired, customAriaLabel) {
return /* #__PURE__ */defineComponent({
props: {
/**
* Component tag
*/
tag: {
type: [String, Object],
default: 'span'
},
/**
* Share parameters for social network
*/
shareOptions: {
type: Object,
default: function _default() {
return customShareOptions || {};
},
required: isShareOptionsRequired || true
}
},
data: function data() {
return {
count: undefined,
response: null,
error: null,
isLoading: false
};
},
emits: ['load', 'error', 'loading'],
computed: {
/**
* Calculate the aria-label for a counter.
* It replaces @s in a string with a social network name
* and @c with a count.
*/
ariaLabel: function ariaLabel() {
var count = this.count;
var label = customAriaLabel || '@c people share this on @s.';
if (!isUndefined(count)) {
return label.replace(/@c/g, String(count)).replace(/@s/g, name);
}
return 'No one shares this content yet.';
}
},
methods: {
/**
* Save response from JSONP or HTTP and emit event
*/
handleResult: function handleResult(value) {
this.response = value;
this.$emit('load', value);
},
/**
* Save response from JSONP or HTTP and emit event
*/
handleError: function handleError(value) {
this.error = value;
this.$emit('error', value);
},
/**
* Save loading state and emit event
*/
handleLoading: function handleLoading(value) {
this.isLoading = value;
this.$emit('loading', value);
},
/**
* Save counter value and render inside element
*/
handleCount: function handleCount(count) {
this.count = count;
},
/**
* Create new count component
*/
generateComponent: function generateComponent() {
var _this$$slots$default, _this$$slots;
var children = ((_this$$slots$default = (_this$$slots = this.$slots).default) === null || _this$$slots$default === void 0 ? void 0 : _this$$slots$default.call(_this$$slots, {
isLoading: this.isLoading,
response: this.response,
count: this.count
})) || [this.count];
return h(this.tag, {
'aria-label': this.ariaLabel
}, children);
}
},
render: function render() {
return this.generateComponent();
}
});
}
/**
* Hey!
*
* SFacebookCount component used for Facebook social network
* @link https://www.facebook.com/
* @example https://graph.facebook.com/?url=https://github.com/
*/
var SFacebookCount = /* #__PURE__ */defineComponent({
mixins: [BaseCount('Facebook')],
methods: {
handleFacebookResponse: function handleFacebookResponse(data) {
this.handleResult(data);
if ('engagement' in data) {
var _data$engagement;
this.handleCount((_data$engagement = data.engagement) === null || _data$engagement === void 0 ? void 0 : _data$engagement.share_count);
}
}
},
mounted: function mounted() {
var _this = this;
var BASE_URL = 'https://graph.facebook.com/';
var shareOptions = this.shareOptions;
var id = shareOptions.id,
accessToken = shareOptions.accessToken,
fields = shareOptions.fields,
scopes = shareOptions.scopes;
var finalURL = "".concat(BASE_URL).concat(getSerialisedParams({
id: id,
access_token: accessToken,
fields: getSeparatedList(fields),
scopes: getSeparatedList(scopes)
}));
this.handleLoading(true);
JSONP(finalURL, function (err, data) {
_this.handleLoading(false);
if (data) {
_this.handleFacebookResponse(data);
}
if (err) {
_this.handleError(err);
}
});
}
});
/**
* Hey!
*
* SFacebookMessenger component used for FacebookMessenger social network
* @link https://facebook.com/
* @example https://www.facebook.com/dialog/send?link=https%3A%2F%2Fgithub.com%2F&app_id=123456789&redirect_uri=https%3A%2F%2Fwww.domain.com%2F
*/
/**
* Share parameters for link
* @link https://developers.facebook.com/docs/sharing/reference/send-dialog#examples
* url => link
* appId => app_id
* redirectUri => redirect_uri
*/
var SFacebookMessenger = /* #__PURE__ */defineComponent({
name: 'SFacebookMessenger',
mixins: [BaseSocials('Facebook Messenger')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'http://www.facebook.com/dialog/send';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
appId = shareOptions.appId,
redirectUri = shareOptions.redirectUri,
to = shareOptions.to;
var serialisedParams = getSerialisedParams({
link: url,
app_id: appId,
redirect_uri: redirectUri,
to: to
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SFacebookWorkplace component used for FacebookWorkplace social network
* @link https://work.facebook.com/
* @example https://work.facebook.com/sharer.php?url=https%253A%252F%252Fgithub.com
*/
/**
* Share parameters for link
* @link https://developers.facebook.com/docs/workplace/sharing/share-dialog/
*/
var SFacebookWorkplace = /* #__PURE__ */defineComponent({
name: 'SFacebookWorkplace',
mixins: [BaseSocials('Facebook Workplace')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://work.facebook.com/sharer.php';
var shareOptions = this.shareOptions;
var url = shareOptions.url;
var serialisedParams = getSerialisedParams({
url: url
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SFlipBoard component used for FlipBoard social network
* @link https://flipboard.com/
* @example https://share.flipboard.com/bookmarklet/popout?url=https%3A%2F%2Fgithub.com%2F&title=Title
*/
/**
* Share parameters for link
* @link https://about.flipboard.com/social-plugins/?tool=browser
*/
var SFlipBoard = /* #__PURE__ */defineComponent({
name: 'SFlipBoard',
mixins: [BaseSocials('Flipboard', {
width: 834,
height: 572
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://share.flipboard.com/bookmarklet/popout';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title;
var serialisedParams = getSerialisedParams({
v: '2',
url: url,
title: title
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SGithub component used for GitHub social network
* @link https://github.com/
* @example https://github.com/webistomin/
*/
var GITHUB_LINK_TYPES$5 = {
sponsor: 'sponsor',
follow: 'follow',
profile: 'profile'
};
var SGithub = /* #__PURE__ */defineComponent({
name: 'SGithub',
mixins: [BaseSocials('GitHub', {
width: 900,
height: 600
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://github.com/';
var shareOptions = this.shareOptions;
var username = shareOptions.username,
type = shareOptions.type;
switch (type) {
case GITHUB_LINK_TYPES$5.sponsor:
return "".concat(BASE_URL, "sponsors/").concat(username);
case GITHUB_LINK_TYPES$5.follow:
return "".concat(BASE_URL).concat(username, "?tab=followers");
case GITHUB_LINK_TYPES$5.profile:
default:
return "".concat(BASE_URL).concat(username);
}
},
ariaLabel: function ariaLabel() {
var shareOptions = this.shareOptions;
var username = shareOptions.username,
type = shareOptions.type;
switch (type) {
case GITHUB_LINK_TYPES$5.sponsor:
return "Sponsor ".concat(username, " on GitHub.");
case GITHUB_LINK_TYPES$5.follow:
return "Follow ".concat(username, " on GitHub.");
case GITHUB_LINK_TYPES$5.profile:
default:
return "Watch ".concat(username, " on GitHub.");
}
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SGithubCount component used for GitHub social network
* @link https://github.com/
*/
var GITHUB_LINK_TYPES$4 = {
follow: 'follow'
};
var SGithubCount = /* #__PURE__ */defineComponent({
name: 'SGithubCount',
mixins: [BaseCount('GitHub', {}, true, '@c followers on @s.')],
methods: {
handleGithubResponse: function handleGithubResponse(data) {
this.handleResult(data);
if ('followers' in data.data) {
this.handleCount(data.data.followers);
}
}
},
mounted: function mounted() {
var _this = this;
var shareOptions = this.shareOptions;
var username = shareOptions.username,
type = shareOptions.type;
var BASE_URL = 'https://api.github.com/';
var finalURL;
switch (type) {
case GITHUB_LINK_TYPES$4.follow:
default:
finalURL = "".concat(BASE_URL, "users/").concat(username);
}
this.handleLoading(true);
JSONP(finalURL, function (err, data) {
_this.handleLoading(false);
if (data) {
_this.handleGithubResponse(data);
}
if (err) {
_this.handleError(err);
}
});
}
});
/**
* Hey!
*
* SGithubGist component used for Github Gists social network
* @link https://gist.github.com/
* @example https://gist.github.com/ai/e3683b03ba936ade91d33dbc721cd6d8/stargazers
*/
var GITHUB_LINK_TYPES$3 = {
gist: 'gist',
star: 'star',
fork: 'fork',
download: 'download'
};
var SGithubGist = /* #__PURE__ */defineComponent({
name: 'SGithubGist',
mixins: [BaseSocials('GitHub Gists', {
width: 900,
height: 600
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://gist.github.com/';
var shareOptions = this.shareOptions;
var username = shareOptions.username,
gistId = shareOptions.gistId,
type = shareOptions.type;
switch (type) {
case GITHUB_LINK_TYPES$3.fork:
return "".concat(BASE_URL).concat(username, "/").concat(gistId, "/forks");
case GITHUB_LINK_TYPES$3.star:
return "".concat(BASE_URL).concat(username, "/").concat(gistId, "/stargazers");
case GITHUB_LINK_TYPES$3.download:
return "".concat(BASE_URL).concat(username, "/").concat(gistId, "/archive/master.zip");
case GITHUB_LINK_TYPES$3.gist:
default:
return "".concat(BASE_URL).concat(username, "/").concat(gistId);
}
},
ariaLabel: function ariaLabel() {
var shareOptions = this.shareOptions;
var type = shareOptions.type;
switch (type) {
case GITHUB_LINK_TYPES$3.fork:
return 'Fork this gist.';
case GITHUB_LINK_TYPES$3.star:
return 'Star this gist.';
case GITHUB_LINK_TYPES$3.download:
return 'Download this gist.';
case GITHUB_LINK_TYPES$3.gist:
default:
return 'Watch this gist.';
}
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SGithubGistCount component used for Github Gists social network
* @link https://gist.github.com/
*/
var GITHUB_LINK_TYPES$2 = {
fork: 'fork'
};
var SGithubGistCount = /* #__PURE__ */defineComponent({
name: 'SGithubGistCount',
methods: {
handleGithubResponse: function handleGithubResponse(data) {
var shareOptions = this.shareOptions;
var type = shareOptions.type;
this.handleResult(data);
var count;
switch (type) {
default:
case GITHUB_LINK_TYPES$2.fork:
if ('forks' in data.data) {
count = data.data.forks.length;
}
break;
}
this.handleCount(count);
}
},
mixins: [BaseCount('GithubGist')],
mounted: function mounted() {
var _this = this;
var shareOptions = this.shareOptions;
var gistId = shareOptions.gistId;
var BASE_URL = 'https://api.github.com/';
var finalURL = "".concat(BASE_URL, "gists/").concat(gistId);
this.handleLoading(true);
JSONP(finalURL, function (err, data) {
_this.handleLoading(false);
if (err) {
_this.handleError(err);
}
if (data) {
_this.handleGithubResponse(data);
}
});
}
});
/**
* Hey!
*
* SGithubRepo component used for GitHub social network
* @link https://github.com/
*/
var GITHUB_LINK_TYPES$1 = {
repo: 'repo',
watch: 'watch',
star: 'star',
fork: 'fork',
download: 'download',
issue: 'issue',
pr: 'pr',
template: 'template'
};
var SGithubRepo = /* #__PURE__ */defineComponent({
name: 'SGithubRepo',
mixins: [BaseSocials('GitHub', {
width: 900,
height: 600
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://github.com/';
var shareOptions = this.shareOptions;
var username = shareOptions.username,
repository = shareOptions.repository,
type = shareOptions.type;
switch (type) {
case GITHUB_LINK_TYPES$1.watch:
return "".concat(BASE_URL).concat(username, "/").concat(repository, "/subscription");
case GITHUB_LINK_TYPES$1.fork:
return "".concat(BASE_URL).concat(username, "/").concat(repository, "/fork");
case GITHUB_LINK_TYPES$1.star:
return "".concat(BASE_URL).concat(username, "/").concat(repository, "/stargazers");
case GITHUB_LINK_TYPES$1.issue:
return "".concat(BASE_URL).concat(username, "/").concat(repository, "/issues/new");
case GITHUB_LINK_TYPES$1.pr:
return "".concat(BASE_URL).concat(username, "/").concat(repository, "/compare");
case GITHUB_LINK_TYPES$1.download:
return "".concat(BASE_URL).concat(username, "/").concat(repository, "/archive/master.zip");
case GITHUB_LINK_TYPES$1.template:
return "".concat(BASE_URL).concat(username, "/").concat(repository, "/generate");
case GITHUB_LINK_TYPES$1.repo:
default:
return "".concat(BASE_URL).concat(username, "/").concat(repository);
}
},
ariaLabel: function ariaLabel() {
var shareOptions = this.shareOptions;
var username = shareOptions.username,
repository = shareOptions.repository,
type = shareOptions.type;
switch (type) {
case GITHUB_LINK_TYPES$1.watch:
return "Watch ".concat(username, "/").concat(repository, " on GitHub");
case GITHUB_LINK_TYPES$1.fork:
return "Fork ".concat(username, "/").concat(repository, " on GitHub");
case GITHUB_LINK_TYPES$1.star:
return "Give a star to ".concat(username, "/").concat(repository, " on GitHub");
case GITHUB_LINK_TYPES$1.issue:
return "Raise a new issue on ".concat(username, "/").concat(repository, " on GitHub");
case GITHUB_LINK_TYPES$1.pr:
return "Raise a new pull request ".concat(username, "/").concat(repository, " on GitHub");
case GITHUB_LINK_TYPES$1.download:
return "Download ".concat(username, "/").concat(repository, " from GitHub");
case GITHUB_LINK_TYPES$1.template:
return "Generate a new repository from ".concat(username, "/").concat(repository, " on GitHub");
case GITHUB_LINK_TYPES$1.repo:
default:
return "Watch ".concat(username, "/").concat(repository, " on GitHub");
}
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SGithubRepoCount component used for Github social network
* @link https://github.com/
*/
var GITHUB_LINK_TYPES = {
watch: 'watch',
star: 'star',
fork: 'fork',
issues: 'issues'
};
var SGithubRepoCount = /* #__PURE__ */defineComponent({
name: 'SGithubRepoCount',
mixins: [BaseCount('GitHub')],
methods: {
handleGithubResponse: function handleGithubResponse(data) {
var shareOptions = this.shareOptions;
var type = shareOptions.type;
this.handleResult(data);
var count;
switch (type) {
case GITHUB_LINK_TYPES.watch:
if ('subscribers_count' in data.data) {
count = data.data.subscribers_count;
}
break;
case GITHUB_LINK_TYPES.fork:
if ('forks_count' in data.data) {
count = data.data.forks_count;
}
break;
case GITHUB_LINK_TYPES.issues:
if ('open_issues_count' in data.data) {
count = data.data.open_issues_count;
}
break;
case GITHUB_LINK_TYPES.star:
default:
if ('stargazers_count' in data.data) {
count = data.data.stargazers_count;
}
break;
}
this.handleCount(count);
}
},
mounted: function mounted() {
var _this = this;
var shareOptions = this.shareOptions;
var username = shareOptions.username,
repository = shareOptions.repository;
var BASE_URL = 'https://api.github.com/';
var finalURL = "".concat(BASE_URL, "repos/").concat(username, "/").concat(repository);
this.handleLoading(true);
JSONP(finalURL, function (err, data) {
_this.handleLoading(false);
if (err) {
_this.handleError(err);
}
if (data) {
_this.handleGithubResponse(data);
}
});
}
});
/**
* Hey!
*
* SGmail component used for sending Email via GMail
* @link https://mail.google.com/
* @example https://mail.google.com/mail/u/0/?view=cm&to=google@gmail.com&su=Title&subject=Subject&body=Hello%0AWorld&cc=google1@gmail.com&bcc=google2@gmail.com&fs=1&tf=1
*/
/**
* Share parameters for link
*/
var SGmail = /* #__PURE__ */defineComponent({
name: 'SGmail',
mixins: [BaseSocials('Gmail')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://mail.google.com/mail/';
var shareOptions = this.shareOptions;
var to = shareOptions.to,
su = shareOptions.su,
body = shareOptions.body,
cc = shareOptions.cc,
bcc = shareOptions.bcc;
var serialisedParams = getSerialisedParams({
view: 'cm',
to: to,
su: su,
body: body,
cc: cc,
bcc: bcc
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SGoogleBookmarks component used for Google social network
* @link https://www.google.com/bookmarks/
* @example https://www.google.com/bookmarks/mark?op=edit&output=popup&bkmk=https%3A%2F%2Fgithub.com%2F&title=Title&annotation=Annotation&labels=tag
*/
/**
* Share parameters for link
*/
var SGoogleBookmarks = /* #__PURE__ */defineComponent({
name: 'SGoogleBookmarks',
mixins: [BaseSocials('Google Bookmarks')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://www.google.com/bookmarks/mark';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title,
annotation = shareOptions.annotation,
tags = shareOptions.tags;
var serialisedParams = getSerialisedParams({
op: 'edit',
output: 'popup',
bkmk: url,
title: title,
annotation: annotation,
labels: getSeparatedList(tags)
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SHackerNews component used for HackerNews social network
* @link https://news.ycombinator.com/
* @example https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fgithub.com%2F&t=Title
*/
/**
* Share parameters for link
*/
var SHackerNews = /* #__PURE__ */defineComponent({
name: 'SHackerNews',
mixins: [BaseSocials('HackerNews')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://news.ycombinator.com/submitlink';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title;
var serialisedParams = getSerialisedParams({
u: url,
t: title
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SHatena component used for Hatena social network
* @link https://b.hatena.ne.jp/
*/
/**
* Share parameters for link
*/
var SHatena = /* #__PURE__ */defineComponent({
name: 'SHatena',
mixins: [BaseSocials('Hatena')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'http://b.hatena.ne.jp/add';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title;
var serialisedParams = getSerialisedParams({
mode: 'confirm',
url: url,
title: title
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SHatenaCount component used for Hatena social network
* @link https://b.hatena.ne.jp/
*/
/**
* Share parameters for link
*/
var SHatenaCount = /* #__PURE__ */defineComponent({
name: 'SHatenaCount',
mixins: [BaseCount('Hatena')],
methods: {
handleOKResponse: function handleOKResponse(count) {
this.handleResult({
count: count
});
this.handleCount(count);
}
},
mounted: function mounted() {
var _this = this;
var shareOptions = this.shareOptions;
var url = shareOptions.url;
var BASE_URL = 'https://bookmark.hatenaapis.com/count/entry';
var finalURL = "".concat(BASE_URL).concat(getSerialisedParams({
url: url
}));
this.handleLoading(true);
JSONP(finalURL, function (err, data) {
_this.handleLoading(false);
if (err) {
_this.handleError(err);
}
if (data) {
_this.handleOKResponse(data);
}
});
}
});
/**
* Hey!
*
* SHouzz component used for Houzz social network
* @link https://www.houzz.com/
*/
/**
* Share parameters for link
* @link https://www.houzz.com/buttonsAndBadges/button#houzzbuttondocs
*/
var SHouzz = /* #__PURE__ */defineComponent({
name: 'SHouzz',
mixins: [BaseSocials('Houzz', {
width: 1100,
height: 700
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://www.houzz.com/imageClipperUpload';
var shareOptions = this.shareOptions;
var id = shareOptions.id,
url = shareOptions.url,
title = shareOptions.title,
image = shareOptions.image,
category = shareOptions.category;
var serialisedParams = getSerialisedParams({
link: url,
hzid: id,
imageUrl: image,
title: title,
category: getSeparatedList(category)
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SInstaPaper component used for InstaPaper social network
* @link http://www.instapaper.com/
*/
/**
* Share parameters for link
*/
var SInstaPaper = /* #__PURE__ */defineComponent({
name: 'SInstaPaper',
mixins: [BaseSocials('InstaPaper', {
width: 600,
height: 600
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'http://www.instapaper.com/edit';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title,
description = shareOptions.description;
var serialisedParams = getSerialisedParams({
url: url,
title: title,
description: description
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SKakaoStory component used for Kakao social network
* @link https://story.kakao.com/
*/
/**
* Share parameters for link
* @link https://developers.kakao.com/sdk/js/kakao.js
*/
var SKakaoStory = /* #__PURE__ */defineComponent({
name: 'SKakaoStory',
mixins: [BaseSocials('KakaoStory')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://story.kakao.com/s/share';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
text = shareOptions.text;
var serialisedParams = getSerialisedParams({
url: url,
text: text
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SLine component used for Line social network
* @link https://line.me/
*/
/**
* Share parameters for link
* @link https://social-plugins.line.me/en/how_to_install#lineitbutton
*/
var SLine = /* #__PURE__ */defineComponent({
name: 'SLine',
mixins: [BaseSocials('Line', {
width: 600,
height: 600
})],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://lineit.line.me/share/ui';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
text = shareOptions.text;
var serialisedParams = getSerialisedParams({
url: url,
text: text
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Simple implementation of XMLHTTPRequest.
* It uses callback to prevent adding the promise polyfill.
*/
function HTTP(url, callback) {
var request = new XMLHttpRequest();
request.open('GET', url);
request.onload = function onLoad() {
if (request.readyState === 4 && request.status === 200) {
callback(null, JSON.parse(request.response));
}
};
request.onerror = function onError() {
callback(request.statusText, null);
};
request.send();
}
/**
* Hey!
*
* SLineCount component used for Line social network
* @link https://line.me/
*/
/**
* Share parameters for link
* @link https://social-plugins.line.me/en/how_to_install#lineitbutton
*/
var SLineCount = /* #__PURE__ */defineComponent({
name: 'SLineCount',
mixins: [BaseCount('Line')],
methods: {
handlePinterestResponse: function handlePinterestResponse(data) {
this.handleResult(data);
this.handleCount(data.share);
}
},
mounted: function mounted() {
var _this = this;
var shareOptions = this.shareOptions;
var url = shareOptions.url;
var BASE_URL = 'https://api.line.me/social-plugin/metrics';
var finalURL = "".concat(BASE_URL).concat(getSerialisedParams({
url: url
}));
this.handleLoading(true);
HTTP(finalURL, function (err, data) {
_this.handleLoading(false);
if (err) {
_this.handleError(err);
}
if (data) {
_this.handlePinterestResponse(data);
}
});
}
});
/**
* Hey!
*
* SLinkedIn component used for LinkedIn social network
* @link https://www.linkedin.com
*/
/**
* Share parameters for link
* @link https://docs.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/plugins/share-plugin
*/
var SLinkedIn = /* #__PURE__ */defineComponent({
name: 'SLinkedIn',
mixins: [BaseSocials('LinkedIn')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://www.linkedin.com/sharing/share-offsite/';
var shareOptions = this.shareOptions;
var url = shareOptions.url;
var serialisedParams = getSerialisedParams({
url: url
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SLiveJournal component used for LiveJournal social network
* @link https://www.livejournal.com/
*/
/**
* Share parameters for link
* @link https://www.livejournal.com/developer/extshare
*/
var SLiveJournal = /* #__PURE__ */defineComponent({
name: 'SLiveJournal',
mixins: [BaseSocials('LiveJournal')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'http://www.livejournal.com/update.bml';
var shareOptions = this.shareOptions;
var subject = shareOptions.subject,
url = shareOptions.url;
var serialisedParams = getSerialisedParams({
event: url,
subject: subject
});
return "".concat(BASE_URL).concat(serialisedParams);
}
},
render: function render() {
return this.generateComponent(this.networkURL);
}
});
/**
* Hey!
*
* SMailRu component used for Mail.ru social network
* @link https://my.mail.ru/
*/
/**
* Share parameters for link
* @link https://api.mail.ru/sites/plugins/share/extended/
*/
var SMailRu = /* #__PURE__ */defineComponent({
name: 'SMailRu',
mixins: [BaseSocials('Mail.ru')],
computed: {
networkURL: function networkURL() {
var BASE_URL = 'https://connect.mail.ru/share';
var shareOptions = this.shareOptions;
var url = shareOptions.url,
title = shareOptions.title,
description = shareOptions.description,
image = shareOptions.image,
swfUrl = shareOptions.swfUrl,
width = shareOptions.width,
height = shareOptions.height;
var serialisedParams = getSerialisedParams({
share_url: url,
title: title,
description: description,
image_url: image,
swfurl: swfUrl,
width: width,
height: height