+
{groups.map((group) => (
-
-
- {group.repo}
-
-
- {group.items.map((item) => (
- handleClick(item)}
- />
- ))}
-
-
+
toggleRepo(group.repo)}
+ onClusterClick={handleClusterClick}
+ onItemClick={handleClick}
+ onMarkRepoRead={() => handleMarkRepoRead(group.repo)}
+ />
))}
)}
@@ -161,29 +278,107 @@ export function Inbox({ onSelectPr }: Props) {
)
}
-function NotificationItem({
- item,
+function RepoSection({
+ group,
+ collapsed,
+ expandedClusters,
+ onToggleRepo,
+ onClusterClick,
+ onItemClick,
+ onMarkRepoRead,
+}: {
+ group: Group
+ collapsed: boolean
+ expandedClusters: Set
+ onToggleRepo: () => void
+ onClusterClick: (cluster: Cluster) => void
+ onItemClick: (item: NotificationRow) => void
+ onMarkRepoRead: () => void
+}) {
+ return (
+
+
+
+ {group.unread > 0 && (
+
+ )}
+
+ {!collapsed && (
+
+ {group.clusters.map((cluster) => (
+ onClusterClick(cluster)}
+ onItemClick={onItemClick}
+ />
+ ))}
+
+ )}
+
+ )
+}
+
+function ClusterRow({
+ cluster,
+ expanded,
onClick,
+ onItemClick,
}: {
- item: NotificationRow
+ cluster: Cluster
+ expanded: boolean
onClick: () => void
+ onItemClick: (item: NotificationRow) => void
}) {
+ const item = cluster.representative
const Icon = iconForReason(item.reason)
const externalUrl = htmlUrlFromSubject(item)
+ const collapsedCluster = cluster.items.length > 1
+ const showUnreadDot = cluster.unread > 0
return (
-
+
+
+ {collapsedCluster && expanded && (
+
+ {cluster.items.map((sub) => (
+ onItemClick(sub)} />
+ ))}
+
+ )}
+
+ )
+}
+
+function ClusterChild({
+ item,
+ onClick,
+}: {
+ item: NotificationRow
+ onClick: () => void
+}) {
+ const externalUrl = htmlUrlFromSubject(item)
+ return (
+
+
)
}
diff --git a/src/components/repo-list.tsx b/src/components/repo-list.tsx
index 999b1f4..8d36aaa 100644
--- a/src/components/repo-list.tsx
+++ b/src/components/repo-list.tsx
@@ -9,6 +9,11 @@ import {
import { AddRepoDialog } from '@/components/add-repo-dialog'
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
+import {
+ HoverCard,
+ HoverCardContent,
+ HoverCardTrigger,
+} from '@/components/ui/hover-card'
import { Skeleton } from '@/components/ui/skeleton'
import { api, type WatchedRepo } from '@/lib/api'
@@ -114,25 +119,18 @@ export function RepoList({
if (collapsed) {
return (
-