-
Notifications
You must be signed in to change notification settings - Fork 34
/
DonateButtons.vue
131 lines (112 loc) · 2.81 KB
/
DonateButtons.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<template>
<div>
<loading v-if="loading" :active.sync="loading" :is-full-page="false" />
<div v-else class="box">
<h3 class="title is-2 mb1em">
<strong style="color: #363636;">Select an amount:</strong>
</h3>
<div class="grid-container has-text-centered">
<div v-for="amount in amounts">
<div class="box" style="background-color: lightgreen;">
<h3 class="title is-3 mb1em">
<strong>€{{ amount.amount / 100 }}</strong>
</h3>
<button class="button is-medium is-primary" @click="donate(amount.id)">Donate now</button>
</div>
</div>
</div>
<h3 class="title is-1" style="text-align: right;">
<strong style="color: #363636;">Thank you.</strong>
</h3>
</div>
</div>
</template>
<script>
import Loading from 'vue-loading-overlay'
import 'vue-loading-overlay/dist/vue-loading.css'
export default {
name: 'DonateButtons',
components: { Loading },
data () {
return {
stripeEmail: '',
stripeToken: '',
amount: '',
loading: true
}
},
async created ()
{
this.loading = true;
await this.$store.dispatch('GET_DONATION_AMOUNTS');
this.$emit('donations-loaded')
this.loading = false;
},
computed: {
/**
* The options to donate in cents (500 = €5)
*/
amounts ()
{
return this.$store.state.donate.amounts;
}
},
methods: {
/**
*
*/
donate (price)
{
this.amount = this.prices[price] * 100;
this.stripe = StripeCheckout.configure({
key: OLM.stripeKey,
image: "https://stripe.com/img/documentation/checkout/marketplace.png",
locale: "auto",
panelLabel: "One-time Donation",
// email: this.email,
token: (token) => { // use the arrow ES15 syntax to make this local
// input the token id into the form for submission
this.stripeToken = token.id,
this.stripeEmail = token.email;
axios.post('/donate', this.$data)
.then(response => {
alert('Congratulations! Your payment was successful. Thanks!');
})
.catch(error => {
alert('Sorry, there was an error processing your card! You have not been charged. Please try again');
});
}
});
this.stripe.open({
name: '€'+this.prices[price],
description: 'OpenLitterMap',
zipCode: false,
amount: this.prices[price] * 100,
});
}
}
}
</script>
<style lang="scss" scoped>
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-column-gap: 1em;
grid-row-gap: 1em;
padding-bottom: 2em;
}
@media screen and (max-width: 1000px)
{
.grid-container {
grid-template-columns: 1fr 1fr;
grid-row-gap: 2em !important;
}
}
@media screen and (max-width: 600px)
{
.grid-container {
grid-template-columns: 1fr;
grid-row-gap: 2em !important;
}
}
</style>