settings.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. const settingsAddAccount = document.getElementById('settingsAddAccount')
  2. const settingsCurrentAccounts = document.getElementById('settingsCurrentAccounts')
  3. /**
  4. * General Settings Functions
  5. */
  6. let selectedTab = 'settingsTabAccount'
  7. /**
  8. * Bind functionality for the settings navigation items.
  9. */
  10. function setupSettingsTabs(){
  11. Array.from(document.getElementsByClassName('settingsNavItem')).map((val) => {
  12. val.onclick = (e) => {
  13. if(val.hasAttribute('selected')){
  14. return
  15. }
  16. const navItems = document.getElementsByClassName('settingsNavItem')
  17. for(let i=0; i<navItems.length; i++){
  18. if(navItems[i].hasAttribute('selected')){
  19. navItems[i].removeAttribute('selected')
  20. }
  21. }
  22. val.setAttribute('selected', '')
  23. let prevTab = selectedTab
  24. selectedTab = val.getAttribute('rSc')
  25. $(`#${prevTab}`).fadeOut(250, () => {
  26. $(`#${selectedTab}`).fadeIn(250)
  27. })
  28. }
  29. })
  30. }
  31. /**
  32. * Account Management Tab
  33. */
  34. // Bind the add account button.
  35. settingsAddAccount.onclick = (e) => {
  36. switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
  37. loginViewOnCancel = VIEWS.settings
  38. loginViewOnSuccess = VIEWS.settings
  39. loginCancelEnabled(true)
  40. })
  41. }
  42. /**
  43. * Bind functionality for the account selection buttons. If another account
  44. * is selected, the UI of the previously selected account will be updated.
  45. */
  46. function bindAuthAccountSelect(){
  47. Array.from(document.getElementsByClassName('settingsAuthAccountSelect')).map((val) => {
  48. val.onclick = (e) => {
  49. if(val.hasAttribute('selected')){
  50. return
  51. }
  52. const selectBtns = document.getElementsByClassName('settingsAuthAccountSelect')
  53. for(let i=0; i<selectBtns.length; i++){
  54. if(selectBtns[i].hasAttribute('selected')){
  55. selectBtns[i].removeAttribute('selected')
  56. selectBtns[i].innerHTML = 'Select Account'
  57. }
  58. }
  59. val.setAttribute('selected', '')
  60. val.innerHTML = 'Selected Account &#10004;'
  61. ConfigManager.setSelectedAccount(val.closest('.settingsAuthAccount').getAttribute('uuid'))
  62. ConfigManager.save()
  63. updateSelectedAccount(ConfigManager.getSelectedAccount())
  64. }
  65. })
  66. }
  67. /**
  68. * Bind functionality for the log out button. If the logged out account was
  69. * the selected account, another account will be selected and the UI will
  70. * be updated accordingly.
  71. */
  72. function bindAuthAccountLogOut(){
  73. Array.from(document.getElementsByClassName('settingsAuthAccountLogOut')).map((val) => {
  74. val.onclick = (e) => {
  75. const parent = val.closest('.settingsAuthAccount')
  76. const uuid = parent.getAttribute('uuid')
  77. const prevSelAcc = ConfigManager.getSelectedAccount()
  78. AuthManager.removeAccount(uuid).then(() => {
  79. if(uuid === prevSelAcc.uuid){
  80. const selAcc = ConfigManager.getSelectedAccount()
  81. refreshAuthAccountSelected(selAcc.uuid)
  82. updateSelectedAccount(selAcc)
  83. }
  84. })
  85. $(parent).fadeOut(250, () => {
  86. parent.remove()
  87. })
  88. }
  89. })
  90. }
  91. /**
  92. * Refreshes the status of the selected account on the auth account
  93. * elements.
  94. *
  95. * @param {string} uuid The UUID of the new selected account.
  96. */
  97. function refreshAuthAccountSelected(uuid){
  98. Array.from(document.getElementsByClassName('settingsAuthAccount')).map((val) => {
  99. const selBtn = val.getElementsByClassName('settingsAuthAccountSelect')[0]
  100. if(uuid === val.getAttribute('uuid')){
  101. selBtn.setAttribute('selected', '')
  102. selBtn.innerHTML = 'Selected Account &#10004;'
  103. } else {
  104. if(selBtn.hasAttribute('selected')){
  105. selBtn.removeAttribute('selected')
  106. }
  107. selBtn.innerHTML = 'Select Account'
  108. }
  109. })
  110. }
  111. /**
  112. * Add auth account elements for each one stored in the authentication database.
  113. */
  114. function populateAuthAccounts(){
  115. const authAccounts = ConfigManager.getAuthAccounts()
  116. const authKeys = Object.keys(authAccounts)
  117. const selectedUUID = ConfigManager.getSelectedAccount().uuid
  118. let authAccountStr = ``
  119. authKeys.map((val) => {
  120. const acc = authAccounts[val]
  121. authAccountStr += `<div class="settingsAuthAccount" uuid="${acc.uuid}">
  122. <div class="settingsAuthAccountLeft">
  123. <img class="settingsAuthAccountImage" alt="${acc.displayName}" src="https://crafatar.com/renders/body/${acc.uuid}?scale=3&default=MHF_Steve&overlay">
  124. </div>
  125. <div class="settingsAuthAccountRight">
  126. <div class="settingsAuthAccountDetails">
  127. <div class="settingsAuthAccountDetailPane">
  128. <div class="settingsAuthAccountDetailTitle">Username</div>
  129. <div class="settingsAuthAccountDetailValue">${acc.displayName}</div>
  130. </div>
  131. <div class="settingsAuthAccountDetailPane">
  132. <div class="settingsAuthAccountDetailTitle">${acc.displayName === acc.username ? 'UUID' : 'Email'}</div>
  133. <div class="settingsAuthAccountDetailValue">${acc.displayName === acc.username ? acc.uuid : acc.username}</div>
  134. </div>
  135. </div>
  136. <div class="settingsAuthAccountActions">
  137. <button class="settingsAuthAccountSelect" ${selectedUUID === acc.uuid ? 'selected>Selected Account &#10004;' : '>Select Account'}</button>
  138. <div class="settingsAuthAccountWrapper">
  139. <button class="settingsAuthAccountLogOut">Log Out</button>
  140. </div>
  141. </div>
  142. </div>
  143. </div>`
  144. })
  145. settingsCurrentAccounts.innerHTML = authAccountStr
  146. }
  147. function prepareAccountsTab() {
  148. populateAuthAccounts()
  149. bindAuthAccountSelect()
  150. bindAuthAccountLogOut()
  151. }
  152. /**
  153. * Settings preparation functions.
  154. */
  155. /**
  156. * Prepare the entire settings UI.
  157. */
  158. function prepareSettings() {
  159. setupSettingsTabs()
  160. prepareAccountsTab()
  161. }
  162. // Prepare the settings UI on startup.
  163. prepareSettings()