@stefanobartoletti/nuxt-social-share
Version:
Simple Social Sharing for Nuxt
51 lines (50 loc) • 2.19 kB
JavaScript
import { computed, useRoute, useRuntimeConfig } from "#imports";
import { networksIndex } from "./networksIndex.js";
const defaultOptions = {
network: "",
url: void 0,
title: void 0,
user: void 0,
hashtags: void 0,
image: void 0
};
export function useSocialShare(options = defaultOptions) {
const { network, url, title, user, hashtags, image } = options;
const moduleOptions = useRuntimeConfig().public.socialShare;
if (!networksIndex[network]) {
const availableNetworks = Object.keys(networksIndex).sort().join(", ");
console.warn(`[nuxt-social-share] Network "${network}" is not valid.
Available networks: ${availableNetworks}.
See https://nuxt-social-share.stefanobartoletti.it/usage/supported-networks`);
return computed(() => null);
}
const selectedNetwork = networksIndex[network];
const route = useRoute();
const pageUrl = computed(() => {
if (url !== void 0) {
return new URL(url).href;
}
if (moduleOptions.baseUrl !== "") {
return new URL(route.fullPath, moduleOptions.baseUrl).href;
}
return "";
});
const fullShareUrl = computed(() => {
const shareUrl = selectedNetwork.shareUrl;
const argTitle = selectedNetwork.args?.title && title ? selectedNetwork.args?.title : "";
const argUser = selectedNetwork.args?.user && user ? selectedNetwork.args?.user : "";
const argHashtags = selectedNetwork.args?.hashtags && hashtags ? selectedNetwork.args?.hashtags : "";
const argImage = selectedNetwork.args?.image && image ? selectedNetwork.args?.image : "";
let fullUrl = shareUrl + argTitle + argUser + argHashtags + argImage;
fullUrl = fullUrl.replace(/\[u\]/i, encodeURIComponent(pageUrl.value)).replace(/\[t\]/i, encodeURIComponent(title || "")).replace(/\[uid\]/i, encodeURIComponent(user || "")).replace(/\[h\]/i, encodeURIComponent(hashtags || "")).replace(/\[i\]/i, encodeURIComponent(image || ""));
return new URL(fullUrl).href;
});
const reactiveNetwork = computed(() => {
const { args, shareUrl: rawShareUrl, ...networkProps } = selectedNetwork;
return {
...networkProps,
shareUrl: fullShareUrl.value
};
});
return reactiveNetwork;
}