diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index d091b63235..f90f906509 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -363,6 +363,7 @@ common/views/components/note-menu.vue: detail: "詳細" copy-link: "リンクをコピー" favorite: "お気に入り" + unfavorite: "お気に入り解除" pin: "ピン留め" unpin: "ピン留め解除" delete: "削除" diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 6030e4fd30..21713e56a0 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -22,11 +22,21 @@ export default Vue.extend({ icon: '%fa:link%', text: '%i18n:@copy-link%', action: this.copyLink - }, null, { - icon: '%fa:star%', - text: '%i18n:@favorite%', - action: this.favorite - }]; + }, null]; + + if (this.note.isFavorited) { + items.push({ + icon: '%fa:star%', + text: '%i18n:@unfavorite%', + action: this.unfavorite + }); + } else { + items.push({ + icon: '%fa:star%', + text: '%i18n:@favorite%', + action: this.favorite + }); + } if (this.note.userId == this.$store.state.i.id) { if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) { @@ -45,6 +55,7 @@ export default Vue.extend({ } if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) { + items.push(null); items.push({ icon: '%fa:trash-alt R%', text: '%i18n:@delete%', @@ -110,6 +121,15 @@ export default Vue.extend({ }); }, + unfavorite() { + (this as any).api('notes/favorites/delete', { + noteId: this.note.id + }).then(() => { + (this as any).os.new(Ok); + this.destroyDom(); + }); + }, + closed() { this.$nextTick(() => { this.destroyDom(); diff --git a/src/models/favorite.ts b/src/models/favorite.ts index 4824a6dbaa..9acaec5c59 100644 --- a/src/models/favorite.ts +++ b/src/models/favorite.ts @@ -75,7 +75,9 @@ export const pack = ( delete _favorite._id; // Populate note - _favorite.note = await packNote(_favorite.noteId, me); + _favorite.note = await packNote(_favorite.noteId, me, { + detail: true + }); // (データベースの不具合などで)投稿が見つからなかったら if (_favorite.note == null) { diff --git a/src/models/note.ts b/src/models/note.ts index a47fd098c7..e6bdbe0b8b 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -358,8 +358,8 @@ export const pack = async ( })(_note.poll); } - // Fetch my reaction if (meId) { + // Fetch my reaction _note.myReaction = (async () => { const reaction = await Reaction .findOne({ @@ -374,6 +374,19 @@ export const pack = async ( return null; })(); + + // isFavorited + _note.isFavorited = (async () => { + const favorite = await Favorite + .count({ + userId: meId, + noteId: id + }, { + limit: 1 + }); + + return favorite === 1; + })(); } }