| 1 | using System.Text.Json; |
| 2 | |
| 3 | namespace AgentForge.Plugin.View.Components.Iop; |
| 4 | |
| 5 | internal static class ForgeViewIopCommentComposer |
| 6 | { |
| 7 | internal static string RenderIssue(string repoName, int issueNumber) => |
| 8 | Render( |
| 9 | $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/issues/{issueNumber}/comment", |
| 10 | repoName, |
| 11 | surface: "issue-comment", |
| 12 | issueNumber: issueNumber); |
| 13 | |
| 14 | internal static string RenderMergeRequest(string repoName, int mrNumber) => |
| 15 | Render( |
| 16 | $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/merge-requests/{mrNumber}/comment", |
| 17 | repoName, |
| 18 | surface: "mr-comment", |
| 19 | mrNumber: mrNumber); |
| 20 | |
| 21 | private static string Render( |
| 22 | string action, |
| 23 | string repoName, |
| 24 | string surface, |
| 25 | int? issueNumber = null, |
| 26 | int? mrNumber = null) |
| 27 | { |
| 28 | var context = new Dictionary<string, string> { ["repo"] = repoName }; |
| 29 | if (issueNumber is > 0) |
| 30 | context["issueNumber"] = issueNumber.Value.ToString(); |
| 31 | if (mrNumber is > 0) |
| 32 | context["mrNumber"] = mrNumber.Value.ToString(); |
| 33 | |
| 34 | return ForgeHtml.Form( |
| 35 | "post", |
| 36 | action, |
| 37 | "forge-composer-form", |
| 38 | ForgeHtml.Textarea(new ForgeTextareaSpec( |
| 39 | "body", |
| 40 | CssClass: "forge-composer", |
| 41 | Rows: 3, |
| 42 | Placeholder: "Comment… type / for commands", |
| 43 | DataForgeSurface: surface, |
| 44 | DataForgeContext: JsonSerializer.Serialize(context))), |
| 45 | ForgeHtml.Button("submit", "Comment", "btn forge-composer-submit")); |
| 46 | } |
| 47 | } |
| 48 | |