1import { 2 Controller 3} from "@hotwired/stimulus" 4import consumer from 'channels/consumer'; 5 6export default class extends Controller { 7 connect() { 8 var $this = this 9 initTheme(); 10 initTimeFormat(); 11 windowLoadContent(); 12 disableDropdownTabEvents(); 13 document.addEventListener("turbo:before-fetch-request", function (e) { 14 document.getElementById('loading-spinner').classList.remove('d-none'); 15 }); 16 document.addEventListener("turbo:frame-render", function (e) { 17 document.getElementById('loading-spinner').classList.add('d-none'); 18 }); 19 this.alertTimeout = undefined; 20 document.addEventListener("turbo:before-fetch-response", function (e) { 21 const alertBox = document.getElementById('alertBox'); 22 if (e.detail.fetchResponse.response.status == 429) { 23 e.preventDefault(); 24 $this.showAlertBox('The website is busy or you have been temporarily rate limited. Please try again in a few moments.'); 25 } else if (e.detail.fetchResponse.response.status == 500) { 26 e.preventDefault(); 27 $this.showAlertBox('The server has encountered an error (500). Please try again later.'); 28 } 29 }); 30 this.connectToPoolChannel(); 31 this.connectToNewsChannel(); 32 document.getElementById('newsDropdown').addEventListener('show.bs.dropdown', function () { 33 $this.setNewsSeen(); 34 }); 35 } 36 37 disconnect() { 38 this.poolChannel.unsubscribe(); 39 this.newsChannel.unsubscribe(); 40 } 41 42 showAlertBox(text) { 43 if (this.alertTimeout) { 44 clearTimeout(this.alertTimeout); 45 } 46 const alertBoxText = document.getElementById('alertBoxText'); 47 alertBoxText.innerHTML = text; 48 alertBox.classList.remove('d-none'); 49 this.alertTimeout = setTimeout(() => { 50 alertBox.classList.add('d-none'); 51 }, 10000); 52 document.getElementById('loading-spinner').classList.add('d-none'); 53 } 54 55 connectToPoolChannel() { 56 this.poolChannel = consumer.subscriptions.create({ 57 channel: "PoolChannel" 58 }, {
59 received: this._poolCableReceived.bind(this), 60 }); 61 } 62 63 connectToNewsChannel() { 64 this.newsChannel = consumer.subscriptions.create({ 65 channel: "NewsChannel" 66 }, { 67 received: this._newsCableReceived.bind(this), 68 }); 69 } 70 71 _poolCableReceived(data) { 72 const timeDiffMsec = timeDiff(data.utc_time); 73 if (timeDiffMsec > 20000) { 74 document.getElementById('time-diff-dropdown').classList.remove('d-none'); 75 document.getElementById('time-difference').innerHTML = Math.round(timeDiffMsec / 1000); 76 } else { 77 document.getElementById('time-diff-dropdown').classList.add('d-none'); 78 } 79 let poolSize = data.pool_size; 80 let poolSizeUnit = 'TiB' 81 if (poolSize >= 1024) { 82 poolSize = poolSize / 1024 83 poolSizeUnit = 'PiB' 84 } 85 var elements = document.getElementsByClassName("pool-size"); 86 Array.from(elements).forEach(function (el) { 87 el.innerHTML = poolSize.toFixed(2); 88 }); 89 var elements = document.getElementsByClassName("pool-size-unit"); 90 Array.from(elements).forEach(function (el) { 91 el.innerHTML = poolSizeUnit; 92 }); 93 var elements = document.getElementsByClassName("xch-usd"); 94 Array.from(elements).forEach(function (el) { 95 el.innerHTML = data.xch_usd; 96 }); 97 } 98 99 _newsCableReceived(data) { 100 document.getElementById('newsList').reload(); 101 } 102 103 toggleHeaderTicker() { 104 var elements = document.getElementsByClassName("header-ticker"); 105 Array.from(elements).forEach(function (el) { 106 console.log(el); 107 el.classList.toggle('d-md-block'); 108 el.classList.toggle('d-none'); 109 }); 110 } 111 112 toggleNewsBody(event) { 113 event.stopPropagation(); 114 const parentElement = event.target.closest('.news-item'); 115 const newsDropdown = parentElement.querySelector('.news-dropdown'); 116 const newsBody = parentElement.querySelector('.news-body'); 117 if (newsDropdown != null) { 118 newsDropdown.classList.toggle('bx-chevron-down'); 119 newsDropdown.classList.toggle('bx-chevron-up'); 120 newsBody.classList.toggle('d-none'); 121 } 122 } 123 124 setNewsSeen() { 125 const currentTimestamp = Date.UTC( 126 new Date().getUTCFullYear(), 127 new Date().getUTCMonth(), 128 new Date().getUTCDate(), 129 new Date().getUTCHours(), 130 new Date().getUTCMinutes(), 131 new Date().getUTCSeconds(), 132 new Date().getUTCMilliseconds() 133 ); 134 localStorage.setItem("newsTimestamp", Math.floor(currentTimestamp / 1000)); 135 this.newsCounter(); 136 } 137 138 newsCounter() { 139 var newsTimestamp = localStorage.getItem("newsTimestamp") || 0; 140 const elements = document.getElementsByClassName('news-item'); 141 var count = 0; 142 for (let i = 0; i < elements.length; i++) { 143 const timestamp = parseInt(elements[i].getAttribute('data-timestamp')); 144 if (timestamp > newsTimestamp) { 145 count = count + 1; 146 } 147 } 148 149 const newsCounter = document.getElementById('newsCounter') 150 if (count > 0) { 151 newsCounter.classList.remove('d-none'); 152 newsCounter.innerHTML = count 153 } else { 154 newsCounter.classList.add('d-none'); 155 } 156 convertUTCTime(); 157 } 158};
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.