134 lines
3.4 KiB
JavaScript
134 lines
3.4 KiB
JavaScript
import Category from "discourse/models/category";
|
|
import { isRTL } from "discourse/lib/text-direction";
|
|
import { censor } from "pretty-text/censored-words";
|
|
import { emojiUnescape } from "discourse/lib/text";
|
|
import Site from "discourse/models/site";
|
|
import { longDate } from "discourse/lib/formatter";
|
|
import PreloadStore from "preload-store";
|
|
import { none } from "@ember/object/computed";
|
|
import { computed } from "@ember/object";
|
|
import { ajax } from "discourse/lib/ajax";
|
|
import { Promise } from "rsvp";
|
|
import RestModel from "discourse/models/rest";
|
|
import discourseComputed from "discourse-common/utils/decorators";
|
|
|
|
const Bookmark = RestModel.extend({
|
|
newBookmark: none("id"),
|
|
|
|
@computed
|
|
get url() {
|
|
return Discourse.getURL(`/bookmarks/${this.id}`);
|
|
},
|
|
|
|
destroy() {
|
|
if (this.newBookmark) return Promise.resolve();
|
|
|
|
return ajax(this.url, {
|
|
type: "DELETE"
|
|
});
|
|
},
|
|
|
|
@discourseComputed("highest_post_number", "url")
|
|
lastPostUrl(highestPostNumber) {
|
|
return this.urlForPostNumber(highestPostNumber);
|
|
},
|
|
|
|
// Helper to build a Url with a post number
|
|
urlForPostNumber(postNumber) {
|
|
let url = Discourse.getURL(`/t/${this.topic_id}`);
|
|
if (postNumber > 0) {
|
|
url += `/${postNumber}`;
|
|
}
|
|
return url;
|
|
},
|
|
|
|
// returns createdAt if there's no bumped date
|
|
@discourseComputed("bumped_at", "createdAt")
|
|
bumpedAt(bumped_at, createdAt) {
|
|
if (bumped_at) {
|
|
return new Date(bumped_at);
|
|
} else {
|
|
return createdAt;
|
|
}
|
|
},
|
|
|
|
@discourseComputed("bumpedAt", "createdAt")
|
|
bumpedAtTitle(bumpedAt, createdAt) {
|
|
const firstPost = I18n.t("first_post");
|
|
const lastPost = I18n.t("last_post");
|
|
const createdAtDate = longDate(createdAt);
|
|
const bumpedAtDate = longDate(bumpedAt);
|
|
|
|
return I18n.messageFormat("topic.bumped_at_title_MF", {
|
|
FIRST_POST: firstPost,
|
|
CREATED_AT: createdAtDate,
|
|
LAST_POST: lastPost,
|
|
BUMPED_AT: bumpedAtDate
|
|
});
|
|
},
|
|
|
|
@discourseComputed("title")
|
|
fancyTitle(title) {
|
|
let fancyTitle = censor(
|
|
emojiUnescape(title) || "",
|
|
Site.currentProp("censored_regexp")
|
|
);
|
|
|
|
if (this.siteSettings.support_mixed_text_direction) {
|
|
const titleDir = isRTL(title) ? "rtl" : "ltr";
|
|
return `<span dir="${titleDir}">${fancyTitle}</span>`;
|
|
}
|
|
return fancyTitle;
|
|
},
|
|
|
|
@discourseComputed("created_at")
|
|
createdAt(created_at) {
|
|
return new Date(created_at);
|
|
},
|
|
|
|
@discourseComputed("tags")
|
|
visibleListTags(tags) {
|
|
if (!tags || !this.siteSettings.suppress_overlapping_tags_in_list) {
|
|
return tags;
|
|
}
|
|
|
|
const title = this.title;
|
|
const newTags = [];
|
|
|
|
tags.forEach(function(tag) {
|
|
if (title.toLowerCase().indexOf(tag) === -1) {
|
|
newTags.push(tag);
|
|
}
|
|
});
|
|
|
|
return newTags;
|
|
},
|
|
|
|
@discourseComputed("category_id")
|
|
category(categoryId) {
|
|
return Category.findById(categoryId);
|
|
},
|
|
|
|
@discourseComputed("reminder_at")
|
|
formattedReminder(bookmarkReminderAt) {
|
|
const currentUser = PreloadStore.get("currentUser");
|
|
return moment
|
|
.tz(bookmarkReminderAt, currentUser.timezone || moment.tz.guess())
|
|
.format(I18n.t("dates.long_with_year"));
|
|
},
|
|
|
|
loadItems() {
|
|
return ajax(`/u/${this.user.username}/bookmarks.json`, { cache: "false" });
|
|
}
|
|
});
|
|
|
|
Bookmark.reopenClass({
|
|
create(args) {
|
|
args = args || {};
|
|
args.siteSettings = args.siteSettings || Discourse.SiteSettings;
|
|
return this._super(args);
|
|
}
|
|
});
|
|
|
|
export default Bookmark;
|