|
29 | 29 | import { decodeBase64, scrollToAsync, toRelativeDateString, typedEntries } from "$lib/util"; |
30 | 30 |
|
31 | 31 | let { data } = $props(); |
32 | | - let { repos } = $derived(data); |
33 | 32 |
|
34 | 33 | const octokit = getOctokit(); |
35 | 34 |
|
|
83 | 82 | return Promise.resolve(cachedResponses[category]); |
84 | 83 | } |
85 | 84 | return Promise.all( |
86 | | - repos[category].repos.map( |
| 85 | + data.repos[category].repos.map( |
87 | 86 | async ( |
88 | 87 | { changesMode, repoName, dataFilter, versionFromTag, changelogContentsReplacer }, |
89 | 88 | repoIndex |
|
210 | 209 | let previousTab: Tab = "svelte"; |
211 | 210 | let visitedTabs = $state<Tab[]>([]); |
212 | 211 | let loadedTabs = $state<Tab[]>([]); |
213 | | - let isLoadingDone = $derived(loadedTabs.length === Object.keys(repos).length); |
| 212 | + let isLoadingDone = $derived(loadedTabs.length === Object.keys(data.repos).length); |
214 | 213 | const lastVisitKey = "lastVisit" as const; |
215 | 214 | let lastVisitDateString = $state(""); |
216 | 215 |
|
|
237 | 236 | </script> |
238 | 237 |
|
239 | 238 | <MetaTags |
240 | | - title={repos[currentTab].name} |
| 239 | + title={data.repos[currentTab].name} |
241 | 240 | titleTemplate="%s | Svelte Changelog" |
242 | 241 | description="A nice UI to stay up-to-date with Svelte releases" |
243 | 242 | canonical={PROD_URL} |
|
267 | 266 |
|
268 | 267 | <div class="container py-8"> |
269 | 268 | <h2 class="text-3xl font-bold"> |
270 | | - <span class="text-primary">{repos[currentTab].name}</span> |
| 269 | + <span class="text-primary">{data.repos[currentTab].name}</span> |
271 | 270 | Releases |
272 | 271 | </h2> |
273 | 272 | <Tabs.Root bind:value={currentTab} class="mt-8" onValueChange={onTabChange}> |
274 | 273 | <div |
275 | 274 | class="flex flex-col items-start gap-4 xs:flex-row xs:items-center xs:justify-between xs:gap-0" |
276 | 275 | > |
277 | 276 | <Tabs.List class="bg-input dark:bg-muted"> |
278 | | - {#each typedEntries(repos) as [id, { name }]} |
| 277 | + {#each typedEntries(data.repos) as [id, { name }]} |
279 | 278 | <BlinkingBadge |
280 | 279 | storedDateItem="{id}MostRecentUpdate" |
281 | 280 | show={!visitedTabs.includes(id) && id !== currentTab} |
|
315 | 314 | for="beta-releases-{currentTab}" |
316 | 315 | class="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" |
317 | 316 | > |
318 | | - Show {repos[currentTab].name} prereleases |
| 317 | + Show {data.repos[currentTab].name} prereleases |
319 | 318 | </Label> |
320 | 319 | </div> |
321 | 320 | </div> |
322 | 321 | <!-- Tabs content creation --> |
323 | | - {#each typedEntries(repos) as [id, { name, repos: repoList }]} |
| 322 | + {#each typedEntries(data.repos) as [id, { name, repos: repoList }]} |
324 | 323 | <Tabs.Content value={id}> |
325 | 324 | <!-- Fetch releases from GitHub --> |
326 | 325 | {#await fetchReleases(id)} |
|
340 | 339 | <!-- eslint-disable-next-line @typescript-eslint/no-unused-vars --> |
341 | 340 | {@const _ = (() => { |
342 | 341 | // Cache the response |
343 | | - cachedResponses[id] = releases; |
| 342 | + // TODO: restore with refactor |
| 343 | + // cachedResponses[id] = releases; |
344 | 344 |
|
345 | 345 | // Add tab to loaded tabs |
346 | | - const toSet = new Set(loadedTabs); |
347 | | - toSet.add(id); |
348 | | - loadedTabs = [...toSet]; |
| 346 | + // const toSet = new Set(loadedTabs); |
| 347 | + // toSet.add(id); |
| 348 | + // loadedTabs = [...toSet]; |
349 | 349 |
|
350 | 350 | // Update the most recent date of a release of the list |
351 | 351 | const latestRelease = releases.sort( |
|
561 | 561 | } |
562 | 562 | ); |
563 | 563 | })()} |
| 564 | + |
| 565 | + {#snippet badges()} |
| 566 | + {#if isLatestRelease} |
| 567 | + <Tooltip.Provider> |
| 568 | + <Tooltip.Root delayDuration={300}> |
| 569 | + <Tooltip.Trigger> |
| 570 | + <Badge |
| 571 | + class="bg-green-600 hover:bg-green-600 dark:bg-green-700 dark:hover:bg-green-700" |
| 572 | + > |
| 573 | + Latest |
| 574 | + </Badge> |
| 575 | + </Tooltip.Trigger> |
| 576 | + <Tooltip.Content> |
| 577 | + {#if id === "others"} |
| 578 | + This is a latest stable release |
| 579 | + {:else} |
| 580 | + This is the latest stable release of {name} |
| 581 | + {/if} |
| 582 | + </Tooltip.Content> |
| 583 | + </Tooltip.Root> |
| 584 | + </Tooltip.Provider> |
| 585 | + {/if} |
| 586 | + {#if isMajorRelease} |
| 587 | + <Tooltip.Provider> |
| 588 | + <Tooltip.Root delayDuration={300}> |
| 589 | + <Tooltip.Trigger> |
| 590 | + <Badge>Major</Badge> |
| 591 | + </Tooltip.Trigger> |
| 592 | + <Tooltip.Content>Major update (e.g.: 1.0.0, 2.0.0, 3.0.0...)</Tooltip.Content> |
| 593 | + </Tooltip.Root> |
| 594 | + </Tooltip.Provider> |
| 595 | + {:else if release.prerelease} |
| 596 | + <Tooltip.Provider> |
| 597 | + <Tooltip.Root delayDuration={300}> |
| 598 | + <Tooltip.Trigger> |
| 599 | + <Badge variant="outline" class="border-primary text-primary"> |
| 600 | + Prerelease |
| 601 | + </Badge> |
| 602 | + </Tooltip.Trigger> |
| 603 | + <Tooltip.Content> |
| 604 | + This version is an alpha or a beta, unstable version{id === "others" |
| 605 | + ? "" |
| 606 | + : ` of ${name}`} |
| 607 | + </Tooltip.Content> |
| 608 | + </Tooltip.Root> |
| 609 | + </Tooltip.Provider> |
| 610 | + {:else if isMaintenanceRelease} |
| 611 | + <Tooltip.Provider> |
| 612 | + <Tooltip.Root delayDuration={300}> |
| 613 | + <Tooltip.Trigger> |
| 614 | + <Badge variant="outline" class="border-blue-600 text-blue-600"> |
| 615 | + Maintenance |
| 616 | + </Badge> |
| 617 | + </Tooltip.Trigger> |
| 618 | + <Tooltip.Content> |
| 619 | + An update bringing bug fixes and minor improvements to an older major |
| 620 | + version |
| 621 | + </Tooltip.Content> |
| 622 | + </Tooltip.Root> |
| 623 | + </Tooltip.Provider> |
| 624 | + {/if} |
| 625 | + {/snippet} |
| 626 | + |
564 | 627 | <Accordion.Item |
565 | 628 | value={release.id.toString()} |
566 | 629 | class={isMajorRelease && id !== "others" && index < 3 |
|
586 | 649 | {@const newReleaseMajor = releaseRepo |
587 | 650 | ?.versionFromTag(release.tag_name) |
588 | 651 | ?.split(".")[0]} |
589 | | - <Tooltip.Root delayDuration={300}> |
590 | | - <Tooltip.Trigger> |
591 | | - {#if index === 0 && currentTab === id} |
592 | | - <div |
593 | | - class="mx-auto" |
594 | | - use:confetti={{ |
595 | | - duration: 5000, |
596 | | - colors: ["orange", "white"] |
597 | | - }} |
598 | | - ></div> |
599 | | - {/if} |
600 | | - <span class="majorGradient text-left text-xl"> |
601 | | - {releaseName} |
602 | | - </span> |
603 | | - </Tooltip.Trigger> |
604 | | - <Tooltip.Content> |
605 | | - {#if newReleaseMajor} |
606 | | - {name} {newReleaseMajor} is available! |
607 | | - {:else} |
608 | | - A new major of {name} is available! |
609 | | - {/if} |
610 | | - </Tooltip.Content> |
611 | | - </Tooltip.Root> |
| 652 | + <Tooltip.Provider> |
| 653 | + <Tooltip.Root delayDuration={300}> |
| 654 | + <Tooltip.Trigger> |
| 655 | + {#if index === 0 && currentTab === id} |
| 656 | + <div |
| 657 | + class="mx-auto" |
| 658 | + use:confetti={{ |
| 659 | + duration: 5000, |
| 660 | + colors: ["orange", "white"] |
| 661 | + }} |
| 662 | + ></div> |
| 663 | + {/if} |
| 664 | + <span class="majorGradient text-left text-xl"> |
| 665 | + {releaseName} |
| 666 | + </span> |
| 667 | + </Tooltip.Trigger> |
| 668 | + <Tooltip.Content> |
| 669 | + {#if newReleaseMajor} |
| 670 | + {name} {newReleaseMajor} is available! |
| 671 | + {:else} |
| 672 | + A new major of {name} is available! |
| 673 | + {/if} |
| 674 | + </Tooltip.Content> |
| 675 | + </Tooltip.Root> |
| 676 | + </Tooltip.Provider> |
612 | 677 | {:else} |
613 | 678 | <span class="flex flex-col text-left"> |
614 | 679 | <span class="text-lg group-hover:underline">{releaseName}</span> |
|
620 | 685 | </span> |
621 | 686 | {/if} |
622 | 687 | <div class="flex items-center gap-2 xs:hidden"> |
623 | | - {#if isLatestRelease} |
624 | | - <Tooltip.Root delayDuration={300}> |
625 | | - <Tooltip.Trigger> |
626 | | - <Badge |
627 | | - class="bg-green-600 hover:bg-green-600 dark:bg-green-700 dark:hover:bg-green-700" |
628 | | - > |
629 | | - Latest |
630 | | - </Badge> |
631 | | - </Tooltip.Trigger> |
632 | | - <Tooltip.Content> |
633 | | - {#if id === "others"} |
634 | | - This is a latest stable release |
635 | | - {:else} |
636 | | - This is the latest stable release of {name} |
637 | | - {/if} |
638 | | - </Tooltip.Content> |
639 | | - </Tooltip.Root> |
640 | | - {/if} |
641 | | - {#if isMajorRelease} |
642 | | - <Tooltip.Root delayDuration={300}> |
643 | | - <Tooltip.Trigger> |
644 | | - <Badge>Major</Badge> |
645 | | - </Tooltip.Trigger> |
646 | | - <Tooltip.Content> |
647 | | - Major update (e.g.: 1.0.0, 2.0.0, 3.0.0...) |
648 | | - </Tooltip.Content> |
649 | | - </Tooltip.Root> |
650 | | - {:else if release.prerelease} |
651 | | - <Tooltip.Root delayDuration={300}> |
652 | | - <Tooltip.Trigger> |
653 | | - <Badge variant="outline" class="border-primary text-primary"> |
654 | | - Prerelease |
655 | | - </Badge> |
656 | | - </Tooltip.Trigger> |
657 | | - <Tooltip.Content> |
658 | | - This version is an alpha or a beta, unstable version{id === "others" |
659 | | - ? "" |
660 | | - : ` of ${name}`} |
661 | | - </Tooltip.Content> |
662 | | - </Tooltip.Root> |
663 | | - {:else if isMaintenanceRelease} |
664 | | - <Tooltip.Root delayDuration={300}> |
665 | | - <Tooltip.Trigger> |
666 | | - <Badge variant="outline" class="border-blue-600 text-blue-600"> |
667 | | - Maintenance |
668 | | - </Badge> |
669 | | - </Tooltip.Trigger> |
670 | | - <Tooltip.Content> |
671 | | - An update bringing bug fixes and minor improvements to an older major |
672 | | - version |
673 | | - </Tooltip.Content> |
674 | | - </Tooltip.Root> |
675 | | - {/if} |
| 688 | + {@render badges()} |
676 | 689 | </div> |
677 | 690 | </div> |
678 | 691 | <span |
679 | 692 | class="ml-auto mr-4 flex text-right text-sm text-muted-foreground xs:ml-0 xs:mr-2" |
680 | 693 | > |
681 | 694 | <span class="mr-1 hidden xs:block">•</span> |
682 | | - <Tooltip.Root delayDuration={300}> |
683 | | - <Tooltip.Trigger> |
684 | | - {isOlderThanAWeek |
685 | | - ? releaseDate.toLocaleDateString("en") |
686 | | - : toRelativeDateString(releaseDate)} |
687 | | - </Tooltip.Trigger> |
688 | | - <Tooltip.Content> |
689 | | - {isOlderThanAWeek |
690 | | - ? toRelativeDateString(releaseDate) |
691 | | - : new Intl.DateTimeFormat("en", { |
692 | | - dateStyle: "medium", |
693 | | - timeStyle: "short" |
694 | | - }).format(releaseDate)} |
695 | | - </Tooltip.Content> |
696 | | - </Tooltip.Root> |
697 | | - </span> |
698 | | - <div class="hidden items-center gap-2 xs:flex"> |
699 | | - {#if isLatestRelease} |
| 695 | + <Tooltip.Provider> |
700 | 696 | <Tooltip.Root delayDuration={300}> |
701 | 697 | <Tooltip.Trigger> |
702 | | - <Badge |
703 | | - class="bg-green-600 hover:bg-green-600 dark:bg-green-700 dark:hover:bg-green-700" |
704 | | - > |
705 | | - Latest |
706 | | - </Badge> |
| 698 | + {isOlderThanAWeek |
| 699 | + ? releaseDate.toLocaleDateString("en") |
| 700 | + : toRelativeDateString(releaseDate)} |
707 | 701 | </Tooltip.Trigger> |
708 | 702 | <Tooltip.Content> |
709 | | - {#if id === "others"} |
710 | | - This is a latest stable release |
711 | | - {:else} |
712 | | - This is the latest stable release of {name} |
713 | | - {/if} |
| 703 | + {isOlderThanAWeek |
| 704 | + ? toRelativeDateString(releaseDate) |
| 705 | + : new Intl.DateTimeFormat("en", { |
| 706 | + dateStyle: "medium", |
| 707 | + timeStyle: "short" |
| 708 | + }).format(releaseDate)} |
714 | 709 | </Tooltip.Content> |
715 | 710 | </Tooltip.Root> |
716 | | - {/if} |
717 | | - {#if isMajorRelease} |
718 | | - <Tooltip.Root delayDuration={300}> |
719 | | - <Tooltip.Trigger> |
720 | | - <Badge>Major</Badge> |
721 | | - </Tooltip.Trigger> |
722 | | - <Tooltip.Content> |
723 | | - Major update (e.g.: 1.0.0, 2.0.0, 3.0.0...) |
724 | | - </Tooltip.Content> |
725 | | - </Tooltip.Root> |
726 | | - {:else if release.prerelease} |
727 | | - <Tooltip.Root delayDuration={300}> |
728 | | - <Tooltip.Trigger> |
729 | | - <Badge variant="outline" class="border-primary text-primary"> |
730 | | - Prerelease |
731 | | - </Badge> |
732 | | - </Tooltip.Trigger> |
733 | | - <Tooltip.Content> |
734 | | - This version is an alpha or a beta, unstable version{id === "others" |
735 | | - ? "" |
736 | | - : ` of ${name}`} |
737 | | - </Tooltip.Content> |
738 | | - </Tooltip.Root> |
739 | | - {:else if isMaintenanceRelease} |
740 | | - <Tooltip.Root delayDuration={300}> |
741 | | - <Tooltip.Trigger> |
742 | | - <Badge variant="outline" class="border-blue-600 text-blue-600"> |
743 | | - Maintenance |
744 | | - </Badge> |
745 | | - </Tooltip.Trigger> |
746 | | - <Tooltip.Content> |
747 | | - An update bringing bug fixes and minor improvements to an older major |
748 | | - version |
749 | | - </Tooltip.Content> |
750 | | - </Tooltip.Root> |
751 | | - {/if} |
| 711 | + </Tooltip.Provider> |
| 712 | + </span> |
| 713 | + <div class="hidden items-center gap-2 xs:flex"> |
| 714 | + {@render badges()} |
752 | 715 | </div> |
753 | 716 | </div> |
754 | 717 | </Accordion.Trigger> |
|
0 commit comments