diff --git a/src/components/ReviewTeaser.svelte b/src/components/ReviewTeaser.svelte index 7804d8794..604f074f6 100644 --- a/src/components/ReviewTeaser.svelte +++ b/src/components/ReviewTeaser.svelte @@ -18,44 +18,89 @@ const { rid, review }: Props = $props(); - const backgroundColor = { - review: "var(--color-background-float)", - accept: "var(--color-fill-diff-green-light)", - reject: "var(--color-fill-diff-red-light)", - }; + const backgroundColor = $derived.by(() => { + if (review.verdict === "accept") { + return "var(--color-fill-diff-green-light)"; + } else if (review.verdict === "reject") { + return "var(--color-fill-diff-red-light)"; + } else { + return "var(--color-fill-float-hover)"; + } + }); + + const header = $derived.by(() => { + if (!review.verdict) { + return "published a review"; + } + + return `${review.verdict ? `${review.verdict}ed` : "reviewed"} revision with a review`; + }); + + const icon = $derived.by(() => { + if (review.verdict === "accept") { + return "comment-checkmark"; + } else if (review.verdict === "reject") { + return "comment-cross"; + } else { + return "comment"; + } + }); -
-
- - {review.verdict ? `${review.verdict}ed` : "reviewed"} revision -
- {formatTimestamp(review.timestamp)} -
- {#if review.comments.length > 0} -
- {review.comments.length} -
- {/if} +
+
+
-
- {#if review.summary?.trim()} - - {:else} - No summary. - {/if} +
+
+
+ + {header} +
+ {formatTimestamp(review.timestamp)} +
+ {#if review.comments.length > 0} +
+ {review.comments.length} +
+ {/if} +
+
+
+ {#if review.summary?.trim()} + + {:else} + No summary. + {/if} +
diff --git a/src/components/Revision.svelte b/src/components/Revision.svelte index 73c82182e..0dee6b91e 100644 --- a/src/components/Revision.svelte +++ b/src/components/Revision.svelte @@ -14,7 +14,11 @@ import { announce } from "@app/components/AnnounceSwitch.svelte"; import { invoke } from "@app/lib/invoke"; import { nodeRunning } from "@app/lib/events"; - import { publicKeyFromDid, scrollIntoView } from "@app/lib/utils"; + import { + didFromPublicKey, + publicKeyFromDid, + scrollIntoView, + } from "@app/lib/utils"; import Changeset from "@app/components/Changeset.svelte"; import CobCommitTeaser from "./CobCommitTeaser.svelte"; @@ -41,6 +45,15 @@ $props(); /* eslint-enable prefer-const */ + const hasOwnReview = $derived( + Boolean( + revision.reviews && + revision.reviews.some( + value => value.author.did === didFromPublicKey(config.publicKey), + ), + ), + ); + let focusReply: boolean = $state(false); let hideChanges = $state(false); let hideDiscussion = $state(false); @@ -128,6 +141,27 @@ } } + async function createReview() { + try { + await invoke("edit_patch", { + rid: rid, + cobId: patchId, + action: { + type: "review", + revision: revision.id, + // We need to pass an empty string to create a review without a verdict. + summary: "", + labels: [], + }, + opts: { announce: $nodeRunning && $announce }, + }); + } catch (error) { + console.error("Creating a review failed: ", error); + } finally { + await reload(); + } + } + async function editComment(commentId: string, body: string, embeds: Embed[]) { try { await invoke("edit_patch", { @@ -143,7 +177,7 @@ opts: { announce: $nodeRunning && $announce }, }); } catch (error) { - console.error("Eediting comment failed: ", error); + console.error("Editing comment failed: ", error); } finally { await reload(); } @@ -293,6 +327,11 @@ left: -18.5px; background-color: var(--color-fill-separator); } + .review-row { + display: flex; + align-items: center; + justify-content: space-between; + }
@@ -360,24 +399,38 @@
-{#if revision.reviews && revision.reviews.length} -
-
+
+
+
(hideReviews = !hideReviews)}> - +
Reviews
-
+ + + New Review + +
+ + {#if revision.reviews && revision.reviews.length} +
{#each revision.reviews as review} {/each}
-
-{/if} + {/if} +