Add mentions column (Deck)
This commit is contained in:
		| @@ -6,6 +6,7 @@ | |||||||
| <x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked"/> | <x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked"/> | ||||||
| <x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/> | <x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/> | ||||||
| <x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/> | <x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/> | ||||||
|  | <x-mentions-column v-else-if="column.type == 'mentions'" :column="column" :is-stacked="isStacked"/> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| @@ -13,12 +14,14 @@ import Vue from 'vue'; | |||||||
| import XTlColumn from './deck.tl-column.vue'; | import XTlColumn from './deck.tl-column.vue'; | ||||||
| import XNotificationsColumn from './deck.notifications-column.vue'; | import XNotificationsColumn from './deck.notifications-column.vue'; | ||||||
| import XWidgetsColumn from './deck.widgets-column.vue'; | import XWidgetsColumn from './deck.widgets-column.vue'; | ||||||
|  | import XMentionsColumn from './deck.mentions-column.vue'; | ||||||
|  |  | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
| 	components: { | 	components: { | ||||||
| 		XTlColumn, | 		XTlColumn, | ||||||
| 		XNotificationsColumn, | 		XNotificationsColumn, | ||||||
| 		XWidgetsColumn | 		XWidgetsColumn, | ||||||
|  | 		XMentionsColumn | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
| 	props: { | 	props: { | ||||||
|   | |||||||
| @@ -0,0 +1,38 @@ | |||||||
|  | <template> | ||||||
|  | <x-column :name="name" :column="column" :is-stacked="isStacked"> | ||||||
|  | 	<span slot="header">%fa:at%{{ name }}</span> | ||||||
|  |  | ||||||
|  | 	<x-mentions/> | ||||||
|  | </x-column> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script lang="ts"> | ||||||
|  | import Vue from 'vue'; | ||||||
|  | import XColumn from './deck.column.vue'; | ||||||
|  | import XMentions from './deck.mentions.vue'; | ||||||
|  |  | ||||||
|  | export default Vue.extend({ | ||||||
|  | 	components: { | ||||||
|  | 		XColumn, | ||||||
|  | 		XMentions | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	props: { | ||||||
|  | 		column: { | ||||||
|  | 			type: Object, | ||||||
|  | 			required: true | ||||||
|  | 		}, | ||||||
|  | 		isStacked: { | ||||||
|  | 			type: Boolean, | ||||||
|  | 			required: true | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	computed: { | ||||||
|  | 		name(): string { | ||||||
|  | 			if (this.column.name) return this.column.name; | ||||||
|  | 			return '%i18n:common.deck.mentions%'; | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | }); | ||||||
|  | </script> | ||||||
							
								
								
									
										93
									
								
								src/client/app/desktop/views/pages/deck/deck.mentions.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								src/client/app/desktop/views/pages/deck/deck.mentions.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | |||||||
|  | <template> | ||||||
|  | 	<x-notes ref="timeline" :more="existMore ? more : null"/> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script lang="ts"> | ||||||
|  | import Vue from 'vue'; | ||||||
|  | import XNotes from './deck.notes.vue'; | ||||||
|  |  | ||||||
|  | const fetchLimit = 10; | ||||||
|  |  | ||||||
|  | export default Vue.extend({ | ||||||
|  | 	components: { | ||||||
|  | 		XNotes | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	props: { | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			fetching: true, | ||||||
|  | 			moreFetching: false, | ||||||
|  | 			existMore: false, | ||||||
|  | 			connection: null, | ||||||
|  | 			connectionId: null | ||||||
|  | 		}; | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	mounted() { | ||||||
|  | 		this.connection = (this as any).os.stream.getConnection(); | ||||||
|  | 		this.connectionId = (this as any).os.stream.use(); | ||||||
|  |  | ||||||
|  | 		this.connection.on('mention', this.onNote); | ||||||
|  |  | ||||||
|  | 		this.fetch(); | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	beforeDestroy() { | ||||||
|  | 		this.connection.off('mention', this.onNote); | ||||||
|  | 		(this as any).os.stream.dispose(this.connectionId); | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	methods: { | ||||||
|  | 		fetch() { | ||||||
|  | 			this.fetching = true; | ||||||
|  |  | ||||||
|  | 			(this.$refs.timeline as any).init(() => new Promise((res, rej) => { | ||||||
|  | 				(this as any).api('notes/mentions', { | ||||||
|  | 					limit: fetchLimit + 1, | ||||||
|  | 					includeMyRenotes: this.$store.state.settings.showMyRenotes, | ||||||
|  | 					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, | ||||||
|  | 					includeLocalRenotes: this.$store.state.settings.showLocalRenotes | ||||||
|  | 				}).then(notes => { | ||||||
|  | 					if (notes.length == fetchLimit + 1) { | ||||||
|  | 						notes.pop(); | ||||||
|  | 						this.existMore = true; | ||||||
|  | 					} | ||||||
|  | 					res(notes); | ||||||
|  | 					this.fetching = false; | ||||||
|  | 					this.$emit('loaded'); | ||||||
|  | 				}, rej); | ||||||
|  | 			})); | ||||||
|  | 		}, | ||||||
|  | 		more() { | ||||||
|  | 			this.moreFetching = true; | ||||||
|  |  | ||||||
|  | 			const promise = (this as any).api('notes/mentions', { | ||||||
|  | 				limit: fetchLimit + 1, | ||||||
|  | 				untilId: (this.$refs.timeline as any).tail().id, | ||||||
|  | 				includeMyRenotes: this.$store.state.settings.showMyRenotes, | ||||||
|  | 				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, | ||||||
|  | 				includeLocalRenotes: this.$store.state.settings.showLocalRenotes | ||||||
|  | 			}); | ||||||
|  |  | ||||||
|  | 			promise.then(notes => { | ||||||
|  | 				if (notes.length == fetchLimit + 1) { | ||||||
|  | 					notes.pop(); | ||||||
|  | 				} else { | ||||||
|  | 					this.existMore = false; | ||||||
|  | 				} | ||||||
|  | 				notes.forEach(n => (this.$refs.timeline as any).append(n)); | ||||||
|  | 				this.moreFetching = false; | ||||||
|  | 			}); | ||||||
|  |  | ||||||
|  | 			return promise; | ||||||
|  | 		}, | ||||||
|  | 		onNote(note) { | ||||||
|  | 			// Prepend a note | ||||||
|  | 			(this.$refs.timeline as any).prepend(note); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | }); | ||||||
|  | </script> | ||||||
| @@ -138,6 +138,15 @@ export default Vue.extend({ | |||||||
| 							type: 'global' | 							type: 'global' | ||||||
| 						}); | 						}); | ||||||
| 					} | 					} | ||||||
|  | 				}, { | ||||||
|  | 					icon: '%fa:at%', | ||||||
|  | 					text: '%i18n:common.deck.mentions%', | ||||||
|  | 					action: () => { | ||||||
|  | 						this.$store.dispatch('settings/addDeckColumn', { | ||||||
|  | 							id: uuid(), | ||||||
|  | 							type: 'mentions' | ||||||
|  | 						}); | ||||||
|  | 					} | ||||||
| 				}, { | 				}, { | ||||||
| 					icon: '%fa:list%', | 					icon: '%fa:list%', | ||||||
| 					text: '%i18n:common.deck.list%', | 					text: '%i18n:common.deck.list%', | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo