mirror of
https://github.com/discourse/discourse.git
synced 2025-02-12 01:48:29 +08:00
![Osama Sayegh](/assets/img/avatar_default.png)
Some of the changes in this commit are extracted from https://github.com/discourse/discourse/pull/17379. The bookmarks tab in the new user menu is different from the other tabs in that it can display a mixture of notifications and bookmarks. When there are unread bookmark reminder notifications, the tab displays all of these notifications at the top and fills the remaining space in the menu with the rest of the bookmarks. The bubble/badge count on the bookmarks tab indicates how many unread bookmark reminder notifications there are. On the technical aspect, since this commit introduces a new `bookmark-item` component, we've done some refactoring so that all 3 "item" components (`notification-item`, `reviewable-item` and the new `bookmark-item`) inherit from a base component and get identical HTML structure so they all look consistent. Internal tickets: t70584 and t65045.
72 lines
1.8 KiB
Ruby
72 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class UserTopicBookmarkSerializer < UserPostTopicBookmarkBaseSerializer
|
|
# it does not matter what the linked post number is for topic bookmarks,
|
|
# on the client we always take the user to the last unread post in the
|
|
# topic when the bookmark URL is clicked
|
|
def linked_post_number
|
|
1
|
|
end
|
|
|
|
def first_post
|
|
@first_post ||= topic.posts.find { |post| post.post_number == 1 }
|
|
end
|
|
|
|
def deleted
|
|
topic.deleted_at.present? || first_post.deleted_at.present?
|
|
end
|
|
|
|
def hidden
|
|
first_post.hidden
|
|
end
|
|
|
|
def raw
|
|
first_post.raw
|
|
end
|
|
|
|
def cooked
|
|
@cooked ||= \
|
|
if last_read_post_number.present?
|
|
for_topic_cooked_post
|
|
else
|
|
first_post.cooked
|
|
end
|
|
end
|
|
|
|
def for_topic_cooked_post
|
|
post_number = [last_read_post_number + 1, highest_post_number].min
|
|
sorted_regular_posts = topic.posts.sort_by(&:post_number).select do |post|
|
|
post.post_type == Post.types[:regular]
|
|
end
|
|
first_unread_post = sorted_regular_posts.find do |post|
|
|
post.post_number >= post_number
|
|
end
|
|
|
|
# if first_unread_cooked is blank this likely means that the last
|
|
# read post was either deleted or is a small action post.
|
|
# in this case we should just get the last regular post and
|
|
# use that for the cooked value so we have something to show
|
|
(first_unread_post || sorted_regular_posts.last).cooked
|
|
end
|
|
|
|
def bookmarkable_user
|
|
@bookmarkable_user ||= first_post.user
|
|
end
|
|
|
|
# NOTE: In the UI there are special topic-status and topic-link components to
|
|
# display the topic URL, this is only used for certain routes like the .ics bookmarks.
|
|
def bookmarkable_url
|
|
if @options[:link_to_first_unread_post]
|
|
Topic.url(topic_id, slug, (last_read_post_number || 0) + 1)
|
|
else
|
|
topic.url
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def topic
|
|
object.bookmarkable
|
|
end
|
|
end
|