|
| 1 | +/** |
| 2 | + * @typedef {Object} GitHubAsset |
| 3 | + * @property {string} name |
| 4 | + * @property {string} browser_download_url |
| 5 | + * @property {number} download_count |
| 6 | + */ |
| 7 | + |
| 8 | +/** |
| 9 | + * @typedef {Object} GitHubRelease |
| 10 | + * @property {string} tag_name |
| 11 | + * @property {string} html_url |
| 12 | + * @property {string} published_at |
| 13 | + * @property {string} body_html |
| 14 | + * @property {GitHubAsset[]} assets |
| 15 | + */ |
| 16 | + |
1 | 17 | const releasesPerPage = 5; |
2 | 18 | const releaseNotesContainer = document.getElementById('changelog'); |
3 | 19 | const downloadFormatter = new Intl.NumberFormat('en', { |
@@ -26,7 +42,7 @@ function LoadReleases() { |
26 | 42 |
|
27 | 43 | return response.json(); |
28 | 44 | }) |
29 | | - .then((releases) => { |
| 45 | + .then((/** @type {GitHubRelease[]} */ releases) => { |
30 | 46 | if (existingBtn) { |
31 | 47 | existingBtn.remove(); |
32 | 48 | } |
@@ -84,6 +100,10 @@ function LoadReleases() { |
84 | 100 | }); |
85 | 101 | } |
86 | 102 |
|
| 103 | +/** |
| 104 | + * @param {GitHubRelease[]} releases |
| 105 | + * @param {boolean} isFirstPage |
| 106 | + */ |
87 | 107 | function RenderReleases(releases, isFirstPage) { |
88 | 108 | for (const release of releases) { |
89 | 109 | const releaseSection = document.createElement('div'); |
@@ -178,7 +198,12 @@ function RenderReleases(releases, isFirstPage) { |
178 | 198 | } |
179 | 199 | } |
180 | 200 |
|
| 201 | +/** @param {HTMLElement} changelogContainer */ |
181 | 202 | function AdjustChangelog(changelogContainer) { |
| 203 | + /** |
| 204 | + * @param {HTMLElement} element |
| 205 | + * @param {HTMLElement|null} [unwrapParent] |
| 206 | + */ |
182 | 207 | const wrapMedia = (element, unwrapParent) => { |
183 | 208 | if (unwrapParent) { |
184 | 209 | const wrapper = document.createElement('div'); |
@@ -214,7 +239,12 @@ function AdjustChangelog(changelogContainer) { |
214 | 239 | } |
215 | 240 | } |
216 | 241 |
|
| 242 | +/** |
| 243 | + * @param {string} src |
| 244 | + * @param {"image"|"video"} type |
| 245 | + */ |
217 | 246 | function OpenMediaModal(src, type) { |
| 247 | + /** @type {HTMLDialogElement} */ |
218 | 248 | let modal = document.getElementById('changelog-media-modal'); |
219 | 249 | if (!modal) { |
220 | 250 | modal = document.createElement('dialog'); |
@@ -245,13 +275,14 @@ function OpenMediaModal(src, type) { |
245 | 275 | const media = document.createElement(type === 'video' ? 'video' : 'img'); |
246 | 276 | media.className = 'changelog-modal-media'; |
247 | 277 | media.src = src; |
| 278 | + |
248 | 279 | if (type === 'video') { |
249 | 280 | media.controls = true; |
250 | 281 | media.autoplay = true; |
251 | 282 | media.loop = true; |
252 | 283 | } |
253 | | - modal.appendChild(media); |
254 | 284 |
|
| 285 | + modal.appendChild(media); |
255 | 286 | modal.showModal(); |
256 | 287 | } |
257 | 288 |
|
|
0 commit comments