Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'web/html/modals/qrcode_modal.html')
-rw-r--r--web/html/modals/qrcode_modal.html162
1 files changed, 162 insertions, 0 deletions
diff --git a/web/html/modals/qrcode_modal.html b/web/html/modals/qrcode_modal.html
new file mode 100644
index 00000000..92d30e93
--- /dev/null
+++ b/web/html/modals/qrcode_modal.html
@@ -0,0 +1,162 @@
+{{define "modals/qrcodeModal"}}
+<a-modal id="qrcode-modal" v-model="qrModal.visible" :title="qrModal.title"
+ :dialog-style="isMobile ? { top: '18px' } : {}"
+ :closable="true"
+ :class="themeSwitcher.currentTheme"
+ :footer="null" width="fit-content">
+ <tr-qr-modal class="qr-modal">
+ <template v-if="app.subSettings.enable && qrModal.subId">
+ <tr-qr-box class="qr-box">
+ <a-tag color="purple" class="qr-tag"><span>{{ i18n "pages.settings.subSettings"}}</span></a-tag>
+ <tr-qr-bg class="qr-bg-sub">
+ <tr-qr-bg-inner class="qr-bg-sub-inner">
+ <canvas @click="copy(genSubLink(qrModal.client.subId))" id="qrCode-sub" class="qr-cv"></canvas>
+ </tr-qr-bg-inner>
+ </tr-qr-bg>
+ </tr-qr-box>
+ <tr-qr-box class="qr-box">
+ <a-tag color="purple" class="qr-tag"><span>{{ i18n "pages.settings.subSettings"}} Json</span></a-tag>
+ <tr-qr-bg class="qr-bg-sub">
+ <tr-qr-bg-inner class="qr-bg-sub-inner">
+ <canvas @click="copy(genSubJsonLink(qrModal.client.subId))" id="qrCode-subJson" class="qr-cv"></canvas>
+ </tr-qr-bg-inner>
+ </tr-qr-bg>
+ </tr-qr-box>
+ </template>
+ <template v-for="(row, index) in qrModal.qrcodes">
+ <tr-qr-box class="qr-box">
+ <a-tag color="green" class="qr-tag"><span>[[ row.remark ]]</span></a-tag>
+ <tr-qr-bg class="qr-bg">
+ <canvas @click="copy(row.link)" :id="'qrCode-'+index" class="qr-cv"></canvas>
+ </tr-qr-bg>
+ </tr-qr-box>
+ </template>
+ </tr-qr-modal>
+</a-modal>
+
+<script>
+ const qrModal = {
+ title: '',
+ dbInbound: new DBInbound(),
+ client: null,
+ qrcodes: [],
+ visible: false,
+ subId: '',
+ show: function(title = '', dbInbound, client) {
+ this.title = title;
+ this.dbInbound = dbInbound;
+ this.inbound = dbInbound.toInbound();
+ this.client = client;
+ this.subId = '';
+ this.qrcodes = [];
+ if (this.inbound.protocol == Protocols.WIREGUARD) {
+ this.inbound.genInboundLinks(dbInbound.remark).split('\r\n').forEach((l, index) => {
+ this.qrcodes.push({
+ remark: "Peer " + (index + 1),
+ link: l
+ });
+ });
+ } else {
+ this.inbound.genAllLinks(this.dbInbound.remark, app.remarkModel, client).forEach(l => {
+ this.qrcodes.push({
+ remark: l.remark,
+ link: l.link
+ });
+ });
+ }
+ this.visible = true;
+ },
+ close: function() {
+ this.visible = false;
+ },
+ };
+ const qrModalApp = new Vue({
+ delimiters: ['[[', ']]'],
+ el: '#qrcode-modal',
+ mixins: [MediaQueryMixin],
+ data: {
+ qrModal: qrModal,
+ },
+ methods: {
+ copy(content) {
+ ClipboardManager
+ .copyText(content)
+ .then(() => {
+ app.$message.success('{{ i18n "copied" }}')
+ })
+ },
+ setQrCode(elementId, content) {
+ new QRious({
+ element: document.querySelector('#' + elementId),
+ size: 400,
+ value: content,
+ background: 'white',
+ backgroundAlpha: 0,
+ foreground: 'black',
+ padding: 2,
+ level: 'L'
+ });
+ },
+ genSubLink(subID) {
+ return app.subSettings.subURI + subID;
+ },
+ genSubJsonLink(subID) {
+ return app.subSettings.subJsonURI + subID;
+ },
+ revertOverflow() {
+ const elements = document.querySelectorAll(".qr-tag");
+ elements.forEach((element) => {
+ element.classList.remove("tr-marquee");
+ element.children[0].style.animation = '';
+ while (element.children.length > 1) {
+ element.removeChild(element.lastChild);
+ }
+ });
+ }
+ },
+ updated() {
+ if (this.qrModal.visible) {
+ fixOverflow();
+ } else {
+ this.revertOverflow();
+ }
+ if (qrModal.client && qrModal.client.subId) {
+ qrModal.subId = qrModal.client.subId;
+ this.setQrCode("qrCode-sub", this.genSubLink(qrModal.subId));
+ this.setQrCode("qrCode-subJson", this.genSubJsonLink(qrModal.subId));
+ }
+ qrModal.qrcodes.forEach((element, index) => {
+ this.setQrCode("qrCode-" + index, element.link);
+ });
+ }
+ });
+
+ function fixOverflow() {
+ const elements = document.querySelectorAll(".qr-tag");
+ elements.forEach((element) => {
+ function isElementOverflowing(element) {
+ const overflowX = element.offsetWidth < element.scrollWidth,
+ overflowY = element.offsetHeight < element.scrollHeight;
+ return overflowX || overflowY;
+ }
+
+ function wrapContentsInMarquee(element) {
+ element.classList.add("tr-marquee");
+ element.children[0].style.animation = `move-ltr ${
+ (element.children[0].clientWidth / element.clientWidth) * 5
+ }s ease-in-out infinite`;
+ const marqueeText = element.children[0];
+ if (element.children.length < 2) {
+ for (let i = 0; i < 1; i++) {
+ const marqueeText = element.children[0].cloneNode(true);
+ element.children[0].after(marqueeText);
+ }
+ }
+ }
+ if (isElementOverflowing(element)) {
+ wrapContentsInMarquee(element);
+ }
+ });
+ }
+</script>
+{{end}}