2 let breadcrumbs = await _require('/_lib/breadcrumbs.jst')
3 let fa_user_check = await env.site.get_min_svg('/_svg/fa_user-check.svg')
4 let get_placeholder = await _require('/_lib/get_placeholder.jst')
5 let get_session = await _require('/_lib/get_session.jst')
6 let icon_cross = await env.site.get_min_svg('/_svg/icon_cross.svg')
7 let icon_tick = await env.site.get_min_svg('/_svg/icon_tick.svg')
8 let navbar = await _require('/_lib/navbar.jst')
10 // preload placeholder
11 let transaction = await env.site.database.Transaction()
14 let root = await transaction.get()
15 let session = await get_session(env, root)
16 placeholder = await get_placeholder(env, session)
17 await transaction.commit()
20 transaction.rollback()
24 // preload URL details if any
26 Object.prototype.hasOwnProperty.call(
30 decodeURIComponent(env.parsed_url.query.email) :
33 Object.prototype.hasOwnProperty.call(
37 decodeURIComponent(env.parsed_url.query.link_code) :
46 await breadcrumbs(env, _out)
48 p {'You will need to verify your new password via an emailed link before you can use it to sign in to your account.'}
54 label.form-label(for="email") {'Email *'}
55 input.form-control#email(type="email" value=email placeholder=placeholder.email required="required" maxlength=256) {}
56 div.invalid-feedback {'Please enter your account\'s email address.'}
61 label.form-label(for="link-code") {'Link code *'}
62 input.form-control#link-code(type="text" value=link_code placeholder="00000000000000000000000000000000" required="required" minlength=32 maxlength=32) {}
63 div.invalid-feedback {'Please enter the 32-character code from the link we have emailed to you.'}
69 if (email.length || details.length)
70 button.btn.btn-success#verify-password(type="button") {
71 div.icon24-outer.mr-2#icon {
72 div.icon24-inner {_out.push(fa_user_check)}
74 div.icon24-outer.mr-2#tick(hidden) {
75 div.icon24-inner {_out.push(icon_tick)}
77 div.icon24-outer.mr-2#cross(hidden) {
78 div.icon24-inner {_out.push(icon_cross)}
80 div.icon24-outer.mr-2#spinner(hidden) {
82 div.spinner-border.spinner-border-sm(role="status") {}
88 button.btn.btn-success#verify-password(type="button" disabled) {
89 div.icon24-outer.mr-2#icon {
90 div.icon24-inner {_out.push(fa_user_check)}
92 div.icon24-outer.mr-2#tick(hidden) {
93 div.icon24-inner {_out.push(icon_tick)}
95 div.icon24-outer.mr-2#cross(hidden) {
96 div.icon24-inner {_out.push(icon_cross)}
98 div.icon24-outer.mr-2#spinner(hidden) {
100 div.spinner-border.spinner-border-sm(role="status") {}
106 p.'mt-3'.mb-0#message(hidden) {}
108 p.text-muted.mt-3 {'* These fields are required.'}
112 //script(src="/js/utils.js") {}
115 document.addEventListener(
118 let id_cross = document.getElementById('cross')
119 let id_email = document.getElementById('email')
120 let id_form = document.getElementById('form')
121 let id_icon = document.getElementById('icon')
122 let id_link_code = document.getElementById('link-code')
123 let id_message = document.getElementById('message')
124 let id_spinner = document.getElementById('spinner')
125 let id_tick = document.getElementById('tick')
126 let id_verify_password = document.getElementById('verify-password')
129 id_verify_password.disabled =
130 id_email.value.length === 0 &&
131 id_link_code.value.length === 0
132 id_icon.hidden = false
133 id_tick.hidden = true
134 id_cross.hidden = true
135 id_spinner.hidden = true
136 id_message.hidden = true
139 id_email.addEventListener('input', edited)
140 id_link_code.addEventListener('input', edited)
142 id_verify_password.addEventListener(
145 id_icon.hidden = false
146 id_tick.hidden = true
147 id_cross.hidden = true
148 id_spinner.hidden = true
149 // the below causes an ugly flicker, so just keep the message
150 //id_message.hidden = true
152 if (!id_form.checkValidity()) {
153 id_form.classList.add('was-validated');
155 id_icon.hidden = true
156 id_cross.hidden = false
159 id_form.classList.remove('was-validated');
161 let email = id_email.value.slice(0, 256).toLowerCase()
162 let link_code = id_link_code.value.slice(0, 32)
164 id_icon.hidden = true
165 id_spinner.hidden = false
168 '/api/account/verify_password.json',
174 let problem = Problem.from(error)
176 id_cross.hidden = false
177 id_spinner.hidden = true
179 id_message.textContent = problem.detail
180 //id_message.classList.remove('text-success')
181 id_message.classList.add('text-danger')
182 id_message.hidden = false
185 id_tick.hidden = false
186 id_spinner.hidden = true
187 id_message.textContent = `New password for "${email}" has been verified. You can now sign in.`
188 //id_message.classList.add('text-success')
189 id_message.classList.remove('text-danger')
190 id_message.hidden = false