diff --git a/src/views/repos/Cob/Revision.svelte b/src/views/repos/Cob/Revision.svelte
index 88495192c..34c359655 100644
--- a/src/views/repos/Cob/Revision.svelte
+++ b/src/views/repos/Cob/Revision.svelte
@@ -525,6 +525,12 @@
+ {#if review.threads.length > 0}
+ {#each review.threads as thread}
+
+
+ {/each}
+ {/if}
{/if}
{/each}
{/if}
diff --git a/src/views/repos/Patch.svelte b/src/views/repos/Patch.svelte
index f159baef7..732fc1f87 100644
--- a/src/views/repos/Patch.svelte
+++ b/src/views/repos/Patch.svelte
@@ -15,8 +15,12 @@
replies: Comment[];
}
+ interface ReviewWithThreads extends Review {
+ threads: Thread[];
+ }
+
interface TimelineReview {
- inner: [string, Review];
+ inner: [string, ReviewWithThreads];
type: "review";
timestamp: number;
}
@@ -186,11 +190,21 @@
revisionDescription: rev.description,
},
[
- ...rev.reviews.map(review => ({
- timestamp: review.timestamp,
- type: "review",
- inner: [review.author.id, review],
- })),
+ ...rev.reviews.map(review => {
+ const reviewThreads: Thread[] = review.comments
+ .filter(comment => !comment.replyTo)
+ .map(thread => ({
+ root: thread,
+ replies: review.comments
+ .filter(comment => comment.replyTo === thread.id)
+ .sort((a, b) => a.timestamp - b.timestamp),
+ }));
+ return {
+ timestamp: review.timestamp,
+ type: "review",
+ inner: [review.author.id, { ...review, threads: reviewThreads }],
+ };
+ }),
...patch.merges
.filter(merge => merge.revision === rev.id)
.map(inner => ({