mirror of
https://seed.radicle.dev/rad:z4D5UCArafTzTQpDZNQRuqswh3ury.git
synced 2026-10-26 06:41:04 +08:00
52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
import type { Revision } from "@bindings/cob/patch/Revision";
|
|
|
|
import { publicKeyFromDid } from "@app/lib/utils";
|
|
|
|
/// Identifies the bucket of code comments that belong to no review, so the
|
|
/// Changes tab can toggle them like it toggles a review. Not a review id, and
|
|
/// deliberately not shaped like one.
|
|
export const STANDALONE_COMMENTS = "standalone";
|
|
|
|
/// A togglable layer of code comments on the revision diff: one per review that
|
|
/// left any, plus a bucket for the comments that belong to no review.
|
|
export interface CommentSource {
|
|
id: string;
|
|
name: string;
|
|
count: number;
|
|
// A review has one author; the comments that belong to no review can have
|
|
// several, so the row stacks the first few avatars.
|
|
nids: string[];
|
|
}
|
|
|
|
export function commentSourcesOf(revision: Revision): CommentSource[] {
|
|
const sources: CommentSource[] = [];
|
|
for (const review of revision.reviews ?? []) {
|
|
const count = (review.comments ?? []).filter(
|
|
c => c.location && !c.replyTo,
|
|
).length;
|
|
if (count === 0) continue;
|
|
sources.push({
|
|
id: review.id,
|
|
name:
|
|
review.author.alias ??
|
|
publicKeyFromDid(review.author.did).substring(0, 6),
|
|
count,
|
|
nids: [publicKeyFromDid(review.author.did)],
|
|
});
|
|
}
|
|
// Standalone located comments are a category of their own: a code comment can
|
|
// be left on a revision without joining any review.
|
|
const standalone = (revision.discussion ?? []).filter(
|
|
c => c.location && !c.replyTo,
|
|
);
|
|
if (standalone.length > 0) {
|
|
sources.push({
|
|
id: STANDALONE_COMMENTS,
|
|
name: "Not part of a review",
|
|
count: standalone.length,
|
|
nids: [...new Set(standalone.map(c => publicKeyFromDid(c.author.did)))],
|
|
});
|
|
}
|
|
return sources;
|
|
}
|