From 9f32713093592ba793cb2347ba08f57032cd4c3a Mon Sep 17 00:00:00 2001 From: Aya Morisawa Date: Fri, 9 Nov 2018 22:35:33 +0900 Subject: [PATCH] Eliminate mutable variable to construct menu items (#3183) --- .../app/common/views/components/note-menu.vue | 115 ++++++++---------- 1 file changed, 50 insertions(+), 65 deletions(-) diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 1b4ae8e125..ad761b9391 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -10,84 +10,69 @@ import i18n from '../../../i18n'; import { url } from '../../../config'; import copyToClipboard from '../../../common/scripts/copy-to-clipboard'; import Ok from './ok.vue'; +import { concat, intersperse } from '../../../../../prelude/array'; export default Vue.extend({ i18n: i18n('common/views/components/note-menu.vue'), props: ['note', 'source', 'compact'], computed: { - items() { - const items = [{ - icon: 'info-circle', - text: this.$t('detail'), - action: this.detail - }, { - icon: 'link', - text: this.$t('copy-link'), - action: this.copyLink - }]; - - if (this.note.uri) { - items.push({ - icon: 'external-link-square-alt', - text: this.$t('remote'), - action: () => { - window.open(this.note.uri, '_blank'); - } - }); - } - - items.push(null); - - if (this.note.isFavorited) { - items.push({ - icon: 'star', - text: this.$t('unfavorite'), - action: this.unfavorite - }); - } else { - items.push({ - icon: 'star', - text: this.$t('favorite'), - action: this.favorite - }); - } - - if (this.note.userId == this.$store.state.i.id) { - if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) { - items.push({ - icon: 'thumbtack', - text: this.$t('unpin'), - action: this.unpin - }); - } else { - items.push({ - icon: 'thumbtack', - text: this.$t('pin'), - action: this.pin - }); - } - } - - if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) { - items.push(null); - items.push({ - icon: ['far', 'trash-alt'], - text: this.$t('delete'), - action: this.del - }); - } - - return items; + items(): any[] { + return concat(intersperse([null], [ + [ + [{ + icon: 'info-circle', + text: this.$t('detail'), + action: this.detail + }], [{ + icon: 'link', + text: this.$t('copy-link'), + action: this.copyLink + }], this.note.uri ? [{ + icon: 'external-link-square-alt', + text: this.$t('remote'), + action: () => { + window.open(this.note.uri, '_blank'); + } + }] : [] + ], + [ + this.note.isFavorited ? [{ + icon: 'star', + text: this.$t('unfavorite'), + action: this.unfavorite + }] : [{ + icon: 'star', + text: this.$t('favorite'), + action: this.favorite + }], this.note.userId == this.$store.state.i.id ? [ + (this.$store.state.i.pinnedNoteIds || []).includes(this.note.id) ? [{ + icon: 'thumbtack', + text: this.$t('unpin'), + action: this.unpin + }] : [{ + icon: 'thumbtack', + text: this.$t('pin'), + action: this.pin + }] + ] : [] + ], [ + this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin ? [{ + icon: ['far', 'trash-alt'], + text: this.$t('delete'), + action: this.del + }] : [] + ] + ].map(concat).filter(x => x.length > 0))); } }, methods: { detail() { - this.$router.push(`/notes/${ this.note.id }`); + this.$router.push(`/notes/${this.note.id}`); }, copyLink() { - copyToClipboard(`${url}/notes/${ this.note.id }`); + copyToClipboard(`${url}/notes/${this.note.id}`); }, pin() {