{ "version": 3, "sources": ["../../assets/queue/index.js"], "sourcesContent": ["/* global pep_queue_config */\n\nconst main_element = document.querySelector('main');\nlet interval;\nlet last_known_position = pep_queue_config['position'];\nlet last_known_length = pep_queue_config['length'];\nlet failed_updates = 0;\n\n/**\n * Render incoming messages. Simply wipes the parent node and rerenders them all.\n */\nfunction renderMessages(data) {\n const messages_root = document.getElementById('messages');\n messages_root.innerHTML = '';\n\n data.forEach((message) => {\n const template = document.getElementById('message-template').content.cloneNode(true);\n template.querySelector('h2').innerHTML = message.title;\n template.querySelector('p.small').innerHTML = message.start;\n template.querySelector('div').innerHTML = message.description;\n messages_root.appendChild(template);\n });\n}\n\nfunction renderPosition(you, total) {\n const el = document.getElementById('queue-position');\n if (!el) {\n return;\n }\n el.innerHTML = pep_queue_config['label_position'].replace('[!position!]', you).replace('[!total!]', total);\n}\n\nfunction renderTimer(seconds, hellip) {\n const timer_element = document.querySelector('.timeout');\n const hellip_element = document.querySelector('.hellip');\n\n if (timer_element) {\n let s = seconds;\n const m = Math.floor(s / 60); //Get remaining minutes\n\n s -= m * 60;\n if (seconds < 1) {\n timer_element.innerHTML = pep_queue_config['label_seconds'].replace('[!seconds!]', '…');\n } else {\n if (m <= 0) {\n timer_element.innerHTML = pep_queue_config['label_seconds'].replace('[!seconds!]', s);\n } else {\n timer_element.innerHTML = pep_queue_config['label_minutes'].replace('[!minutes!]', m).replace('[!seconds!]', s);\n }\n }\n }\n\n if (hellip_element) {\n hellip_element.innerHTML = hellip;\n }\n}\n\nfunction renderUpdate() {\n const now = new Date();\n const update_element = document.querySelector('.update');\n\n if (update_element) {\n update_element.innerHTML = pep_queue_config['label_update'].replace(\n '[!time!]', now.toLocaleTimeString([], {timeStyle: 'short'})\n );\n }\n}\n\nfunction getTimer(new_position) {\n if (new_position > 500) {\n return 240; // 4min\n }\n if (new_position > 250) {\n return 120; // 2min\n }\n if (new_position > 100) {\n return 60;\n }\n if (new_position > 50) {\n return 30;\n }\n if (new_position > 10) {\n return 15;\n }\n\n return 10;\n}\n\n/**\n * Fetch new position, queue length.\n *\n * If that fails, use the last known position and start a new countdown.\n */\nasync function update() {\n try {\n clearTimeout(interval);\n let maintenace_mode = false;\n\n const response = await fetch(pep_queue_config['endpoint']);\n if (response.ok) {\n const data = await response.json();\n\n if (data.position < 1) {\n window.location.reload();\n return;\n }\n\n maintenace_mode = data.is_maintenance_mode;\n if (maintenace_mode) {\n main_element.classList.add('hidden');\n } else {\n main_element.classList.remove('hidden');\n }\n\n renderUpdate();\n last_known_position = data.position;\n last_known_length = data.length;\n } else {\n failed_updates++;\n // eslint-disable-next-line no-console\n console.error(response.status);\n\n if (failed_updates > 3) {\n window.location.reload();\n }\n }\n\n renderPosition(last_known_position, last_known_length);\n\n // In maintenance mode (queue = 0), put everyone on the same interval based on the length of the queue.\n // Considerations:\n // - in reality, when that interval hits will be randomly spread because everyone joined the queue at a different time\n // - although people who are early might be on a short interval, each interval it will eventually increase to match everyone else\n // eslint-disable-next-line no-use-before-define\n startCountdown(maintenace_mode ? getTimer(last_known_length) : getTimer(last_known_position));\n\n } catch (e) {\n failed_updates++;\n // eslint-disable-next-line no-console\n console.error(e);\n\n if (failed_updates > 3) {\n window.location.reload();\n }\n }\n}\n/**\n * Fetch new messages.\n */\nsetInterval(() => {\n fetch(pep_queue_config['messages']).then((response) => {\n if (!response.ok) {\n throw new Error('Failed fetching queue messages.');\n }\n return response.json();\n }).then((data) => {\n renderMessages(data);\n });\n}, 60 * 1000);\n\nfunction startCountdown(secs) {\n let hellip = '';\n\n interval = setInterval(() => {\n if (secs < 1) {\n update();\n }\n renderTimer(secs, hellip);\n secs--;\n\n hellip = hellip + '.';\n if (hellip.length === 4) {\n hellip = '';\n }\n\n }, 1000);\n}\n\nrenderUpdate();\nstartCountdown(getTimer(last_known_position));\n"], "mappings": "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", "names": ["main_element", "interval", "last_known_position", "last_known_length", "failed_updates", "renderMessages", "data", "messages_root", "message", "template", "renderPosition", "you", "total", "el", "renderTimer", "seconds", "hellip", "timer_element", "hellip_element", "s", "m", "renderUpdate", "now", "update_element", "getTimer", "new_position", "update", "maintenace_mode", "response", "startCountdown", "secs"] }