╭ changed ──────╮ │src/ui/Repo.zig│ ╰───────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │443 const gpa = arena.child_allocator; │ │444 │ │445 { │ │446 - // the owner's plain data, which holds the subscriber index │ │446 + // the owner's plain data, which holds the tier index │ │447 var owner_repo = (try evt.openUserRepo(io, gpa, users_dir, owner_id)) orelse return error.NotFound;│ │448 defer owner_repo.deinit(io, gpa); │ │449 const owner_moment = try notify.latestMoment(&owner_repo); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │479 ) !void { │ │480 const items = try arena.allocator().dupe(std.meta.Elem(@TypeOf(window.items)), window.items); │ │481 for (items) |*entry| { │ │482 - const thread_id = try evt.parseEventId(entry.id); │ │483 - // muting drops the user from the index, so membership alone decides │ │484 - const subscribed = if (owner_moment) |moment| try notify.isSubscribed(moment, &notify.idOf(repo_id, &thread_id), user_id) else false;│ │485 - entry.notify_action = if (subscribed) .mute else .subscribe; │ │482 + const notif_id = notify.idOf(repo_id, &try evt.parseEventId(entry.id)); │ │483 + // muting drops the user from every tier, so membership alone decides │ │484 + const notified = if (owner_moment) |moment| try notify.isNotified(moment, &notif_id, user_id) else false; │ │485 + entry.notify_action = if (notified) .mute else .subscribe; │ │486 } │ │487 window.items = items; │ │488 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯