|
16 | 16 | import Notification from "./Notification.svelte";
|
17 | 17 |
|
18 | 18 | export let steamUser: ISteamUser;
|
19 |
| -
|
20 | 19 | let tab: string = "addons";
|
21 | 20 |
|
22 |
| - /** |
23 |
| - * Changes the view into the selected tab |
24 |
| - */ |
| 21 | + // Sorting state |
| 22 | + let sortType: "latest" | "views" | "subscribers" | "favorites" | "likes" | "dislikes" = |
| 23 | + "subscribers"; |
| 24 | +
|
| 25 | + // Computed visible addons based on sort type |
| 26 | + $: visibleAddons = [...steamUser.addons].sort((a, b) => { |
| 27 | + if (sortType === "latest") return 0; |
| 28 | + if (sortType === "views") return b.views - a.views; |
| 29 | + if (sortType === "subscribers") return b.subscribers - a.subscribers; |
| 30 | + if (sortType === "favorites") return b.favorites - a.favorites; |
| 31 | + if (sortType === "likes") return b.likes - a.likes; |
| 32 | + if (sortType === "dislikes") return b.dislikes - a.dislikes; |
| 33 | + return 0; |
| 34 | + }); |
| 35 | +
|
25 | 36 | function changeTab(e: Event) {
|
26 | 37 | e.preventDefault();
|
27 | 38 | tab = (e.target as HTMLButtonElement).value;
|
|
35 | 46 | })}
|
36 | 47 | </h2>
|
37 | 48 | <img src={steamUser.profileImageUrl} class="h-44 my-8 rounded-full" alt="Steam Profile" />
|
| 49 | + |
38 | 50 | {#if steamUser.addons.length > 0}
|
39 |
| - <div class="stats stats-vertical lg:stats-horizontal bg-secondary mx-10 text-center shadow-sm"> |
| 51 | + <!-- Stats summary --> |
| 52 | + <div |
| 53 | + class="stats stats-vertical lg:stats-horizontal bg-secondary mx-10 text-center shadow-sm" |
| 54 | + > |
40 | 55 | <StatTitle title={$_("stats.views")} faIcon={faEye} value={steamUser.views} />
|
41 | 56 | <StatTitle
|
42 | 57 | title={$_("stats.subscribers")}
|
|
51 | 66 | value={steamUser.dislikes}
|
52 | 67 | />
|
53 | 68 | </div>
|
| 69 | + |
| 70 | + <!-- Tab controls --> |
54 | 71 | <div class="invisible lg:visible my-8">
|
55 | 72 | <button
|
56 | 73 | on:click={changeTab}
|
|
67 | 84 | {$_("stats.graph")}
|
68 | 85 | </button>
|
69 | 86 | </div>
|
| 87 | + |
70 | 88 | {#if tab === "addons"}
|
| 89 | + <!-- Sort control --> |
| 90 | + <div class="controls mb-4"> |
| 91 | + <label class="mr-2">Sort by:</label> |
| 92 | + <select bind:value={sortType} class="btn btn-sm"> |
| 93 | + <option value="latest">Time</option> |
| 94 | + <option value="views">{$_("stats.views")}</option> |
| 95 | + <option value="subscribers">{$_("stats.subscribers")}</option> |
| 96 | + <option value="favorites">{$_("stats.favorites")}</option> |
| 97 | + <option value="likes">{$_("stats.likes")}</option> |
| 98 | + <option value="dislikes">{$_("stats.dislikes")}</option> |
| 99 | + </select> |
| 100 | + </div> |
| 101 | + |
71 | 102 | <h2 class="mb-8">
|
72 |
| - {$_("stats.addonsOf", { |
73 |
| - values: { username: steamUser.username }, |
74 |
| - })} |
| 103 | + {$_("stats.addonsOf", { values: { username: steamUser.username } })} |
75 | 104 | </h2>
|
| 105 | + |
| 106 | + <!-- Add-ons grid --> |
76 | 107 | <div
|
77 | 108 | class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-8 mx-8"
|
78 | 109 | >
|
79 |
| - {#each steamUser.addons as addon} |
| 110 | + {#each visibleAddons as addon} |
80 | 111 | <Addon
|
81 | 112 | id={addon.id}
|
82 | 113 | title={addon.title}
|
|
0 commit comments