Files
futurewalker/resources/js/vue/front/ShareToFriends.vue
2023-11-23 15:03:45 +08:00

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>