135 lines
3.3 KiB
Vue
135 lines
3.3 KiB
Vue
<template>
|
|
<div>
|
|
<button
|
|
type="button"
|
|
class="align-self-center btn btn-outline-light ms-2"
|
|
@click="handleShareButton"
|
|
>
|
|
<i class="bi bi-share-fill"></i>
|
|
</button>
|
|
|
|
<!-- Modal -->
|
|
<div
|
|
v-if="showModal"
|
|
class="modal fade show"
|
|
id="shareModal"
|
|
tabindex="-1"
|
|
aria-labelledby="shareModalLabel"
|
|
style="display: block"
|
|
aria-modal="true"
|
|
role="dialog"
|
|
>
|
|
<div class="modal-dialog modal-dialog-centered">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h1
|
|
class="modal-title fs-5 text-black fw-bold"
|
|
id="shareModalLabel"
|
|
>
|
|
Share to Friends
|
|
</h1>
|
|
<button
|
|
type="button"
|
|
class="btn-close"
|
|
@click="showModal = false"
|
|
aria-label="Close"
|
|
></button>
|
|
</div>
|
|
<div class="modal-body d-grid gap-2">
|
|
<input
|
|
type="text"
|
|
readonly
|
|
class="form-control"
|
|
:value="shareUrl"
|
|
/>
|
|
<button class="btn btn-primary w-full" @click="copyLink">
|
|
Copy Link
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div v-if="showModal" class="modal-backdrop fade show"></div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { toast } from "vue3-toastify";
|
|
export default {
|
|
name: "ShareToFriends",
|
|
data() {
|
|
return {
|
|
showModal: false,
|
|
shareUrl: null,
|
|
};
|
|
},
|
|
methods: {
|
|
handleShareButton() {
|
|
if (navigator.share) {
|
|
// Extracting the HTML title
|
|
const shareTitle = document.title;
|
|
|
|
// Extracting the meta description
|
|
const metaDescriptionTag = document.querySelector(
|
|
'meta[name="description"]',
|
|
);
|
|
const shareText = metaDescriptionTag
|
|
? "Check this out: " + metaDescriptionTag.content
|
|
: "";
|
|
|
|
// Setting default values if not found
|
|
const title = shareTitle || "FutureWalker";
|
|
const text = shareText || "Check this AI & tech news platform out!";
|
|
|
|
navigator
|
|
.share({
|
|
title: title,
|
|
text: text,
|
|
url: this.shareUrl,
|
|
})
|
|
.then(() => console.log("Successful share"))
|
|
.catch((error) => {
|
|
this.showModal = true;
|
|
});
|
|
} else {
|
|
this.showModal = true;
|
|
}
|
|
|
|
this.showModal = true;
|
|
},
|
|
copyLink() {
|
|
navigator.clipboard
|
|
.writeText(this.shareUrl)
|
|
.then(() => {
|
|
toast("Copied!", {
|
|
position: "bottom-center",
|
|
type: "success",
|
|
timeout: 1500,
|
|
closeOnClick: true,
|
|
pauseOnFocusLoss: true,
|
|
pauseOnHover: true,
|
|
draggable: true,
|
|
draggablePercent: 0.6,
|
|
showCloseButtonOnHover: false,
|
|
hideProgressBar: false,
|
|
closeButton: true,
|
|
icon: true,
|
|
rtl: false,
|
|
});
|
|
})
|
|
.catch((err) => {
|
|
// Handle error
|
|
console.error("Error copying text: ", err);
|
|
});
|
|
},
|
|
},
|
|
mounted() {
|
|
this.shareUrl = window.location.href;
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
/* Add any component-specific styles here */
|
|
</style>
|