overlay.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. /**
  2. * Script for overlay.ejs
  3. */
  4. /* Overlay Wrapper Functions */
  5. /**
  6. * Check to see if the overlay is visible.
  7. *
  8. * @returns {boolean} Whether or not the overlay is visible.
  9. */
  10. function isOverlayVisible(){
  11. return document.getElementById('main').hasAttribute('overlay')
  12. }
  13. let overlayHandlerContent
  14. /**
  15. * Overlay keydown handler for a non-dismissable overlay.
  16. *
  17. * @param {KeyboardEvent} e The keydown event.
  18. */
  19. function overlayKeyHandler (e){
  20. if(e.key === 'Enter' || e.key === 'Escape'){
  21. document.getElementById(overlayHandlerContent).getElementsByClassName('overlayKeybindEnter')[0].click()
  22. }
  23. }
  24. /**
  25. * Overlay keydown handler for a dismissable overlay.
  26. *
  27. * @param {KeyboardEvent} e The keydown event.
  28. */
  29. function overlayKeyDismissableHandler (e){
  30. if(e.key === 'Enter'){
  31. document.getElementById(overlayHandlerContent).getElementsByClassName('overlayKeybindEnter')[0].click()
  32. } else if(e.key === 'Escape'){
  33. document.getElementById(overlayHandlerContent).getElementsByClassName('overlayKeybindEsc')[0].click()
  34. }
  35. }
  36. /**
  37. * Bind overlay keydown listeners for escape and exit.
  38. *
  39. * @param {boolean} state Whether or not to add new event listeners.
  40. * @param {string} content The overlay content which will be shown.
  41. * @param {boolean} dismissable Whether or not the overlay is dismissable
  42. */
  43. function bindOverlayKeys(state, content, dismissable){
  44. overlayHandlerContent = content
  45. document.removeEventListener('keydown', overlayKeyHandler)
  46. document.removeEventListener('keydown', overlayKeyDismissableHandler)
  47. if(state){
  48. if(dismissable){
  49. document.addEventListener('keydown', overlayKeyDismissableHandler)
  50. } else {
  51. document.addEventListener('keydown', overlayKeyHandler)
  52. }
  53. }
  54. }
  55. /**
  56. * Toggle the visibility of the overlay.
  57. *
  58. * @param {boolean} toggleState True to display, false to hide.
  59. * @param {boolean} dismissable Optional. True to show the dismiss option, otherwise false.
  60. * @param {string} content Optional. The content div to be shown.
  61. */
  62. function toggleOverlay(toggleState, dismissable = false, content = 'overlayContent'){
  63. if(toggleState == null){
  64. toggleState = !document.getElementById('main').hasAttribute('overlay')
  65. }
  66. if(typeof dismissable === 'string'){
  67. content = dismissable
  68. dismissable = false
  69. }
  70. bindOverlayKeys(toggleState, content, dismissable)
  71. if(toggleState){
  72. document.getElementById('main').setAttribute('overlay', true)
  73. // Make things untabbable.
  74. $('#main *').attr('tabindex', '-1')
  75. $('#' + content).parent().children().hide()
  76. $('#' + content).show()
  77. if(dismissable){
  78. $('#overlayDismiss').show()
  79. } else {
  80. $('#overlayDismiss').hide()
  81. }
  82. $('#overlayContainer').fadeIn({
  83. duration: 250,
  84. start: () => {
  85. if(getCurrentView() === VIEWS.settings){
  86. document.getElementById('settingsContainer').style.backgroundColor = 'transparent'
  87. }
  88. }
  89. })
  90. } else {
  91. document.getElementById('main').removeAttribute('overlay')
  92. // Make things tabbable.
  93. $('#main *').removeAttr('tabindex')
  94. $('#overlayContainer').fadeOut({
  95. duration: 250,
  96. start: () => {
  97. if(getCurrentView() === VIEWS.settings){
  98. document.getElementById('settingsContainer').style.backgroundColor = 'rgba(0, 0, 0, 0.50)'
  99. }
  100. },
  101. complete: () => {
  102. $('#' + content).parent().children().hide()
  103. $('#' + content).show()
  104. if(dismissable){
  105. $('#overlayDismiss').show()
  106. } else {
  107. $('#overlayDismiss').hide()
  108. }
  109. }
  110. })
  111. }
  112. }
  113. function toggleServerSelection(toggleState){
  114. prepareServerSelectionList()
  115. toggleOverlay(toggleState, true, 'serverSelectContent')
  116. }
  117. /**
  118. * Set the content of the overlay.
  119. *
  120. * @param {string} title Overlay title text.
  121. * @param {string} description Overlay description text.
  122. * @param {string} acknowledge Acknowledge button text.
  123. * @param {string} dismiss Dismiss button text.
  124. */
  125. function setOverlayContent(title, description, acknowledge, dismiss = 'Dismiss'){
  126. document.getElementById('overlayTitle').innerHTML = title
  127. document.getElementById('overlayDesc').innerHTML = description
  128. document.getElementById('overlayAcknowledge').innerHTML = acknowledge
  129. document.getElementById('overlayDismiss').innerHTML = dismiss
  130. }
  131. /**
  132. * Set the onclick handler of the overlay acknowledge button.
  133. * If the handler is null, a default handler will be added.
  134. *
  135. * @param {function} handler
  136. */
  137. function setOverlayHandler(handler){
  138. if(handler == null){
  139. document.getElementById('overlayAcknowledge').onclick = () => {
  140. toggleOverlay(false)
  141. }
  142. } else {
  143. document.getElementById('overlayAcknowledge').onclick = handler
  144. }
  145. }
  146. /**
  147. * Set the onclick handler of the overlay dismiss button.
  148. * If the handler is null, a default handler will be added.
  149. *
  150. * @param {function} handler
  151. */
  152. function setDismissHandler(handler){
  153. if(handler == null){
  154. document.getElementById('overlayDismiss').onclick = () => {
  155. toggleOverlay(false)
  156. }
  157. } else {
  158. document.getElementById('overlayDismiss').onclick = handler
  159. }
  160. }
  161. /* Server Select View */
  162. document.getElementById('serverSelectConfirm').addEventListener('click', () => {
  163. const listings = document.getElementsByClassName('serverListing')
  164. for(let i=0; i<listings.length; i++){
  165. if(listings[i].hasAttribute('selected')){
  166. const serv = DistroManager.getDistribution().getServer(listings[i].getAttribute('servid'))
  167. updateSelectedServer(serv)
  168. refreshServerStatus(true)
  169. toggleOverlay(false)
  170. return
  171. }
  172. }
  173. // None are selected? Not possible right? Meh, handle it.
  174. if(listings.length > 0){
  175. const serv = DistroManager.getDistribution().getServer(listings[i].getAttribute('servid'))
  176. updateSelectedServer(serv)
  177. toggleOverlay(false)
  178. }
  179. })
  180. document.getElementById('accountSelectConfirm').addEventListener('click', () => {
  181. const listings = document.getElementsByClassName('accountListing')
  182. for(let i=0; i<listings.length; i++){
  183. if(listings[i].hasAttribute('selected')){
  184. const authAcc = ConfigManager.setSelectedAccount(listings[i].getAttribute('uuid'))
  185. ConfigManager.save()
  186. updateSelectedAccount(authAcc)
  187. toggleOverlay(false)
  188. validateSelectedAccount()
  189. return
  190. }
  191. }
  192. // None are selected? Not possible right? Meh, handle it.
  193. if(listings.length > 0){
  194. const authAcc = ConfigManager.setSelectedAccount(listings[0].getAttribute('uuid'))
  195. ConfigManager.save()
  196. updateSelectedAccount(authAcc)
  197. toggleOverlay(false)
  198. validateSelectedAccount()
  199. }
  200. })
  201. // Bind server select cancel button.
  202. document.getElementById('serverSelectCancel').addEventListener('click', () => {
  203. toggleOverlay(false)
  204. })
  205. document.getElementById('accountSelectCancel').addEventListener('click', () => {
  206. $('#accountSelectContent').fadeOut(250, () => {
  207. $('#overlayContent').fadeIn(250)
  208. })
  209. })
  210. function setServerListingHandlers(){
  211. const listings = Array.from(document.getElementsByClassName('serverListing'))
  212. listings.map((val) => {
  213. val.onclick = e => {
  214. if(val.hasAttribute('selected')){
  215. return
  216. }
  217. const cListings = document.getElementsByClassName('serverListing')
  218. for(let i=0; i<cListings.length; i++){
  219. if(cListings[i].hasAttribute('selected')){
  220. cListings[i].removeAttribute('selected')
  221. }
  222. }
  223. val.setAttribute('selected', '')
  224. document.activeElement.blur()
  225. }
  226. })
  227. }
  228. function setAccountListingHandlers(){
  229. const listings = Array.from(document.getElementsByClassName('accountListing'))
  230. listings.map((val) => {
  231. val.onclick = e => {
  232. if(val.hasAttribute('selected')){
  233. return
  234. }
  235. const cListings = document.getElementsByClassName('accountListing')
  236. for(let i=0; i<cListings.length; i++){
  237. if(cListings[i].hasAttribute('selected')){
  238. cListings[i].removeAttribute('selected')
  239. }
  240. }
  241. val.setAttribute('selected', '')
  242. document.activeElement.blur()
  243. }
  244. })
  245. }
  246. function populateServerListings(){
  247. const distro = DistroManager.getDistribution()
  248. const giaSel = ConfigManager.getSelectedServer()
  249. const servers = distro.getServers()
  250. let htmlString = ''
  251. for(const serv of servers){
  252. htmlString += `<button class="serverListing" servid="${serv.getID()}" ${serv.getID() === giaSel ? 'selected' : ''}>
  253. <img class="serverListingImg" src="${serv.getIcon()}"/>
  254. <div class="serverListingDetails">
  255. <span class="serverListingName">${serv.getName()}</span>
  256. <span class="serverListingDescription">${serv.getDescription()}</span>
  257. <div class="serverListingInfo">
  258. <div class="serverListingVersion">${serv.getMinecraftVersion()}</div>
  259. <div class="serverListingRevision">${serv.getVersion()}</div>
  260. ${serv.isMainServer() ? `<div class="serverListingStarWrapper">
  261. <svg id="Layer_1" viewBox="0 0 107.45 104.74" width="20px" height="20px">
  262. <defs>
  263. <style>.cls-1{fill:#fff;}.cls-2{fill:none;stroke:#fff;stroke-miterlimit:10;}</style>
  264. </defs>
  265. <path class="cls-1" d="M100.93,65.54C89,62,68.18,55.65,63.54,52.13c2.7-5.23,18.8-19.2,28-27.55C81.36,31.74,63.74,43.87,58.09,45.3c-2.41-5.37-3.61-26.52-4.37-39-.77,12.46-2,33.64-4.36,39-5.7-1.46-23.3-13.57-33.49-20.72,9.26,8.37,25.39,22.36,28,27.55C39.21,55.68,18.47,62,6.52,65.55c12.32-2,33.63-6.06,39.34-4.9-.16,5.87-8.41,26.16-13.11,37.69,6.1-10.89,16.52-30.16,21-33.9,4.5,3.79,14.93,23.09,21,34C70,86.84,61.73,66.48,61.59,60.65,67.36,59.49,88.64,63.52,100.93,65.54Z"/>
  266. <circle class="cls-2" cx="53.73" cy="53.9" r="38"/>
  267. </svg>
  268. <span class="serverListingStarTooltip">Main Server</span>
  269. </div>` : ''}
  270. </div>
  271. </div>
  272. </button>`
  273. }
  274. document.getElementById('serverSelectListScrollable').innerHTML = htmlString
  275. }
  276. function populateAccountListings(){
  277. const accountsObj = ConfigManager.getAuthAccounts()
  278. const accounts = Array.from(Object.keys(accountsObj), v=>accountsObj[v])
  279. let htmlString = ''
  280. for(let i=0; i<accounts.length; i++){
  281. htmlString += `<button class="accountListing" uuid="${accounts[i].uuid}" ${i===0 ? 'selected' : ''}>
  282. <img src="https://crafatar.com/renders/head/${accounts[i].uuid}?scale=2&default=MHF_Steve&overlay">
  283. <div class="accountListingName">${accounts[i].displayName}</div>
  284. </button>`
  285. }
  286. document.getElementById('accountSelectListScrollable').innerHTML = htmlString
  287. }
  288. function prepareServerSelectionList(){
  289. populateServerListings()
  290. setServerListingHandlers()
  291. }
  292. function prepareAccountSelectionList(){
  293. populateAccountListings()
  294. setAccountListingHandlers()
  295. }