Skip to content

Commit 2f960b8

Browse files
fix: improve look, add icons and filter out PRs from issues
1 parent 6e3b931 commit 2f960b8

File tree

3 files changed

+87
-50
lines changed

3 files changed

+87
-50
lines changed

src/lib/components/GHBadge.svelte

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script lang="ts">
2+
import type { ClassValue } from "svelte/elements";
23
import {
34
CircleCheck,
45
CircleDot,
@@ -22,38 +23,45 @@
2223
};
2324
2425
type Props = {
26+
mode: "regular" | "minimal";
2527
type: PropsObj["type"];
2628
status: PropsObj["status"];
29+
class?: ClassValue;
2730
};
2831
29-
let { type, status }: Props = $props();
32+
let { mode = "regular", type, status, class: className = undefined }: Props = $props();
3033
3134
let icon = $state<typeof Icon>();
3235
let label = $state("");
33-
let color = $state("");
36+
let textColor = $state("");
37+
let bgColor = $state("");
3438
3539
switch (type) {
3640
case "pull":
3741
switch (status) {
3842
case "draft":
3943
icon = GitPullRequestDraft;
4044
label = "Draft";
41-
color = "bg-neutral-500";
45+
textColor = "text-neutral-500";
46+
bgColor = "bg-neutral-500";
4247
break;
4348
case "open":
4449
icon = GitPullRequestArrow;
4550
label = "Open";
46-
color = "bg-green-600";
51+
textColor = "text-green-600";
52+
bgColor = "bg-green-600";
4753
break;
4854
case "merged":
4955
icon = GitMerge;
5056
label = "Merged";
51-
color = "bg-purple-500";
57+
textColor = "text-purple-500";
58+
bgColor = "bg-purple-500";
5259
break;
5360
case "closed":
5461
icon = GitPullRequestClosed;
5562
label = "Closed";
56-
color = "bg-red-500";
63+
textColor = "text-red-500";
64+
bgColor = "bg-red-500";
5765
break;
5866
}
5967
break;
@@ -62,26 +70,34 @@
6270
case "open":
6371
icon = CircleDot;
6472
label = "Open";
65-
color = "bg-green-600";
73+
textColor = "text-green-600";
74+
bgColor = "bg-green-600";
6675
break;
6776
case "closed":
6877
icon = CircleSlash;
6978
label = "Closed";
70-
color = "bg-neutral-500";
79+
textColor = "text-neutral-500";
80+
bgColor = "bg-neutral-500";
7181
break;
7282
case "solved":
7383
icon = CircleCheck;
7484
label = "Solved";
75-
color = "bg-purple-500";
85+
textColor = "text-purple-500";
86+
bgColor = "bg-purple-500";
7687
break;
7788
}
7889
}
7990
</script>
8091

81-
<div class="flex items-center rounded-full px-4 py-2 text-white {color}">
82-
{#if icon}
83-
{@const SvelteComponent = icon}
84-
<SvelteComponent class="mr-2 size-5" />
85-
{/if}
86-
<span class="font-semibold">{label}</span>
87-
</div>
92+
{#if mode === "regular"}
93+
<div class={["flex items-center rounded-full px-4 py-2 text-white", bgColor, className]}>
94+
{#if icon}
95+
{@const SvelteComponent = icon}
96+
<SvelteComponent class="mr-2 size-5" />
97+
{/if}
98+
<span class="font-semibold">{label}</span>
99+
</div>
100+
{:else if icon}
101+
{@const Component = icon}
102+
<Component class={["size-6", textColor, className]} />
103+
{/if}

src/routes/tracker/[org]/[repo]/+page.server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ export async function load({ params }) {
4444
.toSorted((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
4545
.slice(0, 10),
4646
issues: unfilteredIssues
47-
?.filter(({ user }) => membersNames.includes(user?.login ?? ""))
47+
?.filter(
48+
({ user, pull_request }) => !pull_request && membersNames.includes(user?.login ?? "")
49+
)
4850
.toSorted((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
4951
.slice(0, 10)
5052
};

src/routes/tracker/[org]/[repo]/+page.svelte

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { Transparent } from "svelte-exmarkdown";
33
import { Separator } from "$lib/components/ui/separator";
44
import MarkdownRenderer from "$lib/components/MarkdownRenderer.svelte";
5+
import GHBadge from "$lib/components/GHBadge.svelte";
56
67
let { data } = $props();
78
@@ -22,7 +23,7 @@
2223
{#snippet list(title: string, items: Item[], itemToLink: (item: any) => string)}
2324
<!-- {#snippet list<T extends Item>(title: string, items: T[], itemToLink: (item: T) => string)} -->
2425
<div>
25-
<h2 class="mt-12 mb-2 text-2xl font-semibold tracking-tight">{title}</h2>
26+
<h2 class="mt-12 mb-2 text-3xl font-semibold tracking-tight">{title}</h2>
2627
{#each items as item, i (item.id)}
2728
{#if i > 0}
2829
<Separator class="my-1" />
@@ -36,40 +37,58 @@
3637
{@const date = new Date(item.created_at)}
3738
<a
3839
href={link}
39-
class="flex flex-col rounded-xl px-4 py-3 transition-colors hover:bg-neutral-100 dark:hover:bg-neutral-800"
40+
class="flex items-center gap-6 rounded-xl px-4 py-3 transition-colors hover:bg-neutral-100 dark:hover:bg-neutral-800"
4041
>
41-
<div class="flex justify-between">
42-
<span>
43-
<MarkdownRenderer markdown={item.title} inline class="text-foreground" />
44-
<span class="text-muted-foreground">#{item.number}</span>
45-
</span>
46-
<span>
47-
{#if isNew(date)}
48-
{daysAgo(date)} •
49-
{/if}
50-
{new Intl.DateTimeFormat("en", {
51-
dateStyle: "medium"
52-
}).format(date)}
53-
</span>
54-
</div>
55-
<MarkdownRenderer
56-
markdown={item.body || "_No description_"}
57-
inline
58-
parseRawHtml
59-
class="line-clamp-2 max-w-full text-base text-muted-foreground"
60-
additionalPlugins={[
61-
{
62-
renderer: {
63-
h1: "h4",
64-
h2: "h4",
65-
h3: "h4",
66-
pre: Transparent,
67-
a: Transparent,
68-
ul: Transparent
69-
}
70-
}
71-
]}
42+
<GHBadge
43+
mode="minimal"
44+
type={"base" in item || "pull_request" in item ? "pull" : "issue"}
45+
status={item.state === "closed"
46+
? "merged" in item
47+
? item.merged
48+
? "merged"
49+
: "closed"
50+
: "state_reason" in item && item.state_reason === "completed"
51+
? "solved"
52+
: "closed"
53+
: item.draft
54+
? "draft"
55+
: "open"}
56+
class="shrink-0"
7257
/>
58+
<div class="flex w-full flex-col">
59+
<div class="flex justify-between">
60+
<span>
61+
<MarkdownRenderer markdown={item.title} inline class="text-foreground" />
62+
<span class="text-muted-foreground">#{item.number}</span>
63+
</span>
64+
<span>
65+
{#if isNew(date)}
66+
{daysAgo(date)} •
67+
{/if}
68+
{new Intl.DateTimeFormat("en", {
69+
dateStyle: "medium"
70+
}).format(date)}
71+
</span>
72+
</div>
73+
<MarkdownRenderer
74+
markdown={item.body || "_No description provided_"}
75+
inline
76+
parseRawHtml
77+
class="line-clamp-2 max-w-full text-base text-muted-foreground"
78+
additionalPlugins={[
79+
{
80+
renderer: {
81+
h1: "h4",
82+
h2: "h4",
83+
h3: "h2",
84+
pre: Transparent,
85+
a: Transparent,
86+
ul: Transparent
87+
}
88+
}
89+
]}
90+
/>
91+
</div>
7392
</a>
7493
{/snippet}
7594

0 commit comments

Comments
 (0)