e9b335afae397ec0b0199c65301610334227abf2
[ndcode_site.git] / my_account / verify_email / index.html.jst
1 return async env => {
2   let breadcrumbs = await _require('/_lib/breadcrumbs.jst')
3   let icon_cross = await env.site.get_min_svg('/_svg/icon_cross.svg')
4   let icon_tick = await env.site.get_min_svg('/_svg/icon_tick.svg')
5   let navbar = await _require('/_lib/navbar.jst')
6
7   // preload draft details if any
8   let details = {}
9   if (Object.prototype.hasOwnProperty.call(env.parsed_url.query, 'email'))
10     details.email = decodeURIComponent(env.parsed_url.query.email)
11   if (
12      Object.prototype.hasOwnProperty.call(
13       env.parsed_url.query,
14       'link_code'
15     )
16   )
17     details.link_code =
18       decodeURIComponent(env.parsed_url.query.link_code)
19   console.log('details', JSON.stringify(details))
20
21   await navbar(
22     env,
23     // head
24     async _out => {},
25     // body
26     async _out => {
27       await breadcrumbs(env, _out)
28
29       p {'You will need to verify your email address via an emailed link before you can sign in to your account.'}
30
31       div.accordion#accordion.mb-5(role="tablist" aria-multiselectable="true") {
32         div.card#step-1 {
33           div.card-header#step-1-heading(role="tab") {
34             span#step-1-tick(style="display: none;") {
35               span.icon-color.pr-3 {_out.push(icon_tick)}
36             }
37             span#step-1-cross(style="display: none;") {
38               span.icon-color.pr-3 {_out.push(icon_cross)}
39             }
40             //span#step-1-spinner(style="display: none;") {
41             //  span.icon-color.pr-3 {
42             //    div.spinner-border(role="status") {
43             //      span.sr-only {'Loading...'}
44             //    }
45             //  }
46             //}
47             a.h5(data-toggle="collapse" data-parent="#accordion" href="#step-1-collapse" aria-expanded="true" aria-controls="step-1-collapse") {
48               'Link details'
49             }
50           }
51           div#step-1-collapse.collapse.show(role="tabpanel" aria-labelledby="step-1-heading" data-parent="#accordion") {
52             div.card-body {
53               div.row {
54                 div.col-md-6 {
55                   div.form-group {
56                    label.form-label(for="email") {'Email *'}
57                     input.form-control#email(type="email" value=details.email || '' placeholder="Account email address" required="required" maxlength=256) {}
58                   }
59                 }
60                 div.col-md-6 {
61                   div.form-group {
62                     label.form-label(for="link-code") {'Link code *'}
63                     input.form-control#link-code(type="text" value=details.link_code || '' placeholder="Type the code from the email link" required="required" minlength=32 maxlength=32) {}
64                   }
65                 }
66               }
67
68               button.btn.btn-success#step-1-continue(type="button") {'Continue'}
69               p.'mt-3'.mb-0 {'* These fields are required.'}
70             }
71           }
72         }
73         div.card#step-2 {
74           div.card-header#step-2-heading(role="tab") {
75             span#step-2-tick(style="display: none;") {
76               span.icon-color.pr-3 {_out.push(icon_tick)}
77             }
78             span#step-2-cross(style="display: none;") {
79               span.icon-color.pr-3 {_out.push(icon_cross)}
80             }
81             span#step-2-spinner(style="display: none;") {
82               span.icon-color.pr-3 {
83                 div.spinner-border(role="status") {
84                   span.sr-only {'Loading...'}
85                 }
86               }
87             }
88             a.h5.collapsed(data-toggle="collapse" data-parent="#accordion" href="#step-2-collapse" aria-expanded="false" aria-controls="step-2-collapse") {
89               'Verify email'
90             }
91           }
92           div#step-2-collapse.collapse(role="tabpanel" aria-labelledby="step-2-heading" data-parent="#accordion") {
93             div.card-body {
94               p#step-2-message {'Please enter link details first.'}
95
96               button.btn.btn-outline-secondary#step-2-back(type="button") {'Back'}
97               button.btn.btn-outline-secondary.ml-2#step-2-sign-in(type="button") {'Sign in'}
98             }
99           }
100         }
101       }
102     },
103     // scripts
104     async _out => {
105       //script(src="/js/utils.js") {}
106
107       script {
108         let step_1 = async () => {
109           if (
110             !document.getElementById('email').reportValidity() ||
111               !document.getElementById('link-code').reportValidity()
112           ) {
113             $('#step-1-tick').hide()
114             $('#step-1-cross').show()
115             //$('#step-1-spinner').hide()
116             return false
117           }
118           $('#step-1-tick').show()
119           $('#step-1-cross').hide()
120           //$('#step-1-spinner').hide()
121           return true
122         }
123
124         let step_2 = async () => {
125           $('#step-2-tick').hide()
126           $('#step-2-cross').hide()
127           $('#step-2-spinner').show()
128           document.getElementById('step-1').scrollIntoView()
129
130           let email
131           try {
132             email = document.getElementById('email').value.slice(0, 256).toLowerCase()
133             await api_call(
134               '/api/account/sign_up/verify_email.json',
135               email,
136               document.getElementById('link-code').value.slice(0, 32).toLowerCase()
137             )
138           }
139           catch (error) {
140             let problem = Problem.from(error)
141
142             $('#step-2-tick').hide()
143             $('#step-2-cross').show()
144             $('#step-2-spinner').hide()
145
146             document.getElementById('step-2-message').textContent = problem.detail
147             $('#step-2-collapse').collapse('show')
148             return false
149           }
150           $('#step-2-tick').show()
151           $('#step-2-cross').hide()
152           $('#step-2-spinner').hide()
153
154           document.getElementById('step-2-message').textContent = `Your email "${email}" has been verified. You can now sign in.`
155           return true
156         }
157
158         document.addEventListener(
159           'DOMContentLoaded',
160           () => {
161             document.getElementById('step-1-continue').addEventListener(
162               'click',
163               async () => {
164                 if (await step_1() && await step_2())
165                   $('#step-2-collapse').collapse('show')
166               }
167             )
168
169             document.getElementById('step-2-back').addEventListener(
170               'click',
171               () => {$('#step-1-collapse').collapse('show')}
172             )
173
174             document.getElementById('step-2-sign-in').addEventListener(
175               'click',
176               () => {document.getElementById('sign-in').click()}
177             )
178           }
179         )
180       }
181     }
182   )
183 }