summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/vue_shared/components/recaptcha_modal.vue
blob: c35621c9ef3fee99223b076f095c8f9b4a80056c (plain)
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
<script>
  import modal from './modal.vue';

  export default {
    name: 'RecaptchaModal',

    components: {
      modal,
    },

    props: {
      html: {
        type: String,
        required: false,
        default: '',
      },
    },

    data() {
      return {
        script: {},
        scriptSrc: 'https://www.google.com/recaptcha/api.js',
      };
    },

    watch: {
      html() {
        this.appendRecaptchaScript();
      },
    },

    mounted() {
      window.recaptchaDialogCallback = this.submit.bind(this);
    },

    methods: {
      appendRecaptchaScript() {
        this.removeRecaptchaScript();

        const script = document.createElement('script');
        script.src = this.scriptSrc;
        script.classList.add('js-recaptcha-script');
        script.async = true;
        script.defer = true;

        this.script = script;

        document.body.appendChild(script);
      },

      removeRecaptchaScript() {
        if (this.script instanceof Element) this.script.remove();
      },

      close() {
        this.removeRecaptchaScript();
        this.$emit('close');
      },

      submit() {
        this.$el.querySelector('form').submit();
      },
    },
  };
</script>

<template>
  <modal
    kind="warning"
    class="recaptcha-modal js-recaptcha-modal"
    :hide-footer="true"
    :title="__('Please solve the reCAPTCHA')"
    @cancel="close"
  >
    <div slot="body">
      <p>
        {{ __('We want to be sure it is you, please confirm you are not a robot.') }}
      </p>
      <div
        ref="recaptcha"
        v-html="html"
      >
      </div>
    </div>
  </modal>
</template>