UNPKG

vue-socials

Version:

Social media share buttons and counts for Vue.js

1,769 lines (1,595 loc) 78.9 kB
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&quote=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