Skip to content

Commit

Permalink
Merge remote-tracking branch 'rad/patches/0e767f07667debb65d1b2c7e591…
Browse files Browse the repository at this point in the history
…9cba98bfd0319'
  • Loading branch information
JChrist committed Mar 19, 2024
2 parents b997575 + c321863 commit 216bbbb
Show file tree
Hide file tree
Showing 9 changed files with 111 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ private void initComponents() {
seedNodeApiUrl.setText(this.projectSettings.getSeedNode().url);
seedNodeApiUrlMsgLabel.setWrapStyleWord(true);
seedNodeApiUrlMsgLabel.setLineWrap(true);
seedNodeApiUrlMsgLabel.setOpaque(false);
initListeners();
// Show a warning label if the rad version is incompatible
ApplicationManager.getApplication().executeOnPooledThread(() -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import network.radicle.jetbrains.radiclejetbrainsplugin.icons.RadicleIcons;
import network.radicle.jetbrains.radiclejetbrainsplugin.issues.overview.editor.IssueVirtualFile;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.Emoji;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.RadAuthor;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.RadDetails;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.RadDiscussion;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.RadIssue;
Expand Down Expand Up @@ -237,5 +238,39 @@ public RadIssue addEmoji(Emoji emoji, String discussionId) {
public RadIssue removeEmoji(String emojiUnicode, String discussionId) {
return api.issueCommentReact(radIssue, discussionId, emojiUnicode, false);
}

@Override
public void notifyEmojiChanges(String emojiUnicode, String commentId, boolean isAdded) {
var discussion = radIssue.findDiscussion(commentId);
if (discussion != null) {
var reaction = discussion.findReaction(emojiUnicode);
var author = reaction != null ? reaction.findAuthor(radDetails.did) : null;
if (isAdded && author == null) {
if (reaction == null) {
// If the reaction does not exist, add a new reaction with the author
discussion.reactions.add(new Reaction(emojiUnicode, List.of(new RadAuthor(radDetails.did, radDetails.alias))));
} else {
// If the reaction exists, add the author to the existing reaction
reaction.authors().add(new RadAuthor(radDetails.did, radDetails.alias));
}
} else if (!isAdded && author != null) {
if (reaction.authors().size() > 1) {
// If the reaction has multiple authors, remove the current author
reaction.authors().remove(author);
} else {
// If the reaction has only one author, remove the entire reaction from the discussion
discussion.reactions.remove(reaction);
}
}
updatePanel(radIssue);
}
}

public void updatePanel(RadIssue issue) {
commentSection.removeAll();
commentSection.add(createCommentSection(issue.discussion));
commentSection.revalidate();
commentSection.repaint();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ public RadAuthor(String id) {
this.id = id;
}

public RadAuthor(String id, String alias) {
this.id = id;
this.alias = alias;
}

public String generateLabelText() {
if (!Strings.isNullOrEmpty(alias)) {
return alias;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ public boolean isReviewComment() {
return location != null;
}

public Reaction findReaction(String emojiUnicode) {
return reactions.stream().filter(r -> r.emoji().equals(emojiUnicode)).findFirst().orElse(null);
}

public static class Location {
public String path;
public String commit;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ public RadIssue(RadIssue other) {
this.seedNode = other.seedNode;
}

public RadDiscussion findDiscussion(String commentId) {
return discussion.stream().filter(disc -> disc.id.equals(commentId)).findFirst().orElse(null);
}

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum State {
OPEN("open", "Open"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,17 @@ public String getLatestNonEmptyRevisionDescription() {
return "";
}

public Revision findRevision(String revisionId) {
return revisions.stream().filter(rev -> rev.id().equals(revisionId)).findFirst().orElse(null);
}

public record Revision(
String id, String description, String base, String oid, List<String> refs,
List<Merge> merges, Instant timestamp, List<RadDiscussion> discussions, List<Object> reviews, RadAuthor author) { }
List<Merge> merges, Instant timestamp, List<RadDiscussion> discussions, List<Object> reviews, RadAuthor author) {
public RadDiscussion findDiscussion(String commentId) {
return discussions().stream().filter(disc -> disc.id.equals(commentId)).findFirst().orElse(null);
}
}

public record Merge(String node, String commit, Instant timestamp) { }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@
import java.util.List;

public record Reaction(String emoji, List<RadAuthor> authors) {
public RadAuthor findAuthor(String did) {
return authors.stream().filter(r -> r.id.equals(did)).findFirst().orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
import com.intellij.ui.AnimatedIcon;
import com.intellij.ui.BrowserHyperlinkListener;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.HyperlinkAdapter;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.components.BorderLayoutPanel;
import git4idea.GitCommit;
import network.radicle.jetbrains.radiclejetbrainsplugin.RadicleBundle;
import network.radicle.jetbrains.radiclejetbrainsplugin.actions.rad.RadAction;
import network.radicle.jetbrains.radiclejetbrainsplugin.icons.RadicleIcons;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.Emoji;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.RadAuthor;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.RadDetails;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.RadPatch;
import network.radicle.jetbrains.radiclejetbrainsplugin.models.Reaction;
Expand All @@ -31,12 +31,10 @@
import network.radicle.jetbrains.radiclejetbrainsplugin.toolwindow.EmojiPanel;
import network.radicle.jetbrains.radiclejetbrainsplugin.toolwindow.MarkDownEditorPaneFactory;
import network.radicle.jetbrains.radiclejetbrainsplugin.toolwindow.Utils;
import org.jetbrains.annotations.NotNull;

import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.HyperlinkEvent;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
Expand All @@ -50,7 +48,6 @@

public class TimelineComponentFactory {
private static final String PATTERN_FORMAT = "dd/MM/yyyy HH:mm";
private static final String COMMIT_HASH = "commit://";
private static final DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern(PATTERN_FORMAT).withZone(ZoneId.systemDefault());
private final RadPatch patch;
Expand All @@ -65,6 +62,7 @@ public class TimelineComponentFactory {
private EmojiPanel<RadPatch> emojiPanel;
private final PatchVirtualFile file;
private JComponent commentPanel;
private JComponent mainPanel;

public TimelineComponentFactory(PatchProposalPanel patchProposalPanel, SingleValueModel<RadPatch> patchModel, PatchVirtualFile file) {

Check warning on line 67 in src/main/java/network/radicle/jetbrains/radiclejetbrainsplugin/patches/timeline/TimelineComponentFactory.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'com.intellij.collaboration.ui.SingleValueModel' is declared in unstable package 'com.intellij.collaboration.ui' marked with @ApiStatus.Experimental
this.file = file;
Expand All @@ -83,7 +81,7 @@ public JComponent createDescSection() {
}

public JComponent createRevisionSection() {
var mainPanel = getVerticalPanel(0);
mainPanel = getVerticalPanel(0);
var loadingIcon = new JLabel(new AnimatedIcon.Default());
mainPanel.add(loadingIcon);
ApplicationManager.getApplication().executeOnPooledThread(() -> {
Expand Down Expand Up @@ -134,7 +132,7 @@ private String findMessage(String replyTo) {
}

private JComponent createCommentSection(List<RadPatch.Revision> revisions) {
var mainPanel = getVerticalPanel(0);
var verticalPanel = getVerticalPanel(0);
for (var rev : revisions) {
for (var com : rev.discussions()) {
var textHtmlEditor = new BaseHtmlEditorPane();

Check warning on line 138 in src/main/java/network/radicle/jetbrains/radiclejetbrainsplugin/patches/timeline/TimelineComponentFactory.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'BaseHtmlEditorPane()' is declared in unstable package 'com.intellij.collaboration.ui.codereview' marked with @ApiStatus.Experimental

Check warning on line 138 in src/main/java/network/radicle/jetbrains/radiclejetbrainsplugin/patches/timeline/TimelineComponentFactory.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'com.intellij.collaboration.ui.codereview.BaseHtmlEditorPane' is declared in unstable package 'com.intellij.collaboration.ui.codereview' marked with @ApiStatus.Experimental
Expand Down Expand Up @@ -169,10 +167,10 @@ private JComponent createCommentSection(List<RadPatch.Revision> revisions) {
return null;
}));
commentPanel = createTimeLineItem(contentPanel, actionsPanel, com.author.generateLabelText(), com.timestamp);
mainPanel.add(commentPanel);
verticalPanel.add(commentPanel);
}
}
return mainPanel;
return verticalPanel;
}

public JPanel getEmojiJPanel() {
Expand All @@ -183,30 +181,6 @@ public EmojiPanel<RadPatch> getEmojiPanel() {
return emojiPanel;
}

public BaseHtmlEditorPane createCommitsSection(List<GitCommit> commits) {
var builder = new HtmlBuilder();
for (var commit : commits) {
builder.append(HtmlChunk.p()
.children(HtmlChunk.link(COMMIT_HASH + commit.getId(), commit.getId().asString()),
HtmlChunk.nbsp(),
HtmlChunk.raw(commit.getFullMessage())));
builder.append(HtmlChunk.link(commit.getAuthor().getName(), commit.getAuthor().getName()));
builder.append(HtmlChunk.nbsp());
builder.append(DATE_TIME_FORMATTER.format(Instant.ofEpochMilli(commit.getAuthorTime())));
}
var commitEditor = new BaseHtmlEditorPane();
commitEditor.setBody(builder.toString());
commitEditor.removeHyperlinkListener(BrowserHyperlinkListener.INSTANCE);
commitEditor.addHyperlinkListener(new HyperlinkAdapter() {
@Override
protected void hyperlinkActivated(@NotNull HyperlinkEvent e) {
var href = e.getDescription();
patchProposalPanel.selectCommit(href);
}
});
return commitEditor;
}

public static JComponent createTimeLineItem(JComponent contentPanel,
JComponent actionsPanel, String title, Instant date) {
var authorDid = HtmlChunk.link("#",
Expand Down Expand Up @@ -250,6 +224,47 @@ public RadPatch removeEmoji(String emojiUnicode, String commentId) {
return api.patchCommentReact(patch, commentId, revisionId, emojiUnicode, false);
}

@Override
public void notifyEmojiChanges(String emojiUnicode, String commentId, boolean isAdded) {
var revisionId = findRevisionId(commentId);
var revision = patch.findRevision(revisionId);
if (revision != null) {
var discussion = revision.findDiscussion(commentId);
if (discussion != null) {
var reaction = discussion.findReaction(emojiUnicode);
var author = reaction != null ? reaction.findAuthor(radDetails.did) : null;
if (isAdded && author == null) {
if (reaction == null) {
// If the reaction does not exist, add a new reaction with the author
discussion.reactions.add(new Reaction(emojiUnicode, List.of(new RadAuthor(radDetails.did, radDetails.alias))));
} else {
// If the reaction exists, add the author to the existing reaction
reaction.authors().add(new RadAuthor(radDetails.did, radDetails.alias));
}
} else if (!isAdded && author != null) {
if (reaction.authors().size() > 1) {
// If the reaction has multiple authors, remove the current author
reaction.authors().remove(author);
} else {
// If the reaction has only one author, remove the entire reaction from the discussion
discussion.reactions.remove(reaction);
}
}
updatePanel(patch);
}
}
}

public void updatePanel(RadPatch updatePatch) {
var panel = (JPanel) mainPanel.getComponent(2);
panel.removeAll();
for (var rev : updatePatch.revisions) {
panel.add(createCommentSection(List.of(rev)));
}
panel.revalidate();
panel.repaint();
}

private String findRevisionId(String commentId) {
String revisionId = "";
for (var rev : patch.revisions) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public void mouseClicked(MouseEvent e) {
progressLabel.setVisible(false);
var isSuccess = res != null;
if (isSuccess) {
model.setValue(model.getValue());
notifyEmojiChanges(selectedEmoji.get(0).unicode(), discussionId, true);
}
});
return null;
Expand Down Expand Up @@ -167,7 +167,7 @@ public void mouseClicked(MouseEvent e) {
var res = removeEmoji(emojiUnicode, discussionId);
var isSuccess = res != null;
if (isSuccess) {
model.setValue(model.getValue());
notifyEmojiChanges(emojiUnicode, discussionId, false);
}
progressLabel.setVisible(false);
});
Expand Down Expand Up @@ -218,4 +218,5 @@ private Map<String, List<RadAuthor>> groupEmojis(List<Reaction> myReactions) {

public abstract T removeEmoji(String emojiUnicode, String id);

public abstract void notifyEmojiChanges(String emojiUnicode, String commentId, boolean isAdded);
}

0 comments on commit 216bbbb

Please sign in to comment.