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 == 'global'" :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> | ||||
|  | ||||
| <script lang="ts"> | ||||
| @@ -13,12 +14,14 @@ import Vue from 'vue'; | ||||
| import XTlColumn from './deck.tl-column.vue'; | ||||
| import XNotificationsColumn from './deck.notifications-column.vue'; | ||||
| import XWidgetsColumn from './deck.widgets-column.vue'; | ||||
| import XMentionsColumn from './deck.mentions-column.vue'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	components: { | ||||
| 		XTlColumn, | ||||
| 		XNotificationsColumn, | ||||
| 		XWidgetsColumn | ||||
| 		XWidgetsColumn, | ||||
| 		XMentionsColumn | ||||
| 	}, | ||||
|  | ||||
| 	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' | ||||
| 						}); | ||||
| 					} | ||||
| 				}, { | ||||
| 					icon: '%fa:at%', | ||||
| 					text: '%i18n:common.deck.mentions%', | ||||
| 					action: () => { | ||||
| 						this.$store.dispatch('settings/addDeckColumn', { | ||||
| 							id: uuid(), | ||||
| 							type: 'mentions' | ||||
| 						}); | ||||
| 					} | ||||
| 				}, { | ||||
| 					icon: '%fa:list%', | ||||
| 					text: '%i18n:common.deck.list%', | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo