1// Copyright (c) 2021-2025 GrayBits LLC 2 3import _ from 'lodash' 4import axios from 'axios' 5import Errors from 'gray_matter/forms/errors' 6import * as DestroyItem from 'gray_matter/utility/destroy_item' 7import * as Notification from 'gray_matter/utility/notification' 8 9let enable_two_factor_authentication; 10let reset_secret; 11let reset_user_font_size; 12let user_font_size; 13let disable_two_factor; 14let form, errors; 15let user_country; 16let user_time_zone; 17 18export function init(){ 19 form = document.querySelector('form.account_form'); 20 21 if (form){ 22 errors = new Errors(form, document.querySelector('.form_errors')); 23 form.addEventListener('submit', updateAccount); 24 25 user_country = document.querySelector('.field_wrapper[data-attribute="country"] select'); 26 user_country.addEventListener('change', updateCountry); 27 user_time_zone = document.querySelector('.field_wrapper[data-attribute="time_zone"] select'); 28 user_time_zone.addEventListener('change', updateTimeZone); 29 } 30 if (document.getElementById('two_factor_authentication')){ 31 enable_two_factor_authentication = document.getElementById('enable_two_factor_authentication'); 32 if (enable_two_factor_authentication){ 33 enable_two_factor_authentication.addEventListener('click', enableTwoFactorAuthentication); 34 } 35 36 reset_secret = document.getElementById('reset_secret'); 37 if (reset_secret){ 38 reset_secret.addEventListener('click', enableTwoFactorAuthentication); 39 } 40 41 disable_two_factor = document.getElementById('disable_two_factor'); 42 if (disable_two_factor){ 43 disable_two_factor.addEventListener('click', disableTwoFactorAuthentication); 44 } 45 } 46 reset_user_font_size = document.getElementById('reset_user_font_size'); 47 if (reset_user_font_size){ 48 user_font_size = document.getElementById('user_font_size'); 49 user_font_size.addEventListener('input', _.debounce(() => setFontSize(), 400)); 50 reset_user_font_size.addEventListener('click', resetFontSize); 51 } 52} 53 54async function updateTimeZone(){ 55 const response = await axios.put(`/${document.body.dataset.prefix}/account/update_time_zone`, { time_zone: user_time_zone.value }); 56} 57 58async function updateCountry(){ 59 const response = await axios.put(`/${document.body.dataset.prefix}/account/update_country`, { country: user_country.value }); 60 61 user_time_zone.innerHTML = response.data.options; 62} 63 64function updateFontSize(){ 65 let font_size = user_font_size.value; 66 document.querySelector('html').style.fontSize = font_size + 'vw'; 67 return font_size; 68} 69 70async function setFontSize(){ 71 const response = await axios.put(`/${document.body.dataset.prefix}/account/settings/font_size`, { value: updateFontSize() }); 72} 73 74function resetFontSize(){ 75 user_font_size.value = 1.08; 76 setFontSize(); 77} 78 79async function updateAccount(e){ 80 e.preventDefault(); 81 errors.clear(); 82 try{ 83 const response = await axios.put(form.action, new FormData(form)); 84 Notification.showNotification('Successfully updated your account.'); 85 document.getElementById('user_name').innerHTML = response.data.name; 86 } catch(error){ 87 if (error.response){ 88 errors.show(error.response.data); 89 } else { 90 Notification.showResponseError(error); 91 } 92 } 93} 94 95async function enableTwoFactorAuthentication(e){ 96 e.stopPropagation(); 97 e.preventDefault(); 98 99 try{ 100 const response = await axios.post(this.href); 101 document.getElementById('two_factor_authentication').innerHTML = response.data.two_factor; 102 document.body.insertAdjacentHTML('beforeend', response.data.secret); 103 document.getElementById('close_secret').addEventListener('click', closeSecret); 104 let secret = document.getElementById('authentication_secret'); 105 secret.offsetHeight; 106 secret.classList.remove('poppedout'); 107 init(); 108 } catch(error) { 109 Notification.showResponseError(error); 110 } 111} 112 113async function disableTwoFactorAuthentication(e){ 114 e.stopPropagation(); 115 e.preventDefault(); 116 try{ 117 const response = await axios.post(this.href); 118 document.getElementById('two_factor_authentication').innerHTML = response.data.two_factor; 119 init(); 120 } catch(error) { 121 Notification.showResponseError(error); 122 } 123} 124 125function closeSecret(){ 126 DestroyItem.remove(document.getElementById('authentication_secret')); 127};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.