From 9f32713093592ba793cb2347ba08f57032cd4c3a Mon Sep 17 00:00:00 2001
From: Aya Morisawa <AyaMorisawa4869@gmail.com>
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() {