Files
vinlottis/frontend/ui/Vipps.vue
KevinMidboe 5af082784c Always generate vipps url with amount.
Also update vipps component to correctly show vipps and mobile info text
in column correctly on mobile.
2021-02-20 14:11:36 +01:00

196 lines
4.3 KiB
Vue

<template>
<div class="page-container">
<div class="vipps-container" :class="isMobile ? 'clickable' : null" @click="openVipps">
<img src="/public/assets/images/vipps-logo.svg" class="vipps-logo" alt="vipps logo" />
<span v-if="amount * price > price">
kr.
<span class="big-money">{{ amount * price }},-</span>
({{ price }},- pr. lodd)
</span>
<span v-if="amount * price == price">
kr.
<span class="big-money">{{ amount * price }},-</span>
pr. lodd
</span>
<ing src="/public/assets/images/vipps-qr.png" class="qr-logo" v-if="qrFailed" />
<canvas v-if="!qrFailed" ref="canvas" class="qr-logo"></canvas>
<span class="phone-number">{{ phone }}</span>
<span class="name">{{ name }}</span>
<span class="mark-with">Merk med: {{ message }}</span>
</div>
<p class="click-to-open-text" v-if="isMobile">
<i>Du kan også klikke QR-koden for å åpne i Vipps</i>
</p>
</div>
</template>
<script>
import QRCode from "qrcode";
export default {
props: {
amount: {
type: Number,
default: 1
}
},
data() {
return {
qrImage: null,
qrFailed: false,
phone: __PHONE__,
name: __NAME__,
price: __PRICE__,
message: __MESSAGE__
};
},
watch: {
amount: function(price) {
this.calculateQr();
}
},
mounted() {
this.calculateQr();
},
computed: {
isMobile: function() {
return this.isMobileFunction();
},
priceToPay: function() {
return this.amount * (this.price * 100);
},
vippsUrlBasedOnUserAgent: function() {
return (
"https://qr.vipps.no/28/2/01/031/47" +
this.phone.replace(/ /g, "") +
"?v=1&m=" +
this.message +
"&a=" +
this.priceToPay
);
}
},
methods: {
calculateQr: function() {
let canvas = this.$refs["canvas"];
QRCode.toCanvas(canvas, this.vippsUrlBasedOnUserAgent, { errorCorrectionLevel: "Q" }, (err, url) => {
if (err != null) {
this.qrFailed = true;
}
});
this.drawLogoOverCanvas(canvas);
},
drawLogoOverCanvas(canvas) {
const context = canvas.getContext("2d");
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
context.font = "30px Arial";
context.textAlign = "center";
context.textBaseline = "middle";
context.arc(centerX, centerY, 25, 0, 2 * Math.PI, false);
context.fillStyle = "white";
context.fill();
context.lineWidth = 3;
context.strokeStyle = "#fe5b23";
context.stroke();
context.fillText("🍾", centerX, centerY);
},
openVipps: function() {
if (!this.isMobileFunction()) {
return;
}
window.location.assign(this.vippsUrlBasedOnUserAgent);
},
isMobileFunction: function() {
if (
navigator.userAgent.match(/Android/i) ||
navigator.userAgent.match(/webOS/i) ||
navigator.userAgent.match(/iPhone/i) ||
navigator.userAgent.match(/iPad/i) ||
navigator.userAgent.match(/iPod/i) ||
navigator.userAgent.match(/BlackBerry/i) ||
navigator.userAgent.match(/Windows Phone/i)
) {
return true;
} else {
return false;
}
}
}
};
</script>
<style lang="scss" scoped>
@import "@/styles/global.scss";
@import "@/styles/media-queries.scss";
.page-container {
@include mobile {
display: flex;
flex-direction: column;
margin-bottom: 1.5rem;
}
}
.vipps-container {
font-family: Arial;
border-radius: 10px;
background-color: #ff5b23;
display: flex;
flex-direction: column;
color: white;
text-align: center;
padding: 25px;
width: 250px;
margin: auto 0;
}
.clickable {
cursor: pointer;
}
.big-money {
font-size: 1.5rem;
font-weight: bold;
}
.vipps-logo {
padding-bottom: 10px;
}
.phone-number {
font-size: 1.75rem;
font-weight: bold;
padding-top: 20px;
padding-bottom: 10px;
}
.qr-logo {
margin-top: 15px;
border-radius: 10px;
width: 220px;
margin: 15px auto auto auto;
}
.name,
.mark-with {
font-weight: 600;
font-size: 1rem;
}
@include mobile {
.vipps-container {
margin-left: 0px;
margin: auto;
}
.click-to-open-text {
width: 65%;
padding-top: 10px;
margin: auto;
text-align: center;
}
}
</style>