settings.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. const settingsNavDone = document.getElementById('settingsNavDone')
  2. const settingsAddAccount = document.getElementById('settingsAddAccount')
  3. const settingsCurrentAccounts = document.getElementById('settingsCurrentAccounts')
  4. /**
  5. * General Settings Functions
  6. */
  7. let selectedTab = 'settingsTabAccount'
  8. /**
  9. * Bind functionality for the settings navigation items.
  10. */
  11. function setupSettingsTabs(){
  12. Array.from(document.getElementsByClassName('settingsNavItem')).map((val) => {
  13. val.onclick = (e) => {
  14. if(val.hasAttribute('selected')){
  15. return
  16. }
  17. const navItems = document.getElementsByClassName('settingsNavItem')
  18. for(let i=0; i<navItems.length; i++){
  19. if(navItems[i].hasAttribute('selected')){
  20. navItems[i].removeAttribute('selected')
  21. }
  22. }
  23. val.setAttribute('selected', '')
  24. let prevTab = selectedTab
  25. selectedTab = val.getAttribute('rSc')
  26. $(`#${prevTab}`).fadeOut(250, () => {
  27. $(`#${selectedTab}`).fadeIn(250)
  28. })
  29. }
  30. })
  31. }
  32. /* Closes the settings view and saves all data. */
  33. settingsNavDone.onclick = () => {
  34. switchView(getCurrentView(), VIEWS.landing)
  35. }
  36. /**
  37. * Account Management Tab
  38. */
  39. // Bind the add account button.
  40. settingsAddAccount.onclick = (e) => {
  41. switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
  42. loginViewOnCancel = VIEWS.settings
  43. loginViewOnSuccess = VIEWS.settings
  44. loginCancelEnabled(true)
  45. })
  46. }
  47. /**
  48. * Bind functionality for the account selection buttons. If another account
  49. * is selected, the UI of the previously selected account will be updated.
  50. */
  51. function bindAuthAccountSelect(){
  52. Array.from(document.getElementsByClassName('settingsAuthAccountSelect')).map((val) => {
  53. val.onclick = (e) => {
  54. if(val.hasAttribute('selected')){
  55. return
  56. }
  57. const selectBtns = document.getElementsByClassName('settingsAuthAccountSelect')
  58. for(let i=0; i<selectBtns.length; i++){
  59. if(selectBtns[i].hasAttribute('selected')){
  60. selectBtns[i].removeAttribute('selected')
  61. selectBtns[i].innerHTML = 'Select Account'
  62. }
  63. }
  64. val.setAttribute('selected', '')
  65. val.innerHTML = 'Selected Account &#10004;'
  66. setSelectedAccount(val.closest('.settingsAuthAccount').getAttribute('uuid'))
  67. }
  68. })
  69. }
  70. /**
  71. * Bind functionality for the log out button. If the logged out account was
  72. * the selected account, another account will be selected and the UI will
  73. * be updated accordingly.
  74. */
  75. function bindAuthAccountLogOut(){
  76. Array.from(document.getElementsByClassName('settingsAuthAccountLogOut')).map((val) => {
  77. val.onclick = (e) => {
  78. let isLastAccount = false
  79. if(Object.keys(ConfigManager.getAuthAccounts()).length === 1){
  80. isLastAccount = true
  81. setOverlayContent(
  82. 'Warning<br>This is Your Last Account',
  83. 'In order to use the launcher you must be logged into at least one account. You will need to login again after.<br><br>Are you sure you want to log out?',
  84. 'I\'m Sure',
  85. 'Cancel'
  86. )
  87. setOverlayHandler(() => {
  88. processLogOut(val, isLastAccount)
  89. switchView(getCurrentView(), VIEWS.login)
  90. toggleOverlay(false)
  91. })
  92. setDismissHandler(() => {
  93. toggleOverlay(false)
  94. })
  95. toggleOverlay(true, true)
  96. } else {
  97. processLogOut(val, isLastAccount)
  98. }
  99. }
  100. })
  101. }
  102. /**
  103. * Process a log out.
  104. *
  105. * @param {Element} val The log out button element.
  106. * @param {boolean} isLastAccount If this logout is on the last added account.
  107. */
  108. function processLogOut(val, isLastAccount){
  109. const parent = val.closest('.settingsAuthAccount')
  110. const uuid = parent.getAttribute('uuid')
  111. const prevSelAcc = ConfigManager.getSelectedAccount()
  112. AuthManager.removeAccount(uuid).then(() => {
  113. if(!isLastAccount && uuid === prevSelAcc.uuid){
  114. const selAcc = ConfigManager.getSelectedAccount()
  115. refreshAuthAccountSelected(selAcc.uuid)
  116. updateSelectedAccount(selAcc)
  117. validateSelectedAccount()
  118. }
  119. })
  120. $(parent).fadeOut(250, () => {
  121. parent.remove()
  122. })
  123. }
  124. /**
  125. * Refreshes the status of the selected account on the auth account
  126. * elements.
  127. *
  128. * @param {string} uuid The UUID of the new selected account.
  129. */
  130. function refreshAuthAccountSelected(uuid){
  131. Array.from(document.getElementsByClassName('settingsAuthAccount')).map((val) => {
  132. const selBtn = val.getElementsByClassName('settingsAuthAccountSelect')[0]
  133. if(uuid === val.getAttribute('uuid')){
  134. selBtn.setAttribute('selected', '')
  135. selBtn.innerHTML = 'Selected Account &#10004;'
  136. } else {
  137. if(selBtn.hasAttribute('selected')){
  138. selBtn.removeAttribute('selected')
  139. }
  140. selBtn.innerHTML = 'Select Account'
  141. }
  142. })
  143. }
  144. /**
  145. * Add auth account elements for each one stored in the authentication database.
  146. */
  147. function populateAuthAccounts(){
  148. const authAccounts = ConfigManager.getAuthAccounts()
  149. const authKeys = Object.keys(authAccounts)
  150. const selectedUUID = ConfigManager.getSelectedAccount().uuid
  151. let authAccountStr = ``
  152. authKeys.map((val) => {
  153. const acc = authAccounts[val]
  154. authAccountStr += `<div class="settingsAuthAccount" uuid="${acc.uuid}">
  155. <div class="settingsAuthAccountLeft">
  156. <img class="settingsAuthAccountImage" alt="${acc.displayName}" src="https://crafatar.com/renders/body/${acc.uuid}?scale=3&default=MHF_Steve&overlay">
  157. </div>
  158. <div class="settingsAuthAccountRight">
  159. <div class="settingsAuthAccountDetails">
  160. <div class="settingsAuthAccountDetailPane">
  161. <div class="settingsAuthAccountDetailTitle">Username</div>
  162. <div class="settingsAuthAccountDetailValue">${acc.displayName}</div>
  163. </div>
  164. <div class="settingsAuthAccountDetailPane">
  165. <div class="settingsAuthAccountDetailTitle">${acc.displayName === acc.username ? 'UUID' : 'Email'}</div>
  166. <div class="settingsAuthAccountDetailValue">${acc.displayName === acc.username ? acc.uuid : acc.username}</div>
  167. </div>
  168. </div>
  169. <div class="settingsAuthAccountActions">
  170. <button class="settingsAuthAccountSelect" ${selectedUUID === acc.uuid ? 'selected>Selected Account &#10004;' : '>Select Account'}</button>
  171. <div class="settingsAuthAccountWrapper">
  172. <button class="settingsAuthAccountLogOut">Log Out</button>
  173. </div>
  174. </div>
  175. </div>
  176. </div>`
  177. })
  178. settingsCurrentAccounts.innerHTML = authAccountStr
  179. }
  180. function prepareAccountsTab() {
  181. populateAuthAccounts()
  182. bindAuthAccountSelect()
  183. bindAuthAccountLogOut()
  184. }
  185. /**
  186. * Settings preparation functions.
  187. */
  188. /**
  189. * Prepare the entire settings UI.
  190. */
  191. function prepareSettings() {
  192. setupSettingsTabs()
  193. prepareAccountsTab()
  194. }
  195. // Prepare the settings UI on startup.
  196. prepareSettings()