╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────╮ │18 const not_found: []const u8 = ""; │ │19 } else @import("ansi_art"); │ │20 const evt = @import("./event.zig"); │ │21 +const notify = @import("./notify.zig"); │ │22 const inp = @import("./ui/input.zig"); │ │23 │ │24 pub const timestamp = @import("./ui/timestamp.zig");│ ╰────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────╮ │35 pub const NewRepo = @import("./ui/NewRepo.zig"); │ │36 pub const NewUser = @import("./ui/NewUser.zig"); │ │37 pub const UserSettings = @import("./ui/UserSettings.zig"); │ │38 +pub const UserNotifications = @import("./ui/UserNotifications.zig");│ │39 pub const UserLogin = @import("./ui/UserLogin.zig"); │ │40 pub const widget = @import("./ui/widget.zig"); │ │41 pub const Widget = widget.Widget; │ ╰────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │89 .home => .{ .home = try Home.init(arena, session, session.haxy_moment orelse return error.NoMoment, switch (route) {│ │90 .home_users => |u| u, │ │91 else => .{}, │ │90 - }) }, │ │92 + }, route.userTab()) }, │ │93 .user => blk: { │ │94 const haxy_moment = session.haxy_moment orelse return error.NoMoment; │ │95 break :blk switch (route) { │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 94 - .user_repos => |u| .{ .user = try User.init(arena, session, haxy_moment, u.name, u.start, u.search.slice(), 0) }, │ │ 95 - .user_forks => |u| .{ .user = try User.init(arena, session, haxy_moment, u.name, 0, "", u.start) }, │ │ 96 - .user_repo_new, .user_user_new, .user_user => |name| .{ .user = try User.init(arena, session, haxy_moment, name, 0, "", 0) },│ │ 96 + .user_repos => |u| .{ .user = try User.init(arena, session, haxy_moment, u.name, u.start, u.search.slice(), 0, .{}) }, │ │ 97 + .user_forks => |u| .{ .user = try User.init(arena, session, haxy_moment, u.name, 0, "", u.start, .{}) }, │ │ 98 + .user_repo_new, .user_user_new => |name| .{ .user = try User.init(arena, session, haxy_moment, name, 0, "", 0, .{}) }, │ │ 99 + .user_user => |u| .{ .user = try User.init(arena, session, haxy_moment, u.name, 0, "", 0, u.tab) }, │ │100 else => return error.UnexpectedRoute, │ │101 }; │ │102 }, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────╮ │129 home_users: HomeUsersRoute, │ │130 home_repo_new, │ │131 home_user_new, │ │129 - home_user, │ │132 + home_user: UserTab, │ │133 user_repos: struct { │ │134 name: Array(evt.User.name_max_len),│ │135 start: usize = 0, │ ╰────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────╮ │139 user_forks: struct { name: Array(evt.User.name_max_len), start: usize = 0 }, │ │140 user_repo_new: Array(evt.User.name_max_len), │ │141 user_user_new: Array(evt.User.name_max_len), │ │139 - user_user: Array(evt.User.name_max_len), │ │142 + user_user: struct { name: Array(evt.User.name_max_len), tab: UserTab = .{} },│ │143 repo_files: RepoFilesRoute, │ │144 repo_commits: RepoCommitsRoute, │ │145 repo_diff: RepoDiffRoute, │ ╰──────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────╮ │200 repo_user_new: Array(repo_route_max_len), │ │201 repo_settings: Array(repo_route_max_len), │ │202 repo_roles: RepoRolesRoute, │ │200 - repo_user: Array(repo_route_max_len), │ │203 + repo_user: struct { name: Array(repo_route_max_len), tab: UserTab = .{} },│ │204 fork_patch: ForkRoute, │ │205 fork_diff: ForkDiffRoute, │ │206 fork_files: ForkFilesRoute, │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────╮ │207 fork_commits: ForkCommitsRoute, │ │208 fork_repo_new: ForkRoute, │ │209 fork_user_new: ForkRoute, │ │207 - fork_user: ForkRoute, │ │210 + fork_user: struct { fork: ForkRoute, tab: UserTab = .{} },│ │211 not_found, │ │212 │ │213 pub const default: RoutablePage = .home_about; │ ╰───────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │221 pub const DiscussionsView = enum { recent, labels, new, edit, description, new_comment, edit_comment, remove };│ │222 │ │223 pub const EventsView = enum { active, removed }; │ │224 + │ │225 + pub const UserView = enum { notifications, settings }; │ │226 + │ │227 + // the user tab's sub tab and the notifications window it shows │ │228 + pub const UserTab = struct { │ │229 + view: UserView = .notifications, │ │230 + start: usize = 0, │ │231 + }; │ │232 │ │233 pub const RefOrOid = enum { │ │234 branch, │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────╮ │629 } │ │630 │ │631 pub fn forkUserRoute(identity: []const u8, id: []const u8) ?RoutablePage { │ │621 - return .{ .fork_user = initForkRoute(identity, id) orelse return null }; │ │632 + return .{ .fork_user = .{ .fork = initForkRoute(identity, id) orelse return null } };│ │633 + } │ │634 + │ │635 + // the tab a user tab route names, the default for any other route │ │636 + pub fn userTab(self: RoutablePage) UserTab { │ │637 + return switch (self) { │ │638 + .home_user => |tab| tab, │ │639 + inline .user_user, .repo_user, .fork_user => |u| u.tab, │ │640 + else => .{}, │ │641 + }; │ │642 + } │ │643 + │ │644 + // a user tab route showing `tab` instead │ │645 + pub fn withUserTab(self: RoutablePage, tab: UserTab) RoutablePage { │ │646 + var route = self; │ │647 + switch (route) { │ │648 + .home_user => |*t| t.* = tab, │ │649 + inline .user_user, .repo_user, .fork_user => |*u| u.tab = tab, │ │650 + else => unreachable, │ │651 + } │ │652 + return route; │ │653 } │ │654 │ │655 // build a `.repo_files` route (a null ref_kind = the bare default-branch │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯