╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ Discussions.zig ──────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
222 const selected_index = View.viewIndex(data.view); 223 const page_selected = std.meta.activeTag(session.data.current_page) == .repo_discussions; 224 225 // recent discussions 226 { 227 const route = try thread.searchRoute(ui.RoutablePage.repoDiscussionsRoute(data.identity, data.tag, ""), data.search); 228 const link = try ui.inPageTabLink(session, route, page_selected and selected_index == 0); 229 var label_buf: [64]u8 = undefined; 230 const label = try thread.countLabel(&label_buf, recent_tab_label, data.recent); 231 try header.addTab(allocator, label, link, 0); 232 } 233 234 // tags tab, labeled with the active tag filter 235 { 236 const tags_route = try thread.searchRoute(ui.RoutablePage.repoThreadTagsRoute(.discuss, data.identity, data.tag), data.search); 237 const tags_link = try ui.inPageTabLink(session, tags_route, page_selected and selected_index == View.viewIndex(.tags)); 238 const label = if (data.tag.len == 0) tags_tab_label else blk: { 239 const decoded = std.Uri.percentDecodeInPlace(try aa.dupe(u8, data.tag)); 240 break :blk try std.fmt.allocPrint(aa, tags_tab_label ++ " ({s})", .{decoded}); 241 }; 242 try header.addTab(allocator, label, tags_link, View.viewIndex(.tags)); 243 } 244 245 // new-discussion tab; an edit or comment url shows its tab in this place 246 { 247 const route = switch (data.view) { 248 .edit => ui.RoutablePage.repoThreadEditRoute(.discuss, data.identity, data.selected_id) orelse return error.RouteTooLong, 249 .new_comment => ui.RoutablePage.repoThreadCommentNewRoute(.discuss, data.identity, data.selected_id, data.comment_id) orelse return error.RouteTooLong, 250 .edit_comment => ui.RoutablePage.repoThreadCommentEditRoute(.discuss, data.identity, data.selected_id, data.comment_id) orelse return error.RouteTooLong, 251 .remove => ui.RoutablePage.repoThreadRemoveRoute(.discuss, data.identity, data.selected_id, data.comment_id) orelse return error.RouteTooLong, 252 else => ui.RoutablePage.repoThreadNewRoute(.discuss, data.identity) orelse return error.RouteTooLong, 253 }; 254 const link = try ui.inPageTabLink(session, route, page_selected and selected_index == View.viewIndex(.new)); 255 const label: []const u8 = switch (data.view) { 256 .edit => edit_tab_label, 257 .new_comment => reply_tab_label, 258 .edit_comment => edit_tab_label, 259 .remove => remove_tab_label, 260 else => new_tab_label, 261 }; 262 try header.addTab(allocator, label, link, View.viewIndex(.new)); 263 } 264 265 header.select(View.viewIndex(data.view)); 266 return header; 267 } 268